操作系统:进程与线程
进程的概念
为什么会有进程?
操作系统的设计目标之一是充分利用硬件资源,当有程序处于阻塞状态(如正在 I/O)时,CPU是闲下来的
自然而然地可以想到,为什么不让 CPU 先执行另一个程序等到这个程序 I/O 结束,再继续执行这个阻塞的程序呢?
另一方面,多用户操作系统使得计算机要能在不同用户执行的程序中来回切换
即管理 CPU 的方式应该是多道程序、交替执行(并发)
顺序执行一个程序,只需要置好 PC,CPU 就会取指执行
想要在进行中的程序间交替执行,不能只简单地改变 PC
交替执行的程序不同于顺序执行的程序,因此产生了进程的概念
进程,简单来说就是进行中的程序,
操作系统记录进程的信息,按照合理的次序推进(分配资源、进行调度)
CPU 的管理就是进程的管理,通过管理 PCB(Process Control Block,进程控制块)实现
每个进程的 PCB 中保存了这个进程切换所需的上下文,寄存器值、PC,等等
多进程的组织形式:PCB、进程的状态以及队列
一个正在执行的进程占用 CPU
其他就绪的进程在就绪队列中等待执行
有些进程在等待某些事件 如磁盘等待队列
多进程交替执行:队列操作、调度及切换
队列操作,比如,将一个进程的 PCB 由磁盘等待队列出队,挂到就绪队列队尾
调度:即进程调度,决定接下来 CPU 执行哪一个线程
切换:进程上下文的切换
进程对内存的使用
如果一个进程将中间结果存储在某个位置,另一个进程恰好也在该位置写入数据,那么就出事了
因此每个进程的内存空间应当是独立的
进程同步与合作
然而进程间常常需要合作,比如进程间通信,或者说两个进程共用一块内存
简单的说,两个进程同时修改同一个变量,可能丢失其中一个进程的修改结果
此时当保证进程同步,即合理的推进顺序(控制进程切换的时机)
因此多进程并发的状态应该关心一下几件事
- 读写 PCB
- 操作寄存器完成上下文切换
- 进程调度
- 进程的同步与合作
- 地址映射
操作系统多进程基本图像
线程的概念
如上,进程由 资源 + 指令序列 两部分组成,
因此进程既作为资源分配的单位,又可以作为调度和分派的单位
进程切换时,资源与指令序列都需要切换
那么,如果将资源和指令序列分开,一份资源对应多个指令序列,切换时仅切换指令序列
即 保留并发的优点,减小切换的代价
实质是,内存映射表不变、PC 等寄存器改变
一份资源对应多个指令序列是有实用价值的,比如 IDE,可以有一个线程用于显示,一个线程
负责处理输入,还有一个线程进行语法检查,它们确实使用同一块内存
线程即是轻量级的进程
它拥有最基本的资源(TCB(Thread Control Block,线程控制块)、PC、寄存器值、栈)
因此,线程作为调度和分派的基本单位
一个进程中可以有多个线程,这些线程共享进程的内存地址空间(可以访问任何一个虚地址)和资源(打开的文件、定时器、申请到的 I/O设备 等等),
进程间并发执行,一个进程中的多个线程间同样可以并发执行,但是不同进程中的线程进行切换时,也就发生了进程的切换
总结一下
进程作为资源分配的基本单位,线程作为调度、分派和独立运行的基本单位
线程是轻量级的进程,保留了并发性的优点,减小切换的代价(没有切换内存映射表)
线程只拥有能保证独立运行的资源,多个线程间共享该进程的内存地址空间和资源
不同进程间需要保持相当的独立性,而同一进程的不同线程间独立性低很多
进一步了解:用户级线程、内核级线程
2019/12/20