Skip to content

ch3 进程

3.1 进程的概念

  1. 进程
    • 执行中的应用程序
    • 进程不只是程序代码,还包括当前活动。包括文本段(代码段),数据段(包括全局变量),堆(运行期间动态分配的内存),栈(临时数据,如函数参数,返回地址和局部变量),还有程序计数器和处理器寄存器的支持。
    • 进程基本特征
    1. 并发性:多个进程实体同存在于内存中,能在一段时间内同时执行
    2. 动态性:进程由创建而产生,由调度而执行,因得不到资源而暂停执行,由撤销而消亡
    3. 独立性:进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位
    4. 异步性:进程按照独立的、不可预知的速度向前推进
    5. 结构特征:从结构上看,进程实体由程序段、数据段以及进程控制块(PCB)组成
  2. 进程与程序
    • 程序本身不是进程,程序只是被动实体,进程是活动实体(当一个可执行文件被装入内存时,程序才能成为进程)
    • 一个程序不能两次属于同一个进程。
  3. 进程状态及转换
    • 五个状态
    1. 新建(new)
    2. 就绪(ready)
    3. 运行(running)
    4. 等待(waiting)
    5. 终止(terminated)
    • 状态转换条件:一次只有一个进程可在一个处理器上运行,但是多个进程可处于就绪或等待状态 alt text
  4. 进程控制块(PCB)
    • PCB是系统为了管理进程设置的一个专门的数据结构,它用来记录进程的外部特征,描述进程的运动变化过程
  5. PCB的作用
    • 系统利用PCB来进行控制和管理进程
    • PCB是进程存在的唯一标志
    • 操作系统通过PCB而感知进程的存在
  6. PCB包含的信息
    • 进程状态
    • 程序计数器
    • CPU寄存器
    • CPU调度信息
    • 内存管理信息
    • 记账信息
    • I/O状态信息
  7. PCB表(决定了系统的并发度)
    • 系统把所有的PCB组织在一起,把它们放在内存的固定区域就构成了PCB表
    • 两种结构组织
    1. 连接结构(就绪链表,运行链表)
    2. 索引结构(不同状态的进程设置各自得的PCB索引表,表明再PCB表中的位置)
  8. 并发与并行
    • 并发:在某一时间段内任务交替执行
    • 并行:多个任务同时间执行

3.2 进程调度

  1. 调度队列
    • 三种重要队列:
    1. 作业队列(Job queue):系统中的所有进程
    2. 就绪队列(Ready queue):驻留在内存中,就绪的等待运行的进程
    3. 设备队列(Device queue):等待I/O设备的进程
  2. 长期调度策略(作业调度程序)
    • 从缓冲池中选择进程,并装入内存以准备执行
    • 特点:调度频率较低;可以控制系统多道程序度;平衡I/O设备与CPU的利用率(选择合理的包含I/O为主和CPU为主的进程的组合)
  3. 短期调度策略(CPU调度程序)
    • 从准备执行的进程中选择进程,并为之分配CPU
    • 特点:调度频繁;调度快慢影响CPU的利用率和系统吞吐量
  4. 中期调度策略(swapper)
    • 将程序从内存(或从CPU竞争)中移出来,从而降低多道程序设计的程度;之后程序能被重新调入内存,并从中断处继续执行。
  5. 三种调度程序的区别
    • 长期调度程序:执行的并不频繁,控制多道程序设计的程度,还能平衡I/O与CPU的利用率。
    • 短期调度程序:频繁的为CPU选择新进程,所以必须要快,它影响着CPU的利用率和系统吞吐量。
    • 中期调度程序:进程可换出,并在后来可被换入,一种交换(swapping)机制。
  6. 上下文切换
    • 将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务称为上下文切换。
    • CPU在进程间的切换由中断或系统调用引起,需要保存状态至原进程的PCB,然后再从新进程的PCB中获取状态
    • 上下文切换时间与硬件支持密切相关(多组寄存器集合vs单组寄存器集合)

3.3 进程操作

  1. 进程创建与进程树:父进程创建子进程。从root进程开始,操作系统中的进程像树一样延伸下去。
  2. 创建进程——系统调用fork()
    • 大多数系统根据一个唯一的进程标识符(process indentifier,PID)来识别进程,pid通常是一个整数值
    • fork()的要点:
      1. 内核为子进程做一个父进程的上下文拷贝,包括:复制父进程的PCB作为子进程的PCB;在新的地址空间复制一个父进程的拷贝
      2. 父进程和子进程在不同的地址空间上运行
    • 子进程和父进程共享子进程创建时的所有资源
    • 子进程在创建后与父进程是竞争关系,两个进程依据调度的规则分别执行
    • 总结:先继承,后分离
    • fork()的返回值:正确执行时父进程返回子进程的pid,子进程返回0;错误时返回-1
  3. 进程结束时的问题
    • 正常情况下子进程结束后会有父进程的资源,但是在有些时候子进程结束前,父进程已经结束或是没有出现wait()语句等待子进程结束,这时子进程就不可能被父进程处理了,需要操作系统解决。
    • 不同的系统有不同的处理方式,有的系统不允许子进程在没有父进程的情况下继续执行,而Linux和UNIX会交由1号进程(init)作为父进程回收这类子进程。

3.4 进程间通信(IPC)

  1. 进程协作(Cooperating Processes)的优点
    • 信息共享
    • 提高运算速度(多个处理单元&子任务并行执行)
    • 模块化
    • 方便
  2. 进程间通信的两种基本模式
    1. 消息传递(a)
    2. 共享内存(b) alt text
  3. 两种通信方式优缺点比较
    • 消息传递适用于交换较少量的数据;易于实现计算机之间的通信;但是速度慢(由于通过系统调用实现,需要内核介入)
    • 共享内存速度极快(仅在建立共享内存区域的时候需要系统调用)

3.5 例题