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