前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >操作系统-进程管理

操作系统-进程管理

作者头像
shysh95
发布2021-09-24 11:28:02
6250
发布2021-09-24 11:28:02
举报
文章被收录于专栏:shysh95

Hi~朋友,关注置顶防止错过消息

摘要

  1. 进程的概念
  2. 进程的状态
  3. 进程的控制结构
  4. 进程的控制
  5. CPU上下文切换
  6. 进程的上下文切换

进程的概念

什么是进程?

我们编写的代码在运行时会被加载到内存中,接着CPU会执行程序中的每一条指令,该程序就被成为进程。

并发和并行?

单核CPU虽然在某个瞬间只能运行一个进程,但在1秒钟内有可能会交替运行多个进程,这就是并发

并行是指多核CPU同时运行多个进程。

进程的状态

  • 创建状态:进程被创建以后的第一个状态
  • 就绪状态:进程创建初始化完成以后,等待获取CPU使用权的状态
  • 运行状态:进程被操作系统的调度器选中以后,CPU开始运行该进程
  • 结束状态:进程运行结束以后,从系统中消失时的状态
  • 阻塞状态:进程在等待某一事件发生(比如等待IO的完成)而暂停运行,此时的进程即使分配给他CPU使用权,他也无法运行

为什么会有挂起状态?

如果我们的系统中存在大量阻塞状态的进程,这些进程会占用着很多物理内存空间,所以在操作系统中,我们通常会把阻塞状态的进程的物理内存空间换出到磁盘,等到再次需要运行时,再从硬盘换出到物理内存

此时我们需要一个新的状态来描述进程没有实际占据物理内存空间的情况,该状态就是挂起状态

  • 阻塞挂起状态:进程在硬盘并且等待某个事件的出现
  • 就绪挂起状态:进程在磁盘,但只要被换入到内存,可以立即运行

进程的控制结构

操作系统中,使用进程控制块(PCB)数据结构来描述进程。

PCB中包含哪些信息?

  • 进程描述信息:进程标识符(标识各个进程),用户标识符(进程归属的用户)
  • 进程控制和管理信息:进程当前状态和进程优先级
  • 资源分配清单:内存地址和虚拟地址空间的信息,所打开的文件列表,所使用的I/O设备信息
  • CPU相关信息:CPU中各个寄存器的值,当进程发生切换时,CPU的状态信息就会被保存在PCB中,以便进程在恢复时能从断点处继续执行

如何保存PCB?

操作系统中的PCB通常以链表的方式进行组织,把相同状态的进程链在一起,组成队列。

除了链表的实现方式,还有索引的组织方式:将同一状态的进程组织在一个索引表中,索引表项指向对应的PCB,不同状态对应不同的索引表。

进程的控制

操作系统允许一个进程创建子进程,而且允许子进程继承父进程所拥有的资源,当子进程被终止时,其在父进程处继承的资源需要还给父进程。

创建进程

  1. 为新进程分配一个唯一的进程标识号,并申请一个空白的PCB,PCB是有限的,如果申请失败则创建失败
  2. 为进程分配资源,如果资源不足,进程会进入等待状态,以等待资源
  3. 初始化PCB
  4. 如果进程的调度队列能够接纳新进程,就将新进程插入就绪队列,等待调度运行

阻塞进程

当进程需要等待某一事件完成时,它可以调用阻塞语句把自己阻塞等待,阻塞的进程只能由另一个进程将它唤醒

  1. 找到将要被阻塞进程标识号对应的PCB
  2. 如果该进程是运行状态,需要保护其现场,将其状态转换为阻塞状态,停止运行
  3. 将该PCB插入到阻塞队列中去

唤醒进程

  1. 在该事件的阻塞队列中找到相应进程的PCB
  2. 将其从阻塞队列中移除,并将其状态修改为就绪状态
  3. 把PCB插入就绪等待队列,等待调度运行

终止进程

终止进程的方式主要有:

  • 正常结束
  • 异常结束
  • 外界干预(kill)
  1. 查找需要终止的进程的PCB
  2. 如果处于执行状态,立即终止该进程的执行,将CPU资源分配给其他进程
  3. 如果还有子进程,则需要将所有的子进程终止
  4. 将该进程所拥有的全部资源归还给父进程或操作系统
  5. 将其从PCB所在队列中删除

CPU上下文切换

在运行每一个任务时,CPU都需要知道任务从哪里加载,从哪里运行,因此操作系统需要先帮助CPU设置好CPU寄存器和程序计数器

CPU寄存器和程序计数器是运行任何任务(任务主要包括进程、线程和中断)必须依赖的环境,这些环境就成为CPU上下文

CPU上下文的切换就是把当前在运行的任务的CPU上下文保存起来,然后加载新任务的上下文到寄存器和程序计数器,然后跳转到程序计数器所指定的位置开始运行新任务。

保存下来的上下文信息,会在任务重新分配给CPU运行时进行重新加载,这样就能保证任务原来的状态不受影响。

根据任务的不同,CPU上下文切换分为:

  • 进程上下文切换
  • 线程上下文切换
  • 中断上下文切换

进程的上下文切换

多个进程之间是共享CPU的,为了让不同的进程可以在CPU上执行,就需要在进程之间进行切换,一个进程切换成另一个进程运行,称之为线程的上下文切换。

进程是由内核管理和调度的,因此进程的切换只能发生在内核态。

进程上下文切换的资源

  • 虚拟内存
  • 全局变量等用户空间资源
  • 内核堆栈
  • 寄存器等内核空间资源

上下文信息保存在哪?

通常需要保存的上下文信息都存储在进程的PCB中,当需要运行A进程时,就从A进程的PCB中获取上下文,然后加载到CPU中,这样A进程就可以运行了。

上下文的切换场景

  • CPU的时间片调度:为了保证所有进程可以得到公平调度,CPU时间被划分为时间片,时间片被轮流分配给各个进程。当进程的时间片消耗完以后,进程从运行状态变为就绪状态
  • 进程在系统资源不足时,需要等待资源满足以后才可以运行,这时进程会挂起,并由系统调度其他进程运行
  • 当进程通过sleep等函数将自己主动挂起时
  • 当优先级更高的进程运行时,低优先级的运行进程会被挂起
  • 当硬件发生中断时,CPU上的进程会被中断挂起,转而执行内核上的中断处理程序。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档