大话操作系统(9)线程基础知识

什么是线程?

线程是进程当中的⼀条执⾏流程。

同⼀个进程内多个线程之间可以共享代码段、数据段、打开的⽂件等资源,但每个线程各⾃都有⼀套独⽴的寄存器和栈,这样可以确保线程的控制流是相对独⽴的。

在这里插入图片描述

线程的优缺点?

线程的优点:
⼀个进程中可以同时存在多个线程;
各个线程之间可以并发执⾏;
各个线程之间可以共享地址空间和⽂件等资源;

线程的缺点:
当进程中的⼀个线程崩溃时,会导致其所属进程的所有线程崩溃。

举个例⼦,对于游戏的⽤户设计,则不应该使⽤多线程的⽅式,否则⼀个⽤户挂了,会影响其他同个进程的线程。

线程与进程的⽐较

线程与进程的⽐较如下:

进程是资源(包括内存、打开的⽂件等)分配的单位,线程是 CPU 调度的单位;
进程拥有⼀个完整的资源平台,⽽线程只独享必不可少的资源,如寄存器和栈;
线程同样具有就绪、阻塞、执⾏三种基本状态,同样具有状态之间的转换关系;
线程能减少并发执⾏的时间和空间开销;

对于,线程相⽐进程能减少开销,体现在:

线程的创建时间⽐进程快,因为进程在创建的过程中,还需要资源管理信息,⽐如内存管理信息、⽂件管理信息,⽽线程在创建的过程中,不会涉及这些资源管理信息,⽽是共享它们;
线程的终⽌时间⽐进程快,因为线程释放的资源相⽐进程少很多;
同⼀个进程内的线程切换⽐进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同⼀个进程的线程都具有同⼀个⻚表,那么在切换的时候不需要切换⻚表。⽽对于进程之间的切换,切换的时候要把⻚表给切换掉,⽽⻚表的切换过程开销是⽐较⼤的;
由于同⼀进程的各线程间共享内存和⽂件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更⾼了;

所以,不管是时间效率,还是空间效率线程⽐进程都要⾼。

线程的上下⽂切换

在前⾯我们知道了,线程与进程最⼤的区别在于:线程是调度的基本单位,⽽进程则是资源拥有的基本单位。

所以,所谓操作系统的任务调度,实际上的调度对象是线程,⽽进程只是给线程提供了虚拟内存、全局变量等资源。

对于线程和进程,我们可以这么理解:

当进程只有⼀个线程时,可以认为进程就等于线程;
当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源,这些资源在上下⽂切换时是不需要修改的;

另外,线程也有⾃⼰的私有数据,⽐如栈和寄存器等,这些在上下⽂切换时也是需要保存的。

线程上下⽂切换的是什么?

这还得看线程是不是属于同⼀个进程:

当两个线程不是属于同⼀个进程,则切换的过程就跟进程上下⽂切换⼀样;
当两个线程是属于同⼀个进程,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据;

所以,线程的上下⽂切换相⽐进程,开销要⼩很多。

线程的实现

主要有三种线程的实现⽅式:
⽤户线程(User Thread):在⽤户空间实现的线程,不是由内核管理的线程,是由⽤户态的线程库来完成线程的管理;
内核线程(Kernel Thread):在内核中实现的线程,是由内核管理的线程;
轻量级进程(LightWeight Process):在内核中来⽀持⽤户线程;
那么,这还需要考虑⼀个问题,⽤户线程和内核线程的对应关系。

⽤户线程和内核线程的对应关系。

⾸先,第⼀种关系是多对⼀的关系,也就是多个⽤户线程对应同⼀个内核线程:
在这里插入图片描述
第⼆种是⼀对⼀的关系,也就是⼀个⽤户线程对应⼀个内核线程:

在这里插入图片描述
第三种是多对多的关系,也就是多个⽤户线程对应到多个内核线程:

在这里插入图片描述

⽤户线程如何理解?存在什么优势和缺陷?

⽤户线程是基于⽤户态的线程管理库来实现的,那么线程控制块(Thread Control Block, TCB) 也是在库⾥⾯来实现的,对于操作系统⽽⾔是看不到这个 TCB 的,它只能看到整个进程的 PCB。

所以,⽤户线程的整个线程管理和调度,操作系统是不直接参与的,⽽是由⽤户级线程库函数来完成线程的管理,包括线程的创建、终⽌、同步和调度等。

⽤户级线程的模型,也就类似前⾯提到的多对⼀的关系,即多个⽤户线程对应同⼀个内核线程,如下图所示:

在这里插入图片描述
⽤户线程的优点:

每个进程都需要有它私有的线程控制块(TCB)列表,⽤来跟踪记录它各个线程状态信息(PC、栈指针、寄存器),TCB 由⽤户级线程库函数来维护,可⽤于不⽀持线程技术的操作系统;

⽤户线程的切换也是由线程库函数来完成的,⽆需⽤户态与内核态的切换,所以速度特别快;

⽤户线程的缺点:

由于操作系统不参与线程的调度,如果⼀个线程发起了系统调⽤⽽阻塞,那进程所包含的⽤户线程都
不能执⾏了。

当⼀个线程开始运⾏后,除⾮它主动地交出 CPU 的使⽤权,否则它所在的进程当中的其他线程⽆法
运⾏,因为⽤户态的线程没法打断当前运⾏中的线程,它没有这个特权,只有操作系统才有,但是⽤
户线程不是由操作系统管理的。

由于时间⽚分配给进程,故与其他进程⽐,在多线程执⾏时,每个线程得到的时间⽚较少,执⾏会⽐
较慢;

以上,就是⽤户线程的优缺点了。

那内核线程如何理解?存在什么优势和缺陷?

内核线程是由操作系统管理的,线程对应的 TCB ⾃然是放在操作系统⾥的,这样线程的创建、终⽌和管理都是由操作系统负责。

内核线程的模型,也就类似前⾯提到的⼀对⼀的关系,即⼀个⽤户线程对应⼀个内核线程,如下图所示:

在这里插入图片描述
内核线程的优点:

在⼀个进程当中,如果某个内核线程发起系统调⽤⽽被阻塞,并不会影响其他内核线程的运⾏;

分配给线程,多线程的进程获得更多的 CPU 运⾏时间;

内核线程的缺点:

在⽀持内核线程的操作系统中,由内核来维护进程和线程的上下⽂信息,如 PCB 和 TCB;

线程的创建、终⽌和切换都是通过系统调⽤的⽅式来进⾏,因此对于系统来说,系统开销⽐较⼤;

以上,就是内核线程的优缺点了。

最后的轻量级进程如何理解?

轻量级进程(Light-weight process , LWP)是内核⽀持的⽤户线程,⼀个进程可有⼀个或多个 LWP,每个 LWP 是跟内核线程⼀对⼀映射的,也就是 LWP 都是由⼀个内核线程⽀持。

另外,LWP 只能由内核管理并像普通进程⼀样被调度,Linux 内核是⽀持 LWP 的典型例⼦。

在⼤多数系统中,LWP与普通进程的区别也在于它只有⼀个最⼩的执⾏上下⽂和调度程序所需的统计信息。⼀般来说,⼀个进程代表程序的⼀个实例,⽽ LWP 代表程序的执⾏线程,因为⼀个执⾏线程不像进程那样需要那么多状态信息,所以 LWP 也不带有这样的信息。

在 LWP 之上也是可以使⽤⽤户线程的,那么 LWP 与⽤户线程的对应关系就有三种:
1 : 1 ,即⼀个 LWP 对应 ⼀个⽤户线程;
N : 1 ,即⼀个 LWP 对应多个⽤户线程;
M : N ,即多个 LMP 对应多个⽤户线程;

接下来针对上⾯这三种对应关系说明它们优缺点。先看下图的 LWP 模型:
在这里插入图片描述

  • 1 : 1 模式
    ⼀个线程对应到⼀个 LWP 再对应到⼀个内核线程,如上图的进程 4,属于此模型。
    优点:实现并⾏,当⼀个 LWP 阻塞,不会影响其他 LWP;
    缺点:每⼀个⽤户线程,就产⽣⼀个内核线程,创建线程的开销较⼤。
  • N : 1 模式
    多个⽤户线程对应⼀个 LWP 再对应⼀个内核线程,如上图的进程 2,线程管理是在⽤户空间完成的,此模式中⽤户的线程对操作系统不可⻅。
    优点:⽤户线程要开⼏个都没问题,且上下⽂切换发⽣⽤户空间,切换的效率较⾼;
    缺点:⼀个⽤户线程如果阻塞了,则整个进程都将会阻塞,另外在多核 CPU 中,是没办法充分利⽤CPU 的。
  • M : N 模式
    根据前⾯的两个模型混搭⼀起,就形成 M:N 模型,该模型提供了两级控制,⾸先多个⽤户线程对应到多个 LWP,LWP 再⼀⼀对应到内核线程,如上图的进程 3。
    优点:综合了前两种优点,⼤部分的线程上下⽂发⽣在⽤户空间,且多个线程⼜可以充分利⽤多核CPU 的资源。
  • 组合模式
    如上图的进程 5,此进程结合 1:1 模型和 M:N 模型。开发⼈员可以针对不同的应⽤特点调节内核线程的数⽬来达到物理并⾏性和逻辑并⾏性的最佳⽅案。

学自小林coding,侵删

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海岸星的清风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值