进程,线程,协程(用户级线程)相关知识

2023-11-04

一、进程,线程,协程(用户级线程)

1、进程

为了方便管理计算机的多道程序,计算机操作系统引入进程概念

进程是系统进行资源分配和调度的基本单位

进程作为程序独立运行的载体保障程序的独立运行

进程的存在使操作系统的资源利用率大幅度提升

进程的控制结构是进程控制块,简称PCB,PCB是进程存在的唯一标识,这意味一个进程一定会有对应的PCB,进程消失,PCB也会随之消失,PCB主要包含以下四类信息:

1、进程描述信息

  • 进程唯一的标记符,类似唯一id
  • 用户标识符,进程归属的用户,用户标识符主要为共享和保护服务

2、进程控制和管理信息

  • 进程当前状态,比如运行、就绪、阻塞等,作为处理机分配调度的依据
  • 进程优先级,描述进程抢占处理机的优先级,优先级高的进程可以优先获得处理机

3、资源分配清单

  • 用于说明有关内存地址空间或虚拟地址空间的状况,所打开文件的列表和所使用的输入/输出设备信息

4、CPU 相关信息

  • 指 CPU中各寄存器值,当进程被切换时,CPU状态信息都必须保存在相应的PCB中,以便进程重新执行时,能再从断点继续执行。

2、线程

为了提高系统内程序的并发程度,减少并发开销,计算机操作系统引入线程概念

线程是运行调度的最小单位

线程从属于进程,是进程实际运行工作的单位

一个进程可以有多个线程,当进程只有一个线程时,可以认为进程等于线程,每个线程可以执行不同的任务,线程比进程更轻量

线程本身不拥有资源,它们共享进程的资源,因此会产生资源竞争,需要通过锁机制来协同

当进程中的一个线程奔溃时,会导致其所属进程的所有线程奔溃(一般游戏的用户设计不会采用多线程方式)

线程的控制结构是线程控制块,简称TCB,TCB是线程存在的唯一标识,这意味一个线程一定会有对应的TCB,线程消失,TCB也会随之消失,TCB主要包含以下信息:

  • 线程标识符,为每个线程赋予一个唯一的线程标识符

  • 一组寄存器,包括程序计数器PC、状态寄存器和通用寄存器的内容

  • 线程运行状态,用于描述线程正处于何种运行状态

  • 优先级,描述线程执行的优先程度

  • 线程专有存储区,用于线程切换时存放现场保护信息,和与该线程相关的统计信息等

  • 信号屏蔽,即对某些信号加以屏蔽

  • 堆栈指针,在线程运行时,经常会进行过程调用,而过程的调用通常会出现多重嵌套的情况,这样,就必须将每次过程调用中所使用的局部变量以及返回地址保存起来。为此,应为每个线程设置一个堆栈,用它来保存局部变量和返回地址。相应地,在TCB中,也须设置两个指向堆栈的指针:指向用户自已堆栈的指针和指向核心栈的指针。前者是指当线程运行在用户态时,使用用户自己的用户栈来保存局部变量和返回地址,后者是指当线程运行在核心态时使用系统的核心栈。

3、协程(用户级线程)

一个线程能对应多个协程

系统无法感知协程,因此不能被系统调度,也不能发挥多核优势,但因为不消耗内核资源,所以可以大量创建,协程由用户自行调度

协程调度一直处于用户态,因此上下文切换成本非常低

协程拥有自己的TCB,包括寄存器上下文和栈

二、进程,线程,协程之间的不同

1、进程,线程之间的不同

进程是最小的资源(包括内存、打开的文件等)分配单位,线程是最小的运行单位

进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈

线程同样具有就绪、阻塞、执行三种基本状态,同样具有状态之间的转换关系(和进程大同小异)

线程的创建、终止时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,所以线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们(线程管理的资源较少)

同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,切换的时候要把页表给切换掉,而页表的切换过程开销是比较大的

由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了

每个进程都有独立的地址空间,一个进程崩溃不影响其它进程;一个进程中的多个线程共享该进程的地址空间,一个线程的非法操作会使整个进程崩溃

2、线程,协程之间的不同(主要是受内核调度和不受内核调度的不同)

线程是运行调度的最小单位,由系统自主调度;协程由用户调度,系统无法感知

线程运行状态切换及上下文切换因为需要内核调度,所以会有用户态-内核态-用户态的转变,会消耗系统资源,时间代价较大;而协程完全由程序控制,状态切换及上下文切换不需要内核参与,代价很小

线程进程都是同步机制,而协程则是异步。

协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力

协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.

不需要多线程的锁机制:因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多

三、用户态和内核态

1、用户态

用户空间:存放对是用户程序的代码和数据

进程在执行用户自己的代码(非系统调用类函数)

CPU只可以访问有限的内存,不允许访问外围设备

2、内核态

内核空间:存放内核代码和数据

进程执行操作系统内核的代码

CPU可以访问内存所有数据和外围设备

3、用户态、内核态切换过程中进程的变化

进程进入内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内核态恢复到用户态时,在内核态执行的最后将保存在内核栈里面的用户栈的地址恢复到堆栈指针寄存器即可。这样就实现了内核栈和用户栈的互转。

在进程从用户态转到内核态的时候,进程的内核栈总是空的。这是因为,当进程在用户态运行时,使用的是用户栈,当进程陷入到内核态时,内核栈保存进程在内核态运行的相关信息,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的。所以在进程陷入内核的时候,直接把内核栈的栈底地址给堆栈指针寄存器就可以了。

4、用户态切换内核态的时机

  • 系统调用

这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。

  • 异常

当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

  • 外围设备的中断

当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。

四、上下文切换

1、进程上下文切换

  1. 准备就绪进程运行数据
  2. CPU状态字段由用户态改为内核态(即更改权限等级3->0)
  3. 进程数据由用户栈转到内核态栈,保存当前进程运行状态到PCB
  4. 迁出当前进程数据
  5. 迁入就绪进程数据
  6. 进程数据由内核栈转到用户栈,从PCB恢复就绪上次运行状态
  7. CPU状态字段由内核态改为用户态(即更改权限等级0->3)

此过程由系统调用,所以有用户态-内核态-用户态的转换,需要对整体资源腾挪,消耗比较大。

2、(同一进程中)线程上下文切换

和进程切换基本相同,此过程同样由系统调用完成,也有用户态-内核态-用户态的转换,但是前后所需资源没有改变,只需要切换线程的私有数据、寄存器等不共享的数据,消耗较小。

3、协程上下文切换(让步)

和线程切换基本相同,但是由于没有经过系统调用,所有操作均在用户态完成,所以虽然此过程仍有寄存器和栈等信息的腾挪,但相比起来消耗非常小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程,线程,协程(用户级线程)相关知识 的相关文章

  • 202310读书笔记|《大白鲸原创图画书优秀作品:虾一跳》——蝴蝶效应之最,你值得一读

    202310读书笔记 大白鲸原创图画书优秀作品 虾一跳 蝴蝶效应之最 你值得一读 大白鲸原创图画书优秀作品 虾一跳 作者 耿彦红 文 齐海潮 图 由虾一跳的连锁反应构成了整本书的故事脉络 很生动 故事及叙述的重复都不冗杂 反而很朗朗上口 并
  • 密码学--CTF Crypto 总结

    密码学简介 密码学 Cryptography 一般可分为古典密码学和现代密码学 其中 古典密码学 作为一种实用性艺术存在 其编码和破译通常依赖于设计者和敌手的创造力与技巧 并没有对密码学原件进行清晰的定义 其主要包含以下几个方面 单表替换加
  • TCP与UDP

    前言 TCP和UDP是两个传输层最有代表性的传输层协议 TCP一般提供可靠的信息传输 而UDP常被用于广播和细节控制交给应用的通信传输 传输层的定义 在传输层 IP首部有一个协议字段 用来区分使用的是什么协议 用端口号进行处理的具体程序 在
  • 在Vitis IDE中使用第三方库 libtiff 保存 tiff 文件

    目的和思路 一个Vitis IDE 裸机项目 需要将视频帧无损地保存下来 由于每帧的像素数据是 16bit 1通道的 bayer 格式 满足这一需求的图像格式似乎只有 tiff 格式 开源的tiff 库是 libtiff 而在 Vitis
  • nginx安装及部署

    下载 官方网站 https nginx org en download html Windows下安装 安装 下载后解压 切记不能含有中文路径 文件结构如图 我解压的路径就有中文 记得拷贝放置于英文目录下即可 启动 两种方法 1 直接双击该

随机推荐

  • C语言(函数与预处理、指针)

    一 函数与预处理 一 一维数组 1 一维数组的定义格式为 类型说明符 数组名 常量表达式 例如 int a 10 它表示定义了一个整形数组 数组名为a 有10个元素 2 在定义数组时 需要指定数组中元素的个数 方括弧中的常量表达式用来表示元
  • 基于 FFmpeg 的跨平台视频播放器简明教程(七):使用多线程解码视频和音频

    系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程 一 FFMPEG Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程 二 基础知识和解封装 demux 基于 FFmpeg 的跨平台视频播放器简明教程 三 视频
  • 69. Sqrt(x)

    Implement int sqrt int x Compute and return the square root of x where x is guaranteed to be a non negative integer Sinc
  • 新闻分析:解密代号A1S

    本周二SAP董事长特拉普纳 Hasso Plattner 在Software 2007会议上发言时阐述了SAP新的软件设计方法 SAP表示在过去的三年中有3000多名工程师都在运用这种新的软件设计方法在开发代号为A1S的新产品 虽然这一代号
  • HTML的input类型为hidden导致无法reset改字段的value问题

    问题关键 根据HTML规范 hidden是非ui类元素 不接受用户处理 所以form的 reset并不影响它 http stackoverflow com questions 6367793 why does the reset butto
  • 一种通用的业务监控触发方案设计

    一 背景 业务监控是指通过技术手段监控业务代码执行的最终结果或者状态是否符合预期 实现业务监控主要分成两步 一 在业务系统中选择节点发送消息触发业务监控 二 系统在接收到mq消息或者定时任务调度时 根据消息中或者任务中的业务数据查询业务执行
  • go-micro 在linux下安装出现service auth not found

    1 安装micro linux下执行该命令 wget q https raw githubusercontent com micro micro master scripts install sh O bin bash 2 micro se
  • vue 实现md5、base64加密

    背景 前端使用密码登录的时候 一般都会使用密文传输 否则控制台就能看到密码 具体实现如下 使用 md5 进行加密 1 安装 cnpm install save js md5 2 在 main js 全局引用 import md5 from
  • pycharm console 报错

    描述 pycharm的console本来用的好好地 但是我也不知道自己改了啥 结果报错了 报错 Error Console process terminated with error Traceback most recent call l
  • Inheritance___CH_17

    17 1 Introduction to inheritance A hierarchy is a diagram that shows how various objects are related Most hierarchies ei
  • 华为交换机配置链路聚合

    文章目录 1 拓扑图 2 任务描述 3 Sw1配置 4 Sw2配置 5 Lacp模式链路聚合演示 https blog csdn net qq 45042462 article details 120938052 1 拓扑图 2 任务描述
  • 正则表达式校验版本号

    需求 校验版本号 规则 X Y Z 1 99 0 99 0 99 要求 1 必须是三位 例如 x x x的形式 2 每位x的范围分别为1 99 0 99 0 99 3 不允许的情况 0 x x 01 x x x 0x x x 00 x x
  • Python根据Excel名单实现文件夹下文件批量改名

    班级收集截图 通过缓存快速获取图片 可是文件夹内的文件是乱码 所以采用Python进行批量改名操作 import os import xlrd count 1 path C Users White Desktop 18 文件所在文件夹 ex
  • 排查Linux服务器是否被入侵步骤

    作为一个Linux运维工程师 能够清晰地鉴别异常机器是否已经被入侵了显得至关重要 以下是结合centos7 9操作系统进行排查Linux操作系统是否被入侵 其他Linux发行版的操作类似 1 入侵者可能会删除机器的日志信息 可以查看日志信息
  • No projects are found to import 问题如何解决

    在myeclipse中导入项目遇到 No projects are found to import 导致原因 项目目录中没有 project或者 classpath 解决方案 1 project classpath直接拷贝到相应位置即可 2
  • 大数据——Java 知识点整理

    1 JDK 和 JRE 有什么区别 JDK Java Development Kit 的简称 java开发工具包 提供了java的开发环境和运行环境 JRE Java Runtime Environment 的简称 java运行环境 为ja
  • FSDataInputStream中的seek()方法

    FSDataInputStream实现了Seekable接口 实现方法 其中的seek long pos 方法可以 对任意位置进行重新定位 与java io inputstream中的skip 不同 举个例子对 hdfs中的一个文件进行两次
  • JavaScript 使用 canvas arcTo() 在画布上画一条弧线

    arcTo 在画布上创建介于两个切线之间的弧 曲线 arcTo 使用 stroke 方法在画布上绘制确切的弧
  • 汇编与接口课程实验3——利用8255A实现LED的流水点亮实验

    一 实验目的 该实验的目的在于让学生掌握8255A和微机接口的连接方法 了解8255A的基本的工作原理和编程方法 二 实验内容 PA口接8个拨动开关K1 K8 PB口接8个LED 初始由开关K1 K8设定8位不同的值 当执行程序后LED按K
  • 进程,线程,协程(用户级线程)相关知识

    一 进程 线程 协程 用户级线程 1 进程 为了方便管理计算机的多道程序 计算机操作系统引入进程概念 进程是系统进行资源分配和调度的基本单位 进程作为程序独立运行的载体保障程序的独立运行 进程的存在使操作系统的资源利用率大幅度提升 进程的控