线程——现代操作系统学习笔记

一、为什么引入线程?

1、如果是单线程进程,在进程中可能存在多种活动,如果当进程等待IO发生阻塞,那么其它部分就不能继续运行。引入线程可以进一步提高程序执行的并行能力。

2、进程的创建无非会增加内存以及CPU的负担,而线程属于轻量级的进程,更加容易创建于撤销。

二、线程的模型

1、进程包括资源与调度两个部分,而线程的模型则是分离了资源与调度。所有线程共享资源,线程与线程之间不像进程之间相互独立。线程之间可以互相修改,虽然这样做没有意义。

2、线程拥有寄存器以及栈、IP、以及状态。不拥有其他资源,只能享用进程的资源。进一步抽象,进程之于CPU好比于线程之于进程。进程共享机器的资源,线程共享进程的资源。

3、在多线程的情况下,进程通常会从当前某个单线程开始。然后调用thread_create创建新的线程,这个系统调用的参数专门指定了新线程要运行的过程名。因此对于线程而言,栈的存在时必要的,用于保存程序的返回点。

二、线程的深入理解

1、IEEE定义了线程的标准,大部分UNIX系统都支持这个标准,其中包括了一系列系统调用。POSIX(可移植操作系统接口——Portable Operating System Interface)线程。

2、在用户空间实现线程:

①从内核角度考虑,按照正常的方式管理,即单线程进程模型

②从用户角度考虑,进程需要有专门的线程表用于跟踪进程中的线程,这与内核中的线程表类似。

对于单线程内核而言,如果某个进程中的线程阻塞,而内核并不知道该进程是多线程进程,而把它当成单线程进程处理,结果就是导致整个进程阻塞,即其它线程阻塞。另外一种情况,当线程进行阻塞系统调用时,会放弃当前的CPU进入阻塞状态,那么与上述情况相同,该进程同样进入阻塞。

④如果一个线程开始执行,那么该进程中的其它线程就不能执行,除非第一个线程自动放弃CPU

3、在内核空间实现线程:

①由内核管理线程表

②不用考虑是否使用阻塞还是非阻塞系统调用。

4、混合使用

①每个进程使用一个或者多个内核级线程,通过复用与分解,进程与内核进行通信

三、线程调度

1、用户级线程调度:内核按照进程调度给进程分配CPU的使用,进程中的线程调度程序决定线程的调度。针对于线程数目很大的进程而言明显是不公平的,分配到每个线程上的CPU占用时间会变得很少。

2、内核级线程调度:内核把进程与线程同等看待

你可能感兴趣的:(现代操作系统学习笔记)