深入原理64式:18 多进程,多线程相关问题总结

目标:
整理多进程/多线程知识,主要包含如下内容:
1、多进程及其通信方式
2、多线程及其通信方式
3、线程池与进程池

第一部分 多进程及其通信方式
1 进程是什么?线程是什么?进程与线程有什么区别?
1)进程是已运行程序的实体,由程序,数据,进程控制块组成。
2)线程是轻量级进程,是处理器的分配单元。
3)主要在调度,开销,地址空间上有区别。
调度:进程是资源分配的单位,线程是调度的单位。
开销: 进程创建和销毁的开销大于线程的开销。
    因为进程切换涉及CPU环境保存和设置,线程切换只需保存少量寄存器内容
地址空间: 进程地址空间相互独立,同一进程的各线程共享进程的资源。

2 进程有哪些状态?状态如何切换?
1)运行,就绪,阻塞状态。
运行状态: 进程在处理器上运行。
就绪状态: 获得除处理器外所有所需资源
阻塞状态: 等待某时间二暂停,例如等待输入/输出
2) 
运行->阻塞:等待某个事件发生
阻塞->就绪:等待的事件发生
就绪->运行:调度
运行->就绪:时间片到。

3 什么是临界资源?什么是临界区?
1)一次仅允许一个进程使用的资源,例如打印机。
2)临界区是访问临界资源的那段代码。

4 进程间通信有哪些方式?
进程间通信的方式有:管道,信号,消息队列,共享内存,套接字。
管道: 可用于亲缘关系的进程通信。有名管道可以用于无亲缘关系的进程通信。
信号: 通知接收进程有某种事件发生,
消息队列: 一个进程可以向其中写入消息,零一个进程可以从队列中读取消息。
共享内存: 多个进程可以访问同一块内存空间。
        在内存划出区域作为共享区,把区域映射到参与通信的各个进程空间。
套接字:即socket,用于不同机器之间的进程通信。

第二部分 多线程及其通信方式
1 线程间通信凡是有哪些?
互斥体(互斥量),信号量,条件变量。

2 临界区与互斥体的区别是什么?
1)临界区只能用来同步本进程的多个线程;
互斥体可以被用于跨进程同步数据。
2)临界区是非内核对象,速度快,互斥体是内核对象,速度慢。


第三部分 线程池与进程池
1 线程池的默认queue实现是什么?
python中:

2 线程池有哪些参数?分别有什么用?如果任务数超过的核心线程数,会发生什么?阻塞队列大小是多少?
1)python中有workers,用于设置线程池的大小。
2)任务数超过核心线程数,已提交的任务在队列中,等待其他线程完成后继续处理。
3)待补充

3 线程池原理
主线程是通过队列将任务传递给多个子线程。一旦主线程将任务塞进任务队列,子线程们就会开始争抢,最终只有一个线程能抢到这个任务,并立即进行执行,执行完后将结果放进Future对象就完成了这个任务的完整执行过程。
主线程将任务塞进线程池后得到了这个Future对象,它内部的_result还是空的。如果主线程调用result()方法获取结果,就会阻塞在条件变量上。如果子线程计算任务完成了就会立即调用set_result()方法将结果填充进future对象,并唤醒阻塞在条件变量上的线程,也就是主线程。这时主线程立即醒过来并正常返回结果。

4 进程池原理
主线程将任务塞进TaskQueue(普通内存队列),拿到Future对象
唯一的管理线程从TaskQueue获取任务,塞进CallQueue(分布式跨进程队列)
子进程从CallQueue中争抢任务进行处理
子进程将处理结果塞进ResultQueue(分布式跨进程队列)
管理线程从ResultQueue中获取结果,塞进Future对象
主线程从Future对象中拿到结果

5 跨进程队列
进程池模型中的跨进程队列是用multiprocessing.Queue实现的。
它使用无名套接字sockerpair来完成的跨进程通信,socketpair和socket的区别就在于socketpair不需要端口,不需要走网络协议栈,通过内核的套接字读写缓冲区直接进行跨进程通信。

6 I/O密集型与CPU密集型任务的选择
concurrent提供了两种并发模型,一个是多线程ThreadPoolExecutor,一个是多进程ProcessPoolExecutor。对于IO密集型任务宜使用多线程模型。对于计算密集型任务应该使用多进程模型。
是因为Python GIL的存在让Python虚拟机在进行运算时无法有效利用多核心。对于纯计算任务,它永远最多只能榨干单个CPU核心。如果要突破这个瓶颈,就必须fork出多个子进程来分担计算任务。而对于IO密集型任务,CPU使用率往往是极低的。


参考:
王道程序员求职宝典
https://blog.csdn.net/qingyuanluofeng/article/details/97882309
https://blog.csdn.net/wei_cheng18/article/details/79658209
https://blog.csdn.net/qq_38410730/article/details/81488145
https://www.cnblogs.com/hoojjack/p/10846010.html
http://blog.sina.com.cn/s/blog_3df05c220102ydlj.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值