写在最前面:本篇文章参考哈工大操作系统课程。主要是对操作系统中多进程图谱的概述,为下几节内容做好铺垫。

CPU管理的直观想法

由cpu的管理引出了多进程图谱,进而带动其他硬件设备的管理。

CPU的使用

管理cpu之前首先要使用cpu,而管理的目的就是为了让cpu的使用更加高效。

如上图所示,CPU的工作原理取指-执行

即根据PC地址获取内存中存储的代码并解析执行之,同时累加读取后续代码进行下一步操作。

所以管理cpu的一个最直观的方法就是:设置好初PC地址

一个问题

到这里,有一个问题:CPU的利用率。我们以下面这个程序为例:

如图所示,一个含有IO指令的程序比之不含有IO指令的程序要慢很多。

所以我们就会面临一个问题:在执行IO指令时CPU要干什么,是等待还是执行其他程序

问题的解决

解决方法:多程序交替执行

上图可见,通过交替执行程序可以显著提高利用率。而利用率的提高不就是CPU管理的目的吗。

问:如何进行程序的交替执行呢?
答:通过修改PC指针即可完成。


新问题:只是修改寄存器PC就可以了吗

回答:。还需要记录信息切换前后程序的状态要保存

如图所示,进行查询的交替执行时不仅仅要进行PC的修改,还要保存好每一个程序的状态信息

因为运行中的程序与静态程序是不一样的,为此我们引入进程的概念。

进程的引入

进程就是正在执行的程序。而多进程的并发执行就是CPU管理的核心部分。

下面我们将接着进程的概念进行介绍,搭建起一个大概的多进程图像。

多进程图像

前面我们介绍了:为什么要有多进程
下面就要来看:操作系统如何实现多进程

什么是多进程图像

用户层面:多进程图像就是打开了多个应用程序
操作系统层面:多进程图像就是管理好这些进程,记录这些进程的状态信息、资源调度等,负责各个进程的推进。


系统的第一个进程

如图所示,就是一个多进程的例子:首先启动1号进程也就是shell进程,此进程通过fork()创建新的进程执行用户指令。一个进程执行完毕后可以通过exit()退出(shell进程不会退出)。

每执行一个任务都要启动一个进程,通过多个进程的推进实现计算机工作。


一个直观的画面:任务管理器

如图所示,我们的计算机中正在执行很多进程。 操作系统就是通过管理进程来管理计算机的使用

如何实现多进程图像

之后几个部分会详细介绍多进程图像的实现,这个部分主要是一个引子


多进程的组织方式:PCB+状态+队列

如图所示,进程有三个状态:运行态就绪态阻塞态

PCB放在不同的区域以标识进程的不同状态,这些区域叫做队列

通过进程状态的转换来实现进程的管理


多进程的交替实现:队列操作+调度+切换

我们以具体的代码来看多进程交替的实现思路,这也是并发的基本含义

一个很关键的函数:schedule()
其作用就是实现进程状态的转换,即pCurpNew的切换。

当然其中涉及到进程的调度问题也就是getNext

进程的调度是一个很复杂、深刻的问题,后面会专门拿出一个部分具体介绍,当然也是介绍一些简单的调度策略。

进程的切换也就是switch_to()

  • 首先这个函数实现了进程状态信息的保存,将pCur信息保存到对应的PCB中。
  • 之后实现进程的切换,即将pNew信息传入CPU中

多进程的相互影响:内存冲突问题

问题:多个进程的内存空间存在冲突。

解决方法:多进程的内存分离,通过映射表实现。(是后面内存管理的主要内容)


多进程的合作

通过下面几个例子来理解多进程之间的合作

共享数据多进程交替执行时可能会出现问题。
例如发生以下问题:

因为交替执行程序,可以导致共享变量的错误赋值,从而影响到整个程序的执行。

解决方法:进程同步

通过锁机制来实现进程的同步以实现进程的合理推进


一个总结:

第二部分主要是介绍一下多进程图像的组织与切换问题,为之后的学习打好基础。

下面我们也将根据上图介绍,用4个部分内容介绍多进程图像这一核心模块。