操作系统如何管理程序运行?从线程、进程到内存隔离与用户态切换:CS162 Note2

这次介绍的是四大基本OS概念:Thread,Address Space,Process,Dual Mode Operation。这次的Note内容是对上一次Note的一些补充和扩展,比如对于Thread等概念进行了阐述。

Thread

在原课件中的定义是:

Thread: Single unique execution context:
Program Counter, Registers, Execution Flags, Stack, Memory State

这里就是在描述,线程是程序执行时的上下文,它完整描述着程序的状态:

  • Program Counter( PC )
  • Registers
  • Execution Flags
  • Stack
    知道上面这四样东西,就知道程序本身就正在处于什么状态。这也是为什么thread的核心不是代码本身,而是当前的执行状况。
    当一个thread正在某个core上执行的时候,它的状态是resident in processor registers,也就是寄存器保存了线程的根状态( 上下文 ):
  • PC在寄存器里
  • 寄存器内容就是它的执行状态
  • stack pointer也在寄存器里
  • CPU正在按照这个线程的上下文执行
    下面这张图展现了程序执行时真正的流程

Core单核跑多线程原理

原理很简单,因为OS在做`Time Multiplexing #Time_Multiplexing

如果我们以足够细的颗粒度来执行每个thread,就会看起来像是有很多虚拟CPU跑线程。在这个过程中也传递了PC,SP还有registers:

  • OS 保存 vCPU1 的 PC、SP、registers 到它的 TCB
  • OS 从 vCPU2 的 TCB 恢复 PC、SP、registers
  • CPU 跳转到 vCPU2 的 PC 开始执行
    OS通过时间复用( Time Multiplexing )让多个线程轮流占用物理core,于是每个线程都看起来像有一个自己的core。

需要提醒的是:thread本身就是virtual CPU

TCB

当thread不执行的时候,它的上下文就不会驻留在CPU里,而是保存到内存中,通常会保存在一个专门的数据结构里面:

  • TCB = Thread Control Block
    这也让线程可能处于两种位置:
  • 在物理核心上执行
  • 在内存中的TCB里被保存
    这也是线程是虚拟CPU的根本原因

Address Space

在原课件中的定义是:

Address space = the set of accessible addresses + associated state:
32 位:2322^{32}232地址
64 位:2642^{64}264地址

这句话表明的是地址空间是程序能够访问的地址集合,以及与这些地址相关的状态。注意不是简单的内存区域,与地址相关的状态涉及到了:

  • 哪些地址程序能读,哪些地址程序能写
  • 对这些地址访问有什么效果
    典型的地址空间布局如下图所示

地址空间这个概念存在的必要性,正是体现在限制程序可见和可访问的内存范围这一方面,确保每个程序只看到属于自己的那部分地址。
我们先前提及到的 #Time_Multiplexing,每个vCPU都有权限访问非CPU资源,每个线程都可以读写内存,这就导致了线程很有可能篡改OS的内容?也有可能篡改别的线程的内容?我们就思考硬件该怎么帮助OS免受进程的非法篡改?这就引出了B&B,是一种限制线程访问内存权限的方法

Base And Bound

这是一种很基础的机制,我们有两个register,分别是base register和bound register。程序发出的地址不会直接拿去访问物理内存,而是会先检查:

  • 是否在合法范围内
  • 或者和base做转换后是否落在允许的区域内( 段基址+偏移地址 )

Virtural Address Space

这是一种更一般的思想:

程序运行在一个和物理内存不同的地址空间里: 程序看到的是virtual address,真正访问的是physical address,中间要经过translation

这带来了两个巨大好处:

  • 程序看不到不该看的内存
  • 程序不再需要连续放在物理内存里

Paged Virtual Address Space

这是一种分页思想,把整个虚拟地址空间分成固定大小的块,同时把整个物理内存也切成同样大小的块,然后由硬件通过page table完成映射。
需要注意的是:

  • 每个 virtual page 可以映射到任意 physical frame
  • 页面大小固定,管理更方便
  • 如果某页不在内存里,访问会触发page fault
    其中虚拟地址可以看成<Page #> + <Page Offset>,其中<Page #>用来查page table,<Page Offset>直接保留,最后组合出了真实的physical address
    这是进程隔离最重要的底层机制之一

Process

原课件的定义:

execution environment with Restricted Rights

  • (Protected)Address Space with One or More Threads
  • Owns memory(address space)
  • Owns file descriptors, file system context, …
  • Encapsulate one or more threads sharing process resources

为什么需要Process这个定义?

  • Process彼此隔离
  • OS也需要被保护
  • 进程提供内存保护边界
    还需要注意的一点是进程内通信容易,进程间通信更难,原因也很简单:同一进程的多个线程共享很多资源;不同进程彼此隔离不共享Address Space,要通信就必须通过OS提供的机制

Single and Multithreaded Processes

为什么一个进程要有多个线程?

  1. Parallelism: 利用多核硬件并行执行
  2. Concurrrency: 更容易处理 I / O和多个同时发生的事件

PCB

每个Process有一个PCB,这可以看成thread在内核中的官方档案,TCB则更偏向于线程执行状态档案。TCB may be inside PCBPCB包含了:

  • 状态( running, ready, blocked )
  • registers状态
  • Process ID( PID ), User, Executbable, Priority
  • 执行时间
  • 内存空间和地址翻译信息

Protection And Isolation

我们再次回顾一下刚才放的一张图,这就是我们采取保护和隔离的目的

但是仅有地址空间隔离还不够,即使有page table/ address translation,为什么进程不能自己改page table ptr?为什么不能直接发I/O指令绕过OS?我们就必须再加上权限控制,这就引入了:Dual Mode Operation


Dual Mode Operation

Dual Mode Operation的含义是硬件至少提供两种模式: Kernel Mode和User Mode。User Mode权限受限,不能做敏感操作;Kernel Mode拥有完整硬件访问能力。
课件中列出的User mode不能做的东西包括:

  • changing the page table pointer
  • disabling interrupts
  • interacting directly with hardware
  • writing to kernel memory
    我们可以通过Unix System Structure的结构来理解Dual Mode Operation,下图所示的便是Unix。


User -> Kernel 的三种方式

Syscall

进程主动请求系统服务,比如:

  • exit
  • open
  • read
  • write

Interrupt

外部的异步事件触发,比如:

  • timer interrupt
  • I/O device interrupt

Trap/Exception

进程内部的同步异常触发,比如:

  • divide by 0
  • protection violation( segment fault )
    这是一种因为硬件/异常机制强制切换控制流

OS加载进程的真实过程

第一步: OS在kernel mode下准备进程

OS会在这一步设置一些基本的Base,Bound,user PC,other oregisters
需要注意的是B&B只有在sysmode = 1的时候才可以填写

第二步: RTU( Return to User )

OS执行返回User mode,开始从用户PC执行用户程序

第三步: 执行用户代码

此时程序运行在受保护的地址空间里,内核暂时放手

第四步: 内核重新拿回控制权

通过timer interrupt还有I/O request / interrupt还有exception / trap来重新拿回控制权,这在User -> Kernel是提及到过的

第五步: 发生中断后

硬件会:

  • 保存用户 PC
  • 切换到 kernel mode
  • 跳到 interrupt vector 对应的 handler

第六步: OS可能进行调度

如果决定换一个线程/进程来运行:

  • 就会选择保存当前thread到TCB
  • 恢复下一个thread的TCB
  • 再RTU

相关新闻

AI重构招聘逻辑:从信息过滤到决策力比拼

AI重构招聘逻辑:从信息过滤到决策力比拼

先讲一个我最近看到的现象&#xff1a;某家做智能招聘系统的公司&#xff0c;统计了上线AI初筛功能后六个月内客户的反馈数据&#xff0c;发现一个很有意思的结果——HR团队并没有因为“简历筛选自动化”而变得轻松&#xff0c;反而在“面试决策”环节花的平均时间增加了约37%。…

2026/10/20 6:34:37 阅读更多 →
从零搭建PPT自动化生成工具:内容与样式分离的工程实践

从零搭建PPT自动化生成工具:内容与样式分离的工程实践

1. 从零搭建一个PPT自动化生成工具&#xff0c;我为什么选了这个方向做演示文稿这件事&#xff0c;几乎每个职场人都躲不开。产品汇报、项目复盘、技术分享、培训课件&#xff0c;一年下来少说几十份。我身边不少朋友的做法是&#xff1a;找模板、复制粘贴、手动调格式&#xf…

2026/10/20 6:33:36 阅读更多 →
Linux Rootkit源码逐行解读:内核隐藏技术与检测实践

Linux Rootkit源码逐行解读:内核隐藏技术与检测实践

简介&#xff1a;这是一份面向Linux内核与系统安全初学者的rootkit源码包&#xff0c;体积精简但覆盖模块隐藏、进程隐藏等核心功能&#xff0c;适合用来理解LKM&#xff08;可加载内核模块&#xff09;的基本原理与常见反检测思路。包内共有46个文件&#xff0c;压缩后约36KB&…

2026/10/20 6:33:36 阅读更多 →

最新新闻

微服务商城对接支付宝支付:独立支付服务与异步回调实战

微服务商城对接支付宝支付:独立支付服务与异步回调实战

1. 支付服务在微服务架构里的定位做电商项目&#xff0c;前面把商品、库存、订单、用户这些服务都搭起来之后&#xff0c;早晚要面对一个绕不开的环节——支付。我这次在基于Vue和SpringCloudAlibaba的微服务商城项目里&#xff0c;把支付单独拆成了一个平台服务&#xff0c;专…

2026/10/20 7:12:54 阅读更多 →
前缀表达式求值:从右往左扫描的栈式算法详解

前缀表达式求值:从右往左扫描的栈式算法详解

这是一道很经典的数据结构题目&#xff0c;很多朋友在学栈和递归的时候都会遇到。我当年第一次做这题也卡了一阵子&#xff0c;倒不是代码写不出来&#xff0c;而是方向搞反了&#xff0c;一直在想怎么从左往右处理。后来想通前缀表达式的本质之后&#xff0c;代码其实就几行。…

2026/10/20 7:12:54 阅读更多 →
QoS原理与实战:从拥塞控制到带宽分配,一套完整的网络服务质量配置指南

QoS原理与实战:从拥塞控制到带宽分配,一套完整的网络服务质量配置指南

网络时不时卡顿、视频会议断断续续、后台同步任务把带宽占满&#xff0c;这种场景在现网里太常见了。QoS&#xff08;服务质量&#xff0c;Quality of Service&#xff09;就是专门用来处理这类问题的机制集合&#xff1a;在有限的带宽条件下&#xff0c;按业务的重要程度重新分…

2026/10/20 7:12:54 阅读更多 →
AI芯片软硬件协同设计:算子映射、指令集与存储调度

AI芯片软硬件协同设计:算子映射、指令集与存储调度

每个做AI加速器的团队&#xff0c;几乎都遇到过这种场景&#xff1a;硬件团队说MAC阵列利用率跑到了98%&#xff0c;软件团队盯着执行时间说这绝对没到预期&#xff0c;两边各拿出一套数据&#xff0c;结果谁都没错。问题就出在软硬件协同设计上&#xff0c;而且多半不是单点失…

2026/10/20 7:12:54 阅读更多 →
Delphi 11数据库界面增强:EhLib 10.0.031实战指南

Delphi 11数据库界面增强:EhLib 10.0.031实战指南

简介&#xff1a;EhLib 10.0.031 是一款专为 Delphi 11&#xff08;特别是 11.1.5 环境&#xff09;深度适配的高性能第三方组件库&#xff0c;面向中高级 Delphi 桌面与数据库应用开发者&#xff0c;显著提升图形处理、多源数据库交互、专业报表生成及数据可视化开发效率。资源…

2026/10/20 7:12:54 阅读更多 →
Repast多智能体建模实战:从SIR模型到Headless批量仿真

Repast多智能体建模实战:从SIR模型到Headless批量仿真

简介&#xff1a;一份针对 Repast 建模与仿真平台的英文原版教程与配套实例&#xff0c;面向社会科学、经济学及复杂系统领域的研究者&#xff0c;也适合希望快速上手多智能体仿真的学生和工程师。整个资源包内共包含72个文件&#xff0c;主体为66个HTML/HTM格式的教程页面&…

2026/10/20 7:11:54 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →