多进程与多线程处理任务:
如果需要进行多任务处理,有两种方法:一种是多线程,一种是多进程。
线程优点:
- 线程间的通信更加灵活:线程间共用同一虚拟地址,共享数据段,只要知道虚拟地址就可以访问数据。线程间的通信方式包含进程间通信方式(管道、共享内存、消息队列、信号量)在内还可以使用全局变量以及函数传参实现通信。
- 线程的创建与销毁成本更低:创建线程只需要创建pcb,然后建立映射关系
- 线程间的调度成本低:共用同一页表,调度时不用切换页表等
注意:
一个线程崩溃,进程退出,释放进程资源,所有线程退出。
线程不是越多越好,cpu资源固定,线程多了反而会增加线程间的切换调度成本
进程优点:
- 稳定性高、健壮性强:各个进程之间是相互独立的,如果一个进程崩溃,不会影响其他进程的运行。适用于对于主程序安全性要求更高的场景,例如:shell、网络服务器
多线程的优点就是多进程的缺点,多进程的优点就是多线程的缺点。
线程与进程的应用场景不同,在合适的场景选取合适的方法。
多任务处理场景:
- CPU密集型程序:程序中进行大量数据运算,对cpu资源要求高。可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,CPU密集型任务同时进行的数量应当等于CPU的核心数。
- IO密集型程序:程序中进行大量IO操作,对cpu资源要求并不高。任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。