[优雅的面试] 进程 线程 协程分的清 | Python 主题月

2,001

本文正在参加「Python主题月」,详情查看 活动链接

微信公众号搜索【程序媛小庄】,Rest cannot be enjoyed by lazy people.

前情提要:小庄的面试可谓是一波三折,面试官大佬邀请我面试多线程多进程这块,来看看小庄如何机智应对吧~

image.png

面试官大佬:小伙子,咱今儿个先聊聊进程线程这块的知识哈,就先说说进程吧。

我:存储在硬盘中的代码是静态文件,运行中的程序被称为进程。进程之间数据是相互隔离的。

一般说来,一个进程并不是自始至终连续不停地运行的,它与并发执行中的其他进程的执行相互制约。在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。

①当进程被创建完成并初始化后,会变成就绪状态。

②处于就绪状态的进程被操作系统的进程调度器选中后,就分配给 CPU 正式运行该进程,进入运行状态;

③当进程已经运行完成或出错时,会被操作系统作结束状态处理;

④处于运行状态的进程在运行过程中,由于分配给它的运行时间片用完,操作系统会把该进程变为就绪态,接着从就绪态选中另外一个进程运行;

⑤当进程请求某个事件且必须等待时,例如请求 I/O 事件的时候就会从运行状态变为阻塞状态;

⑥当进程等待的事件完成的时候,就会从阻塞状态变成就绪态

面试官大佬:(心想,小伙子说的挺全)那再说说线程呢?

我:线程是进程中的的一条流水线,是CPU调度的单位,一个进程中可以同时存在多个线程,同一个进程内的线程共享当前进程中的所有资源,如果打个比方说,就是进程相当于一个车间,线程就相当于车间中的流水线,流水线需要的原料都需要从车间中获取。因此可以说进程是一个资源单位,而线程是执行单位,并且创建线程比创建进程更加节省资源。

面试官大佬:python中的协程有了解吗

我:在python中协程指的是单线程下实现并发,由开发人员在代码层面上检测IO操作,一旦程序遇到IO操作就会在代码级别完成切换,这样给CPU的感觉就是程序一直在运行,没有IO操作,从而提升程序的运行效率 ,在python中可以借助gevent模块实现协程,gevent模块本身无法检测一些常见的io操作,需要借助猴子补丁。

面试官大佬:python中的GIL锁知道吗?

我:GIL是python的全局解释器锁,并且GIL是CPython的特点,是用来阻止同一进程下多个线程的同时执行,GIL存在的原因是Cpython的内存管理不是线程安全的。

程序的代码需要交给解释器解释执行,由于进程中所有线程是共享该进程内的资源,这就有了竞争,而垃圾回收机制也是当前进程中的一个线程,这个线程会和当前进程内的其他线程争抢数据,为了保证数据安全,进程内同一时间只有一个线程在运行就有了GIL。

面试官大佬:嗯嗯,进程线程这些基本知识说的都不差,咱们再约下次简单聊聊网络方面的吧~

我:(还要下次这个面试官还真是奇怪哦)好的,您慢走。