L3,L4 网上只有 2019、2015 年的视频。本文是参考 2019 年的视频写的。
多程序运行需要考虑如下的问题:
操作系统中的调度单元是进程。
通过 PCB(Process Control block) 记录进程信息:
通过上下文切换,完成 cpu 的进程切换:
通过状态机维护进程/线程的状态:
切换的三种方式:
1.系统调用 2.中断 3.陷阱或异常
设计用户态和内核态的目的之一是需要对资源进行隔离,需要谨慎处理。
内核和用户分别维护自己的堆栈空间。
中断则是由软硬件协作完成。
关于中断,更多的是 ee 的范畴,这里只是一笔带过,个人估计 cs152 应该会说的更多,更清楚。
进程操作:
示例:
wait(&statues) 可以接收子进程 exit() 的返回结果。
需要注意的是
fork 后,进程的变量都会 copy 一遍,没有资源复用的情况
进程间可以通过 signal 进行通讯。
视频特别不好找,最后在 2019 年春季的 L5、L6 找到了对应内容。
内存分布:
Unix 提供了 pthread 的库,使用 thread 的时候,编译添加 -pthread
可以看到分发的第一步就是 RunThread.
这里的关键是要理解,线程是如何释放切换的。
内部事件和外部事件可以触发切换。
内部事件 Yeild
示例:
会在 s,t 来回切换。
看一下 thread 切换的示例:
外部事件
主要有两类:
中断和时钟
中断
时钟
说完分发流程,现在来看创建流程:
创建的流程就绕不过 TCB(Thread Control Block)
这里关注一下 ThreadRoot 的结构:
这里会调用 Call 方法去执行线程操作。
前面提过内部事件和外部事件可以触发 Thread 切换。
TCB 的数据由 os 持有。
TCB 和 PCB(Process Control Block) 的结构关系:
线程间的 memory 和 i/o 不是独立的,线程的效率比进程要高。
前面提到的 Thread 是由内核创建的,还有更轻量的 Thread--User level Threads.
其优缺点:
根据用户 Thread 和 kernel Thread 的对应关系,有如下的模型组合:
通常情况下推荐使用 Many-Many 的模型。
超线程:
这两个章节相当的复杂,概念非常的多。