聊一聊进程、线程和协程以及线程的那些“锁“事
进程 线程 协程
进程 线程 协程
进程 Process
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
通俗的讲:进程可以理解为我们在电脑上正在运行的一个个应用,例如:QQ,微信,LOL
打开一个浏览器急速一个进程,打开两个浏览器就是两个进程,进程和进程之间具有独立性,它们具有各自的虚拟地址空间和文件描述符
线程 thread
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。同一个进程的多个线程之间是共享同一份虚拟空间地址和文件描述符的。在一个进程中的多线程,可以并发的执行(后面有并发的介绍)。
就拿百度网盘来说,如果有下载任何和上传任务的话,那么百度网盘这个进程里面至少有两个线程来完成工作,一个是上传 一个是下载
我们使用htop来看一下,百度网盘开了几个线程
进程和线程我们都讲过了,那么现在来问一个问题,如何实现多任务?
其实如果你看完了进程和线程应该也能明白,多任务嘛,可以 多进程 也可以多线程,还可以采用多进程+多线程的方式
协程coroutine
在详细讲解协程之前,我们先看一下这个场景,比如一个饭店有两个厨师,一个小工,小工负责摘菜 洗菜 啥的,那么饭店运转的时候,其实就有三个线程,这没有问题,但是忽然有一天小工请假了,就剩下两个厨师了?怎么办?老板这时候说,你看你俩也不是很忙,有人点菜的时候就炒菜,没人点菜的时候就洗洗菜啥的,别闲着(周扒皮已上线),明白了吧,就是为了更高效率的利用线程,而不是频繁的创建线程 销毁线程 以及CPU频繁的切换上下文,不能让线程闲着
- 协程,英文Coroutines,是一种基于线程之上,但又比线程更加轻量级的存在,因为是自主开辟的异步任务,所以很多人也更喜欢叫它们纤程(Fiber),或者绿色线程(GreenThread)。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。具有对内核来说不可见的特性。(其实这里有一个问题,就是协程是无序的,那么我们怎么保证数据的事务性呢?有好的想法可以和我交流哦)
进程的状态
三种基本状态
三种基本状态:就绪态、执行态、阻塞态。
这三种基本状态每个OS 中都会有的,因些称为基本态,下而是给出三种基本状态的定义:
就绪(Ready)状态
通过Ready 我们可以看到,处于此状态的进程已经处于准备好要运行了。
此时进程已经分配好除CPU 外的所有必要资源,只需要获得CPU,便可立即执行。
处于就绪态的进程都是在就绪队列中,等待着调度程序的调度(分配CPU)。执行(Running)状态
处于此状态的进程是已经获得CPU 且正在执行中。
对于这一状态,在单CPU OS 中,同一时刻只能有一个进程处于此状态,而在多CPU OS,则可以有多个(不超过CPU 的数量)进程同时处于执行状态。阻塞(Block)状态
处于此状态的进程是因为在执行的过程中由于发生某种需要等待的事件(I/O 请求,申请缓存失败,等待接收数据等),而暂时无法继续运行。
在多道批处理系统中,此时需要进程把处理机释放,并选取新的就绪进程执行。
与就绪队列相对应的,处于阻塞状态的进程都在阻塞队列中,某些OS 中,出于提高效率的目的,根据阻塞的原因,会有多个阻塞队列。
上图是进程的三种基本状态的转换图,进程在运行的过程中会经常的发生状态的转换。
从图中我们可以看到,就绪态和执行态是可以相互转换的,但是执行态到阻塞态是单向的,这是因为就算阻塞的进程“通畅” 了,因为处理机已经分配给别的进程了,因此进程的状态只能切换到就绪态,并且也是单项的,因为等待的事件也只可以在执行中才能发生。
创建状态和终止状态
我们知道,进程创建时,需要对其分配除CPU处的所有的必要资源,
但是,如果此时OS 因为资源不足无法给进程分配资源,那么进程应该处于什么状态呢?
为了满足上述问题,满足进程状态的完整性以及增强管理的灵活性,
通常会在OS中为进程新增两种常见的状态:创建状态和终止状态。
下面给出两种状态的定义:
创建状态
进程创建的过程中,所需的资源尚不能得到满足,此时创建工作尚未完成,进程无法被调度执度,进程此时就处于创建状态。
终止状态
进程正常运行结束或都出现导致进程终止的错误,或是被 os 所终结,或是被父过程终结,则进入终止状态。
进入终止状太的进程将不能再执行,但是OS 依然保持一个记录,其中保存着状态码和计时器统计数据,等待别的进程收集,一旦资源被收集完成,OS 会立即删除该进程。
认识并发和并行
- 如果我们第一次理解并发,很容易理解错误,认为并发 就是同时发生的意思,而慢慢的,你会了解到并行,那么我们就先看看并发和并行。
- 并发
并发是指一个cpu交替执行多个任务,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。通俗点理解,并发就像一个厨师架了两口锅,一个炒西红柿鸡蛋,一个炒尖椒肉丝,猛一想,好像是一个厨师同时在炒两个菜,但其实,同一个时刻,厨师只能颠一个勺,颠完西红柿鸡蛋颠尖椒肉丝。来回切换。这里面的厨师 就是CPU 。西红柿鸡蛋和尖椒肉丝就是要处理的线程。 - 并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。我想起来小时候家里养的一头母猪,可以同时奶12个猪仔(一般母猪有6对乳头,即12个乳头,养殖必备知识点,记一下),对应起来,这头母猪其实就是一个12核的计算机,同时奶12个猪仔这件事情,就是并行(尴尬的笑
聊一聊进程、线程和协程以及线程的那些“锁“事相关推荐
- 怎么更进一步学python_【百尺竿头,更进一步学Python】Python进阶课程——进程,线程和协程的区别...
本文带来各类奇怪的IT百科知识. [百尺竿头,更进一步学Python]Python进阶课程--进程:线程和协程的区别 现在多进程多线程已经是老生常谈了:协程也在最近几年流行起来.今天我们本文主要介绍进 ...
- Go 学习笔记(22)— 并发(01)[进程、线程、协程、并发和并行、goroutine 启动、goroutine 特点,runtime 包函数]
Go 语言通过编译器运行时( runtime ),从语言上支持了并发的特性. 虽然 Go 程序编译后生成的是本地可执行代码,但是这些可执行代码必须运行在Go 语言的运行时(Runtime )中.Go ...
- 进程 线程 协程_进程,线程,协程那些事
无论我们写出怎样的程序,最后都是由操作系统来运行我们的程序,而操作系统如何管理我们的程序,我们程序的数据如何保存和计算,这些都是操作系统需要处理的事情,我们只要将写好的程序交给操作系统就好. 虽然操作 ...
- python 多线程和协程结合_一文讲透 “进程、线程、协程”
本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程? 它们之间的关系是什么? 为什么说Python中的多线程是伪多线程? 不同的应用场景该如何选择技术方案? ... 什么是进程 ...
- 进程、线程、协程、通信方式
文章目录 进程 线程 协程 进程.线程.协程的区别 概念 进程.线程共同点 进程.线程不同点 线程.协程比较 通信方式之间的差异 进程通信 管道(pipe) 有名管道 (namedpipe) 信号量( ...
- 什么是 “进程、线程、协程”?
作者 | 头文件 责编 | 王晓曼 来源 | 程序员小灰(ID:chengxuyuanxiaohui) 本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程? 它们之间的关系是什 ...
- 一文讲透 “进程、线程、协程”
本文从操作系统原理出发结合代码实践讲解了以下内容: 什么是进程,线程和协程? 它们之间的关系是什么? 为什么说Python中的多线程是伪多线程? 不同的应用场景该如何选择技术方案? ... 什么是进程 ...
- 进程、线程和协程的理解
转自: http://blog.csdn.net/guyan0319 https://blog.csdn.net/guyan0319/article/details/79411626 一.进程 进程 ...
- 操作系统的线程和进程的区别_进程,线程,协程,有何区别?
进程 cpu是计算机的核心,主要处理计算机的计算任务.操作系统是计算机的管理员,它负责任务的调度,资源的管理和分配,统一管理计算机的硬件资源.应用程序则是具有某种功能的程序,应用程序运行于操作系统 ...
- python 协程、进程、线程_Python 中的进程、线程、协程
1. 进程 进程是正在运行的程序实例,是内核分配资源的最基本的单元.进程拥有自己独立的堆和栈,独立的地址空间,资源句柄.进程由 OS 调度,调度开销较大,在并发的切换过程效率较低. Python 提供 ...
最新文章
- AI新基建哪家强?百度“秀肌肉”,意在C位
- keras从入门到放弃(六)多层感知器(神经网络)
- IDEA出现错误:找不到或无法加载主类 io.renren.RenrenApplication
- HBase总结(二十)HBase常用shell命令详细说明
- python pointer_python 的隐式指针特征与class inheritance
- 15 张图阅尽人工智能现状
- python对原数组遍历_Python数组遍历的简单实现方法小结
- SQLServer的索引和统计
- stata中计算公式命令_Stata:runby - 一切皆可分组计算!
- 马尔科夫区制转换matlab,马尔科夫区制转移混频向量自回归(MS-MF-VAR)模型及其Gauss实现...
- Vue3 非常好用的中文文档以及一份 Vue 3 新文档学习笔记
- 贪心法(作业调度问题)
- jetson nano 3(Archiconda安装)
- 用matlab判断两个球是否相交,判断两个矩阵相交
- html源码画螺旋,1.6 绘制螺旋线 - HTML5 Canvas 实战
- 小姐姐让我帮忙修照片
- 15份PPT,透视网易云音乐/严选/新闻/游戏背后的AI实践(合集下载)
- python实现多重排序(多级排序)
- 想把图像文件转换为DWG文件?光栅矢量化工具了解一下
- ps -aux | grep 用法
热门文章
- 怎么更进一步学python_【百尺竿头,更进一步学Python】Python进阶课程——进程,线程和协程的区别...