进程

Head First C 第九章 进程与系统调用 出错处理

断了今生、忘了曾经 提交于 2020-02-29 02:47:55
Head First C 第九章 进程与系统调用 出错处理 大多数的系统调用以相同的方式出错 需求:想知道系统调用为什么会失败,因此所有的系统调用都遵循“失败黄金法则”。 尽可能的收拾残局 把errno变量设为错误码 返回-1 errno 变量是定义在 errno.h 中的全局变量,和它定义在一起的还有很多标准错误码。 EPERM=1 不允许操作 ENOENT=2 没有该文件或目录 ESRCH=3 没有该进程 使用strerror打印标准错误 #include <errno.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main() { if (execl("ifconfig", "ifconfig", NULL) == -1) if (execlp("kryptonite", "kryptonite", NULL) == -1) { fprintf(stderr, "Can not run ipconfig:%s\n", strerror(errno)); return 1; } return 0; } 系统调用在出错时通常会返回-1,但不是绝对的 系统调用在出错的同时,将errno变量设为错误码。 来源: oschina 链接: https://my.oschina.net/u/2491285

浅谈Linux进程调度过程

本秂侑毒 提交于 2019-12-09 21:52:41
在操作系统运行过程中,由于CPU bound和I/O bound,进行进程的调度自然是常事。进行进程调度时,操作系统使用某些特定算法(如FIFO、SCBF、轮转法等)在进程队列中选出一个进程作为下一个运行的进程,调用schedule。进行进程调用的时机有以下几种: 中断处理过程(包括时钟中断、I/O中断、系统调用和异常)中,直接调用schedule(),或者返回用户态时根据need_resched标记调用schedule(); 内核线程可以直接调用schedule()进行进程切换,也可以在中断处理过程中进行调度,也就是说内核线程作为一类的特殊的进程可以主动调度,也可以被动调度; 用户态进程无法实现主动调度,仅能通过陷入内核态后的某个时机点进行调度,即在中断处理过程中进行调度。 相对于可以高风亮节主动让出系统资源的内核态进程,用户态进程只能接受被动调度。而被动调度分为抢占式调度和强制调度。 schedule函数进行调度时,首先选择一个新的进程来运行,然后调用context_switch进行上下文的切换,这个宏又调用switch_to进行关键上下文的切换。 next = pick_next_task(rq, prev);//进程调度算法都封装这个函数内部 context_switch(rq, prev, next);//进程上下文切换 switch_to利用了prev和next两个参数

Java高级-解析Java中的多线程机制

折月煮酒 提交于 2019-12-09 19:38:07
一、进程与应用程序的区别 进程(Process)是最初定义在Unix等多用户、多任务操作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的几乎所有用户管理和资源分配等工作都是通过操作系统对应用程序进程的控制来实现的。 C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时, 处在可执行状态中的应用程序称为进程 。 从用户角度来看,进程是应用程序的一个执行过程。从操作系统核心角度来看,进程代表的是操作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体 。多任务环境下应用程序进程的主要特点包括: ● 进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间; ● 进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型; ● 从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是操作系统指令。

android使用aidl实现进程间通信

我的未来我决定 提交于 2019-12-09 15:07:35
在 Android 中 , 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢 ? 显然 ,Java 中是不支持跨进程内存共享的。因此要传递对象 , 需要把对象解析成操作系统能够理解的数据格式 , 以达到跨界对象访问的目的。 在 JavaEE 中,采用 RMI 通过序列化传递对象。 在 Android 中 , 用 AIDL(Android Interface Definition Language :接口定义语言 ) 方式实现。 AIDL 是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码,实现 Android 设备上的两个进程间通信 (IPC) 。 由于进程之间的通信信息需要双向转换,所以 android 采用代理类在背后实现了信息的双向转换 ,代理类由 android 编译器生成,对开发人员来说是透明的。 具体实现 假设 A 应用需要与 B 应用进行通信,调用 B 应用中的 download(String path) 方法, B 应用以 Service 方式向 A 应用提供服务。需要下面四个步骤 : 1 ) 在 B 应用中创建 *.aidl 文件 , aidl 文件的定义和接口的定义很相类,如:在 com.alex.aidl 包下创建 IDownloadService.aidl 文件,内容如下: package com.alex.aidl

Android的进程,线程模型

两盒软妹~` 提交于 2019-12-07 21:15:47
Android进程模型: 在安装Android应用程序的时候,Android会为每个程序分配一个Linux用户ID,并设置相应的权限,这样其它应用程序就不能访问此应用程序所拥有的数据和资源了。 在Linux中,一个用户ID识别一个给定用户;在Android上,一个用户ID识别一个应用程序。 应用程序在安装时被分配用户ID,应用程序在设备上的存续期间内,用户ID保持不变。 默认情况下,每个apk运行在它自己的Linux进程中。当需要执行应用程序中的代码时,Android会启动一个jvm,即一个新的进程来执行,因此不同的apk运行在相互隔离的环境中。 下图显示了:两个 Android 应用程序,各自在其自己的基本沙箱或进程上。他们是不同的Linux user ID。 开发者也可以给两个应用程序分配相同的linux用户id,这样他们就能访问对方所拥有的资源。 为了保留系统资源,拥有相同用户id的应用程序可以运行在同一个进程中,共享同一个jvm。 如下图,显示了两个Android应用程序,运行在同一进程上。 不同的应用程序可以运行在相同的进程中。要实现这个功能,首先必须使用相同的私钥签署这些应用程序,然后必须使用 manifest 文件给它们分配相同的 Linux 用户 ID,这通过用相同的值/名定义 manifest 属性 android:sharedUserId 来做到。

Windows中杀死占用某个端口的进程

牧云@^-^@ 提交于 2019-12-04 14:49:03
启动tomcat时候,控制台报错,发现是端口占用,于是寻找方法关闭对应的程序。 从网上找了好久,尝试之后,发现不行。开始自己尝试,终于,成功的将占用端口的进程杀掉。在此记录下过程(以8081端口为例): 第一步,根据端口号查找对应的进程号 netstat -ano | findstr 80 //列出进程极其占用的端口,且包含 80 结果如下: 发现 8081 端口被 PID(进程号)为 2000 的进程占用。 第二步,据进程号寻找进程名称 tasklist | findstr 2000 从任务管理器中查找该程序,手动杀死即可。 至此,已经完成。 但是我发现,在任务管理器中找不到该程序。只好从命令行杀死该程序了,命令如下: taskkill -PID <进程号> -F //强制关闭某个进程 如此即可。 来源: oschina 链接: https://my.oschina.net/u/3797187/blog/1802794

Android进程保活招式大全

三世轮回 提交于 2019-12-04 14:48:34
目前市面上的应用,貌似除了微信和手Q都会比较担心被用户或者系统(厂商)杀死问题。本文对 Android 进程拉活进行一个总结。 Android 进程拉活包括两个层面: A. 提供进程优先级,降低进程被杀死的概率 B. 在进程被杀死后,进行拉活 本文下面就从这两个方面做一下总结。 1. 进程的优先级 Android 系统将尽量长时间地保持应用进程,但为了新建进程或运行更重要的进程,最终需要清除旧进程来回收内存。 为了确定保留或终止哪些进程,系统会根据进程中正在运行的组件以及这些组件的状态,将每个进程放入“重要性层次结构”中。 必要时,系统会首先消除重要性最低的进程,然后是清除重要性稍低一级的进程,依此类推,以回收系统资源。 进程的重要性,划分5级: 1. 前台进程(Foreground process) 2. 可见进程(Visible process) 3. 服务进程(Service process) 4. 后台进程(Background process) 5. 空进程(Empty process) 前台进程的重要性最高,依次递减,空进程的重要性最低,下面分别来阐述每种级别的进程 1.1. 前台进程 —— Foreground process 用户当前操作所必需的进程。通常在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行这一万不得已的情况下,系统才会终止它们。

操作系统之进程管理_上(汤子瀛版)

落爺英雄遲暮 提交于 2019-12-04 04:52:48
2.1 进程的基本概念 1. 程序的顺序执行及其特征 特征:顺序性、封闭性、可再现性 2. 程序的并发执行及其特征 (1)特征:间断性、失去封闭性、不可再现性 (2)程序并发执行的条件——Bernstein条件: 设有读集R(p_i )={a_1,a_2…a_m}和写集W(p_i )={b_1,b_2…b_n},若程序满足以下三个条件,则程序可以并发且具有可再现性(i≠j): R(p_i )∩W(p_j )=∅|R(p_j )∩W(p_i )=∅|W(p_i )∩W(p_j )=∅ 3. 进程的特征与状态 进程(动态)是进程实体(静态)的运行过程,是系统进行资源分配和调度的一个独立单位。 (1)进程的特征: ①结构特征:进程实体由进程控制块PCB(Process Control Block)、程序段、相关的数据段组成 ②动态性(最基本特性) ③并发性④独立性⑤异步性 (2)进程的状态: ①三种基本状态:就绪态、运行态、阻塞态 (进程状态的转换并非都可逆,阻塞态无法转换为执行态;只有执行态变为阻塞态是主动的,其余都是被动的;进程在某一时刻仅有一种状态) ②挂起态 引起挂起态的原因: 终端用户的要求、父进程的请求、负荷调节的需要、操作系统的需要 进程状态的转换 活动就绪->静止就绪 活动阻塞->静止阻塞 静止就绪->活动就绪 静止阻塞->活动阻塞 ③创建态和终止态 创建态

进程、线程、协程基本概念理解

三世轮回 提交于 2019-12-01 16:24:30
概述 最近接触一些进程、线程、协程、相关的东西,总是容易搞混淆,或者出错,专门想总结下这块的几个概念的问题! 进程 进程之间不共享任何状态 进程的调度由操作系统完成 每个进程都有自己独立的内存空间 进程间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量、管道、事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低 由于是独立的内存空间,上下文切换的时候需要保存先调用栈的信息、cpu各寄存器的信息、虚拟内存、 以及打开的相关句柄等信息,所以导致上下文进程间切换开销很大,通讯麻烦。 线程 线程之间共享变量,解决了通讯麻烦的问题 对于变量的访问需要锁 线程的调度主要也是有操作系统完成 一个进程可以拥有多个线程,但是其中每个线程会共享父进程像操作系统申请资源,这个包括虚拟内存、文件等,由于是共享资源,所以创建线程所需要的系统资源占用比进程小很多,相应的可创建的线程数量也变得相对多很多。 线程时间的通讯除了可以使用进程之间通讯的方式以外还可以通过共享内存的方式进行通信,所以这个速度比通过内核要快很多。 另外在调度方面也是由于内存是共享的,所以上下文切换的时候需要保存的东西就像对少一些,这样一来上 下文的切换也变得高效。 协程 协程的调度完全由用户控制 一个线程可以有多个协程,用户创建了几个线程,然后每个线程都是循环按照指定的任务清单顺序完成不同的任务

Java并发教程-1进程和线程

邮差的信 提交于 2019-12-01 04:52:20
http://www.iteye.com/magazines/131 计算机的使用者一直以为他们的计算机可以同时做很多事情。他们认为当其他的应用程序在下载文件,管理打印队列或者缓冲音频的时候他们可以继续在文字处理程序上工作。甚至对于单个应用程序,他们任然期待它能在在同一时间做很多事情。举个例子,一个流媒体播放程序必须能同时完成以下工作:从网络上读取数字音频,解压缩数字音频,管理播放和更新程序显示。甚至文字处理器也应该能在忙于重新格式化文本和刷新显示的情况下同时响应键盘和鼠标事件。这样的软件就被称为并发软件。 通过Java语言和Java类库对于基础并发的支持,Java平台具有完全(from the ground up )支持并发编程的能力。从JDK5.0起,Java平台还引入了高级并发APIs。这个课程不仅涵盖了Java平台基础并发内容,还对高级并发APIs有一定的阐述。 进程和线程 在并发编程中,有两个基本的执行单元:进程和线程。在java语言中,并发编程最关心的是线程,然而,进程也是非常重要的。 即使在只有单一的执行核心的计算机系统中,也有许多活动的进程和线程。因此,在任何给定的时刻,只有一个线程在实际执行。处理器的处理时间是通过操作系统的时间片在进程和线程中共享的。 现在具有多处理器或有多个执行内核的多处理器的计算机系统越来越普遍,这大大增强了系统并发执行的进程和线程的吞吐量