首页 > 代码库 > 操作系统基础-进程
操作系统基础-进程
进程的创建
四种主要的事件导致进程的创建:
- 系统初始化
- 正在运行的进程发出系统调用,创建一个活多个进程
- 用户请求创建一个新进程
- 一个批处理作业的初始化
在所有的情形中,新进程都是由于一个以存在的进程执行了一个用与创建进程的系统调用而创建的。
Unix 进程的创建:
fork(系统调用)--> 创建一个与系统调用相同的副本 --> 子进程执行execve或一个类似的系统调用 --> 修改其存储映像并运行一个新的程序。 在调用fork后,父进程和子进程拥有相同的存储映像,同样的环境字符串,同样的打开文件。例如,当用户在shell中输入一个sort命令时,shell就创建一个子进程执行sort,之所以安排两步建立进程,是为了在fork之后但在execve之前允许该子进程处理其文件描述符,这样可以完成对标准输入,标准输出和标准出错的重定向。
Windows 进程的创建:
win32函数调用CreateProcess即处理进程的创建,也负责把正确的程序装入新的进程。该调用有10个参数,其中包括要执行的程序,输入给该程序的命令行参数,各种安全属性,有关打开的文件是否继承的控制位,优先级信息,为该进程所需要创建的窗口规格以及指向一个结构的指针,在该结构中新创建进程的信息被返回给调用者。处了CreateProcess win32中大约有100多个其他的函数用于处理进程的管理,同步以及相关的事物。
进程的终止
进程的终止通常由下列条件引起:
- 正常退出(自愿)
- 出错退出(自愿)
- 严重错误(非自愿):执行了一条非法指令,引用不存在的内存,或是除数为0.有些系统中(unix),进程可以通知OS,它希望自行处理某些类型的错误。在这类错误中,进程会收到信号(被中断),而不是这类错误出现时终止。
- 被其他进程杀死(非自愿):Unix(kill),Windows(TerminateProcess)。在有些系统中,当一个进程终结时,不论是自愿还是其他原因,该进程创建的进程也一律被立即杀死。但是Unix和Windows都不是这种工作方式。
进程的层次结构
- 进程只有一个父进程,但是可以有多个子进程。
- 在Unix中,进程和它所有的子女进程及其后裔共同组成一个进程组(例如,unix中所有的进程都属于以init为根的一棵树)。当用户从键盘上发出一个消息的时候,该信号被送给当前与键盘相关的进程组的所有的成员,每个成员可以捕获该信号,忽略该信号或者采取默认的动作,即该信号被杀死。
- 在Windows中没有进程层次的概念,所有进程的地位都是相同的。在创建进程的时候父进程可以得到一个句柄用来控制子进程,但是父进程可以把句柄传递给某个进程,这样就不存在进程层次了。在Unix中,进程不能剥夺其子女的继承权。
进程的状态
进程的三种状态:
- 运行态(该时刻进程实际占用CPU)
- 就绪态(可运行,但因为其他进程正在运行而暂时停止)
- 阻塞态(除非某种外部事件发生,否则进程不能运行)
状态的切换:
- 运行-->阻塞:进程为等待输入而阻塞
- 运行-->就绪:调度程序选择另一个进程
- 就绪-->运行:调度程序选择这个进程
- 阻塞-->就绪:出现有效输入
进程的实现
为了实现进程模型,操作系统维护者一张表格即进程表。每个进程占用一个进程表项,该表型包含了进程状态的重要信息。包括程序计数器,堆栈指针,内存分配状况,所打开文件的状态,账号和调度信息,以及其他进程由运行状态转到就绪或阻塞状态时必须保存的信息。进程表项的一些字段:
- 进程管理:寄存器,程序计数器,程序状态字,堆栈指针,进程状态,优先级,调度参数,进程ID,父进程,进程组,信号,进程开始时间,使用的CPU时间,子进程的CPU时间,下次报警时间
- 存储管理:代码段指针,数据段指针,堆栈段指针
- 文件管理:根目录,工作目录,文件描述符,用户ID,组ID
进程的切换
在某一时刻,一个正在运行的进程被中断,操作系统指定另一个进程为运行态,并把控制权交给这个进程。进程切换可以在操作系统从当前正在运行的进程中获得控制权的任何时刻发生。那么什么时候进行进程切换?由三种类型进程中断机制:
- 中断:当前指令的外部执行,对异步外部事件的反应。
- 陷阱:与当前指令的执行相关,处理一个错误或异常条件。
- 系统调用:显示请求,调用操作系统函数
实际上,大多数操作系统区分两种类型的系统中断。一种称为中断,另一种称为陷阱。前者与当前正在运行的进程无关的某种类型的外部事件相关,如完成一次I/O 操作;后者与当前正在运行的进程所产生的错误或异常条件相关,如非法的文件访问。对于普通中断,控制首先转移给中断处理器,它做一些基本的辅助工作,然后转到与已经发生的特定类型的中断相关的操作系统例程。
中断
- 时钟中断:操作系统确定当前正在运行的进程的执行时间是否已经超过了最大允许时间段(时间片,即进程在被中断前可以执行的最大时间段),如果超过了,进程必须切换到就绪态,调入另一个进程。
- I/O 中断:操作系统确定是否发生了I/O 活动。如果I/O 活动是一个或多个进程正在等待的事件,操作系统就把所有相应的阻塞态进程转换到就绪态(阻塞/挂起态进程转换到就绪/挂起态),操作系统必须决定是继续执行当前处于运行态的进程,还是让具有高优先级的就绪态进程抢占这个进程。
- 内存失效:处理器访问一个虚拟内存地址,且此地址单元不在内存中时,操作系统必须从外存中把包含这个引用的内存块(页或段)调入内存中。在发出调入内存块的I/O 请求之后,操作系统可能会执行一个进程切换,以恢复另一个进程的执行,发生内存失效的进程被置为阻塞态,当想要的块调入内存中时,该进程被置为就绪态。
陷阱
操作系统确定错误或异常条件是否是致命的。如果是,当前正在运行的进程被转换到退出态,并发生进程切换;如果不是,操作系统的动作取决于错误的种类和操作系统的设计,其行为可以是试图恢复或通知用户,操作系统可能会进行一次进程切换或者继续执行当前正在运行的进程。
系统调用
操作系统可能被来自正在执行的程序的系统调用激活。例如,一个用户进程正在运行,并且正在执行一条请求I/O 操作的指令,如打开文件,这个调用导致转移到作为操作系统代码一部分的一个例程上执行。通常,使用系统调用会导致把用户进程置为阻塞态。
From: http://blog.csdn.net/liufei_learning/article/details/27229589