[优雅的面试] 进程 线程 协程分的清
面试官大佬:小伙子,咱今儿个先聊聊进程线程这块的知识哈,就先说说进程吧。
我:存储在硬盘中的代码是静态文件,运行中的程序被称为进程。进程之间数据是相互隔离的。
一般说来,一个进程并不是自始至终连续不停地运行的,它与并发执行中的其他进程的执行相互制约。在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。
①当进程被创建完成并初始化后,会变成就绪状态。
②处于就绪状态的进程被操作系统的进程调度器选中后,就分配给 CPU 正式运行该进程,进入运行状态;
③当进程已经运行完成或出错时,会被操作系统作结束状态处理;
④处于运行状态的进程在运行过程中,由于分配给它的运行时间片用完,操作系统会把该进程变为就绪态,接着从就绪态选中另外一个进程运行;
⑤当进程请求某个事件且必须等待时,例如请求 I/O 事件的时候就会从运行状态变为阻塞状态;
⑥当进程等待的事件完成的时候,就会从阻塞状态变成就绪态
面试官大佬:(心想,小伙子说的挺全)那再说说线程呢?
我:线程是进程中的的一条流水线
,是CPU调度的单位,一个进程中可以同时存在多个线程,同一个进程内的线程共享当前进程中的所有资源,如果打个比方说,就是进程相当于一个车间,线程就相当于车间中的流水线,流水线需要的原料都需要从车间中获取。因此可以说进程是一个资源单位,而线程是执行单位,并且创建线程比创建进程更加节省资源。
面试官大佬:python中的协程有了解吗
我:在python中协程指的是单线程下实现并发,由开发人员在代码层面上检测IO操作,一旦程序遇到IO操作就会在代码级别完成切换,这样给CPU的感觉就是程序一直在运行,没有IO操作,从而提升程序的运行效率 ,在python中可以借助gevent模块实现协程,gevent模块本身无法检测一些常见的io操作,需要借助猴子补丁。
面试官大佬:python中的GIL锁知道吗?
我:GIL是python的全局解释器锁,并且GIL是CPython的特点,是用来阻止同一进程下多个线程的同时执行,GIL存在的原因是Cpython的内存管理不是线程安全的。
程序的代码需要交给解释器解释执行,由于进程中所有线程是共享该进程内的资源,这就有了竞争,而垃圾回收机制也是当前进程中的一个线程,这个线程会和当前进程内的其他线程争抢数据,为了保证数据安全,进程内同一时间只有一个线程在运行就有了GIL。
面试官大佬:嗯嗯,进程线程这些基本知识说的都不差,咱们再约下次简单聊聊网络方面的吧~
我:(还要下次这个面试官还真是奇怪哦)好的,您慢走。