OS ch4 threads

CH4 Threads & Concurrency

进程是资源分配的基本单位,线程是处理器调度的基本单位 ## 4.1 Overview 前面一节介绍了进程(process),在进程的基础上我们引入了线程的概念:我们可以把线程理解成一种轻量级的线程:其中的单位是每个进程的调度单位(最小单位(? 其实一个最小任务量的基本单位,看下面的这个例子:alt text

也就是说,线程相对于进程来说,更小,而且数据之间的传输更简单

对于线程概念的总结如下:alt text对于一个进程内的线程,其可以并发执行 每一个线程具有独立的stack和register,但是同一个进程下的线程可以访问、修改进程的code、data、操作系统资源,因此线程之间可以互相修改。

4.2 Multicore Programming

也就是多个处理器(core)处理多个系统的内容,这里有两个例子: 1. Concurrent Execution on a Single-core System:在一个单核处理器上,通过不断地快速在不同线程中切换,起到一种并发执行的效果 2. Parallel Execution on a Multicore System:就是在多个core上各做各的事情

4.3 Multithreading Models

线程的实现方式主要有以下的两种: 用户级线程 user-level thread以及 内核级线程 kernel-level thread 对于他们两个的解释: alt text也就是说,相当于用户级线程中的内容都是由程序自己运行和维护,上层的操作系统不知道,也没必要知道具体的实现细节 对于用户级进程,同一个进程中只能有一个线程运行;因此,如果这个进程被阻塞,那么相应的进程也被阻塞;用户级线程也不可以利用系统的多处理器,只有一个用户级线程可以被执行,看下面这个比喻alt textalt text后者的缺点是成本会高

alt text二者的一个区别是,前者如果一个线程发动系统调用导致阻塞那么整个进程都会阻塞,但是后者就不会这样。

multithreading models主要有以下的三种: 1. many-to-one model:就相当于前面说的用户级线程,其主要具有的特点如下:alt text对于线程的所有操作都在用户级进行和完成 这里稍微解释一下两个缺点:由于在操作系统内核的眼里,相当于只有一个线程,因此这样导致的一个最致命的缺点就是哪怕我有多个内核可以使用,由于限制实际上我只能一次分配一个内核给我的进程使用。,相当于我的线程在用户端切换,在内核眼里一直都只有一个线程;依旧一个阻塞,其他全阻塞

  1. one-to-one model:在这个时候,可以理解我的每一个内核线程和我的一个用户的线程对应,因此在内核态进行的操作就相当于对于我的用户级线程进行操作;因此这个模型的特点如下:alt text 这个和前面说的内核级进程有点像,优点:一个阻塞别的还是可以用 缺点:成本高(这个相当于,我每一个内核线程对应一个用户线程,一个阻塞直接拿别的来用就可以)
  2. many-to-many model: alt text我觉得可以理解为前面两种的一种平衡,这里需要注意内核的线程数量一定小于等于用户的线程数量,这里多个线程可以并发,也不会阻塞,综合了以上的优点
  3. two-level model:和多对多相比,其既有多对多的部分,又允许对于某一个用户线程和内核的绑定(相当于一对一+多对多)

对于上面线程知识的总结:alt text

4.4 thread libraries

线程库给程序员提供了创建和管理线程的apialt text 下面关注Windows thread library,其提供的是内核级别的线程库;在windows调用createthread()创建新的线程的时候,默认的初始状态是运行

而对于Pthreads,在类Linux系统中广泛使用,其可以提供用户以及内核级的线程

alt textJAVA,了解一下即可

4.5 隐式多线程

这是指处理器自动将单任务拆分成多个子任务,并且分配给多个核;这是由操作系统自动分配的alt text

fork:把大任务拆分成子任务;join:把得到的结果按顺序结合 这个fork-join的实现思路有点像分治法

4.6 thread issues(线程的一些问题)

这里首先重点回顾一下fork()和exec(): 1. fork():手上有一个父进程,现在要创建一个几乎相同的子进程,并且记住如下的两点内容:alt text 2. exec():exec() 用新程序替换当前进程的内存映像,但不创建新进程,其对于当前进程的影响如下:alt text

这里思考如下的两个问题:原来的进程中的某一个线程调用fork(),那么复制的进程是只有一个线程还是会保留原来的所有线程? 答案:POSIX规定只复制当前的线程,但是有的规定可以替换所有的;而exec()会强制终止原始程序的所有线程 alt text提前终止线程的两种方法:异步取消(可以随时及时取消进程)以及Deferred cancellation (线程在一系列固定的点检查,如果需要那么cancel掉) alt text“信号”是指通知一个进程某个时间发生的内容,对于多线程的进程来说,有多种可能;要么全发送,要么发给需要用这个信号的,要么选择一些进行发送…… alt text线程池:在进程开始的时候,创造一系列线程等着;需要请求的时候,调用一个;用完了放回去(这样更快;同时,可以用pool的大小来限制线程的数量)

alt text线程特有数据:虽然共享进程数据,但是一些线程会拥有线程特有数据

一些例题

alt text AC;要记住每个线程都有自己的寄存器信息,并且保存机器信息

alt text CB alt text BCC 11是因为,键盘是I/O设备,速度很慢,这里多线程并发没意义


OS ch4 threads
https://zrwrz.github.io/2025/11/18/OS-ch4-threads/
作者
zrw
发布于
2025年11月18日
许可协议