1.线程和进程概念对比
进程:把程序文件加载到内存,操作系统为该进程创建PCB,页表等管理进程的数据机构,这就形成了进程,是程序的执行实例。(一个程序可以有多个进程来执行)
线程:是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细和轻量化。
进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
- 进程内部:线程在进程的地址空间内运行,地址空间描述了进程所能看到的所有内容
- 执行分支:CPU调度的时候只看PCB,每一个PCB曾经被指派过指向方法和数据,CPU可以直接的调度
- 属于进程的一部分:所有和进程相关的数据结构(PCB,页表,file_struct等等)+代码和数据最多算进程内的一个执行流,进程由多个执行流组成
2.线程的结构
windows下:
一个进程内可能存在多个线程,所以在操作系统内部,会存在更多的线程,操作系统需要管理这些线程,先描述再组织,所以也有线程控制块(tcb-thread-control-block,pcb的p表示process),也就是一个struct tcb(这是windows的做法,Linux下不一样)
Linux下:
这里CPU拿到的PCB,不一定是同一个进程里面的PCB,在操作系统看来,一个PCB就是一个需要被调度的执行流。在Linux下,使用进程PCB模拟线程,在一个进程里面可以有多个PCB,表示多个线程。所以在Linux下,对操作系统来说,一个PCB就是一个需要被调度的执行流,也就是一个线程。
- CPU此时看到的PCB〈=PCB的概念, 一个PCB就是一个需要被调度的执行流
- Linux中没有专门为线程设计TCB,而是用进程的PCB来模拟线程
- 不用维护复杂的进程和线程的关系,不用单独为线程设计任何算法,直接使用进程的一套相关的方法。OS只需要聚焦在线程间的资源分配上就可以了
3.进程和线程的区别
1.进程,独立性,可以有部分共享资源(管道、ipc资源)
线程,大部分资源是共享的,可以有部分资源是"私有"的
(私有的如:pcb,栈,上下文,线程ID,一组寄存器,errno,信号屏蔽字,调度优先级)
(公有的如:文件描述符表,每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数),当前工作目录,用户id和组id)
2.进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
4.线程的优缺点
线程的优点:
- 创建一个新线程的代价要比创建一个新进程小得多
- 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多(不需要切换页表,也不需要更新缓存数据等,只需要切换上下文即可)
- 线程占用的资源要比进程少很多
- 能充分利用多处理器的可并行数量(多线程也可以做到)
- 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务(多线程也可以做到)
- 计算密集型应用(加密,大数据运算,主要使用的是CPU资源),为了能在多处理器系统上运行,将计算分解到多个线程中实现,提高效率(但是并不是线程越多越好,如果线程太多,会导致线程间被过度调度切换(有成本的),因为要保证所有的线程都能够获得CPU资源,所以需要切换)
- I/O密集型应用(网络下载,云盘,ssh,在线直播,看电影,主要使用的是内存和外设的资源),为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作(等外设A的时候另一个线程也在等外设B)。(同样也不是线程越多越好,相比计算密集型,可以多一些线程,因为IO比较慢,大部分时间都是在等待,比如等待用户输入)
计算密集+IO密集型的应用:网络游戏
线程的缺点:
- 性能损失(多线程也有)
如果线程数量超过CPU的核心数量,来回切换线程会需要额外的同步和调度的开销。
- 健壮性降低
一个线程崩溃,整个进程崩溃。因为所有线程共享进程地址空间,线程之间是完全透明的,一个线程崩溃就说明该线程此时已经出现了不可逆转的错误,该错误极有可能已经破坏掉了或者即将破坏掉进程的地址空间,因此在操作系统眼里看来继续运行其它线程是有很大风险的,因为大家共同运行的基础已经没有了(完好的地址空间)。
- 缺乏访问控制
线程是没有独立性的,在进行一些操作的时候(比如修改了进程中某些全局数据),会对整个进程产生影响。
- 编程难度提高
总和前三个原因,也就导致了编写与调试一个多线程程序比单线程程序困难得多。程序崩溃后,调试很困难。
5.线程异常/线程用途
线程异常:
- 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
- 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出
线程用途:
- 合理的使用多线程,能提高CPU密集型程序的执行效率
- 合理的使用多线程,能提高IO密集型程序的用户体验(像迅雷的边下边播,一个线程下载数据,一个线程播放视频)