操作系统概念 Chapter3
CS143A 读书笔记 OperatingSystemConcepts
进程概念
进程
进程是执行中的程序。不只是程序代码,除了代码段外进程还包含:
- 当前活动:通过PC的值和处理器寄存器内容表示。
- 堆栈段:包含临时数据,函数参数,返回地址,局部变量。
- 数据段:全局变量
- 堆:进程运行期间动态分配的内存。
注意:程序本身不是进程,程序只是被动实体,进程是活动实体。两个进程可以是同一程序相关,但是被当成两个独立的执行序列。
进程状态
进程执行时会改变状态,列表如下:
- New:进程正被创建。
- Running:进程正在被执行。
- Waiting:进程等待某个事件(Event)的发生。
- Ready:进程等待分配给处理器。
- Terminated:进程完成执行。

进程控制块(Process Control Block)
每个进程在操作系统中用PCB表示,内容如下:
- 进程状态:New,ready等。
- PC:表示进程要执行的下一个指令的地址。
- CPU寄存器:为能够继续执行,这些状态信息在中断时候要保存。
- CPU调度信息:priority
- 内存管理信息:base,range
- 记账信息
- I/O状态信息
线程
进程可以支持多线程。
进程调度Scheduling
进程调度选择一个可用的进程到CPU处理。
调度队列
进程进入系统时候会被加入队列中。
调度程序 Scheduler
- 进程选择是有相应的调度程序实现的。
- 进程在大容量存储的缓冲池里,长期调度程序long-term scheduler从该池中选择进程,装入内存准备执行。短期调度程序short-term scheduler从准备执行的进程中选择进程,分配给CPU。
- 短期调度频率比长期调度快。
- 长期调度程序需要仔细选择。因为大部分进程可分为:
- I/O为主
- 基本时间都用来执行I/O,计算量小
- CPU为主
- 基本时间都用来计算
因此,长期调度程序应该选择一个合理的兼并二者的组合进程。
如果缺少长期调度程序,所有的新进程都放在内存中,稳定性随着进程的增加会大幅下降。
另外引入的中期调度程序能将长久不用的进程从内存(CPU竞争)中移出(Swap Out)并再后来可以被换入。
作用:当内存内进程太多,效能变差后。移走一些进程以减少系统资源占用率。
上下文切换 Context Switch
进程上下文用进程的PCB表示。
实现方式:通过执行一个状态保存(state save)来保存CPU当前状态,之后执行一个状态恢复(State restore)重新开始运行。
发生上下文切换时,内核会自动将旧进程的状态保存在PCB中,然后装入新进程的上下文。
切换时间是额外开销,速度:
- 与硬件支持密切相关:寄存器多,CS只需要简单改变当前寄存器组的指针。如果进程数>寄存器集合数量,需要在寄存器与内存之间进行数据复制。
- 与操作系统复杂度相关:操作系统越复杂,上下文切换需要做的工作就越多。
进程操作 Operations on Processes
进程创建
进程执行过程中,可以通过创建进程系统调用(create-process system call)创建多个新进程。
创建进程为父进程,新进程为子进程。
进程需要一定的资源来完成任务:
- 子进程可能从操作系统直接获取资源;也可能从父进程获取资源。
- 父进程可能需要在子进程之间分配或共享资源。
好处:限制子进程只能使用父进程资源能防止创建过多进程导致系统超载。
除了物理和逻辑资源,初始化数据也由父进程传递给子进程。当进程创建新进程时,有两种执行时序可能:
1. 并发执行
2. 父等待子执行完毕继续
有两种地址空间可能:
1. 子进程是父进程的复制品(具有相同程序和数据)
2. 子进程为新程序
- fork()系统调用
- 可创建新进程。新进程通过复制原进程地址空间,允许父子通信。对子进程fork()返回值为0,父进程为非0标识符。
进程终止
当进程完成执行最后的语句并使用exit()请求操作系统删除自身时,进程终止。此时,进程可以返回状态值到父进程,其使用过的资源会被操作系统释放。
一个程序可以使用适当的系统调用终止自己的子进程,所以父需要知道子的id,所以创建子进程时,子进程的id要传给父进程。
父进程终止子进程的原因:
- 子进程使用超过自身分配的资源(需要父进程有检查子进程状态的机制来判定此现象)
- 分配给子进程的任务不复需要
- 父进程终止
- 级联终止(cascading termination)
- 一个进程终止,它所有的子进程也随之终止。
进程通信
- 独立进程
- 一个进程不能影响其他进程或被其他进程所影响。
- 协作进程
- 一个进程能影响其他进程或被其他进程所影响。
我们需要允许进程内协作的理由有:
- 信息共享(information sharing)
- 提高速度(computation speedup)
- 模块化(modularity)
- 方便
进程间通信机制 IPC
主要两种方法:
- 共享内存(share)
- 消息传递(message passing)
共享内存
- 优点:快。因为消息传递需要系统调用实现,需要内核介入从而耗费时间。
- 原理:两个进程共用部分内存,在共享区域内读写交换信息。数据的形式或位置取决于这些进程,需要保证不向同一区域同时写数据。
- 生产者-消费者问题
- 生产者进程产生信息给消费者进程消费。为了允许生产者进程和消费者进程能并发执行,需要一个缓冲在二者共享区域内,消费者的消费和生产者的生产同步进行。
无限缓冲:消费者可能不得不等待新的项,生产者生产无限制
有限缓冲:必须同步,都受限制。共享缓冲的逻辑指针in和out相等即缓存为空,(in+1)%buffer_size==out时缓存满。缓冲最大项数为Buffer_Size-1.
消息传递
优点:不需要避免冲突。安全。适合少量数据。
原理:消息传递工具提供两种操作:发和收。
- 直接/间接通信:直接通信:以pid通信,缺点是限制了进程定义的模块化,名称改变即失效。间接通信:为进程设立邮箱。
- 同步/异步通信:阻塞/非阻塞。当发送接受都为阻塞,收发者之间生成一个集合点(rendezvous)。使用阻塞时无需考虑生产消费问题,因为只有被接受才会生产,在接受时候只有一个可用。
- 自动/显式缓冲explicit buffering:队列实现有三种方法:
- 零容量(自动缓冲):队列最大长度为0.线路中无等待。需要必须阻塞发送,直到接受者收到消息。
- 有限容量:队列长度有限。如果线路满,必须阻塞发送者直到队列中空间可用为止。
- 无限容量:无论多少消息都可以等待,不阻塞发送者。