操作系统OS/进程与线程/线程

news2024/10/6 8:22:00

进程和线程

进程

  • 进程实体(进程映像)由PCB、程序段和数据段组成,其中PCB是进程存在的唯一标志。

线程

  • 线程最直接的理解就是“轻量级进程”,它是一个基本的CPU执行单元,包含CPU现场(状态),也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
  • 引入线程后,进程只作为除CPU外的系统资源的分配单元,而线程则作为处理机的分配单元。一个进程内部有多个线程。

线程与进程的比较/属性/特点

0)多线程操作系统中的进程已不再是一个基本的执行实体,但它仍具有与执行相关的状态。所谓进程处于“执行”状态,实际上是指该进程中的某线程正在执行。

1) 调度。在传统的操作系统中(引入线程之前),拥有资源和独立调度的基本单位都是进程,每次调度都要进行上下文切换,开销较大。

在引入线程的操作系统中,线程是独立调度的基本单位, 而线程切换的代价远低于进程。在同一进程中,线程的切换不会引起进程切换。但从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。

什么是上下文切换?
在传统的操作系统中,进程是拥有资源和独立调度的基本单位。当一个进程在执行时,它拥有系统的全部资源,并且可以独立地执行任务。然而,当操作系统需要进行任务调度时,它需要将当前正在执行的进程的上下文(即该进程的程序计数器、寄存器状态、内存数据等)保存下来,然后加载下一个进程的上下文到系统中,这个过程就叫做上下文切换。

2) 并发性。在引入线程的操作系统中,不仅进程之间可以并发执行,而且一个进程中的多

个线程之间亦可并发执行,甚至不同进程中的线程也能并发执行,从而使操作系统具有

更好的并发性,提高了系统资源的利用率和系统的吞吐量

无论是进程还是线程,并发性的目的是为了提高系统资源的利用率和系统的吞吐量

3) 拥有资源。线程是进程中的一个实体,是被系统独立调度和分派的基本单位。进程是系统中拥有资源的基本单位,而线程不拥有系统资源(仅有一点必不可少、能保证独立运行的资源,比如:每个线程都有一个唯一的标识符和一个线程控制块,线程控制块记录了线程执行的寄存器和栈等在那个时刻的状态),但线程可以访问其隶属进程的系统资源,这主要表现在属于同一进程的所有线程都具有相同的地址空间。要知道,若线程也是拥有资源的单位,则切换线程就需要较大的时空开销,线程这个概念的提出就没有意义。

时空开销是指在进行进程或线程切换时,系统需要保存和恢复上下文信息以及分配和释放资源所需要的时间和空间。
如果线程也是拥有资源的单位,切换线程需要较大的时空开销,主要是因为线程的切换涉及到资源的分配和释放。而这些资源的分配和释放的进行需要时间以及系统的空间,所以加大了时空开销。

4) 独立性。每个进程都拥有独立的地址空间和资源,除了共享全局变量,不允许其他进程访问。某进程中的线程对其他进程不可见。同一进程中的不同线程是为了提高并发性及进行相互之间的合作而创建的,它们共享进程的地址空间和资源

5) 系统开销。在创建或撤销进程时,系统都要为之分配或回收进程控制块PCB及其他资源,如内存空间、I/O设备等。操作系统为此所付出的开销,明显大于创建或撤销线程时的开销。类似地,在进程切换时涉及进程上下文的切换,而线程切换时只需保存和设置少量寄存器内容,开销很小。此外,由于同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信非常容易实现,甚至无须操作系统的干预。

6) 支持多处理机系统。对于传统单线程进程,不管有多少处理机,进程只能运行在一个处理机上。对于多线程进程,可以将进程中的多个线程分配到多个处理机上执行。所以,一个多线程进程可以使用多个处理机,这些处理机分别是进程中的多个线程使用的。

7)不同的线程可以执行相同的程序。当某一个功能,被不同的用户或在不同的事件调用时,执行这个功能的线程可能是不同的。

8)线程是处理机的独立调度单位,多个线程是可以并发执行的。在单CPU的计算机系统中,

各线程可交替地占用CPU;在多CPU的计算机系统中,各线程可同时占用不同的CPU,

若各个CPU同时为一个进程内的各线程服务,则可缩短进程的处理时间。

9) 一个线程被创建后,便开始了它的生命周期,直至终止。线程在生命周期内会经历阻塞

态、就绪态和运行态等各种状态变化。

10)为什么线程的提出有利于提高系统并发性?

可以这样来理解:由于有了线程,线程切换时, 有可能会发生进程切换,也有可能不发生进程切换,平均而言每次切换所需的开销就变小了,因此能够让更多的线程参与并发,而不会影响到响应时间等问题。

线程的状态和转换

与进程一样,各线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。相应地,线程在运行时也具有下面三种基本状态。

  • 执行状态:线程己获得处理机而正在运行。
  • 就绪状态:线程已具备各种执行条件,只需再获得CPU便可立即执行。
  • 阻寒状态:线程在执行中因某事件受阻而处于暂停状态。

线程这三种基本状态之间的转换和进程基本状态之间的转换是一样的。

线程的组织与控制

  1. 线程控制块

与进程类似,系统也为每个线程配置一个线程控制块TCB,用于记录控制和管理线程的信息。

线程控制块通常包括:①线程标识符;②一组寄存器,包括程序计数器、状态寄存器和通用寄存器;③线程运行状态,用于描述线程正处于何种状态;④优先级;⑤线程专有存储区,线程切换时用于保存现场等;⑥堆栈指针,用于过程调用时保存局部变量及返回地址等。

同一进程中的所有线程都完全共享进程的地址空间和全局变量。各个线程都可以访问进程地

址空间的每个单元,所以一个线程可以读、写或甚至清除另一个线程的堆栈。

        2. 线程的创建

线程也是具有生命期的,它由创建而产生,由调度而执行,由终止而消亡。相应地,在操作系统中就有用于创建线程和终止线程的函数(或系统调用)。 用户程序启动时,通常仅有一个称为“初始化线程”的线程正在执行,其主要功能是用于创建新线程。在创建新线程时,需要利用一个线程创建函数,并提供相应的参数,如指向线程主程序的入口指针、堆栈的大小、线程优先级等。线程创建函数执行完后,将返回一个线程标识符。

        3. 线程的终止

当一个线程完成自己的任务后,或线程在运行中出现异常而要被强制终止时,由终止线程调用相应的函数执行终止操作。但是有些线程(主要是系统线程)一旦被建立,便一直运行而不会被终止。通常,线程被终止后并不立即释放它所占有的资源,只有当进程中的其他线程执行了分离函数后,被终止线程才与资源分离,此时的资源才能被其他线程利用。

被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。

线程的实现方式

  1. 用户级线程ULT
        在用户级线程中, 有关线程管理(创建 撤销和切换等)的所有工作都由应用程序在用户空
间中完成 内核意识不到线程的存在 应用程序可以通过使用线程库设计成多线程程序 通常
应用程序从单线程开始 在该线程中开始运行 在其运行的任何时刻 可以通过调用线程库中的
派生例程创建一个在相同进程中运行的新线程
        
        对于设置了用户级线程的系统, 其调度仍是以进程为单位进行的 各个进程轮流执行一个时
间片 假设进程 A 包含 1 个用户级线程 进程 B 包含 100 个用户级线程 这样 进程 A 中线程
的运行时间将是进程 B 中各线程运行时间的 100 因此对线程来说实质上是不公平的
        这种实现方式的优点如下: ①线程切换不需要转换到内核空间 节省了模式切换的开销 。②调 度算法可以是进程专用的 不同的进程可根据自身的需要 对自己的线程选择不同的调度算法。 ③用户级线程的实现与操作系统平台无关 对线程管理的代码是属于用户程序的一部分
这种实现方式的缺点如下 ①系统调用的阻塞问题 当线程执行一个系统调用时 ,不仅该线程被阻塞 而且进程内的所有线程都被阻塞 ②不能发挥多处理机的优势 内核每次分配给一个
进程的仅有一个 CPU, 因此进程中仅有一个线程能执行

        2. 内核级线程KLT

        在操作系统中, 无论是系统进程还是用户进程 都是在操作系统内核的支持下运行的 与内
核紧密相关 。内核级线程同样也是在内核的支持下运行的 线程管理的所有工作也是在内核空间
内实现的 内核空间也为每个内核级线程设置一个线程控制块, 内核根据该控制块感知某线程的
存在 并对其加以控制。
        这种实现方式的优点如下: ①能发挥多处理机的优势 内核能同时调度同一进程中的多个线
程并行执行 ②如果进程中的一个线程被阻塞 内核可以调度该进程中的其他线程占用处理机
也可运行其他进程中的线程 ③内核支持线程具有很小的数据结构和堆栈 线程切换比较快
销小 ④内核本身也可采用多线程技术 可以提高系统的执行速度和效率
        这种实现方式的缺点如下: 同一进程中的线程切换 需要从用户态转到核心态进行 系统开
销较大 这是因为用户进程的线程在用户态运行 而线程调度和管理是在内核实现的
        3. 组合方式
有些系统使用组合方式的多线程实现 在组合实现方式中 内核支持多个内核级线程的建立
调度和管理 同时允许用户程序建立 调度和管理用户级线程 一些内核级线程对应多个用户级
线程 这是用户级线程通过时分多路复用内核级线程实现的 同一进程中的多个线程可以同时在
多处理机上并行执行 且在阻塞一个线程时不需要将整个进程阻塞 所以组合方式能结合 KLT
ULT 的优点 并且克服各自的不足
        在线程实现方式的介绍中, 提到了通过线程库来创建和管理线程 线程犀 (thread library)
是为程序员提供创建和管理线程的 API 实现线程库主要的方法有如下两种
        ①在用户空间中提供一个没有内核支持的库 这种摩的所有代码和数据结构都位于用户空间
这意味着 调用库内的一个函数只导致用户空间中的一个本地函数的调用
        ②实现由操作系统直接支持的内核级的一个库 对于这种情况 库内的代码和数据结构位于
内核空间 调用库中的一个 API 函数通常会导致对内核的系统调用
目前使用的三种主要线程库是 POSIX Pthreads Windows APL、  Java.,
Pthreads 作为POSIX 标准的扩展 可以提供用户级或内核级的库 Windows API 是用于 Windows 系统的内核级线程库
Java 线程 API 允许线程在 Java 程序中直接创建和管理 由于 JVM 实例通常运行在宿主操作系统
之上 Java 线程 API 通常采用宿主系就的线程库来实现 因此在 Windows 系统中 Java 线程通常
采用 Windows API 来实现 在类 UNIX 系统中采用 Pthreads 来实现

多线程模型

有些系统同时支持用户线程和内核线程 由于用户级线程和内核级线程连接方式的不同
而形成了下面三种不同的多线程模型
1 ) 多对一模型 将多个用户级线程映射到一个内核级线程
这些用户线程 一般属于一个进程 线程的调度和管理在用户空间完成 仅当用户线程需要访问内核时, 才将其映射到一个内核级线程上 但是每次只允许一个线程进行映射
        优点: 线程管理是在用户空间进行的 因而效率比较高
        缺点: 如果一个线程在访问内核时发生阻塞 则整个进程都会被阻塞 在任何时刻 ,只 有一个线程能够访问内核 多个线程不能同时在多个处理机上运行
2) 一对一模型 将每个用户级线程映射到一个内核级线程
        优点:当一个线程被阻塞后 允许调度另一个线程运行 所以并发能力较强
        缺点: 每创建一个用户线程 相应地就需要创建一个内核线程 开销较大
3) 多对多模型 将n个用户线程映射到 m 个内核级线程上 要求 n>=m
特点 既克服了多对一模型并发度不高的缺点 又克服了一对一模型的一个用户进程占
用太多内核级线程而开销太大的缺点 此外 还拥有上述两种模型各自的优点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1217606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux系统化学习】探索进程的奥秘 | 第一个系统调用

个人主页点击直达:小白不是程序媛 Linux系列专栏:系统化学习Linux 目录 进程的概念 进程的管理 描述进程——pcb 组织进程 进程在排队 Linux下的进程 Linux组织进程 查看进程 查看可执行程序的进程 第一个系统调用 "杀掉进程" 进程…

一些有趣的迹象:“前端已死”难道要成真了?

移动互联网的兴起,传统行业的数字化转型,大前端技术的普及,随之而来的就是Vue为代表的前端框架和工具的兴起,前端开发的门槛降低。但发展,稳定,衰落是亘古不变的事物发展规律。 一些有趣的迹象 最近逛社区…

Linux发展史与环境安装

Linux发展史与环境安装 一、Linux发展史推动技术进步的基本模式理解操作系统的发展理解Linux操作系统的发展 一、Linux的环境安装 一、Linux发展史 Linux和window XX其实都是一样的,定位:操作系统,企业内部,要给用户提供“互联网…

C语言指针强制的本质

今天看到这样一段项目代码,某个函数传入了一个void类型的指针,并在函数内部将其强转为了某结构体类型指针,利用该指针获取结构体中变量之后,又将指针转换为char类型并偏移结构体大小的长度获取数据。代码如下 void recv_omu_data(…

为什么esp8266刷入了固件,无法接受AT指令

我遇到的解决方法是:是串口调试助手出了问题。所以需要更换一个串口调试助手软件。 上面这个就是我换了的软件 在开发的时候,经常会遇到软件故障,导致正确的方法,但是没有效果,好比以前用盗版的8.7版本的Proteus模拟…

Leetcode2760. 最长奇偶子数组

Every day a Leetcode 题目来源&#xff1a;2760. 最长奇偶子数组 解法1&#xff1a;模拟 代码&#xff1a; class Solution { public:int longestAlternatingSubarray(vector<int> &nums, int threshold){int n nums.size();int ans 0;for (int i 0; i <…

vue3基础学习(上)

##以前怎么玩的? ###MVC Model:Bean View:视图 Controller ##vue的ref reactive ref:必须是简单类型 reactive:必须不能是简单类型 ###创建一个Vue项目 npm init vuelatest ###生命周期 ###setup相关 ####Vue2的一些写法 -- options API ####Vue3的写法 组合式API Vu…

Elasticsearch基础增删改查

Elasticsearch是面向文档型数据库&#xff0c;一条数据在这里就是一个文档 倒排索引 正排(正向)索引&#xff1a; IDcontent01my name is zhangsan02my name is lisi 倒排索引&#xff1a; keywordIDname01,02zhang01 创建索引 创建索引等同于创建数据库 PUT具有幂等性&…

sqlserver配置管理器无法启动解决方案

在SQL server configuration manager配置管理器中遇到SQL server browser呈灰色&#xff0c;无法启动 右击选择属性 进入服务 将启动模式改为自动 可以启动了

Python大语言模型实战-利用MetaGPT框架自动开发一个游戏软件(附完整教程)

实现功能 MetaGPT是一个应用在软件开发领域的多智能体框架&#xff0c;其主要创新点在于将SOP标准流水线和Agent结合在了一起&#xff0c;使得拥有不同技能的Role之间配合完成一项较为复杂的任务。本文将用一个案例来演示整个流程。 实现代码 项目地址&#xff1a;https://gi…

3DMAX各种拼图建模插件集锦之“彩虹系列”

现实生活中我们随处可见各种重复的图案&#xff0c;例如地面上铺设的地砖&#xff0c;砌的砖墙石墙&#xff0c;覆盖着瓦片的屋顶&#xff0c;用作装饰的拼图图案等等&#xff0c;这些重复的拼图单体建模看似简单&#xff0c;但是大面积铺设&#xff0c;如果完全手动就有些费时…

FPGA——IP核 基础操作

FPGA——IP核 基础操作 IP核例化模块时钟IP核RAM IP核 IP核例化模块 找到模版 加入代码中 时钟IP核 配置模式功能 配置输入时钟 输出配置 RAM IP核

NSS [SWPUCTF 2022 新生赛]1z_unserialize

NSS [SWPUCTF 2022 新生赛]1z_unserialize 我敲&#xff0c;报恩题&#xff01; 直接用构造方法构造POC更改$lt和$lly <?php class lyh{public $lt;public $lly;function __construct(){$this->lt"system";$this->lly"tac /flag";} } $a new…

图片转换成base64格式的优缺点

文章目录 前言什么是base64? 一&#xff0c;优点二&#xff0c;缺点三&#xff0c;工具 前言 什么是base64? Base64&#xff0c;顾名思义&#xff0c;就是包括小写字母a-z、大写字母A-Z、数字0-9、符号"“、”/“一共64个字符的字符集&#xff0c;&#xff08;另加一个…

锂离子电池充电管理芯片应用

基本概述 TP4054是一个完善的单片锂离子电池恒流/恒压线性电源管理芯片。 更值得一提的是&#xff0c;TP4054专门设计适用于USB的供电规格。得益于内部的MOSFET结构&#xff0c;在应用上不需要外部电阻和阻塞二极管。在高能量运行和高外围温度时&#xff0c;热反馈可以控制充…

重磅 | 进一步夯实生态建设,朗思科技与阿里龙蜥完成兼容性认证

近日&#xff0c;北京朗思智能科技有限公司&#xff08;以下简称“朗思科技”&#xff09;自主研发的数字员工产品与OpenAnolis龙蜥社区龙蜥操作系统&#xff08;Anolis OS&#xff09;8完成兼容性认证。测试结果显示&#xff0c;双方产品相互兼容&#xff0c;功能正常&#xf…

vue-router路由(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-router路由(二) 目录 1. Vue-Router 的懒加载如何实现 2. 路由的hash和history模式的区别 1…

打开文件 和 文件系统的文件产生关联

补充1&#xff1a;硬件级别磁盘和内存之间数据交互的基本单位 OS的内存管理 内存的本质是对数据临时存/取&#xff0c;把内存看成很大的缓冲区 物理内存和磁盘交互的单位是4KB&#xff0c;磁盘中未被打开的文件数据块也是4KB&#xff0c;所以磁盘中页帧也是4KB&#xff0c;内存…

JMeter之HTTP压测详解

一、创建线程组 右击-->添加-->Threads(Users)-->线程组 下面对比较重要的几个参数&#xff0c;讲解下&#xff1a; 名称&#xff1a; 就是给你这个线程组起名字。 线程数&#xff1a;指压力测试时候模拟几个用户测试接口。 Ramp-Up&#xff1a;这里指几秒运行完上…

Windows环境VSCode配置OpenCV-项目配置(二)

修改c_cpp_properties.json {"configurations": [{"name": "windows-gcc-x64","includePath": ["${workspaceFolder}/**","D:/mingw64/mingw64/include","D:/openCV_win/build/install/include","…