阅读深入理解计算机系统(二)--------------- 进程控制

1.     进程控制

每个进程都有一个唯一的正数进程ID,getpid()函数可以获得调用者的进程ID。

a.     fork()函数:

创建一个新的运行子进程,新创建的子进程几乎但不完全与父进程相同,子进程得到与父进程用户级虚拟地址空间相同的(但是独立的)一份拷贝,包括文本、数据和bss段、堆以及用户栈,子进程还获得父进程任何打开文件描述符相同的拷贝,这就意味着当父进程调用fork时,子进程可以读写父进程中打开的任何文件,两者最大的区别在于他们有不同的PID。父进程和子进程是并发运行的独立程序,不能假设那一个先运行。相同的但是独立的地址空间,即每个进程的地址空间都是相同的,但是都有自己的私有空间。

b.     僵尸进程:当一个进程由于某种原因终止时,内核并不立即把它从系统中清除,相反进程被保持在一种已终止的状态中,直到被它的父进程回收,当父进程回收已经终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程,从此时开始,该进程就不存在了。一个终止了但还未被回收的进程成为僵死进程。

c.     waitpid()函数:


    默认的(当options=0时),waitpid挂起调用进程的执行,直到它的等待集合中的一个子进程终止。如果等待集合的一个进程在刚调用的时刻已经终止了,那么waitpid就立即返回。

    如果pid>0,那么等待集合就是一个单独的子进程,它的进程ID就等于pid。

    如果pid=-1,那么等待集合就是由父进程所有的子进程组成的。每当一个子进程返回时,waitpid都会接收,写在while里就是接收所有的子进程,写在if里就是接收任意一个子进程。用fork创建的时候,就会存在多个子进程之间执行顺序混乱,但是在等待接收进程时可以指定特定的pid号来顺序接受子进程的exit。

d.      execve函数


e.     signal函数

阅读深入理解计算机系统(二)--------------- 进程控制_第1张图片

信号处理的问题:

l  待处理信号被阻塞:正在执行的和来的是同一类时,后面来的会被阻塞。

l  待处理信号不会排队:任意待处理的信号,至多只有一个待处理信号。

l  系统调用可以被终端:像read、wait、accept这样的系统调用潜在的阻塞进程一段较长的时间,称为慢速系统调用。

      SIGCHID信号:当每个子进程终止时,内核通过发送一个SIGCHID信号通知父进程,父进程捕获这个信号,进行相应的处理。

f.      并发编程

阅读深入理解计算机系统(二)--------------- 进程控制_第2张图片

当子父进程在对同一个东西进行处理时,如果按照的是父进程先执行,例如addjob操作,子进程进行deletejob操作这样的顺序,是可以顺利执行的,但是我们在程序如果不进行一些操作的话,是无法保证这样的顺序执行的。在这里我们引入的是一个锁机制:sigprocmask()函数。

阅读深入理解计算机系统(二)--------------- 进程控制_第3张图片

你可能感兴趣的:(操作系统,进程控制)