《计算机操作系统-第五章》之线程与多线程模型

简介: 《计算机操作系统-第五章》之线程与多线程模型

文章目录

1.线程

为什么需要线程?

2.什么是线程?

2.1引入线程后的变化

2.2线程的属性

2.3线程的实现方式

2.3.1用户级线程

2.3.2内核级线程

2.3.3内核级线程与用户级线程同在

3.多线程模型

3.1多对一模型

3.2一对一模型

3.3多对多模型

4.处理机调度

4.1高级调度(作业调度)

4.4中级调度(内存调度)

4.5低级调度(进程调度)

1.线程

为什么需要线程?

在很久很久以前,系统中各个程序只能串行执行,也就是qq音乐和qq没法同时运行。后来引入进程,qq和qq音乐就可以并发的执行了。但是这里有个问题,比如qq不仅可以同时文字聊天还可以视频聊天,而我们又知道进程是程序的一次执行,这些功能显然是不可能有一个程序的顺序,如果是按照顺序执行,那么qq就无法做到能同时完成多个功能。因此就引入了线程,来增加并发度。

引入线程前,传统的进程就是执行流的最小单位,假设内存中存在两个进程,分别为进程1和进程2,那么CPU就要被这两个进程并发使用。当引入线程后进程里面可以拥有对个线程,那么CPU就是给进程中的线程并发执行。这样就可以达到qq既可以文字聊天也可以视频聊天。

2.什么是线程?

可以把线程理解为轻量级的进程,线程的创建和回收所消耗的资源远远小于进程的创建和销毁。有了线程后,线程就成了CPU一个基本的执行单元,即程序流的最小单位。

注意

1.引入线程后,进程只作为除CPU之外的系统资源的分配单位(如内存空间)

2.引入线程后,不仅仅是进程之间可以并发,进程内的各线程之间也就可以并发,从而提高了并发度,使得一个进程内也可以处理各种任务

2.1引入线程后的变化

从资源分配,调度的角度来看

  1. 1.传统进程机制中,进程是资源分配,调度的基本单位
  2. 2.引入进程后,进程是资源分配的基本单位,线程是调度的基本单位

从并发性来看

  1. 1.传统进程机制中,只能进程间并发
  2. 2.引入线程后,各线程间也能并发,提高了并发度

从系统开销角度来看

  1. 1.传统的进程间并发,需要切换进程的运行环境,系统开销大
  2. 2.线程间并发,如果是同一个进程内的线程切换,则不需要切换进程环境,系统开销小
  3. 3.引入线程后,并发所带来的系统开销小。

2.2线程的属性

  1. 1.每个线程都有一个线程ID,线程控制块(TCB)
  2. 2.线程几乎不拥有系统资源
  1. 3.同一进程的不同线程间共享进程的资源
  2. 4.由于共享内存地址空间,同一进程中的线程间通信甚至需要系统干预
  3. 5.不同进程中的线程切换,会引起进程切换
  4. 6.多核CPU,各个线程可占用不同的CPU

2.3线程的实现方式

2.3.1用户级线程

用户级线程由应用程序通过线程库是实现。所有的线程管理工作都由应用程序负责(包括线程切换)。用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。在用户看来,是有多个线程.但是在操作系统内核看来,并没有意识到线程的存在,而是意识到进程的存在,因此调度的基本单位为进程。

如图所示

2.3.2内核级线程

内核级线程的管理工作由操作系统内核完成。线程调度,切换等工作都由内核完成,因此内核级线程的切换必然需要在核心态下才能完成。从内核角度来看内存中有三个线程,一个进程。

如图所示

2.3.3内核级线程与用户级线程同在

两者结合,也就是将n个用户级线程映射到m个内核级线程上(n>=m)

如图所示

操作系统看的见内核级线程,因此只有内核级线程才是处理机分配的单位。举个栗子,上图中该进程有2个内核级线程,三个用户级线程,站在用户角度有三个线程。当该进程处于多核CPU的计算机上运行时,也最多只能分配2个CPU核心,最多只有2个用户级线程运行 。

3.多线程模型

在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了多线程模型问题

3.1多对一模型

多个用户级线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。

如图所示

优点:用户线程的切换在用户空间即可完成,无需切换大到核心态,线程管理的系统开销小,效率高。

缺点:当一个用户级线程被阻塞后,整个进程后悔被阻塞,并发度不高。多个线程不可以在多核处理机上并发运行。

3.2一对一模型

一个用户级线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程

如图所示

优点

当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并发执行。

缺点

一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

3.3多对多模型

n个用户级线程映射到m个内核级线程。每个用户级进程对应m个内核级线程。

如图所示

该模型其前两种模型的优点,克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

4.处理机调度

现实世界里,当一群人去银行办事,普通用户则是按时间顺序排好队依次进入银行,而VIP客户则可以优先被服务。在计算机世界里,当有一堆任务要处理,但是由于资源有限(银行),这些事没办法同时处理.这就需要确定某种规则(VIP/时间顺序)来决定处理任务的顺序,这就是调度研究的问题。

在多道程序系统中,进程的数量是远远大于处理机(CPU)的数量,这样不可能同时并发的执行的处理各个进程。处理机调度,就是从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行。

4.1高级调度(作业调度)

由于内存空间有限,有时无法将用户提交的作业全部放入内存中,因此就需要确定某种规则来决定将作业调入内存的顺序。

高级调度:按照一定的原则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它获得竞争处理机的权利。

高级调度是外存与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,但调出的时机必然是作业运行结束才调出。

4.4中级调度(内存调度)

引入虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了

运行条件且内存又稍有空闲时,再重新调入内存。这样做的目的就是为了提高内存利用率和系统吞吐量。

暂时调到外存等待的进程状态为挂起转态。注意,PCB并不发一起调度到外存,而是会常驻内存.PCB中会记录进程数据在外存中的存放位置,进程转态等信息,

中级调度:就是要决定将那个处于挂起转态的进程中重新调入内存。一个进程可能会被多次调出,调入内存,因此中级调度发生的频率要比高级频率度更高。

七状态模型

暂时调到外存等待的进程状态为挂起状态(挂起态)

挂起态又可以分为就绪挂起,阻塞挂起两种状态

如图所示

注意挂起和阻塞的区别,两种状态都是暂时不能获得CPU的服务,但挂起状态是将进程映像调到外存去了,而阻塞态进程映像还在内幕内存中。

4.5低级调度(进程调度)

其主要任务是按照某种方法从就绪队列中选取一个进程,将处理机分配给它。

进程调度是进程并发执行的基础,是操作系统中最基本的一种调度。进程的调度的频率很高,一般几十毫一次。

最后的话

各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!。如果你想变强那么点我点我 牛客网

相关文章
|
4天前
|
Python
|
4天前
|
Unix 调度
操作系统(6)----线程相关
操作系统(6)----线程相关
10 0
|
6天前
|
存储 Unix Linux
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
14 1
|
6天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
17 1
|
2天前
|
NoSQL Redis 缓存
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
【5月更文挑战第17天】Redis常被称为单线程,但实际上其在处理命令时采用单线程,但在6.0后IO变为多线程。持久化和数据同步等任务由额外线程处理,因此严格来说Redis是多线程的。面试时需理解Redis的IO模型,如epoll和Reactor模式,以及其内存操作带来的高性能。Redis使用epoll进行高效文件描述符管理,实现高性能的网络IO。在讨论Redis与Memcached的线程模型差异时,应强调Redis的单线程模型如何通过内存操作和高效IO实现高性能。
28 7
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?
|
5天前
|
监控 Java 测试技术
在多线程开发中,线程死循环可能导致系统资源耗尽,影响应用性能和稳定性
【5月更文挑战第16天】在多线程开发中,线程死循环可能导致系统资源耗尽,影响应用性能和稳定性。为解决这一问题,建议通过日志记录、线程监控工具和堆栈跟踪来定位死循环;处理时,及时终止线程、清理资源并添加错误处理机制;编码阶段要避免无限循环,正确使用同步互斥,进行代码审查和测试,以降低风险。
18 3
|
6天前
|
消息中间件 安全 Ubuntu
【操作系统原理】—— 线程同步
【操作系统原理】—— 线程同步
16 1
|
6天前
|
安全 API 数据库
【转】Android线程模型(AsyncTask的使用)
【转】Android线程模型(AsyncTask的使用)
13 1
|
6天前
|
消息中间件 存储 网络协议
Kafka 线程模型痛点攻克: 提升分区写入 2 倍性能
Apache Kafka的单分区写入性能在某些严格保序场景中至关重要,但其现有线程模型限制了性能发挥。本文分析了Kafka的串行处理模型,包括SocketServer、KafkaChannel、RequestChannel等组件,指出其通过KafkaChannel状态机确保请求顺序处理,导致处理效率低下。AutoMQ提出流水线处理模型,简化KafkaChannel状态机,实现网络解析、校验定序和持久化的阶段间并行化,提高处理效率。测试结果显示,AutoMQ的极限吞吐是Kafka的2倍,P99延迟降低至11ms。
25 3
Kafka 线程模型痛点攻克: 提升分区写入 2 倍性能
|
6天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
13 0

热门文章

最新文章