《现代操作系统:进程》学习笔记
参考资料: 《现代操作系统 3th edtion》原书第二章 进程与线程
在 xmind 上记录
进程模型
一个进程就是一个正在执行程序的实例,包括程序计数器、 寄存器和变量的当前值
一、创建进程
创建进程的场景
- 系统初始化
- 执行了正在运行的进程所调用的进程创建系统调用
- 用户请求创建一个新进程
- 一个批处理作业的初始化
在UNIX系统中,只有一个系统调用可以用来创建新进程:fork
- 在调用了fork后,父进程和子进程拥有相同的存储映像、同样的环境字符串和同样的打开文件。这就是全部情形。通常,子进程接着执行execve或一个类似的系统调用,以修改其存储映像并运行一个新的程序
- 在UNIX中,子进程的初始地址空间是父进程的一个副本,但是这里涉及两个不同的地址空间,不可写的内存区是共享的(某些UNIX的实现使程 序正文在两者间共享,因为它不能被修改)
- 但是,对于一个新创建的进程而言,确实有可能共享其创建者的其他资源,诸如打开的文件等
在Windows中,情形正相反,一个Win32函数调用CreateProcess既处理进程的创建,也负责把正确的程序装入新的进程
- 在Windows中,从一开始父进程的地址空间和子进程的地址空间就是不同的
进程的终止
正常退出(自愿的)
- 完成了工作
出错退出(自愿的)
- 进程希望自行处理某些错误
严重错误(非自愿)
- 参数错误等
被其他进程杀死(非自愿)
- kill命令
二、进程的层次结构
在UNIX中,进程和它的所有子女以及后裔共同组成一个进程组
- 当用户从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员(它们通常是在当前窗口创建的所有活动进程)。每个进程可以分别捕获该信号、忽略该信号或采取默认的动作,即被该信号杀死
Windows中没有进程层次的概念,所有的进程都是地位相同的
三、进程的状态
运行态(该时刻进程实际占用CPU)
阻塞态(除非某种外部事件发生,否则进程不能运行)
- 当一个进程在逻辑上不能继续运行时,它就会被阻塞,典型的例子是它在等待可以使用的输入
就绪态(可运行,但因为其他进程正在运行而暂时停止)
四、进程的实现
为了实现进程模型,操作系统维护着一张表格(一个结构数组),即进程表 process table
- 包括程 序计数器、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息,以及其他在进程由运行态转换 到就绪态或阻塞态时必须保存的信息,从而保证该进程随后能再次启动,就像从未被中断过一样
与每一I/O类关联的是一个称作中断向量(interrupt vector)的位置(靠近内存底部的固定区域)。它包含中断 服务程序的入口地址。
中断
- 1.硬件压入堆栈程序计数器等
- 2.硬件从中断向量装入新的程序计数器等
- 3.汇编语言过程保存寄存器值
- 4.汇编语言过程设置新的堆栈
- 5.C中断服务例程运行(典型地读和缓冲输入)
- 6.调度程序决定下一个将运行的程序
- 7.C过程返回至汇编代码
- 8.汇编语言过程开始运行新的当前进程
五、多道程序设计模型
采用多道程序设计可以提高CPU的利用率
假设一个进程等待I/O操作的时间与其停留在内存中时 间的比为p。当内存中同时有n个进程时,则所有n个进程都在等待I/O(此时CPU空转)的概率是p^n
CPU利用率=1-p^n
XMind: ZEN - Trial Version