python 线程、进程、并发、并行、协程、进程池、互斥锁
2020-12-27 22:28
标签:包括 寄存器 大小 png 其它 alt 处理 并行 因此
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。 python 线程、进程、并发、并行、协程、进程池、互斥锁 标签:包括 寄存器 大小 png 其它 alt 处理 并行 因此 原文地址:https://www.cnblogs.com/jackson669/p/13028067.html进程
进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆。
上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源)。进程是资源分配的最小单位。
进程是线程的容器。程序是指令,数据及其组织形式的描述,进程是程序的实体
进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域、堆栈
特点:
结构特征:进程由程序、数据和进程控制块三部分组成。
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
并发性:任何进程都可以同其他进程一起并发执行
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 线程
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源。
只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。线程与进程的区别
线程是程序中一个单一的顺序控制流程。
进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。
在单个程序中同时运行多个线程完成不同的工作,称为多线程。线程特点
在多线程OS中,通常是在一个进程中包括多个线程。
每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。
由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。
在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;
同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。 协程
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,
线程和协程的区别
因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;
而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。 当前协程控制切换到其他协程
协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。进程和线程的关系
地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;因此线程可以读写同样的数据结构和变量,便于线程之间的通信。相反,进程间通信(IPC)很困难且消耗更多资源。
资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
比如上面图的进程2里面的线程2、3、4都一起共享进程里面的资源进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
二者均可并发执行.
优缺点:
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反
图解:
计算机的核心是CPU,它承担了所有的计算任务。它就像一座电工厂,时刻在运行。
1 假定工厂的电力有限,一次只能供给一个车间使用。
2
3
4 也就是说,一个车间开工的时候,其他车间都必须停工。
5
6
7 背后的含义就是,单个CPU一次只能运行一个任务。
进程就好比工厂的车间,它代表CPU所能处理的单个任务。
任一时刻,CPU总是运行一个进程,其他进程处于非运行状态 一个车间里,可以有很多工人。他们协同完成一个任务。
线程就好比车间里的工人。一个进程可以包括多个线程。 相当于一个车间里面有很多工人,可以说是一个进程里面有很多线程
车间的空间是工人们共享的。比如许多房间是每个工人都可以进出的。
相对于以下解释:
这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。 可是,每间房间的空间大小不同,有些房间最多只能容纳一个人,比如厕所。
里面有人的时候,其他人就不能进去了。
这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。 一个防止他人进入的简单方法,就是门口加一把锁。
先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。
这就叫”互斥锁”(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。还有些房间,可以同时容纳n个人,比如厨房。
也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。 这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。
这种做法叫做”信号量”(Semaphore),用来保证多个线程不会互相冲突。不难看出,mutex是semaphore的一种特殊情况(n=1时)。互斥锁。
也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。总结
(1)以多进程形式,允许多个任务同时运行;并发
(2)以多线程形式,允许单个任务分成不同的部分运行;【互斥锁、信息量、内存空间分享】
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
下一篇:python 判断两个集合相等
文章标题:python 线程、进程、并发、并行、协程、进程池、互斥锁
文章链接:http://soscw.com/index.php/essay/38681.html