一片自留地 UCB CS162(操作系统)L3-L4 进程、线程

magicyang · 2021年02月02日 · 1606 次阅读

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 总结

这两个章节相当的复杂,概念非常的多。

共收到 0 条回复 时间 点赞
magicyang 关闭了讨论 02月02日 17:05
magicyang 重新开启了讨论 02月02日 17:16
magicyang 关闭了讨论 02月03日 14:08
magicyang 重新开启了讨论 02月04日 13:13
magicyang 关闭了讨论 02月04日 13:40
magicyang 重新开启了讨论 02月04日 15:57
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册