Cpython的进程,线程,协程,io模型

一、进程:

  一  基础概念:

  1、进程的定义: 进程本身是一个抽象的概念,进程是操作系统资源分配的基本单位,是正在进行的一个过程或者说一个任务,负责执行任务的是cpu。

  2、并行与并发: 假设计算机只有一个cpu,由于一个cpu在同一时间只能执行一个任务,那么当有多个任务想同时运行按道理那么需要多个cpu执行

          这个时候如果有多个cpu同时运行这些任务就是并行,如果是一个cpu运行多个任务(其实就是cpu在多个任务之间来回切换则为并发)

          那么由此定义如下:

          并行:多个任务同时运行,只有具备多个cpu才能实现并行。
          并发:伪并行,看起来是同时运行多个任务,实际上是单个CPU在多个程序之间来回切换。
  3、同步与异步: 当一个进程在执行多个任务时,如果要等待到该任务执行完成才会继续执行下个任务,那么就属于同步。

          如果该进程在执行某个任务是,不等待该任务是否完成而继续执行下个任务,那么就是异步。

          举个例子:

            打电话就是同步,你必须跟这个人通话完成(排除呼叫等待)才能接另外一个人的电话,不能同时接两个人的电话

            发短信就是异步,QQ聊天也是异步,你可以不用等待收件人是否有回复信息而继续和其他人聊天。

  4、阻塞与非阻塞: 阻塞:调用结果返回之前,该执行程序会被挂起,不释放CPU执行权,线程不能做其它事情,只能等待,只有等到调用结果返回了,才能接着往下执行;

             非阻塞:就是在没有获取调用结果时,不是一直等待,线程可以往下执行,如果是同步的,通过轮询的方式检查有没有调用结果返回,如果是异步的,会通知回调。

  5、同步、异步、阻塞、非阻塞区别:(参考知乎的回答)

          同步与异步关注的是:消息的通信机制,阻塞与非阻塞关注的是:程序在等待调用结果时的状态

          举个例子:

            比如你打电话问书店老板有没有《gold瓶梅》这本书:

            如果是同步通信机制,老板说你稍等我查下,(可能等待一天或者几秒)然后告诉你返回结果。

            异步通信机制,老板会直接告诉你我查下,查好了打电话给你,然后直接挂电话(不返回结果),查好了老板会打电话给你。

            阻塞机制:会把自己一直挂起,等待老板给你打电话告知这本书的查询结果,知道有返回结果。

            非阻塞机制:不管老板有没有告诉你,自己先一边去干别的了,然后根据自己设定的时间检查老板有没有返回结果给你。

  二  进程的创建和终止:

  创建:

  1. 系统初始化(查看进程linux中用ps命令,windows中用任务管理器)

  2. 一个进程在运行过程中开启了子进程

  3. 用户的交互式请求,而创建一个新进程(如用户双击暴风影音)

  终止:

  1. 正常退出

  2. 出错退出

  3. 被其他进程杀死

  三 进程间的通信方式:

  1、管道:管道可用于具有亲缘关系的父子进程间的通信

  2、信号:用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。

  3、消息队列:消息队列是消息的链接表。

  4、共享内存:使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。

  5、信号量:主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。

  6、套接字:它可用于网络中不同机器之间的进程间通信。

二、线程:

 一基础概念:

   1、线程的定义:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位多线程是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间。

  2、线程的特点:

    • 首先易于调度。其次提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。还有就是开销少。

 二进程与线程的关系以及区别:

  关系:

    • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
    • 同一进程的所有线程共享该进程的所有资源。
    • 线程在执行过程中,需要协作同步。

  区别:

    • 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
    • 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
    • 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
    • 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

三、协程:

  一基础概念:

  1、协程的定义:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的

  二协程的特点:

  1、协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级

  2、必须在只有一个单线程里实现并发

  3、修改共享数据不需加锁

四、IO模型:

  由于进程是不可直接访问外部设备的,所以只能调用内核去调用外部的设备(上下文切换),然后外部设备比如磁盘,读出存储在设备自身的数据传送给内核缓冲区,内核缓冲区在copy数据到用户进程的缓冲区。在外部设备响应的给到用户进程过程中,包含了两个阶段;由于数据响应方式的不同,所以就有了不同的I/O模型。

 IO模型的区别主要在以下两个阶段上:

  1)等待数据准备。

  2)将数据从内核拷贝到进程中。

一、阻塞IO:

    如下

  

  

    当用户调用了recvfrom进程,内核第一个阶段:准备数据。网络 io来说,很多时候数据在一开始还没有到达,这个时候内核就要等待足够的数据到来。

而在用户进程这边,整个进程会被阻塞。当内核收到数据,它就会将数据拷贝到用户内存,用户进程才解除block的状态,重新运行起来。

二、非阻塞IO:

  如下:

  

  非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error。进程在返回之后,可以干点别的事情,然后再发起recvform系统调用。重复上面的过程,循环往复的进行recvform系统调用。这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态,在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。相当于上面的例子你自己设定个时间轮询询问老板有没有找到你要的书

三、多路复用IO:

  

  有些地方也称这种IO方式为事件驱动IO(event driven IO),

  在内核请求IO设备响应指令发出后,数据就开始准备,在此期间用户进程是阻塞的。数据从kernel buffer复制到用户进程的过程也是阻塞的。但是和阻塞I/O所不同的是,它可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数,也就是说一个线程可以响应多个请求。

四、异步IO:

  

  用户进程发起read操作之后,立刻就可以开始去做其它的事。从内核的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。

五、IO模型对比:

  non-blocking IO和asynchronous IO的区别还是很明显的。在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。

参考博客:https://www.cnblogs.com/microfan/p/5294250.html

        https://blog.csdn.net/linhuaiyang/article/details/68483222

原文地址:https://www.cnblogs.com/Robertzewen/p/10056447.html

时间: 2024-08-08 13:52:21

Cpython的进程,线程,协程,io模型的相关文章

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

python_day10 多线程 协程 IO模型

多线程协程IO模型 多线程 #线程的PID与主进程PID一致 from threading import Thread from multiprocessing import Process import os def task(): print('%s is running' %os.getpid()) if __name__ == '__main__': t1=Thread(target=task,) t2=Thread(target=task,) # t1=Process(target=t

初识进程 线程 协程(三):协程

协程:(又称微线程,也是交替运行) 进程-->线程-->协程 协程就是充分利用cpu给该线程的时间,多个协程只使用一个线程,某个任务遇到阻塞,执行下一个任务.如果一个线程只执行一个任务,比较容易进入阻塞队列,如果这条线程永远在工作(协程:一个线程执行多个任务),永远不会进入阻塞队列. 适用场景:    当程序中存在大量不需要CPU的操作时(IO) 特点: 每次都能从上次暂停的位置继续执行 三种实现方式: 1.yield(生成器) 生成器:一边计算一边循环的机制 def a(): ......

python的进程/线程/协程

1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有一个线程被执行. 多线程的特点: 线程比进程更轻量级,创建一个线程要比创建一个进程快10-100倍. 线程共享全局变量. 由于GIL的原因,当一个线程遇到IO操作时,会切换到另一个线程,所以线程适合IO密集型操作. 在多核cpu系统中,最大限度的利用多核,可以开启多个线程,开销比进程小的多,但是这并

进程线程协程那些事儿

一.进程与线程 1.进程 我们电脑的应用程序,都是进程,假设我们用的电脑是单核的,cpu同时只能执行一个进程.当程序出于I/O阻塞的时候,CPU如果和程序一起等待,那就太浪费了,cpu会去执行其他的程序,此时就涉及到切换,切换前要保存上一个程序运行的状态,才能恢复,所以就需要有个东西来记录这个东西,就可以引出进程的概念了. 进程就是一个程序在一个数据集上的一次动态执行过程.进程由程序,数据集,进程控制块三部分组成.程序用来描述进程哪些功能以及如何完成:数据集是程序执行过程中所使用的资源:进程控制

进程/线程/协程/GIL

线程 线程是操作系统调度的最小单位 threading模块 线程的调用方式: import threading import time '''直接调用''' def hello(name): print("Hello %s"%name) time.sleep(3) if __name__ == "__main__": t1=threading.Thread(target=hello,args=("zhangsan",)) #生成线程实例 t2=t

Python并发编程-进程 线程 协程

一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据集:数据集则是程序在执行过程中所需要使用的资源 3.进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感 知进程存在的唯一标志. 二.线程                                                                        

python 进程 线程 协程

并发与并行:并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔内发生.在单核CPU下的多线程其实都只是并发,不是并行. 进程是系统资源分配的最小单位,进程的出现是为了更好的利用CPU资源使到并发成为可能.进程由操作系统调度. 线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能.线程共享进程的大部分资源,并参与CPU的调度, 当然线程自己也是拥有自己的资源的,例如,栈,寄存器等等.线程由操作系统调度. 协程通

进程线程协程

一.进程 各个进程拥有自己的代码段. 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 二.线程 线程比进程轻量级,线程的切换cpu花费比进程小,线程能加大系统的并行度. 一个进程的各个线程之间是共享代码段的,各个线程都有一个程序计数器来指向下一条应该执行的指令. 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的). 三.协程 协程和线程一样共享堆,不共享栈,协程由程序员在协程的代码里显示调度.

进程,线程,协程的相关解释 《转载》

自己不太懂这一块,转发和大家一块分享!!! 进程,由OS来管理,每个进程都有自己独立的内存空间,进程之间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量,管道,事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低.由于是独立的内存空间,所以上下文切换的时候需要保存当先调用栈的信息,cpu各寄存器的信息,虚拟内存,以及打开的相关句柄等信息,所以导致上下文切换的代价非常高,因此进程并不适合大量创建. 线程:也是由OS来管理的,一个进程可以拥有多个线程,但是其中每个线程会共享父进