进程与线程
进程¶
进程实体¶
由代码段、相关数据和PCB组成



进程映像¶
- 每个进程的虚拟地址空间都是独立的,且每个进程都认为自己独占了整个主存空间。
- 为了把某个程序跑起来,需要在主存空间中划出一部分区域专门存放跑起来需要的东西,这段空间和空间里的东西就叫做进程映像。
下图中操作系统内核区也包含在了进程映像中,这里并非意味着每个进程都拥有内核,而是指的是只要访问这部分地址就代表着要申请内核服务。


进程状态¶
- 创建进程的原因主要有:用户登录、高级调度、系统处理用户程序的请求、用户程序的应用请求。
- 当系统调用执行完时,会导致CPU从内核态转为用户态。

进程控制¶
勘误:第二行是“为程序”,而不是“微程序”
- 图中提到撤销父进程时,也必须同时撤销所有的子进程是错误的,只是有些操作系统如此。在408考试中,当操作系统终止进程时,所有的进程资源(如内存空间、进程控制块、设备、打开文件、I/O缓冲区等)都会被释放,撤销父进程时,不一定会撤销所有的子进程。

- 决定这个主存能进多少个进程的是PCB空间。
进程通信¶

线程¶
基本概念¶
- 因为进程太大,调度起来开销大,因此开发了线程。
- 线程也称为轻量级进程,但并不是说所有线程都比进程小,主要是因为同进程内的线程之间切换不需要切换虚拟地址空间(页表),从而降低了开销。

实现方法¶
- 核心概念辨析
1. 用户级线程 (ULT) —— “操作系统的黑户”
- 管理者:完全由用户空间的线程库管理,操作系统(内核)感知不到它的存在。
- 调度者:线程库(运行在用户态)。
- 并发能力:极低。同一进程内的所有 ULT 只能被分配到一个 CPU 核心上运行。
2. 内核级线程 (KLT) —— “CPU 调度的基本单位 / 中间人”
- 管理者:操作系统内核直接管理,其线程控制块(TCB)存放在内核空间。
- 运行状态:既可以在用户态执行普通用户代码,也可以在发起系统调用后,切换到内核态执行内核代码。
-
并发能力:高。可以被内核分配到多个 CPU 核心上真正并行。
-
为什么切换开销有天壤之别?
-
内核级线程切换慢的原因: 因为 KLT 是归操作系统管的,它的“户口本”(TCB) 存放在内核空间。当进行线程切换时(无论是因为时间片耗尽触发的硬件中断,还是线程自己发起的系统调用),CPU 都必须切换到内核态,唤醒操作系统的调度程序来完成切换,然后再回到用户态。这种反复的权限状态翻转导致开销很大。
-
用户级线程切换快的原因: 因为操作系统根本看不到 ULT,它完全归我们应用程序里的线程库管。ULT 的切换纯粹是用户态代码里的“私下交接”,完全不需要惊动操作系统(不需要陷入内核),全程在用户态下完成,所以切换速度极快,开销极小。


CPU调度¶
进程调度¶
- 进程调度只是决定接下来谁上,把进程换上CPU是分派程序的任务。

调度时机¶

调度目标¶

调度算法¶



同步与互斥¶
同步机制准则¶

同步互斥机制¶
软件¶

单标志法因为只有进入临界区后才能该turn,因此如果进程不访问临界区了那另一个进程也没机会进临界区了。

- 以上四种都违背了让权等待,因为都有while;就算进不去临界区还是会占用CPU。
- flag是自己想要进入临界区,turn是谦让。
硬件¶

- Test-and-Set就是TS就是TSL
- 前两个都是在加锁,本质是一样的。
管程¶

把PV操作封装成对象的思想。!!但是,管程中的PV操作并没有对资源数目进行修改,这与普通的PV操作不同的一点!!
死锁¶
定义¶

产生死锁的必要条件¶

死锁的处理策略¶

-
死锁一定饥饿,饥饿不一定死锁。
-
死锁预防是最严苛的,直接破坏了四个条件之一,因此可以确保系统不发生死锁。
- 银行家算法并不能判断系统是否处于死锁状态。
- 限制用户申请资源顺序的只有死锁预防,如通过顺序分配资源来破坏循环等待。