【CSAPP】进程 | 上下文切换 | 用户视角下的并发进程

avatar
作者
猴君
阅读量:0

 💭 写在前面:本文将学习《深入理解计算机系统》的第六章 - 关于异常控制流和系统级 I/O 的 进程部分。CSAPP 是计算机科学经典教材《Computer Systems: A Programmer's Perspective》的缩写,该教材由Randal E. Bryant和David R. O'Hallaron 合著。

📜 本章目录:

0x00 进程(Processes)

0x01 假象:多个进程同时运行(Illusion: Multiprocessing)

0x02 真相:上下文切换(Reality: Context Switching)

0x03 在单处理器中的上下文切换

0x04 在多处理器 / 多核下的上下文切换

0x05 用户视角下的并发进程(User View of Concurrent Processes)

0x06 内核是如何控制的?


0x00 进程(Processes)

"Definition: A process is an instance of a running program"

📚 定义:进程是正在运行的程序的实例。

可以这么说:当可执行文件被加载到内存中时,该程序就成为了一个进程。

  • 进程可谓是计算机科学中最成功的想法之一。
  • 不同于 "程序" 或 "处理器"。
  • 进程具有程序执行的上下文(状态)的能力。

进程为每个程序提供了两个关键抽象:

逻辑控制流 (Logical control flow):

  • 每个进程 "似乎" 都有自己的 CPU。
  • 由称为上下文切换 (virtual memory) 的内核机制提供。

私有地址空间 (Private address space)

  • 每个进程 "似乎" 都独占内存 (memory)。
  • 由称为虚拟内存 (virtual memory) 的内核机制提供。

0x01 假象:多个进程同时运行(Illusion: Multiprocessing)

 计算机同时运行多个进程,好像每个进程都有一对专用的 CPU 和内存。

  • 一个或多个用户的应用程序(Web 浏览器、编辑器等)
  • 后台任务(监控网络和 I/O 设备)

💭 讲个故事来理解:

《重生之我是财阀老板私生子》

韩国某个财阀老板非常滴有钱,他有 3 个私生子,每个私生子都并不知道对方的存在,他们都以为自己是独生子。因为他们彼此不知道对方的存在,所以他们在生活和工作上也没有交集,不会有任何互相的影响(这就是独立性的体现)。财阀老板为了维护自己的独立性:

他就对大儿子说:"儿子,你好好学习,以后老爹钱都是你的。",大儿子一听卧槽真好,高枕无忧,就好好学习,一想到自己以后有钱,就更想学习了。

然后又对二儿子说:"儿子,好好工作,等以后我就把公司给你。",二儿子一听热泪盈眶,于是就好好工作,等着将来有一天可以继承公司。

后来又对三儿子说:"儿子,你好好干活,等你长大老爹的家产交给你!",三儿子知道自己以后会继承老爹的所有财产,开心坏了,就努力的干活。

只要在财阀爹的可承受范围内,孩子要多少钱他都给多少钱,所以三个儿子自然都认为自己有很多钱。财阀老板给他的三个儿子画了一张虚拟的、不存在的大饼,让他们都能努力学习工作干活(这个步骤就是给他们分别建立了进程地址空间)。

上面的故事中,财阀老板就是操作系统,三个私生子就是进程,

财阀老板给他的三个儿子画的大饼,我们就称之为 "进程地址空间"。

所以,进程地址空间并不是物理上存在的概念,而是在逻辑上抽象的一个虚拟的空间。

财阀老板给三个私生子画饼,就是为了维护这三个私生子互相之间的独立性,

如果让私生子知道自己并不是唯一,那以后分割财产必然会造成矛盾,

对他来说自然就不是一件好事。所以,进程地址空间,就是就是给进程画的大饼。

进程地址空间 → 逻辑上抽象的概念 → 让每个进程都认为自己独占系统的所有资源

操作系统通过软件的方式,给进程提供一个软件视角,认为自己是独占系统的所有资源(内存)。

指令学习:在 Linux 服务器上运行 top 命令:

我们可以看到i,系统有 123 项任务,其中 2 项处于活动状态

\textrm{pid}、用户帐户和命令名标识。  

0x02 真相:上下文切换(Reality: Context Switching)

进程由驻留在内存中的共享 OS 代码块管理,我们称之为 内核 (kernel)。

注意:内核不是一个单独的进程,而是在进程之间运行并管理它们。

控制流通过 上下文切换 (context switch) 从一个进程传递到另一个进程。

0x03 在单处理器中的上下文切换

 

单个处理器同时执行多个进程:

  • 进程执行交错(多任务)
  • 由虚拟内存系统管理的地址空间
  • 为保存在内存中的非执行进程注册值

 

将当前寄存器保存在内存中。

安排下一个执行过程。

 加载保存的寄存器和切换地址空间(上下文切换)。

0x04 在多处理器 / 多核下的上下文切换

单个芯片上有多个 CPU,或单个 CPU 中的多个核心。

每个都可以执行一个单独的进程,内核调度进程到核心。

0x05 用户视角下的并发进程(User View of Concurrent Processes)

如果两个进程的执行在时间上重叠 (overlap),则两个进程同时运行,称之为 并发 concurrent

否则,它们将按顺序运行,在用户的视角下,A 和 B(或A和C)给我们的感觉是在同时运行:

真实情况是什么样的?在单个处理器中:

一次只能运行一个进程,进程 A 和 B 是交错的,所以给我们一种同时执行的错觉。

当我们有多个 CPU 同时实际运行多个进程时,我们称之为 并行 (parallelism)

注意并发和并行的细微区别!

并行:多个进程在多个 CPU 下分割,同时进行运行,我们称之为并行。
并发:多个进程在单个 CPU 下采用进程切换的方式,在一段时间内,让多个进程都得以推进,称之为并发。

下面我们来理解一下并行与并发。

一般服务器都是双 CPU 的,所以双 CPU 的系统是存在的,就会存在多个进程同时在跑的情况。

如果存在多个 CPU 的情况,任何一个时刻,都有可能有两个进程在同时被运行 —— 并行 

但我们大家接触的、用的笔记本电脑基本都是单核的,单 CPU 的任何时刻只允许一个进程运行。

我的电脑是单 CPU 的,但是我的电脑中有各种进程都可以在跑啊?怎么肥事啊?

它是怎么做到的呢?

不要认为进程一旦占有 CPU,就会一直执行到结束,才会释放 CPU 资源。

所以一直让它跑,直到进程执行完,是不存在的,我们遇到的大部分操作系统都是 分时 的!

操作系统会给每一个进程,在一次调度周期中,赋予一个 时间片 的概念。

例:一秒钟之内每一个进程至少要被调度20次,每一次调度就是自己代码得以推进的时候。

在一个时间段内,多个进程都会通过 "切换交叉" 的方式,当多个进程的代码,在一段时间内都得到推进 ——  并发

0x06 内核是如何控制的?

我们不会在程序中编写 "正在运行内核代码" ……

此外,还有另一种机制允许内核控制(我们已经学习过)

物理控制流 (Physical control flow)

📌 [ 笔者 ]   王亦优 📃 [ 更新 ]   2023.3.9 ❌ [ 勘误 ]   /* 暂无 */ 📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,               本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Computer Systems: A Programmer's Perspective (3rd Edition)

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!