操作系统(6)---线程

发布时间 2023-10-08 21:59:20作者: 小光翎

一、线程

为什么引入线程?

单进程——>串行,多进程——>并发。问题:数据无法共享。进程之间不共享内存,就用多线程来解决。

多线程解决思路:

  在进程内部增加一类实体(线程),线程之间可以并发执行,可以共享相同的地址空间。

线程的概念:线程是进程的一部分,描述指令流执行状态,它是进程中的指令执行流的最小单元,是CPU调度的基本单位

因为总有不能共享的资源,所有线程也有线程控制块TCB(保持地址独立)。

                                                             

二、线程与进程

进程是资源分配单位,线程是CPU调度单位。

进程拥有一个完整资源平台,线程只独享指令流执行的必要资源,如堆栈、寄存器。

线程具有就绪、等待和运行三种基本状态和状态间的转换关系。

线程能减少并发执行的时间和空间开销

  • 线程的创建时间比进程短
  • 线程的终止时间比进程短
  • 同一进程内的线程切换时间比进程短

由于同一进程的各线程间共享内存和文件资源,可不通过内核进行直接通信

线程=进程-共享资源

 

  • 线程的优点:一个进程可以有多个线程,各线程可以并发执行,可以共享地址空间和文件等资源。
  • 线程的缺点:一个线程崩溃,所属进程的其他进程都会崩溃。

主线程和函数线程

 

  

 

上面的例子可以看出:

  • 主线程和函数线程并发执行
  • 函数线程若提前于主线程结束,不影响主线程运行
  • 主线程提前于函数线程结束,整个进程都会结束,其他进程均结束
  • 哪个线程先执行取决于调度算法和当时机器环境决定

 

 

三、用户线程与内核线程

用户线程:由用户级线程函数完成线程的管理(线程的创建、终止、同步和调度等),内核不知道用户线程的存在。

                                                           

用户线程是多对一结构,一个内核进程为多个用户线程服务。

优点:1.同一进程内的用户线程切换速度快,不依赖操作系统内核(可用于不支持线程的多进程操作系统),无需用户态/核心态的切换,线程切换代价比内核线程少。

   2.允许每个进程拥有自己的线程调度算法。

缺点:1.一个用户线程发起系统调用占用内核资源而阻塞时,整个进程进入等待,不会进行线程切换,因为内核不知道多线程的存在。

      2.不支持基于线程的处理机抢占。除非当前运行的线程主动放弃,否则其所在进程的其他线程无法抢占CPU。

      3.只能按进程分配CPU时间。多线程的进程中,每个线程的时间片段少。

 

内核线程:由内核通过系统调用实现线程机制,完成线程的管理(线程的创建、终止、同步和调度等)。

                                                           

 

内核线程是一对一结构(单核心,多核心处理器就是多对多结构),一个内核线程服务一个用户线程。

优点:1.多核处理器下,内核可以并行同一进程的多个线程。

   2.一个线程执行系统调用而被阻塞不影响其他线程的执行,能够切换同一进程的其他线程继续执行(单核心处理器中,只有一个核心可用,可能会发生阻塞导致内核线程被延迟执行)

      3.以线程为单位进行CPU时间分配,多线程的进程可以获得更多CPU时间。

缺点:1.线程的创建、终止、切换开销大,通过系统调用/内核函数在内核实现,涉及用户态/核心态的转换,速度和效率不如用户级线程。