一、多线程
-
多线程的处理思路:一个运行中的程序中,具有多个执行流,各自完成一个功能模块的实现
-
linux的操作系统中:认为一个pcd就是一个执行流(pcd是操作系统调用一段程序运行的 实体–描述了程序的运行过程)
- linux下的线程就是一个pcd
- pcd:是一个进程
- 现在,多个pcd可以共用同一个虚拟地址空间,这些pcd共用了一个运行中程序的资源
- linux下的线程就是一个pcd是一个轻量级进程,因为一个运行中程序的多个pcd共用同一 份资源
- 一个运行中的程序就是一个进程,以前我们所说的进程,这时候再来解释,就是具有一个线程的进程,linux下的线程是一个pcb(轻量级进程),是一个进程中的一条执行流;
- 进程就是一个线程组;
二、进程/线程
1、进程跟线程是要一起说的(否则单一说会有一种冲突感)
2、进程就是一个运行中的程序,操作系统会创建一个pcb(运行中程序的描述),并且分配资 源,通过pcb来调度运行整个程序
3、线程是一个进程中的执行流,但是linux下实现进程中的执行流的时候,使用了pcb实现
4、因此就说linux下的线程是一个pcb,称作轻量级进程,因为同一个进程中的线程共用进程 分配的资源
5、而进程就是所有线程的统称,就是一个线程组,系统在运行程序,分配资源的时候是分 配给线程组,分配给整个进程
进程是资源分配的基本单位,线程是cpu调度的基本单位
三、 线程之间的独有与共享
线程是一个pcb; 一个进程中若有多个线程,也就意味着有多个pcb,这些pcb共用同一个虚 拟地址空间; 它是如何做到同时运行而不会出现栈混乱的情况的呢?
线程之间的独有与共享
1>独有:栈(每个线程一个,就可以避免出现栈混乱了),寄存器(每一个pcb都是一个执行流),信号屏蔽字(阻塞自己想阻塞的信号),errno (每调用一次系统调用都会重置errno)
2> 共享:代码段和数据段(虚拟地址空间),信号的处理方式,I0信息, 工作路径,用户id,组id
四、多线程的优缺点
多线程任务处理相较于多进程的优点:
1.线程间的通信更加灵活方便(出了进程间通信方式以外,还可以通过全局变量/函数传参实 现通信)
2.线程的创建和销毁成本更低(线程间共享进程等的大部分资源)
3.同一个进程中的线程间调度成本更低(切换页表,数据)
4.线程的执行粒度更加细致
缺点:
1、线程间缺乏访问控制,有些系统调用(exit)或者异常是针对整个进程产生效果
2、多线程任务处理没有多进程任务处理稳定性高
应用场景:多进程应用场景,对主程序的稳定性安全性要求更高的场景,比如shell/网络服务 器;
五、多进程/多线程进行并发/并行任务处理的优势
- I0密集型程序:在程序中进行大量的I0操作,但是对cpu资源要求并不多
在操作系统层面实现平衡化(循环调度;循环对一个线程中的IO发出请求,不需要等待上一个完 成后才能进行下一个的请求),并行压缩了I0的等待时间- CPU密集型程序:在程序中进行大量的数据运算,对cpu资源要求更多
多执行流操作,可以更加充分的利用cpu资源;在多cpu情况下,多个执行流可以实现并行处理,提高效率
在这种情况下,到底线程创建多少个比较合适: cpu核心数+1 (线程创建的太多,反而会增 加调度成本)
来源:CSDN
作者:An_Mo
链接:https://blog.csdn.net/An_Mo/article/details/104446996