操作系统:线程

本文详细介绍了线程在操作系统中的概念,进程与线程的关系,以及Linux中如何通过pthread库进行线程控制,包括线程创建、退出、等待、分离和取消。同时讨论了线程控制的接口、原理和与编程语言如C++的关系,以及线程局部存储的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言: 

1.线程

1.1.初识线程

1.2.“轻量化”进程

1.3.线程与进程

2.线程控制 

2.1.pthread原生线程库

2.2.线程控制的接口 

2.2.1.线程创建

2.2.线程退出|线程等待|线程分离|线程取消

2.3.pthread库的原理

2.4.语言和pthread库的关系

2.5.线程局部存储


前言: 

在前面的学习中,我们知道进程是一种处理任务的执行流,操作系统中的大部分任务都由进程来处理,而进程的创建,需要开辟内存来产生进程PCB、进程虚拟地址空间、页表……,而这个进程的创建成本较大,于是操作系统实现了另一种执行流------线程。

  1. 线程是比进程更加轻量化的一种执行流,线程是进程内部的一种执行流。
  2. 线程是CPU调度的基本单位,进程是承担系统资源的实体。

那么我们大概就能猜到:进程是线程的载体,操作系统增加了线程这个新的执行流后,进程的角色变为了在系统中创建、获取资源,用来供给线程执行流,实现CPU对线程的不断调度,即:进程是线程的宏观体现?带着这个猜测,我们开始进入线程的学习……

1.线程

1.1.初识线程

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”

我们在以往的博客中,把进程当做一个执行流来看待,是因为我们在进程中只有一条单一的执行流,当我们在某个进程中创建新的线程之后,就出现了“主线程”和“新线程”,那么这里我们就知道了进程是通过线程来作为执行流的。 

一言以蔽之:对于Linux而言,进程是一个资源的结合体,而线程就是通过这些资源来完成任务的一个个执行流。

比如:有一家大公司,干活的肯定不是大公司,而是公司里的各个部门中的打工人,公司这个进程提供的就是给线程的资源,给线程一个好的平台、环境去发挥。


1.2.“轻量化”进程

在操作系统中,虽然为了解决进程过于笨重的问题,引入了线程的概念,但是线程和进程一样都是一个需要描述的结构,那么进程用process control block(PCB)来描述,那么线程是不是也同样需要TCB这一个数据结构来进行描述呢?

答案:线程也是需要通过数据结构,进行“先描述再组织”的,但是我们实现这个结构可以通过两个方向:1.创建新的TCB体系,实现一份类似于PCB的体系。2.复用当前PCB体系。

对于Windows而言,实现了一个Thread的体系。而Linux则是在PCB的基础上,将线程抽象成“轻量化进程”这个概念,接着复用当前PCB体系……(这里也体现了tast_stuct不完全等于PCB)

如图:对应我们上面所述------Linux对线程的实现是抽象成“轻量化”进程,这是怎么理解的呢?

  1. 首先进程拥有它的内核数据结构、代码和数据,所以在空间中需要开辟较多资源来存储
  2. “轻量化”体现在于,Linux创建新的线程时,只创建一份新的task_struct,和部分的代码和资源,这样子就能够减少资源的开辟
  3. 我们说是创建了新的task_struct,但是实际上这些创建的“轻量化”进程共用着原进程的资源,也就是线程他们是可以访问同一个进程内的数据的。

除了上面的几点,线程的轻量化也体现在CPU的调度上……这里我们需要重点讲解!!!

我们知道:在进程间转换时,CPU在调度不同的进程时需要进行进程相关的上下文切换,以及页表、进程地址空间相关的寄存器内数据的切换……

而线程中的切换,因为访问的是同一个进程的资源,所以大部分的寄存器内容不用修改,这样子线程在CPU切换和调度就显得轻量化了。

实际上:CPU内会维护一块cache缓存,一般情况下CPU是从内存直接读取进程的数据并加载到CPU中,而为了减少IO提高系统效率,所以CPU会将进程的部分代码和数据提前读取进cache中,这部分预加载的代码和数据符合局部性原理。而进程切换,这一块缓存中保存的热数据也需要切换。线程切换并不需要切换cache

面试题:线程切换为什么效率高?

  1. 切换的寄存器少
  2. 不需要重新更新cache缓存 

1.3.线程与进程

  1. 进程是资源分配的基本单位,对于线程而言,进程是线程的载体,给线程提供资源。
  2. 线程是调度的基本单位,宏观上是进程被调度,其实在CPU中是通过线程(LWP)来进行任务的调度的
  3. 线程共享进程数据,但也拥有自己的一部分数据。

对于第三点,因为线程需要被CPU进行调度,处于多线程时,就需要保存当前线程的上下文(类似进程切换),所以线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值