现代操作系统读书笔记-第二章
第二章
2.1 进程
就操作系统而言,任何多道程序设计系统中的任何一个时刻CPU都只能运行一个进程。
进程的创建
进程是如何创建的 通常有四种情况可以创建进程:
1. 系统初始化
2. 正在运行的程序执行了创建进程的系统调用
3. 用户请求创建了一个新的进程
4. 一个批处理作业的初始化
在Windows和Unix系统中,被创建的子进程和父进程的地址空间是不同的。Unix中初始化的子进程的地址空间是父进程的副本,他们之间不可写的内存区间是共享的或者写时复制(copy on write)的空间也是共享的。Windows系统中父子进程在初始化时地址空间就是不同的。
进程的终止
线程的终止也有四种情况:
1. 正常退出
2. 出错退出
3. 严重错误
4. 被其他进程杀死
进程的层次结构
Unix: 操作系统会在启动时,一个称为init的线程会出现在启动映像中,知道系统启动完成。后续的所有操作所产生的进程都会是从init中散发出去的。所以在Unix系统中所有的进程都属于一颗以init为根的树。在Unix系统中父进程和多个子进程会组成一个进程组,当系统接收到一个信号时会将信号发送给整个组,组中不同的进程可以对信号做出不同的响应。
Windows: 父子进程之间没有绝对的继承关系,父进程通过句柄来控制子进程,而句柄是可以转让的。也就是说Windows系统中进程之间不存在进程层次。
进程的状态
进程有多种状态,通常包括以下几种 阻塞 就绪 运行
进程的实现
为了实现进程模型,操作系统中维护了一张进程表,每个进程占用其中一个表项。表项中包含了很多进程重要的信息包括程序计数器、堆栈指针、内存分配状况、打开文件的状态、账号和调度信息。
接下来实现多线程最重要的一环就是中断向量。换句话叫保护线程,当线程的时间片消耗完毕或因其他情况所导致的线程切换,都需要保护当前现场以便恢复。中断都是从保存寄存器开始,随后会从堆栈中删除因中断硬件机制所保存的信息,并将堆栈指针指向当前进程处理程序所使用的临时堆栈。当例程结束后,通常会有进程就绪,接着调度程序就会决定切换到哪个进程。
记录一下书中介绍的中断发生后操作系统最底层的工作步骤:
1. 硬件压入堆栈程序计数器等
2. 硬件从中断向量装入新的程序计数器
3. 汇编语言过程保存寄存器值
4. 汇编语言过程设置新的堆栈
5. C中断服务例程运行(典型地读和缓冲输入)
6. 调度程序决定下一个将运行的进程
7. C过程返回至汇编代码
8. 汇编语言过程开始运行新的当前进程
2.2 线程