编程知识 cdmana.com

操作系统概念第三章——进程

操作系统概念第三章——进程

概念

进程

进程是执行中的程序,这只是非正式的说法。进程不只是程序代码,程序代码称为文本段(代码段),还包括当前活动,通过程序计数器的值和处理器寄存器的内容来表示。此外,进程还包括进程堆栈段(临时数据、函数参数、局部变量、地址)和数据段(包括全全局变量。还可能包括堆(leap),是在进程运行期间动态分配内存。

程序是被动实体,如存储在磁盘上包含一系列指令的文件内容(可执行文件),而进程是一个活动实体,他有一个程序计数器来表示下一个要执行的命令和相关资源集合。

虽然两个进程可以与同一程序相关,如同一用户调用的不同web浏览器副本,但他们是独立的进程。尽管代码段相同的,但数据段、堆栈等却不同。

进程状态

进程状态:

  • 新的:进程正在被创建
  • 运行:指令正在被执行
  • 等待:进程等待某个事件的发生(如I/O完成或受到信号)
  • 就绪 :进程等待分配处理器
  • 终止 :进程完成执行

一次只有一个进程可以在一个处理器上运行,但多个进程可以处于就绪或等待状态。

进程控制块

进程在操作系统内用进程控制块(process control block,PCB)来表示,PCB包含了进程状态、程序计数器、cpu寄存器、cpu调度信息、内存管理信息、记账信息、I/O状态信息等信息。

进程状态: 状态可包括新的,就绪,运行,等待,终止等。 程序计数器 : 计数器表示进程要执行的下个指令的地址。 CPU寄存器: 与程序计数器一起,这些寄存器的状态信息在出现中断时也需要保存,以便进程以后能正确的执行。 CPU调度信息:这类信息包括进程优先级、调度队列指针和其他调度参数。 内存管理信息:根据内存系统,这类信息包括基址和界限寄存器的值,页表或段表。 记账信息:这类信息包括CPU时间、实际使用时间、时间界限、记账数据、作业或进程数量等。 I/O状态信息:这类信息包含分配给进程的I/O设备列表、打开的文件列表等。

进程调度

多道程序设计的目的是无论何时都有进程执行,从而使cpu利用率达到最大。分时系统的目的是在进程之间快速切换cpu以便用户在程序运行时能与其进行交互。为达到这一目的,进程调度选择一个可用的进程到cpu上执行。单处理器系统从不会有超过一个进程在执行。如果有多个进程,那么余下的则需要等待CPU空闲并且重新调度。

调度队列

进程进入系统时被加入到作业队列中,该队列包含系统中所有进程。驻留在内存中等待运行的程序保存在就绪队列中,该队列常用链表来实现,其头节点指向链表的第一个和最后一个PCB块的指针。每个PCB包括一个指向就绪队列的下一个PCB的指针域。

在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB,还包含有指向父进程和子进程的指针。例如,进程的状态就是通过这个结构中的long state字段来表示的。

在Linux内核里,所有活动的进程是通过一个名为task_struct的双向链表来表示的,内核为当前正在运行的进程保存了一个指针。

如内核想把当前运行的进程状态值修改成 new_state。如果current是指向当前进程的指针,则:

`current -> state = new_state;“

操作系统也有其他队列。等待特定IO设备的进程列表称为设备队列。每个设备都有自己的设备队列。

新进程开始处于就绪队列,它就在就绪队列中等待直到被选中执行或被派遣。当进程分配到cpu执行时,可能发生:

a.进程发出一个IO请求,并放到IO队列中。

b.进程创建新的子进程,并等待其结束

c.进程由于中断而强制释放cpu,并被放回到就绪队列中

对于前两种情况,进程最终从等待状态切换到就绪状态,并放回到就绪队列中。进程继续这一循环直到终止,到那时它将从所有队列中删除,其PCB和资源将得以释放。

调度程序

进程会在各种调度队列之间迁移,为了调度,操作系统必须按某种方式从这些队列中选择进程。进程的选择是由相应的调度程序(scheduler)来执行的。

通常批处理系统中,进程更多的是被提交,而不是马上执行。这些进程通常放到磁盘的缓冲池里,以便以后执行。长期调度程序作业调度程序从该池中选择进程,并装入内存以准备执行。短期调度程序cpu调度程序从准备执行的进程中选择进程,并为之分配cpu。

这两个调度程序的主要差别是调度的频率。

短期调度程序通常100ms至少执行一次,由于每次执行之间的时间较短,短期调度程序必须要快。

长期调度程序执行的并不频繁,所以长期调度程序能使用更多的时间来选择执行进程。长期调度程序控制多道程序设计的程度(内存中进程的数量)。长期调度程序必须仔细选择执行进程。通常,绝大多数进程可分为:I/O为主或CPU为主。I/O为主的进程通常执行I/O方面比执行计算花费更多时间,另一方面,CPU为主的进程很少产生I/O请求。为使系统达到平衡和更好的性能,长期调度程序应当选择一个合理的包含IO为主的和cpu为主的组合进程以充分使用设备和短期调度程序。

对于Linux和Windows系统通常没有长期调度程序,这些系统的稳定性依赖于物理限制,如果系统性能下降很多,会有用户的退出。

有的系统如分时系统,可能引入中期调度程序,其核心思想是能够将进程从内存中移出,从而降低多道程序设计的程度,之后进程可以被换入。

上下文切换

中断使CPU从当前任务改变为运行内核子程序。当发生一个中断时,系统需要保存当前运行在CPU中进程的上下文,从而能在其处理完后恢复上下文。进程的上下文用PCB来表示。通常通过执行一个状态保存(state save)来保存cpu当前状态,之后执行一个状态恢复(state restore)重新开始运行。

将CPU切换到另一进程需要保存当前状态并恢复另一进程状态,这叫做上下文切换(context switch)。当发生上下文切换时,内核会将旧进程的状态保存在PCB中,然后装入经调度要执行的并已保存的新进程的上下文。

上下文切换时间是额外开销,因为切换时系统并不能做什么有用的工作。其切换时间与硬件支持密切相关。

详细参见:

https://blog.csdn.net/sunmc1204953974/article/details/45534217

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[种花家的奋斗兔]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1747158

Scroll to Top