这是
操作系统进程
系列文章第三篇-操作系统线程描述文章是《操作系统-精髓与设计原理》学习笔记
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
关于进程的两个概念:
这两个概念是独立的,操作系统可以独立的处理。
现代操作系统通常把分派单位称为线程(或轻量级进程),拥有资源所有权的单位称为进程。
多线程是指操作系统在单个进程内支持多个并发执行路径的能力。每个进程中只有一个线程在执行的方法称为单线程方法。进程支持多个线程的情况被称作多线程。
在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位,与进程相关联的有:
在一个进程中,可能有一个或多个线程,每个线程有:
下图说明了进程和线程的区别:
在单线程模型中,进程的标出包括他的进程控制块和用户地址空间,以及在进程执行中管理调用/返回 行为的用户栈和内核栈。当进程被控制时,处理器寄存器被该进程锁控制;当进程不运行时,这些处理器寄存器的内容被保存。
在多线程环境中,进程仍然只有一个与之关联的进程控制块和用户地址空间。但是每个线程都有一个独立的栈,还有独立的控制块用于包含寄存器值、优先级和其他与线程相关的状态信息。
进程中的所有线程共享该进程的状态和资源,它们驻留在同一块地址空间中,并且可以访问到相同的数据。当一个线程改变了内存中的一个数据项时,其他线程在访问这一数据项时能够看到变化后的结果。
和进程一样,线程的关键状态有运行态、就绪态和阻塞态。挂起是进程级别的概念,一个进程被换出,它的所有线程都被换出。
有4个与线程状态改变相关的操作:
线程的实现可以分为两大类:用户级线程(User-Level Thread ULT)
和内核级线程(Kernel-Level Thread KLT)
。
在用户级线程和内核级线程使用时,通常有以下三种模式:
在一个纯粹的用户级线程程序中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。
使用用户级线程的优点:
使用用户级线程的缺点:
解决这两个问题有两种方式:
在一个纯粹的内合辑线程程序中,有关线程管理的所有工作都由内核完成。内核为进程及其内部的每个线程维护上下文信息。调度由内核基于线程完成。
使用内核级线程客服了用户级线程的两个基本缺陷。首先内核可以把同一个进程的多个线程调度到多个处理器;其次一个进程中的线程被阻塞,内核可以调度同一个进程的另一个线程。 主要缺点是:把控制从一个线程传送到同一个进程内的另一个线程是,需要内核的状态切换。
某些操作系统提供了一种组合的用户级/内核级线程设施。在组合的系统中,线程创建完全在用户空间中完成,线程的调度和同步也是在应用程序中进行。一个应用程序中的多个用户级线程被映射到一些(小于或等于用户级线程的数目)内核级线程上。开发者可以为特定的应用程序和处理器调节内核级线程的数目,以达到最佳结果。
Linux中的进程或任务由一个 task_struct
数据结构表示,这个数据结构包含了以下信息:
Linux 提供一种不区分进程和线程的解决方案,用户级线程被映射到内核级进程上。组成一个用户级进程的多个用户级线程被映射到共享同一组 ID 的多个 Linux 内核级进程上。这使得这些进程可以共享文件和内存等资源,使得同一组中的进程调度切换是不需要切换上下文。
在 Linux 中通过复制当前进程的属性可创建一个新进程。新进程被克隆出来,使得它可以共享资源。当两个进程共享相同虚拟内存时,它们可以被当做是一个进程中的线程。因此 Linux 中进程和线程没有区别。
最后,感谢女朋友支持和包容,比❤️
想了解以下内容可以在公号输入相应关键字获取历史文章: 公号&小程序
| 设计模式
| 并发&协程