“线程的上下文是暂停后继续执行所需的状态。用户态暂停点包括用户PC、寄存器与用户栈;当线程停在内核服务内部,还要保存内核栈指针、恢复位置和调用约定要求保留的寄存器。进程的地址空间、文件表等资源…”
形式陈述
程序是指令和初始数据的描述;进程是操作系统管理的一次运行实例。本文把一个进程写成 (pid, AS, FD, threads, state):AS 是地址空间及访问权限,FD 是文件描述符表,threads 保存执行流,state 保存生命周期等内核记录。一个线程至少有自己的程序计数器、寄存器和调用栈;同进程线程共享本模型的 AS 与 FD。程序文件、进程、线程因而不是三个同义名称。
线程每次运行执行指令状态转移理路指令集的架构状态与转移Instruction-set architecture state · ISA state transition以 RV32I 的五条指令定义 PC、寄存器与字节内存的顺序转移,分开 ISA 契约和实现周期。,但指令中的地址先在当前地址空间内解释。对进程 P,地址空间可抽象为部分映射
其中 v 是虚地址,a 是读、写或取指,m 是用户态或内核态,p 是物理地址。同一个 v 在 P、Q 中可以得到不同 p;也可通过受控映射得到相同 p。隔离要求未经许可的进程不能直接读写对方资源,不要求所有物理字节永不共享。
贯穿模型 OS-16
本单元采用自定教学机 OS-16:单核,按字节寻址,虚地址和物理地址均16位;页面为256B,用户读写示例均为单字节。内核保留页表和控制记录,用户指令不能修改它们。地址空间身份在存活期间唯一;内存事件逐个完成,不模拟弱内存或投机时间。内核可睡眠,运行线程可被定时器抢占。
存储设备另有易失写缓存与稳定块区,每块256B;单块稳定写原子,跨块更新不原子。设备可乱序稳定普通写,但成功的flush必须使此前已提交到该队列的写全部稳定。掉电丢失寄存器、DRAM与设备易失缓存,保留稳定块。后文的页缓存、日志和恢复都沿用这张边界;它不是某款CPU、xv6或Linux的完整规格。
直觉
程序文件像可重复使用的配方,进程是一次带有自己的材料和工作台的制作过程。两个进程可以执行同一个程序而输入、堆、当前目录和打开文件都不同。内核维护这些归属,使每次恢复执行时都能找回正确的上下文。
“地址0x12AB”只给出了工作台上的位置,还没有说是哪一张工作台。把地址空间身份丢掉后比较指针数值,就像只凭两个文件中的行号都为12,断言它们指向同一段文字。
例子与边界
两个进程,相同虚地址
在OS-16中,P的虚页0x12映射到物理页0x30,Q的同一虚页映射到0x50。P读取0x12AB实际读0x30AB,值为7;Q读取0x12AB实际读0x50AB,值为9。P向该地址写11后,Q仍读9。若内核特意把Q该页也映射到0x30,则写入可被Q观察;这叫受控共享,需要并发访问时仍须选择同步协议。
同一进程两个线程则共享这份映射。线程A把寄存器r存成7,并不会改变线程B的r;A把共享地址0x12AB存成7,B随后读此地址则会得到7。独立寄存器、独立栈和共享堆可以同时成立;栈独立指使用不同地址区间,不表示其他线程绝对无法访问其中的合法地址。
fork复制运行实例,exec替换程序映像
POSIX.1-2024的fork成功后,父进程得到子PID,子进程在对应返回点得到0。私有内存初始内容相同,后续普通写独立;实现可采用写时复制理路fork的写时复制与页生命周期Copy-on-write fork · COW fork · 写时复制进程创建在父子私有内存语义下追踪PTE降权、引用计数、写故障复制、独占快路和退出释放,并核验分配失败不破坏旧状态。,无需立刻复制每个数据页。父子各有描述符表,但相应项可指向同一个打开文件描述,所以“进程独立”不意味着文件offset也独立。
同版本POSIX的exec函数族成功时以新程序映像替换调用进程的映像,PID继续存在,也不返回到旧程序的调用点。带close-on-exec标志的描述符会关闭,其余按接口保留;不能把exec描述为“创建另一个进程”。多线程fork的子进程只保留调用线程,锁状态会带来额外限制;本单元的fork轨迹限定为单线程进程。
推论与应用
退出使进程停止执行并释放内存、打开文件引用等资源;父进程还可能需要通过等待接口收取退出状态。因此“没有可运行线程”与“内核中已无该PID的任何记录”不是同一事件。OS-16把退出状态记录与已释放地址空间分开保存。
地址空间隔离由页表权限与翻译理路页表地址转换与访问权限Page table address translation · VPN PFN offset · 虚实地址转换由虚页号、页内偏移与PTE计算物理地址,分别检查驻留、访问类型和用户权限,并建立可检查的隔离不变量。落实,资源访问由系统调用理路陷阱入口与系统调用Trap and system call · 用户态与内核态把受控特权转移分成硬件入口、软件保存、参数验证与返回,区分普通call、缺页重试和调度切换。受控进入内核。这里的进程是OS资源对象;消息传递模型理路消息传递系统Message-passing system进程仅通过发送和接收消息交互的分布式模型。中的进程可以只是局部状态机,不承诺PID、页表或系统调用。抽象分布式进程甚至可由多个OS线程共同实现。
进程创建成本必须分项:建立内核记录与描述符表、构造地址空间元数据、复制或共享数据页、最终首次写触发的工作。只计fork返回前的复制字节会漏掉COW把成本推迟到未来写入的事实。
参考资料
- Cox、Kaashoek、Morris,xv6教材 rev5,2025-09-02,§1.1、§2.5。用于进程资源与受控执行的教学接口;OS-16为本文自定。
- The Open Group,POSIX.1-2024,fork、exec,父子返回、共享打开文件描述与程序映像替换。