第 3 章 进程

  进程是现代分时操作系统的工作单元。

  进程是资源分配的基本单位。

  线程是程序执行的最小单位。

3.1 进程概念

3.1.1 进程

  进程是执行的程序,这是一种非正式的说法。进程不只是程序代码(也称文本段),进程还包括数据(程序计数器的值和处理器寄存器的内容等)、进程堆栈(包括临时数据,如函数参数、返回地址和局部变量)和数据段(包括全局变量)和堆。 

   内存中的进程

 3.1.2 进程状态

  新的(new):进程正在创建

  运行(running):指令正在执行

  等待(waitting):进程等待发生某个时间(如I/O完成或收到信号)

  就绪(ready):进程等待分派处理器

  终止(terminated):进程已经完成执行

 3.1.3 进程控制块

  操作系统内的每个进程表示,采用进程控制块(Progress Control Block,PCB),也称任务控制块。它包含于进程的相关信息:

  • 进程状态:新的、就绪、运行、等待、停止等;
  • 程序计数器:表示进程将要执行的下一个指令的地址;
  • CPU寄存器:包括累加器、索引寄存器、堆栈指针、通用寄存器和其他条件码信息寄存器。发生中断时,这些状态信息与程序计数器一起需要保存;
  • CPU调度信息:包括进程优先级、调度队列的指针和其他调度参数;
  • 内存管理信息:包括基地址和界限寄存器的值、页表或段表;
  • 记账信息:包括CPU时间、实际使用时间、时间期限、记账数据、作业或进程数量等;
  • I/O 状态信息:包括分配给进程的I/O设备列表等

3.1.4 线程

  ...

3.2 进程调度

  多道程序设计的目标是,无论何时都有进程运行,从而最大化CPU利用率。分时操作系统的目的是在进程间快速切换CPU,以便用户在程序运行时能与其交互。为了满足这些目的,程序调度器选择一个可用进程到CPU上执行。单处理系统不会具有多个正在运行的进程。

3.2.1 调度队列

  进程在进入系统时,会被加到作业队列(job queue),这个队列包括系统内的所有进程。

  驻留在内存中的、就绪的、等待运行的进程保存在就绪队列。

  等待特定 I/O 设备的进程列表被称为设备队列。每个设备都有自己的设备队列。

  最初,新进程被加到就绪队列中等待,知道被选中执行。当该进程被分配到CPU上执行时,一下时间可能发生:

  • 进程可能发出I/O请求,并被放到I/O队列。
  • 进程可能创建一个子进程,并等待其终止。
  • 进程可能由于中断而被强制释放CPU,重新回到就绪队列

  前面两种情况,进程最终会从等待状态切换到就绪状态,并放回到就绪队列。进程重复这一循环知道终止,然后会从所有队列中删除,其PGB和资源也被释放。

3.2.2 调度程序

  进程会在各种调度队列之间迁移,操作系统wield调度必须按一定方式从这些队列中选择进程。进程选择通过适当调度器或调度程序来执行。

  通常,对于批处理系统,提交的进程多于可以立即执行的进程,这些进程会被保存到大容量存储设备(通常为磁盘)的缓冲池中,以便执行。长期调度程序从该池中你那个选择程序,加到内存,以便执行。短期调度程序或CPU调度程序从准备执行的进程中选择进程,并分配CPU。

  这两种调度程序的主要区别是执行频率。

    短期调度进程必须经常为CPU选择新的进程。

    长期调度进程执行并不频繁。长期调度程序控制多道程序程度(内存中的进程数量)。长期调度程序进行认真的选择,应该选择I/O密集型和CPU密集型的合理进程组合。

  有的操作系统如分时操作系统可能引入一个额外的中期调度程序。思想是可将进程从内存中换入换出。

3.2.3 上下文切换

  当中断发生时,系统需要保存当前运行在CPU上的进程的上下文,以便在处理后能够恢复上下文,即先挂起进程,再恢复进程。进程上下文采用PGB表示。

  切换CPU到另一个进程需要保存当前进程状态和恢复另一个进程的状态,这个任务称为上下文切换。

3.3 进程运行

  大多数系统的进程能够并发执行,它们可以动态地创建和删除,因此操作系统必须提供机制,以创建进程和终止进程。

3.3.1 进程创建

  进程(父进程)在执行的过程可以创建多个子进程,从而形成进程树。

  大多数的操作系统对进程的识别采用的是唯一的进程识别符pid,通常是一个整数。

  进程创建新进程时,父进程可以与子进程并发执行;父进程等待子进程部分或全部子进程执行完。

3.4 进程间的通信

  操作系统的并发执行的程序可以是独立的也可以是协作的,与其他进程共享数据的是协作进程。允许进程协助的理由:信息共享、计算加速、模块化、方便。

  协助进程需要一种进程间的通信机制,以允许进程相互交换数据和信息。进程间通信有两种基本模型:共享内存和消息传递。

    共享内存模型会建立一块供协作进程共享的内存区域,进程提供向此共享区域读出或写入数据来交换信息。

    消息传递模型提供在协作进程间交换消息来通信。

  消息传递对交换较少的数据很有用,因为无需避免冲突。对于多核系统,消息传递的性能要优于共享内存。共享内存会有高速缓存一致性问题。

猜你喜欢

转载自www.cnblogs.com/astonc/p/12150702.html