个人主页:Lei宝啊
愿所有美好如期而遇
线程优点
创建一个新线程的代价要比创建一个新进程小得多
这个好理解,创建进程,需要创建task_struct,创建虚拟地址空间,还有页表,建立映射关系等等,而创建线程仅仅只需要创建一个task_struct。
与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
进程的切换,在我们看来,就是切换硬件的上下文数据,线程也有他自己的上下文数据需要维护,线程的切换,也就是切换他的硬件上下文数据,但对于CPU上的寄存器来说,无非也就多了那么几次交互,线程切换似乎并没有比进程切换效率高多少?
其实差距就在cache上,CPU中有一个硬件叫做cache,也就是缓存,他在执行一个指令的时候,会认为你大概率也会执行下一行指令,也就会一次性将一批数据从物理内存中读取到cache中,下次执行指令时就从cache中拿就行。
进程切换,cache中的数据也就没用了,新切换的进程数据,仍然要重新加载进cache中。而线程不同,因为共享一个虚拟地址空间,读取在cache中的数据大概率上在进程切换后仍然可以使用,就无需丢弃这批数据,效率也就高了。
- 线程占用的资源要比进程少很多
- 能充分利用多处理器的可并行数量
- 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
- 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
- I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作
剩下这五个优点我们不做详细介绍。
线程缺点
性能损失
一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
健壮性降低
编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
缺乏访问控制
进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
编程难度提高
编写与调试一个多线程程序比单线程程序困难得多。
线程 vs 进程
进程是分配资源的基本实体,线程是调度的基本单位。
即使线程共享进程数据,但也有自己的一部分数据:
- 线程的硬件上下文数据(调度)
- 线程的独立栈(常规运行)
- 线程id
- 信号屏蔽字
- 线程优先级
如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
- 文件描述符表
- 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
- 当前工作目录
- 用户id和组id