进程、线程、协程详解

news2024/10/2 20:32:58

目录

前言:

一、进程

进程的概念

进程内存空间

二、线程

线程的定义

内核线程

用户线程

内核线程和用户线程的比较

线程的状态

 三、协程

协程的定义        

协程序相对于线程优势

运用场景

四、线程、协程、进程切换比较


 

 

前言:

     有时候无法理解进程、线程、以及协程的它们所存在的意义以及各有什么不同;同时如何深层次理解它们,才能在实际运用了能给我们多技术选择或方向。


一、进程

        进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体

进程是正在运行的程序的实例,是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统操作系统中,进程既是基本的分配单元,也是基本的执行单元。

进程的概念

第一:进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

第二:进程是一个实体。每一个进程都有它自己的地址空间。

进程内存空间

一般情况下,包括内核空间(Kernel space )、文本区域(text regionCode Segment)、数据区域(data region)和堆区(heap region)、BBS区域(bbs region )栈(stack region)。 

d0de7e30f5044488a14330eded3d1839.png

内核区

        Kernel space 是操作系统内核的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。在Kernel space中可以执行任意命令,调用系统的一切资源,如对文件大操作和socket 句柄等操作,属于内核操作。这一块区域用户不能直接更改,用户只能通过内核接口来访问。

栈区

        从高地址向低地址增长。由编译器自动管理分配。程序中的局部变量、函数参数值、返回变量等存在此区域。

内存映射区

         其实也属于堆区,只不过这一部分可以通过 mmap 来产生映射

未初始化数据区(bbs region)

        当全局/静态变量没有被初始化时,会放在该区域。处于BSS段的变量的值默认为0,考虑到

 这一点,BSS段内部无需存储大量的零值,而只需记录字节个数即可。系统载入可执行程序

 后,将BSS段的数据载入数据段(Data Segment) ,并将内存初始化为0,再调用程序入口(main函数)。     

数据区

        对于已经初始化了的全局/静态变量存放的内存区域。

文本区

        对于已经初始化了的全局/静态变量所存放的区域。

Heap区

        从低地址向高地址增长。容量大于栈,程序中动态分配的内存在此区域。如new和malloc申请的内存。


二、线程

线程的定义

线程是操作系统能够进行运调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程分为内核线程和用户线程。

内核线程

        由内核管理的线程。用户应用程序通过API和系统调用(system call)来访问线程工具。

需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销。内核线程的线程表(thread table)位于内核中,包括了线程控制块(TCB),一旦线程阻塞,内核会从当前或者其他进程(process)中重新选择一个线程保证程序的执行。

用户线程

指不需要内核支持而在中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。

内核线程和用户线程的比较

        720c4ab6db05419bbd4c681fc695ec0c.png

 

 

线程的状态

初始化状态

        产生一个Thread对象就生成一个新线程。当线程处于"新线程"状态时,仅仅是一个空线程对象,它还没有分配到系统资源。因此只能启动或终止它。    

可运行态(Runnable)

        start()方法产生运行线程所必须的资源,调度线程执行,并且调用线程的run()方法。在这时线程处于可运行态。

 

阻塞/非运行态(Not Runnable)

        suspend()方法被调用;

        sleep()方法被调用;

        线程使用wait()来等待条件变量;

        线程处于I/O请求的等待。

死亡态(Dead)

        当run()方法返回,或别的线程调用stop()方法,线程进入死亡态。


 

 三、协程

协程的定义        

协程(coroutine)是一种程序运行的方式,即在单线程里多个函数并发地执行。它就是一个可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。协程是以单线程的执行方式执行。      

        为什么需要协程?因为对于线程所占用系统资源比较多,默认情况下,线程需要占用比较大空间同时需要线程调度,它是系统级别的。由于协程的暂停完全由程序控制,发生在用户态上;而线程的阻塞状态是由操作系统内核来进行切换,发生在内核态上。用户无法创建巨量的线程来处理业务逻辑,对于协程的数量远远大于线程的创建数量。

协程序相对于线程优势

1)因此协程的开销远远小于线程的开销。

        协程涉及到函数的切换, 多线程涉及到线程的切换, 所以都有执行上下文, 但是协程不是被操作系统内核所管理, 而完全是由程序所控制(也就是在用户态执行), 这样带来的好处就是性能得到了很大的提升, 不会像线程那样需要在内核态进行上下文切换来消耗资源。


2)线程是可能并行,协程是单线程的

        同一时间, 在多核处理器的环境下, 多个线程是可以并行的,但是运行的协程的函数却只能有一个,其他的协程的函数都被suspend, 即协程是并发的。


3)没有非同步问题(无锁)

        由于协程在同一个线程中, 所以不需要用来守卫临界区段的同步性原语(primitive)比如互斥锁、信号量等,并且不需要来自操作系统的支持


4)用户级别的调度和阻塞

        在协程之间的切换不需要涉及任何系统调用或任何阻塞调用

5)执行权利有程序分配
        通常的线程是抢先式(即由操作系统分配执行权), 而协程是由程序分配执行权

6)协程所占资源小于线程

        在默认情况下线程所占用堆栈空间8M的内存空间,而协程只需要几KB的空间。

运用场景

协程的应用场景主要在于 I/O 密集型任务。

协程调用是在一个线程内进行的,是单线程,切换的开销小,因此效率上略高于多线程;

当程序在执行 I/O 时操作时,CPU 是空闲的,此时可以充分利用 CPU 的时间片来处理其他任务;

有了协程,我们在函数的执行过程中,如果遇到了I/O密集型任务,函数可以临时让出控制权,让 CPU 执行其他函数,等 I/O 操作执行完毕以后再收回其他函数的控制权.


四、线程、协程、进程切换比较

 

协程

线程

进程

切换着

用户(编程/程序本身)

操作系统

操作系统

切换时机

用户自己的程序决定

根据操作系统自己策略调度,对于用户是透明的

根据操作系统自己策略调度,对于用户是透明的

切换内容

硬件上下文

内核栈

硬件上下文

页全局目录

内核栈

硬件上下文

切换内容的保存

保存用户自己设定的栈中

保存在内核栈中

保存在内核栈中

切换过程

不需要进入内核态进行切换

用户态-内核态-用户态

用户态-内核态-用户态

切换效率

 


 

 

 

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

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

相关文章

JPA之实体之间的关系

JPA之实体之间的关系 10.1.1实体类创建 注解的应用 Table,Entity IdGeneratedValue指定主键,Column P174 实体类编写规范 Table(name "t_user") Entity(name "User") public class User implements Serializable {IdGeneratedVa…

王道操作系统课代表 - 考研计算机 第二章 进程与线程 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “进程与线程” 章节知识点总结的十分全面,涵括了《操作系统》课程里的全…

机器学习——线性学习

提及线性学习,我们首先会想到线性回归。回归跟分类的区别在于要预测的目标函数是连续值线性回归假定输入空间到输出空间的函数映射成线性关系,但现实应用中,很多问题都是非线性的。为拓展其应用场景,我们可以将线性回归的预测值做…

SQL的优化【面试工作】

SQL的优化 最近看到群友在讨论这块的优化,感觉不管工作和面试,都是用上的,记录下吧!(不然又记不住) 优化点: 处理和优化复杂的 SQL 查询可以有以下几个方向: 1.优化查询语句本身 首先,可以优化 SQL 查询语句本身,尽量让其更加简洁、高效。 …

Go程序当父进程被kill,子进程也自动退出的问题记录

平常我们启动一个后台进程,会通过nouhp &的方式启动,这样可以在退出终端会话的时候,进程仍然可以继续在后台执行(进程的父进程id会从原来的bash进程变成1) 在go程序中,通过nouhp &的方式启动子进程,预期是即使…

干货| Vue小程序开发技术原理

目前应用最广的三大前端框架分别是Vue、 React 和 Angular 。其中,不管是 BAT 大厂,还是创业公司,Vue 都有广泛的应用。如今,再随着移动开发小程序的蓬勃发展,Vue也广泛应用到了小程序开发当中。今天,就来详…

嵌入式 STM32 SHT31温湿度传感器

目录 简介 1、原理图 2、时序说明 数据传输 起始信号 结束信号 3、SHT31读写数据 SHT31指令集 读数据 温湿度转换 4、温湿度转换应用 sht3x初始化 读取温湿度 简介 什么是SHT31? 一主机多从机--通过寻址的方式--每个从机都有唯一的地址&…

linux--多线程(一)

文章目录Linux线程的概念线程的优点线程的缺点线程异常线程的控制创建线程线程ID以及进程地址空间终止线程线程等待线程分离线程互斥进程线程间的互斥相关概念互斥量mutex有线程安全问题的售票系统查看ticket--部分的汇编代码互斥量的接口互斥量实现原理探究可重入和线程安全常…

三重积分为何不能直接带入积分区域?搞懂这些,重积分基本可以了

积分的积分区域及被积表达式 重点:积分的结果均为数值,仅与被积表达式和积分区间有关!!! 1.如何一下子区分一重积分,二重积分,三重积分? 看积分区间和被积表达式: 一重…

React教程详解一(props、state、refs、生命周期)

文章略长,耐心读完,受益匪浅哦~ 目录 前言 简介 JSX 面向组件编程 state props refs 组件生命周期 前言 简介 React框架由Facebook开发,和Vue框架一样,都是用于构建用户界面的JavaScript库; 它有如下三个特…

PHP - ChatGpt 学习 仅供参考

由于最近ChatGpt 大火,但是门槛来说是对于大家最头疼的环节, 由此ChatGpt 有一个API 可以仅供大伙对接 让我来说下资质: 1:首先要搞得到一个 ChatGpt 的账户, 会获得一个KEY,该key为访问API核心&#xff0…

jenkins漏洞集合

目录 CVE-2015-8103 反序列化远程代码执行 CVE-2016-0788 Jenkins CI和LTS 远程代码执行漏洞 CVE-2016-0792 低权限用户命令执行 CVE-2016-9299 代码执行 CVE-2017-1000353 Jenkins-CI 远程代码执行 CVE-2018-1000110 用户枚举 CVE-2018-1000861 远程命令执行 CVE-2018…

ChatGPT文章自动发布WordPress

WordPress可以用ChatGPT发文章吗?答案是肯定的,ChatGPT官方有提供api接口,多以目前有很多的SEO工具具有自动文章生成自动发布的功能,使用SEO工具,我们可以通过疑问词和关键词进行文章生成,并定时发布到我们…

软测入门(三)Selenium(Web自动化测试基础)

Selenium(Web端自动测试) Selenium是一个用于Web应用程序测试的工具:中文是硒 开源跨平台:linux、windows、mac核心:可以在多个浏览器上进行自动化测试多语言 Selenium WebDriver控制原理 Selenium Client Library…

Linux基础——连接Xshell7

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…

复位理论基础

先收集资料,了解当前常用的基础理论和实现方式 复位 初始化微控制器内部电路 将所有寄存器恢复成默认值确认MCU的工作模式禁止全局中断关闭外设将IO设置为高阻输入状态等待时钟趋于稳定从固定地址取得复位向量并开始执行 造成复位的原因 有多种引起复位的因素&…

客户关系管理挑战:如何保持客户满意度并提高业绩?

当今,各行业市场竞争愈发激烈,对于保持客户满意度并提高业绩是每个企业都面临的挑战。而客户关系管理则是实现这一目标的关键,因为它涉及到与客户的互动和沟通,以及企业提供优质的产品和服务。在本文中,我们将探讨客户…

使用Geth搭建多节点私有链

使用Geth搭建多节点私有链 步骤 1.编辑初始化配置文件genesis.json {"config": {"chainId": 6668,"homesteadBlock": 0,"eip150Block": 0,"eip150Hash": "0x000000000000000000000000000000000000000000000000000000…

JDK下载安装与环境

🥲 🥸 🤌 🫀 🫁 🥷 🐻‍❄️🦤 🪶 🦭 🪲 🪳 🪰 🪱 🪴 🫐 🫒 🫑…

回暖!“数”说城市烟火气背后

“人间烟火气,最抚凡人心”。在全国各地政策支持以及企业的积极生产运营下,经济、社会、生活各领域正加速回暖,“烟火气”在城市中升腾,信心和希望正在每个人心中燃起。 发展新阶段,高效统筹经济发展和公共安全&#…