美文网首页
《操作系统概念精要》基本概念整理之进程篇(一)

《操作系统概念精要》基本概念整理之进程篇(一)

作者: 小pb | 来源:发表于2019-10-29 11:06 被阅读0次

进程:

进程是执行的程序,这是一种非正式的说法。进程不只是程序代码,程序代码有时被成为文本段(text section)(或者代码段(code section))。进程还包括当前活动,如程序计数器的值和处理器寄存器的内容等。另外进程通常还包括:进程的堆栈(包括临时数据,比如函数参数,返回地址和局部变量)和数据段(全局变量,常量,静态变量),除此之外还有动态分配的内存(heap)。如图所示:

process_1.png

进程的状态

进程在执行时会改变状态。进程状态部分取决于进程的当前活动。
每个进程可能处于一下状态:

  1. 新的(new): 进程正在创建。
  2. 运行(running): 指令正在运行。
  3. 等待(waiting): 进程等待某个事件发生(如I/O完成或者某个信号)。
  4. 就绪(ready): 进程等待分配处理器。
  5. 终止(terminated) : 进程已经完成执行。

在这些状态中,一次只有一个进程可以在处理去上运行,但是许多进程可处于就绪或者等待状态。

他们的状态转移图如图所示:

process_state.png

进程控制块

操作系统内的每个进程都是由进程控制块(Process Control Block, PCB)来进行表示的。
PCB中包含了很多的特定的进程相关信息:

  • 进程状态(state): 状态可以包括,新的,就绪,运行,等待和停止。
  • 程序计数器(PC): 计数器表示进程将要执行的下一个指令的地址。CPU到进程和线程抽象的重要CPU物理寄存器。
  • CPU寄存器(CPU register): 根据计算机体系结构的不同,寄存器的类型和数量也会不同。包括累加器,索引寄存器,堆栈指针,通用寄存器和其他条件码信息寄存器。在发生终端时,这些状态信息和程序计数器一起保存到PCB中,一边进行上下文的切换。
  • CPU调度信息(CPU scheduling information): 这类信息包括进程的优先级和调度队列的指针和其他调度参数。
  • 内存管理制度(memory-management information): 根据操作系统使用的内存系统,这类信息可以包括基地址和界限寄存器的值,页表和段表。
  • 记账信息(accounting information):这类信息包括CPU时间,实际使用时间时间期限,作业和进程数量等。
  • I/O状态信息(I/O status information): 这类信息包括分配给进程的I/O设备列表,打开的文件列表。
PCB.png
在Linux中的进程表示:

linux 操作系统的进程控制块是采用C语言的结构体 task_struct 来表示,它位于内核的源代码目录内的头文件<linux/sched.h>。 这个结构体包含用于表示进程的所有必要信息,包括进程状态,调度和内存
管理信息,打开的文件列表,指向父进程的指针以及子进程,兄弟进程列表的指针。
具体的Linux进程相关的原来可以参考《Linux内核源码剖析》

进程的调度

调度队列

进程在进入系统时,会被加入作业队列(job queue),这个队列包括系统内所有的进程。除此之外,系统还有一个就绪队列。它保存了驻留在内存中的,就绪的,等待运行的进程, 一般是一个链表结构来实现的。其头节点有两个指针,用于指向链表的第一个和最后一个PCB块;每个PCB有个指针指向队列里的下一个PCB。
系统还有其他队列。当一个进程被分配了CPU以后,它执行了一段时间,最终退出,或被中断,或等待特定事件发生(I/O事件完成)。假设进程向一个共享设备发出请求,由于具有许多进程,磁盘可能忙于其他进程的I/O进程,因此该进程可能需要等待磁盘。等待I/O设备的进程列表,也被放到了一个队列中,这个队列就是设备队列。每个设备都有属于自己的设备队列。

ready_queue_device_queue.png

CPU的调度可以用下面的图进行来进行表示:


进程调度实际表示.png

进程从开始到进入系统到结束一般都是在这个图中进行的,

  1. 进程进入系统后,加入到就绪队列中,这时进程处于就绪状态。
  2. 进程被调入到CPU中后,就进入到了运行状态。
  3. 运行时需要访问I/O设备,进程被放入设备队列中,进入挂起状态(或者等待状态),直到I/O事件就绪后,在进入到就绪对列中。

调度程序

在上面的进程的整个生命周期中,进程会在各种调度队列中迁移。
操作系统为了调度必须按照一定的方式从这些队列中选择进程。进程选择通过调度程序(调度器)进行调度。
通常,对于有大量的需要执行进程的系统中。可能进程的任务不能全部加载到内存中,这个时候会有部分的进程保存在磁盘中。这部分磁盘的数据,他作为一个虚拟的内存池被称为虚拟内存
调度程序可以分为长期调度程序短期调度程序
长期调度程序 会把在磁盘上的进程加载到内存,把最近不会被执行的进程从内存中挪出。
短期调度程序(CPU调度程序) 从就绪队列中选择进程分配CPU。

为什么会有两个调度程序?
这两种调度程序的主要区别是执行效率。短期调度程序必须经常为CPU选择新的进程。长期调度程序执行并不频繁,但是它控制着内存中进程的数量,也就是并发进程的程度。
长期调度程序他会进行认真的选择。一般根据进程的类型分为:I/O密集型进程CPU密集型进程
如果所有进程都是I/O密集型进程,那么I/O设备队列一直都是满的,而就绪队列是空的,短期调度程序就一直处于空闲。
当所有进程都是CPU密集型进程,那么I/O 设备对列都是空的,I/O设备就没有得到使用。所以长期调度程序是保证系统使用CPU和I/O设备平衡的。

上下文切换

进程间的切换是由调度器完成的。它们进行切换的过程如图所示:


process_switch_context.png

其中状态保存和状态回复的这一个过程成为上下文切换
上下文的切换的时间与硬件支持是分不开的。

移动操作系统的多任务

由于移动设备的限制,早期版本的ios系统是不支持多任务的,但是在ios4 后,苹果系统编程的API中提供了多任务支持,允许前台程序(占用屏幕的程序)和后台程序(位于内存中,但不占用屏幕)。
但是也是有限制:

  • 运行单个,长度有限的任务(例如:通过网络完成下载内存);
  • 接受不了事件通知(如 新的电子邮件消息)
  • 可长时间运行的后台程序(如 音频播放器)
    由于电池寿命和内存的影响,Apple也可能会限制多任务。
    Android系统对后台运行的运行没有这种限制,如果一个应用程序必须后台处理,那么这个应用必须使用 服务,也就是后台进行运行的,必须是独立的组件。以音频流程序为例:如果程序后台运行,那么服务会为后台应用继续发送音频文件到音频设备驱动程序。服务没有用户界面,并且占用内存少,因此为移动环境提供更高效的多任务支持。

相关文章

网友评论

      本文标题:《操作系统概念精要》基本概念整理之进程篇(一)

      本文链接:https://www.haomeiwen.com/subject/qbqwvctx.html