线程、对称多处理和微内核(OS 笔记)

到目前为止提出的进程的概念包含两个特点:

资源所有权 存放进程映像的虚拟地址空间

调度/执行 被执行和接受操作系统调度

上述两个特点是独立的,操作系统应该能够独立的处理他们。为了区分这两个特点,分派(接受调度)的单位通常被称为 线程 或者轻量级进程。而拥有资源所有权的单位通常仍称为进程或任务。现在,我们提出了线程的概念,并对二者加以了区分。

多线程

​ 多线程是指操作系统在单个进程内支持多个并发执行路径的能力。每个进程中只有一个线程(一条执行路径)在执行的传统方法称为单线程方法。

多线程单线程示意图:

线程、对称多处理和微内核(OS 笔记)

在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位。与进程相关联的有:

存放进程映像的虚拟地址空间

受保护地对处理器、其他进程、文件和 I/O 资源的访问

在一个进程中,可能有一个或多个线程,每个线程都有:

线程执行状态(执行,就绪等)

在未运行时保存的线程上下文:从某种意义上来讲,线程可以被看做进程内的一个被独立操作的程序计数器

一个执行栈

用于每个线程局部变量的静态储存空间

与进程内的其他线程共享的对进程的内存和资源的访问

线程和进程在进程管理角度的不同:

在单线程模型中(即并没有明确的线程概念),进程的表示包括他的进程控制块和用户地址空间,以及在进程执行中对例程调用和返回的行为的用户栈和内存栈。当进程正在运行时,处理器寄存器将被该进程所控制;当进程不运行时,这些处理器寄存器中的内容将被保存。在多线程环境中,进程仍只有一个与之关联的进程控制块和用户地址空间,但是每个线程都有一个独立的栈,该有独立的控制块用于包含寄存器的值、优先级和其他与线程相关的状态信息。

因此,进程中的所有线程共享进程的状态和资源。

如图:

线程、对称多处理和微内核(OS 笔记)

从性能方面考虑线程的优点:

在一个进程中创建一个新线程比创建一个新进程所需要的时间要少许多(约快10倍)

终止一个线程比终止一个进程花费的时间要少

同一个进程内线程间切换比进程间切换花费时间要少

线程提高了不同的执行程序间通信的效率。在大多数操作系统中,独立进程间的通信需要内核的介入,以提供保护和通信所需的机制。但在同一个进程中的线程共享内存和文件,无需调用内核就可以相互通信

因此,如果一个应用程序或函数被实现为一组相关的线程要比实现为一组分离的进程更高效。

使用线程比较常见的例子是服务器对于多个用户请求的响应,因为这涉及到频繁的创建和销毁任务操作。并且如果计算机具有多个处理器,那么同一进程的多个线程可以同时被多个处理器同时处理以提高效率。

另外,在单处理机中,为了简化在逻辑上完成若干项不同功能的程序的结构,线程也是有用的。

比如:

前台和后台工作

异步处理

执行速度

模块化程序结构

在支持线程的操作系统中,调度和分派是在线程基础上完成的。

线程的功能特性 线程状态

派生

阻塞

解除阻塞

结束

线程阻塞并不会导致拥有该线程的进程发生阻塞。不然便丧失了线程的灵活性。

线程同步

线程同步的问题和解决的技术和进程同步相同,将在之后的进程同步部分一起讨论。

用户级和内核级线程 用户级线程

​ 在一个纯粹的用户级线程程序中,有关线程管理的工作都由应用程序完成,内核意识不到线程的存在。程序默认是以一个单线程程序开始执行,如果需要使用多线程技术,那么用户必须使用一个多线程的例程库,通过多线程例程库实现对线程的创建、销毁和调度、恢复线程上下文等操作。此时可以认为线程库起到了类似操作系统管理进程时的作用。这些活动都发生在用户进程中,操作系统内核并不知道这一切。

还有一点需要注意的就是线程调度和进程调度的关系。

考虑一种情况,一个进程中有两个处于运行态的线程,某一时刻这个进程被操作系统设置为阻塞态,但是由于进程内部的线程对于操作系统是不可见的,所以进程中的线程对于管理他的线程库来说仍处于运行态,不过由于线程所在的进程被阻塞而暂停运行所以进程中的多线程例程库和他所管理的线程都会赞同运行。等到这个进程恢复运行时,线程继续恢复运行。对于内部的线程来说,进程的阻塞仿佛没有发生一样。

使用用户级线程的 优点

线程的切换不需要内核态特权,同时节省了内核态和用户态之间的状态转换时间

可以在应用程序内部定制自己的线程调度算法

用户级线程可以在任何操作系统中运行而不必对底层内核进行修改以支持用户级线程

缺点

用户级线程执行一个系统调用时,不仅这个线程会被阻塞,而且进程中所有的线程都会被阻塞

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwypyp.html