linux---线程概念

目录

1、什么是线程?

2、线程的优缺点

3、线程异常、线程用途、

4、Linux线程和进程的比较


1、什么是线程?

线程是一个进程内部的控制序列,在一个程序里的一条执行路线就叫做线程。所有的进程都至少有一个执行线程,线程在进程内部本质是在进程地址空间上运行(所有线程同时使用该进程的程序地址空间,只不过每个线程都有自己的执行流)。线程透过进程地址空间可以看到进程的大部分资源,将进程资源合理分配给每个执行流就形成了线程执行流。在Linux系统中,线程是用进程来模拟实现的,也就是说Linux中线程没有相关的数据结构。

linux---线程概念_第1张图片

在Linux中多个task_struct公用一个程序地址空间,形成了多个线程执行流,因此Linux中的所有的PCB都要比传统的进程更加轻量化。

2、线程的优缺点

1)线程的优点

  • 创建线程不需要给线程创建独立的虚拟地址空间、页表等数据结构,因此创建线程的代价比创建进程的代价小。
  • 与进程之间的切换相比,线程之间的切换需要操作系统做更少的工作。
  • 线程占用的资源比进程少,线程公用进程的许多资源。
  • 线程能充分利用多处理器的可并行数量。
  • 在等待慢速I/O操作结束的同时,程序可以执行其他计算任务。不同线程分担不同的任务。
  • 计算密集型应用,为了能够在多处理器上并行运行,将计算分解到多个线程中。
  • I/O密集型应用,为了提高性能将I/O操作重叠。线程可以同时等待不同的I/O操作。

线程的优点很多,但是只有前三个是线程独有的优点,后边的优点利用多进程同样可以实现。

2)线程的缺点

  • 性能损失:一个很少被外部阻塞的计算密集型线程往往无法与其他线程共享同一个处理器。如果计算密集型线程的数量比可用处理器的数量多,就会增加额外的调度和同步开销,造成性能损失。
  • 健壮性第:在多线程程序里,因时间分配上的细微偏差或共享了不该共享的变量而造成不良影响的可能是很大的,线程之间缺乏保护性。
  • 缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些系统函数会对整个进程造成影响。
  • 编程难度高:当某一个线程崩溃可能导致整个进程崩溃,编写和调试多线程程序比单线程程序困难的多。

3、线程异常、线程用途

1)线程异常

线程是进程的一个分支,当线程出现异常触发信号机制,会导致进程终止,随即进程中的所有线程也会终止。

单线程如果出现除0、野指针等问题导致线程崩溃,进程也会随着崩溃。

2)线程的用途

  • 合理的使用多线程,能提高CPU密集型程序的执行效率

  • 合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

4、Linux线程和进程的比较

1)进程是资源分配的基本单位,线程是调度的基本单位。

线程共享进程的一些数据结构,当一个程序加载到内存被CPU执行时就已经创建好了各种数据结构和内存资源的分配,也就是说资源分配是以进程为单位进行分配的。

在多线程中,CPU的调度是以线程为单位进行调度的,Linux下一个进程至少有一个线程(Linux中进程本身就是轻量级进程)因此单线程程序的调度也是以线程为单位进行调度的。

2)线程是进程中的执行流,线程在进程的程序地址空间上运行。

线程和进程共享进程的程序地址空间,一个进程中可以有多个线程,每一个线程就是进程的一条执行流。

3)线程共享进程数据,但是线程也有自己的数据。

线程私有数据(每个线程私有线程栈,拥有自己的硬件上下文)

  • 线程ID(每一个线程都有独立的线程ID,用来标识不同的线程)
  • 一组寄存器(线程调度时保存当前线程数据,和其他线程数据互不干扰)
  • 线程栈(线程私有线程栈)
  • errno
  • 信号屏蔽字
  • 调度优先级

共享数据

  • 数据段、代码段(如果定义一个函数在各个线程中都可以调用,定义一个全局变量在各个线程中都可以访问)
  • 文件描述符
  • 每种信号的处理方式
  • 当前的工作目录
  • 用户id和组id

linux---线程概念_第2张图片

你可能感兴趣的:(Linux,多线程,linux)