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

💭 写在前面:本文将学习《深入理解计算机系统》的第六章 - 关于异常控制流和系统级 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 项处于活动状态
由 、用户帐户和命令名标识。
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]. []. . |
相关文章:
【CSAPP】进程 | 上下文切换 | 用户视角下的并发进程
💭 写在前面:本文将学习《深入理解计算机系统》的第六章 - 关于异常控制流和系统级 I/O 的 进程部分。CSAPP 是计算机科学经典教材《Computer Systems: A Programmers Perspective》的缩写,该教材由Randal E. Bryant和David R. OHallaron 合著…...
节流还在用JS吗?CSS也可以实现哦
函数节流是一个我们在项目开发中常用的优化手段,可以有效避免函数过于频繁的执行。一般函数节流用在scroll页面滚动,鼠标移动等。 为什么需要节流呢,因为触发一次事件就会执行一次事件,这样就形成了大量操作dom,会出现卡顿的情况…...
带你看看 TypeScript 5.0 的新特性
一、写在前面 TypeScript 5.0 已经于 2023 年 3 月 16 日发布了,带来了许多新功能,同时也在性能方面进行了优化,下面让我们来一起看看新版 TypeScript 中比较有重要的变化吧。 二、新特性 2-1、速度、包体积优化 首先是新版本性能的提升&…...
C语言预处理条件语句的 与或运算
C语言预处理条件语句的 与或运算 1.#ifdef 与或运算 #ifdef (MIN) && (MAX) ----------------------------错误使用 #if defined(MIN) && defined(MAX) ---------------- 正确使用 #ifdef (MIN) || (MAX) -----------------------------错误使用 …...
从零实现深度学习框架——学习率调整策略介绍
引言 本着“凡我不能创造的,我就不能理解”的思想,本系列文章会基于纯Python以及NumPy从零创建自己的深度学习框架,该框架类似PyTorch能实现自动求导。 要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不使用外部完备的框架前提下,实现我…...
系统架构:经典三层架构
引言 经典三层架构是分层架构中最原始最典型的分层模式,其他分层架构都是其变种或扩展,例如阿里的四层架构模式和DDD领域驱动模型。阿里的 四层架构模型在三层基础上增加了 Manager 层,从而形成变种四层模型;DDD架构则在顶层用户…...
数据结构--二叉树
目录1.树概念及结构1.1数的概念1.2数的表示2.二叉树概念及结构2.1二叉树的概念2.2数据结构中的二叉树2.3特殊的二叉树2.4二叉树的存储结构2.4.1顺序存储2.4.2链式存储2.5二叉树的性质3.堆的概念及结构3.1堆的实现3.1.1堆的创建3.1.2堆的插入3.1.3堆顶的删除3.1.4堆的代码实现3.…...
Keil5安装和使用小记
随着keil版本的更新,一些使用问题一随之产生。本文针对安装目前最新版本keil软件和使用问题做一些总结。 目录1 Keil5下载&安装1.1 官网下载链接1.2 软件安装1.2.1 安装说明1.2.2 关于 51 和 ARM 共存的问题1.3 软件破解2 pack包安装 & 破解2.1 下载2.2 安装…...
多机器人集群网络通信协议分析
本文讨论的是多机器人网络通信各层的情况和协议。 每个机器人连接一个数据传输通信模块(以下简称为数传,也泛指市面上的图传或图数一体的通信模块),数传之间进行组网来传递信息。 根据ISO的划分,网络通信的OSI模型分…...
【PyTorch】手把手带你快速搭建PyTorch神经网络
手把手带你快速搭建PyTorch神经网络1. 定义一个Class2. 使用上面定义的Class3. 执行正向传播过程4. 总结顺序相关资料话不多说,直接上代码1. 定义一个Class 如果要做一个神经网络模型,首先要定义一个Class,继承nn.Module,也就是i…...
【完整代码】用HTML/CSS制作一个美观的个人简介网页
【完整代码】用HTML/CSS制作一个美观的个人简介网页整体结构完整代码用HTML/CSS制作一个美观的个人简介网页——学习周记1HELLO!大家好,由于《用HTML/CSS制作一个美观的个人简介网页》这篇笔记有幸被很多伙伴关注,于是特意去找了之前写的完整…...
Java分布式事务(九)
文章目录🔥XA强一致性分布式事务实战_Atomikos介绍🔥XA强一致性分布式事务实战_业务说明🔥XA强一致性分布式事务实战_项目搭建🔥XA强一致性分布式事务实战_多数据源实现🔥XA强一致性分布式事务实战_业务层实现…...
基于深度学习的动物识别系统(YOLOv5清新界面版,Python代码)
摘要:动物识别系统用于识别和统计常见动物数量,通过深度学习技术检测日常几种动物图像识别,支持图片、视频和摄像头画面等形式。在介绍算法原理的同时,给出Python的实现代码、训练数据集以及PyQt的UI界面。动物识别系统主要用于常…...
K8S集群之-ETCD集群监控
### 生产ETCD集群监控核心指标 etcd服务存活状态 up{job~"kubernetes-etcd.*"}0 说明:up0代表服务挂掉 etcd是否有脱离情况 etcd_server_has_leader{job~"kubernetes-etcd.*"}0 说明:每个instance,该值应该都…...
一文弄懂熵、交叉熵和kl散度(相对熵)
一个系统中事件发生的概率越大,也就是其确定性越大,则其包含的信息量越少,可以认为一个事件的信息量就是该事件发生难度的度量,事件所包含的信息量越大则其发生的难度越大。并且相互独立的事件,信息量具有可加性。相互…...
10从零开始学Java之开发Java必备软件Intellij idea的安装配置与使用
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者前言壹哥在前面的文章中,带大家下载、安装、配置了Eclipse这个更好用的IDE开发工具,并教会了大家如何在Ecli…...
04 - 进程参数编程
---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接:(更新中)Linux系统编程训练营 - 目录 文章目录1. 问题1.1 再论execve(...)1.2 main函数(默认进程入口)1.3 进程空间概要图1.4 编程实验:进程参数剖析1…...
【python进阶】你真的懂元组吗?不仅是“不可变的列表”
📚引言 🙋♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅,…...
《C++ Primer Plus》(第6版)第13章编程练习
《C Primer Plus》(第6版)第13章编程练习《C Primer Plus》(第6版)第13章编程练习1. Cd类2. 使用动态内存分配重做练习13. baseDMA、lacksDMA、hasDMA类4. Port类和VintagePort类《C Primer Plus》(第6版)第…...
【多线程】多线程案例
✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:we can not judge the value of a moment until it becomes a memory. 目 录🍝一. 单例模式🍤1. 饿汉模式实现🦪2. 懒汉模…...
2026届必备的五大AI辅助写作方案推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在人工智能技术参与进来之后,学术论文写作在效率方面有了明显的大幅提升…...
JDK 17 + Spring Boot 3.5.8:企业级开发技术栈全景分析
JDK 17与Spring Boot 3.5.8的核心特性JDK 17 LTS特性 JDK 17作为长期支持版本(LTS),提供多项生产级增强:密封类(Sealed Classes):通过sealed和permits关键字限制类的继承关系,增强领…...
手把手教你用PyTorch复现YOLOv8的Pose Head:从零搭建关键点检测模块
手把手教你用PyTorch复现YOLOv8的Pose Head:从零搭建关键点检测模块 在计算机视觉领域,目标检测与姿态估计的结合正成为工业界和学术界的热点。YOLOv8作为YOLO系列的最新成员,其姿态估计模块(Pose Head)的设计尤为精妙…...
intv_ai_mk11 GPU部署教程:A10显卡下intv_ai_mk11服务健康检查脚本编写与自动化监控
intv_ai_mk11 GPU部署教程:A10显卡下intv_ai_mk11服务健康检查脚本编写与自动化监控 1. 环境准备与快速部署 在开始编写健康检查脚本之前,我们需要确保intv_ai_mk11服务已经正确部署在A10显卡服务器上。以下是快速部署步骤: 系统要求&#…...
小白必看:霜儿-汉服-造相Z-Turbo从部署到出图全流程解析
小白必看:霜儿-汉服-造相Z-Turbo从部署到出图全流程解析 1. 镜像简介与核心优势 霜儿-汉服-造相Z-Turbo是一款专为汉服写真生成优化的AI模型镜像,基于Xinference框架部署,通过Gradio提供简洁易用的Web界面。与通用文生图模型相比࿰…...
VBA数据库解决方案第二十九讲 如何批量修改数据库中的数据
《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…...
STM32智能剪枝机:嵌入式系统与传感器集成实践
1. 项目背景与需求分析作为一名从事嵌入式开发多年的工程师,我最近完成了一个基于STM32的智能绿化带剪枝机项目。这个项目的初衷源于我在城市公园散步时的观察:园艺工人手持笨重的剪枝工具,在烈日下长时间弯腰作业,不仅效率低下&a…...
GLM-4.1V-9B-Base应用场景:零售货架图像识别与SKU自动盘点方案
GLM-4.1V-9B-Base应用场景:零售货架图像识别与SKU自动盘点方案 1. 零售行业面临的库存管理挑战 走进任何一家超市或便利店,你都会看到整齐排列的商品货架。但你可能不知道的是,这些看似简单的货架背后隐藏着一个巨大的管理难题 - 库存盘点。…...
Seeed rpcBLE库:RTL8720DN平台的Arduino兼容BLE开发方案
1. 项目概述 Seeed Arduino rpcBLE 是一款面向嵌入式开发者的轻量级蓝牙低功耗(BLE)软件库,专为基于 Realtek RTL8720DN SoC 的 Seeed Studio 开发板(如 Wio Terminal、Wio-E5、W600 系列)设计。该库并非从零实现 BLE…...
STM32与LoRa实现高压线缆智能监控方案
1. 项目概述高压线缆间隔棒监控装置是一个典型的工业物联网应用案例,它完美展现了如何将嵌入式系统与无线通信技术结合解决传统行业的痛点问题。作为一名在电力监控领域工作多年的工程师,我深知人工巡检高压线路的种种不便——不仅效率低下,而…...
