Linux线程简单理解

线程:**是操作系统能够进行运算调度的最小单位。**它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
在一个程序里的一个执行路径就叫做线程。线程是一个进程内部的控制序列。一切进程至少有一个执行线程。线程在进程内部运行,本质是进程地址空间内运行。在Linux系统中,在cpu眼里,看到的PCB都有比传统的进程更加轻量化。
通过进程虚拟地址空间,可以看到进程大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

线程为了让程序更能充分利用多核cpu资源。

创建一个新的进程,相当于开了一个新的厂子,成本比较高。(增加健壮性)。
创建一个新的线程,相当于在原厂子的基础上新增了一条生产线,成本比较低。

每次创建一个新的进程,就会分配一个新的虚拟地址空间(复制pcb)
每次创建一个新的线程,线程共用原来的虚拟地址空间。

线程是运行在进程之中的,一个进程包含着若干个线程。
线程进程都是pcb表示的,一个pcb表示线程也表示进程。

进程:资源的管理(管理内存,管理打开的文件…)
线程:调度和执行(和进程类似,也是抢占式的调度)

透过进程虚拟地址空间,就可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

线程的优点

  • 创建一个新的线程的代价要比创建一个新的进程小的多(虚拟地址空间不用复制)
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
  • 线程占用的资源比进程少很多
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
  • 计算密集型应用,为了能在多个处理器系统上运行,将计算分解到多个线程中实现。
  • I/O密集型应用,为了提高性能,将I/O操作重置。线程可以同时等待不同I/O操作。

线程相比于进程的优点

  • 创建和销毁开销更小
  • 切换调度的开销更小
  • 线程占用的资源更小

多线程/多进程的应用场景
cpu密集型:while(1)
IO密集型:1.通过网络进行输入输出 2.响应UI界面(界面显示和数据计算要多线程完成,放在由于数据计算太久导致界面卡死)

线程缺点

  • 性能损失:一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
  • 健壮性降低:编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成了不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。一个线程异常终止会导致进程异常终止
  • 缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调度某些OS函数会对整个进程造成影响。
  • 编程难度提高:编写与调试一个多线程程序比单线程程序困难的多。对线程的可靠性要求更高。线程安全

线程之间共用的资源:

  • 虚拟地址空间。
  • 文件描述符表

线程之间不共用的资源: 不共用不是私有

  • 栈(函数调用栈就是平时说的栈,局部变量)
  • 上下文信息(CPU中寄存器的信息)
  • errno错误码,每个线程有自己单独的errno错误码

线程不是越多越好,达到一定数目的时候效率就没法提升了。
线程如果多了,多个线程尝试访问同一个资源,就会打架(互斥)。
某个线程可能一直得不到执行的机会,线程饥饿(同步)。
如果某个进程异常终止,整个进程都异常终止了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章