python 面试题14 python 进程 线程 协程

进程与线程的历史
我们都知道计算机是由硬件和软件组成的。
硬件中的CPU是计算机的核心,它承担计算机的所有任务。
操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。
程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块
进程就是一个程序在一个数据集上的一次动态执行过程。 进程是资源管理的最小单元
进程一般由程序、数据集、进程控制块三部分组成。
我们编写的程序用来描述进程要完成哪些功能以及如何完成;
数据集则是程序在执行过程中所需要使用的资源;
进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。(VS 在现代操作系统中,进程支持多线程。进程是资源管理的最小单元)
每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。
进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机(SymmetricalMulti-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构)的出现,可以满足多个运行单位,而多进程并行开销过大。 这个时候就引入了线程的概念。

线程 它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合 和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。 线程没有自己的系统资源,只拥有在运行时必不可少的资源。但线程可以与同属与同一进程的其他线程共享进程所拥有的其他资源。

进程与线程之间的关系
线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

总结

在现代操作系统中,进程支持多线程。

  • 进程是资源管理的最小单元;

  • 线程是程序执行的最小单元。

即线程作为调度和分配的基本单位,进程作为资源分配的基本单位

一个进程的组成实体可以分为两大部分:线程集和资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。(同一进程中的线程究竟共享哪些资源
https://www.cnblogs.com/baoendemao/p/3804677.html#undefined
计算机概念来源于生活
进程 共享资源的集合 类似 现实生活的仓库
线程 对数据处理的的函数 类似 加工的机器 工人 占有时间
协程 效率快 异步 可暂停

协程

协程,又称微线程,纤程。英文名Coroutine。

扫描二维码关注公众号,回复: 2466888 查看本文章

子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。

所以子程序调用是通过栈实现的,一个线程就是执行一个子程序

子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。

注意,在一个子程序中中断,去执行其他子程序,不是函数调用,有点类似CPU的中断。
线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。

协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;

event loop是协程执行的控制点, 如果你希望执行协程, 就需要用到它们。

event loop提供了如下的特性:

注册、执行、取消延时调用(异步函数)
创建用于通信的client和server协议(工具)
创建和别的程序通信的子进程和协议(工具)
把函数调用送入线程池中

参考(一定要看)
https://www.cnblogs.com/aylin/p/5601969.html
http://python.jobbole.com/85781/
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432090171191d05dae6e129940518d1d6cf6eeaaa969000

python协程发展 http://python.jobbole.com/86481/
拓展
https://blog.csdn.net/andybegin/article/details/77884645
http://python.jobbole.com/87310/
——谢谢各位大佬!

猜你喜欢

转载自blog.csdn.net/weixin_41853490/article/details/81269720