引言:

每个进程都有一个非负整型表示的唯一进程。虽然唯一,但是进程ID可以复用。

大多数UNIX系统实现延迟复用算法,使得赋给新建进程的ID不同于最近终止进程所使用的ID。这防止了将新进程认为是使用同一ID的某个已终止的先前进程。

ID为0的进程是调度进程,也称交换进程。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。

ID为1的进程是Init进程,由内核调用,在新的 /sbin/init 中,在自举内核后启动一个Unix系统,Init进程通常读取与系统有关的初始化文件,并将一个系统引导到一个状态。init进程绝不会终止,它是一个普通的用户进程,但是它以超级用户特权运行。

ID为2的进程。每个Unix系统实现都有它自己的一套提供操作系统服务的内核进程,例如在某些Unix的虚拟存储器分页实现中,进程ID是页守护进程,此进程负责支持虚拟存储器系统的分页操作。

文件共享

重定向父进程的标准输出时,子进程的标准输出也被重定向。

实际上,fork之后,父进程所有打开的文件描述符都被复制到子进程中。父进程和子进程每个打开的文件描述符共享一个文件表项。

父进程和子进程共享一个文件偏移量量。

一个进程fork一个子进程,然后父进程等待子进程终止。假定,作为普通处理的一部分,父进程和子进程都向标准输出写操作。如果父进程的标准输出自己重定向,那么子进程标准输出时,它将更新与父进程共享的该文件的偏移量。

在这个例子中,父进程等待子进程时,子进程写到标准输出;而在子进程进程终止后,父进程也写到标准输出上,并且知道其输出会追加在子进程所写数据之后。如果父进程和子进程不共享同一文件偏移量,要实现这种形式的交互就困难得多,可能需要父进程显式的动作。

exec函数:

第八章:进程控制

exit函数:

进程有五种正常终止和三种异常终止情况。

(1)在main函数中调用return函数,效果等同exit。

(2)调用exit。操作包括调用各终止处理程序,然后关闭所有标准I/O流。

(3)调用_exit和_Exit函数,对标准I/O流是否冲洗,取决于用户的实现。在Unix系统中,两者同意,都不冲洗标准I/O流。

(4)进程的最后一个线程在其启动例程中执行return语句。但是该线程的返回值不作为进程的返回值。当最后一个线程从其启动例程返回时,该进程以终止状态0返回。

(5)进程的最后一个线程调用pthread_exit函数,这样,进程终止状态总是0,这与传给pthread_exit函数参数无关。

(6)异常终止:调用abort。产生SIGARBT信号。

(7)异常终止:当进程接收到某种信号。信号可由自身(如调用abort函数),其他进程或内核产生(如进程引用地址空间之外的存储单元,或者除以0操作)。

(8)异常终止:一个线程要求取消另一个线程,若干时间后,目标线程终止。

对于任何一种终止情况,最后都会执行内核中的同一段代码,这段代码为相应进程关闭多有打开的描述符,释放它所使用的存储器。

调用wait、waitpid发生了什么?

(1)如果所有进程都在运行,则阻塞。

(2)如果一个进程已经终止,正等待父进程获取其终止状态,则取得该进程的终止状态,立即返回。

(3)如果没有子进程,则立即返回,出错返回0。

waitpid提供了wait的非阻塞版本,希望得到子进程的状态,但是不阻塞;


waitpid支持作业控制。

进程调度算法

(1)先来先服务算法

(2)短作业优先算法

(3)抢占式高优先级优先算法

(4)不可抢占式高优先级优先算法

(5)高响应比优先算法

(6)时间片轮询算法

(6)多级反馈队列调度算法

相关文章: