【校招VIP】[操作系统]——线程(一步一个脚印带你学线程)

1天前 收藏 0 评论 0 java开发

【校招VIP】[操作系统]——线程(一步一个脚印带你学线程)

转载声明:文章来源https://blog.csdn.net/Hello_shuo/article/details/142898838

一、线程、多线程模型
1.1 什么是线程,为什么要引入线程?
还没引入进程之前,系统中各个程序只能串行执行。
进程是程序的一次执行。但这些功能显然不可能是由一个程序顺序处理就能实现的。
例如,在使用QQ聊天的时候,我们没办法边聊天听音乐


如果我们想要一边QQ聊天一边听音乐那就要引入线程的概念

有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了“线程”,来增加并发度。
传统的进程是程序执行流的最小単位。


引入线程后,线程成为了程序执行流的最小单位。


可以把线程理解“轻量级进程”。
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。
引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。

1.2 引入线程机制后,有什么变化?
带来的变化:
资源分配、调度
传统进程机制中,进程是资源分配、调度的基本单位
引入线程后,进程是资源分配的基本单位,线程是调度的基本单位
并发性
传统进程机制中,只能进程间并发
引入线程后,各线程间也能并发,提升了并发度
系统开销
传统的进程间并发,需要切换进程的运行环境,系统开销很大
线程间并发,如果是同一进程内的线程切换,则不需要切换进程环境,系统开销小
引入线程后,并发所带来的系统开销减小

类比:
去图书馆看书。
切换进程运行环境:有一个不认识的人要用桌子,你需要你的书收走,他把自己的书放到桌上
同一进程内的线程切换=你的舍友要用这张书桌,可以不把桌子上的书收走。

1.3 线程的属性
线程是处理机调度的单位
多CPU计算机中,各个线程可占用不同的CPU
每个线程都有一个线程ID、线程控制块(TCB)
线程也有就绪、阻塞、运行三种基本状态
线程几乎不拥有系统资源
同一进程的不同线程间共享进程的资源
由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
同一进程中的线程切换,不会引起进程切换不同进程中的线程切换,会引起进程切换
切换同进程内的线程,系统开销很小
切换进程,系统开销较大

二、线程的实现方式、多线程模型
2.1 线程的实现方式
用户级线程
历史背景:早期的操作系统(如:早期Unix)只支持进程,不支持线程。当时的“线程”是由线程库实现的.


想要使用QQ来进行视频和文字聊天并且进行文件的传送,想要并发运行的话,在不支持线程的系统当中,我们可以分别建立三个进程,这三个进程分别处理其中的某个事件。


我们可以用while循环的方式来实现代码并发的运行。


从代码的角度看,线程其实就是一段代码逻辑。上述三段代码逻辑上可以看作三个“线程”。while 循环就是一个最弱智的“线程库”,线程库完成了对线程的管理工作(如调度)。
很多编程语言提供了强大的线程库,可以实现线程的创建、销毁、调度等功能。

思考:
1. 线程的管理工作由谁来完成?
2. 线程切换是否需要CPU变态?
3. 操作系统是否能意识到用户级线程的存在?
4. 这种线程的实现方式有什么优点和缺点?

1.用户级线程由应用程序通过线程库实现,所有的线程管理工作都由应用程序负责(包括线程切换)
2.用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
3. 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。
“用户级线程”就是“从用户视角看能看到的线程”
4.优缺点
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行。
内核级线程(Kernel-Level Thread, KLT, 又称“内核支持的线程”)
由操作系统支持的线程
大多数现代操作系统都实现了内核级线程,如Windows. Linux


思考:
1.线程的管理工作由谁来完成?
2.线程切换是否需要CPU变态?
3.操作系统是否能意识到内核级线程的存在?
4.这种线程的实现方式有什么优点和缺点?

1. 内核级线程的管理工作由操作系统内核完成。
2.线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
3.操作系统会为每个内核级线程建立相应的TCB(Thread Control Block,线程控制块),通过TCB对线程进行管理。“内核级线程”就是“从操作系统内核视角看能看到的线程”
4.优缺点
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

2.2 多线程模型

在支持内核级线程的系统中,根据用户级线程和内核级线程的映射关系,可以划分为几种多线程模型.


一对一模型:一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。


多对一模型:多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程*
优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行
操作系统
重点重点重点:
操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位。


多对多模型:n用户及线程映射到 m个内核级
线程(n>=m)。每个用户进程对应m个内核级线程。
克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
可以这么理解:
用户级线程是“代码逻辑”的载体内核级线程是“运行机会”的载体
内核级线程才是处理机分配的单位。例如:多核
CPU环境下,左边这个进程最多能被分配两个核。
一段“代码逻辑”只有获得了“运行机会”才能被
CPU执行。
内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞。

小结:


三、线程的状态与转换
3.1 状态与转换
与传统的进程一样,在各线程之间也存在着共享资源和相互合作的制约关系,致使线程在运行时也具有间断性。相应地,线程在运行时也具有下述三种基本状态:(1)执行状态,表示线程已获得处理机而正在运行;(2)就绪状态,指线程已具备了各种执行条件,只须再获得CPU便可立即执行:(3)阻塞状态,指线程在执行中因某事件受阻而处于暂停状态,例如,当一个线程执行从键盘读入数据的系统调用时,该线程就被阻塞。


3.2 线程的组织与控制


C 0条回复 评论

帖子还没人回复快来抢沙发