操作系统的奋斗(二)进程与线程

news2024/12/27 14:02:29

第二章 进程与线程

  • 2.1进程与线程
    • 2.1.1进程的概念、特征、状态与转换
    • 2.1.2进程的组织、控制、通信
    • 2.1.3进程和多线程模型
  • 2.2处理机调度
    • 2.2.1调度的概念、目标、实现
    • 2.2.2典型的调度算法
    • 2.2.3进程切换
  • 2.3同步与互斥
    • 2.3.1同步与互斥的基本概念
    • 2.3.2实现临界区互斥的基本办法
    • 2.3.3互斥锁、信号量、管程
    • 2.3.4经典同步问题
  • 2.4死锁
    • 2.4.1死锁的概念
    • 2.4.2死锁的预防和避免
    • 2.4.3死锁的检测和解除
  • 2.5本章疑难点
    • 2.5.1进程与程序的区别与联系
    • 2.5.2死锁与饥饿
    • 2.5.3银行家算法的工作原理
    • 2.5.4进程同步互斥的区别和联系

2.1进程与线程

在这里插入图片描述

2.1.1进程的概念、特征、状态与转换

  • 1、引入进程的概念,更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性。
    进程实体(又称进程映象)由 程序段、相关数据、和PCB(进程控制块)三部分组成。
  • 2、进程的特征:动态性、并发性、独立性、异步性
  • 3、进程的状态有五种:【运行态、就绪态、阻塞态】、创建态(等待态)、结束态
就绪态指进程仅缺少处理器,只要获得处理机资源就立即运行
等待态是指进程需要其他资源(除了处理机)或等待某一事件

下图为5种进程状态的转换:
在这里插入图片描述而三种基本状态的转换如下:
就绪态—>运行态:获得处理机资源(分派处理机时间片)。
运行态—>就绪态:让出处理机(主动)。
运行态—>阻塞态:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生。
阻塞态—>就绪态:进程等待的事件到来时,由中断处理程序进行 状态的转换(被动)。

2.1.2进程的组织、控制、通信

(一)进程的组织有三部分,如下表:

组成部分定义
进程控制块(PCB)是进程实体的一部分,进程存在的唯一标志,系统唯有通过进程的PCB才能感知到该进程的存在
程序段是指能被进程调度程序调度到CPU执行的程序代码段
数据段是指进程对应的程序加工处理的原始数据,也可以是程序执行产生的中间或最终结果

(二)进程控制
定义:在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,是一个不可分割的基本单位。

1、进程的创建:创建原语
2、进程的终止:正常结束、异常结束、外界干预,都是终止原语
3、进程的阻塞和唤醒:正在执行的进程,由于期待的某些事件未发生,便调用阻塞原语(Block),由运行态变为阻塞态;当被阻塞进程所期待的时间出现时,调用唤醒原语(Wakeup),将等待该事件的进程唤醒。
(三)进程的通信
定义:进程通信是指进程之间的信息交换。PV操作时低级通信方式;高级通信方式是指以较高的效率传输大量数据的通信方式,有三种:共享存储、消息传递、管道通信。

2.1.3进程和多线程模型

(1)线程的基本概念:引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的是减小程序在并发执行时所付出的空间开销,提高操作系统的并发性能。
------线程最直接理解是“轻量级进程”,是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。
线程和进程可以从 调度、并发性、拥有资源、独立性、系统开销、支持多处理机系统等方面比较
为什么线程有利于提高系统并发性?
线程切换时可能会发生进程切换,也可能不发生,平均来说每次切换的开销减小了,所以能让更多的线程参与并发,且不会影响到响应时间的问题。
(2)线程的状态和转化
各个线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时具有间断性。

状态内容
执行状态线程已获得处理机而正在运行
就绪状态线程已具备各种执行条件,只需再获得CPU便可立即执行
阻塞状态线程在执行中因某事件受阻而处于暂停状态

(3)线程的组织和控制由 线程控制块(TCB)、线程的创建、线程的终止组成。
--------被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。
线程的实现方式分为两类:用户级线程和内核级线程(内核支持的线程)
(4)多线程模型
在这里插入图片描述
就是三种模型来说,多对多模型是最优解,为什么呢?
多对多模型,线程管理是在用户空间进行的,效率高;当一个线程被阻塞后允许调度另一个线程运行,并发能力强;集成了a和b模型的优点,且克服了多对一模型并发度不高的缺点和一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点。

2.2处理机调度

2.2.1调度的概念、目标、实现

(1)调度的概念
概念:处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法选择一个进程将处理机分配给它运行,以实现进程并发执行。处理机调度是多道程序操作系统的基础。

一个作业从开始到完成,要经历如图所示的三级调度:
在这里插入图片描述

高级调度(作业调度)外存 —> 内存,从外存上处于后备队列的作业中挑选一个(或多个),给它(们)分配内存、输入/输出设备等必要资源,建立相应的进程,使它(们)获得竞争处理机的权利。
中级调度(内存调度)目的是提高内存利用率和系统吞吐量,将那些暂时不能运行的进程调至外存等待,此时进程的状态称为 挂起态
低级调度(进程调度)按照某种算法从就绪队列中选取一个进程,将处理机分配给它。

(2)调度的目标
调度算法要考虑评价标准,下面介绍其中主要几种:

CPU利用率CPU利用率 = CPU有效工作时间 /(CPU有效工作时间 + CPU空闲等待时间)
系统吞吐量表示单位时间内CPU完成作业的数量
周转时间周转时间 = 作业完成时间 – 作业提交时间
带权周转时间带权周转时间 = 作业周转时间 / 作业实际运行时间
等待时间是指进程处于等处理机的时间之和,等待时间越长,用户满意度越低
响应时间是指从用户提交请求到系统首次产生响应所用的时间

(3)调度的实现
调度程序(调度器)如下图所示:
在这里插入图片描述
不能进行程序的调度与切换的情况有:在处理中断的过程中、进程在操作系统内核临界区中、其他需要完全屏蔽中断的原子操作过程中

应进行进程调度与切换的情况如:发生引起调度条件且当前进程无法继续运行下去时、中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前

进程切换往往在调度完成后立刻发生,它要求保存原进程当前断电的现场信息,恢复被调度进程的现场信息。

进程又是通过什么方式进行调度的?下表为你解答:

非抢占调度方式(非剥夺方式)是指 即使有某个更为重要或紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行
抢占调度方式(剥夺方式)若有某个更为重要重要或紧迫的进程需要使用处理机,则允许调度程序根据某种原则去暂停正在执行的进程,将处理机分配给这个更为重要或紧迫的进程
两种线程的调度
用户级线程调度用户级线程的线程切换在同一进程中进行,仅需少量的机器指令。
内核级线程调度内核级线程的线程切换需要完整的上下文切换、修改内存映像、使高速缓存失效,这就导致了若干数量级的延迟。(该线程超过了被赋予的时间片,就会被强制挂起)

2.2.2典型的调度算法

介绍几种常用的调度算法及比较:
在这里插入图片描述

2.2.3进程切换

任何进程都是在操作系统内核的支持下运行的,与内核紧密相关;进程切换同样是在内核的支持下实现的。
(1)上下文切换:只发生在内核态,切换CPU到另一个进程需要保存当前进程状态并恢复另一个进程的状态,实质是指处理机从一个进程的运行转到另一个进程上运行。(上下文 实质某时刻CPU寄存器和程序计数器的内容)
上下文切换通常是计算密集型的,对系统来说意味着消耗大量的CPU时间。
(2)模式切换:是指用户态和内核态之间的切换,CPU逻辑上还可能在执行同一进程。

看到这里累了吧,放张照片缓解一下眼的酸痛:
在这里插入图片描述
嘿嘿

2.3同步与互斥

2.3.1同步与互斥的基本概念

同步:也称直接制约关系,源于它们之间的相互合作,是指为完成某种任务而建立的两个或多个进程,因为需要在某些位置上协调他们的工作次序而等待、传递消息所产生的制约关系。

互斥:也称间接制约关系,当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。

2.3.2实现临界区互斥的基本办法

可以看这个作者:仔仔木,生动且形象

2.3.3互斥锁、信号量、管程

互斥锁:一个进程在进入临界区时应获得锁,在退出临界区时释放锁;获得和释放锁是原子操作,互斥锁通常采用硬件机制实现。

信号量:信号量机制可以解决互斥与同步的问题,只能被两个原语wait(S)和signal(S)访问,也可称作 “P操作” 和 “V操作”。
整型信号量:该机制并未遵循 “让权等待” 的准则,而是使进程处于 “盲等” 的状态。
记录型信号量:是一种不存在 “忙等”现象的进程同步机制,且遵循 “让权等待” 的准则。

管程
管程的特性保证了进程互斥,无须程序员实现互斥,降低死锁发生的可能性;提供条件变量可灵活实现进程同步。
管程把对共享资源的操作封装起来,管程内的共享数据结构只能被管程内的过程所访问,且每次仅允许一个进程进入管程,从而实现进程互斥。
在这里插入图片描述
管程由四部分组成:

  1. 管程的名称
  2. 局部于管程内部的共享数据结构说明
  3. 对该数据结构进行操作的一组过程(或函数)
  4. 对局部于管程内部的共享数据设置初始值的语句

条件变量
在这里插入图片描述
条件变量和信号量的比较:
相似点:条件变量的 wait / signal 操作类似于信号量的 P / V 操作,可以实现进程的阻塞/唤 醒。
不同点:条件变量是 “ 没有值 ”的,仅实现了 “排队等待” 功能:而信号量是 “有值” 的,信号量的值反映了剩余资源数,而在管程中,剩余资源数用共享数据结构记录。

2.3.4经典同步问题

  1. 生产者消费者问题
  2. 读者-写者问题
  3. 哲学家进餐问题
  4. 吸烟者问题

互斥分析基本办法,如下图:
在这里插入图片描述
关于P、V的操作讨论,如下图:
在这里插入图片描述

2.4死锁

2.4.1死锁的概念

定义:计算机系统中有很多独占性资源,同一时刻每个资源只能由一个进程使用,所以操作系统具有授权一个进程单独访问资源的能力。两个进程独占性的访问某个资源,从而等待另外一个资源的执行结果,会导致两个进程都被阻塞,并且两个进程都不会释放各自的资源,这种情况就是 死锁(deadlock)。

2.4.2死锁的预防和避免

死锁的预防只需要破坏死锁产生的四个必要条件之一即可:

  1. 、破坏互斥条件
  2. 、破坏不剥夺条件
  3. 、破坏请求并保持条件
  4. 、破坏循环等待条件

死锁的避免 属于事先预防策略,在资源动态的分配过程中,计算此次分配的安全性,若不安全,则不进入;安全,则进入。可以参照银行家算法

2.4.3死锁的检测和解除

简化资源分配图可检测系统状态S 是否为死锁状态,如下图;
在这里插入图片描述
死锁如何解除呢?方法有如下三种:

死锁解除方法步骤
资源剥夺法挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止被挂起的进程长时间得不到资源而处于资源匮乏的状态
撤销进程法强制撤销部分甚至全部死锁进程并剥夺这些进程的资源。撤销的原则可以按照进程优先级和撤销进程代价的高低进行
进程回退法让一(或多)个进程回退到足以回避死锁的地步,进程回退时资源释放资源而非被剥夺。要求系统保持进程的历史信息,设置还原点

关于死锁更详细的解释请点击这里看我的另一篇文章很详细

2.5本章疑难点

2.5.1进程与程序的区别与联系

(1)进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。进程的运行实体是程序,离开程序的进程没有存在的意义。从静态角度看,进程是由程序、数据和进程控制块( PCB )三部分组成的。而程序是一组有序的指令集合,是一种静态的概念。
(2)进程是程序的一次执行过程,它是动态地创建和消亡的,具有一定的生命周期,是暂时存在的:而程序则是组代码的集合,是永久存在的,可长期保存。
(3)一个进程可以执行一个或几个程序,一个程序也可构成多个进程。进程可创建进程,而程序不可能形成新的程序。
(4)进程与程序的组成不同。进程的组成包括程序、数据和 PCB

2.5.2死锁与饥饿

饥饿:
饥饿(starvation):当 等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿.饥饿到一定程度的进程所赋予的使命即使完成也不再具有实际意义时称该进程被饿死(starved to death).
没有时间上界的等待
排队等待
忙式等待
忙式等待条件下发生的饥饿,称为活锁(live lock).

饥饿 vs 死锁
死锁进程处于等待状态,忙式等待的进程并非处于等待状态, 但却可能被饿死;
死锁进程等待永远不会释放的资源, 饿死进程等待可能被释放,但却不会分给自己的资源,其等待时间没有上界;
死锁一定发生了循环等待,饿死不然;
死锁至少涉及两个进程 , 饿死进程可能只有一个.

///下面对两种状态进行比较式的解释,如下五点:
1、概念
死锁:如果一组进程中的每一个进程都在等待由该进程中的其它进程才能引发的事件,那么该组进程是死锁的。
饥饿:指系统不能保证某个进程的等待时间上界,从而使该进程长时间等待,当等待时间给进程推进和响应带来明显影响时,称发生了进程饥饿。当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被饿死。
2、产生原因
死锁:源于多个程序对资源的争夺,不仅对不可抢占资源进行争夺时会引起死锁,而且对可消耗资源进行争夺时,也会引起死锁。
饥饿:如果一个线程因为处理器时间全部被其它线程抢走而得不到处理器运行时间,这种状态被称之为饥饿,一般是由高优先级线程吞噬所有的低优先级线程的处理器时间引起的。
3、必要条件
死锁:互斥、不可剥夺、请求与保持、循环等待
饥饿:没有其产生的必要条件,随机性很强。并且饥饿可以被消除,因此也将忙等待时发生的饥饿称为活锁。
4、异同点
相同:二者都是由于竞争资源而引起的
不同:
从进程状态考虑,死锁进程都处于等待状态,忙等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死。
死锁进程等待永远不会被释放资源,饿死进程等待会被释放但却不会分配给自己资源,表现为等待时限没有上界(排队等待或忙等待)。
死锁一定发生了循环等待,而饿死不一定。
死锁一定涉及多个进程,而饥饿或被饿死的进程可能只有一个。
在饥饿的情形下,系统中至少有一个进程能正常运行,只是饥饿进程得不到执行机会。而死锁则可能会最终使整个系统陷入死锁并崩溃。
5、举例
死锁:砍树你需要一个斧子,但是斧子需要木头来做,这就发生了死锁。
饥饿:排队过程中,总有人插队到你的前面,导致你一直处于排队状态,这就发生了饥饿。

2.5.3银行家算法的工作原理

银行家算法的主要思想是避免系统进入不安全状态。在每次进行资源分配时,它首先检查系
统是否有足够的资源满足要求,若有则先进行试分配,并对分配后的新状态进行安全性检查。若新状态安全,则正式分配上述资源,否则拒绝分配上述资源。这样,它保证系统始终处于安全状态,从而避免了死锁现象的发生。

2.5.4进程同步互斥的区别和联系

并发进程的执行会产生相互制约的关系:一种是进程之间竞争使用临界资源,只能让它们逐个使用,这种现象称为互斥,是一种竞争关系;另一种是进程之间协同完成任务,在关键点上等待另一个进程发来的消息,以便协同致,是一种协作关系。

在这里插入图片描述
拜拜啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

泊松随机变量的分解与求和

1.泊松随机变量的分解 假设传感器发出的信号为0-1信号.发出1的概率为,发出0的概率为 ,并且和以前所发的信号独立.现在假设一定时间内发出信号的个数为泊松随机变量,其参数为, 可以证明在同一段时间内发出1的个数也是泊松随机变量,其参数为. 证明&#…

PTA题目 A除以B

真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B商”的格式输出结果。 输入格式: 输入在第一行给出两个整数A和B(−100≤A,B≤100),数字间以空格分隔。 输出格式: 在一行中输出…

Data-Efficient Backdoor 论文笔记

#论文笔记# 1. 论文信息 论文名称Data-Efficient Backdoor作者Pengfei Xia 中国科学技术大学会议/出版社IJCAI 2022pdf📄在线pdf代码💻pytorch概要:本文是 backdoor attack 中的数据加毒。不同于以往随机在干净数据中选择样本加毒的方法&am…

磁盘怎么删除分区,磁盘管理怎么删除分区

为了高效地利用磁盘分区,会删除部分磁盘分区,但是很多的用户都不知道应该怎么删除磁盘分区,所以,易我小编将讲解磁盘怎么删除分区。 一、为什么要删除磁盘分区 因为不同用户的磁盘分区管理需求不同,为了适应用户的具体…

spring boot yaml自定义配置传入代码

目录 一、在项目代码中,直接读取配置文件application.yml中的数据 二、通过yaml配置文件,给类注入数据 一、在项目代码中,直接读取配置文件application.yml中的数据 使用Value注解。 如: 在spring boot 中,applica…

Spring实战之容器、上下文、Bean的生命周期

一、Spring容器 在基于Spring的应用中,你的应用对象生存于Spring容器(container)中,Spring容器负责创建对象,装配它们,配置它们并管理它们的整个生命周期,从生存到死亡。(在这里&am…

程序运行只是单单的编译吗?一文让你深入理解程序运行的过程

前言: 写了这么长时间的c语言代码,我们都没有想过为什么要写头文件吗,而程序执行的过程又是如何呢?只有编译吗 ?要知道机器只能读懂二进制但我们所写的代码编译器是如何读懂的呢?这一篇文章看后一定能解决以…

数据结构之Trie树

Trie树: Tire树可以较为高效的存储和查找字符串集合。 存储方式: 首先Trie有一个根节点,我们按从前往后的顺序将字符串的每个位置上的字符存储到树的每一层中,这样我们存储多个字符串时就可以消除一部分冗余,在查询字…

期货开户后需要银期转账绑定

一、期货公司正规性 如何判断期货公司是否正规? 1、 中国证监会官网有公布所有正规期货公司(一共150家)名录的,我们可以直接参考证监会发布链接:期货公司名录 2、如果你懒得从名录中一个个找,也可以直接…

一款不错的SpringCloud 脚手架项目

文章目录 I 一款不错的SpringCloud 脚手架项目1.1 项目概述1.2 本地启动II. Swagger RESTful 风格的 Web 服务框架2.1 组成部分2.2 springfoxIII 相关辅助脚本3.1 pod 辅助脚本3.2 git 辅助脚本I 一款不错的SpringCloud 脚手架项目 1.1 项目概述 springboot+springcloud注册中心…

基于SpringBoot的电子招标投标管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SpringBoot 前端:HTML、Vue 数据库:MySQL5.7 数据库管理工具:Navicat 12 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否…

Android BottomSheetDialogFragment 使用详解,设置圆角、固定高度、默认全屏等

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/127967304 本文出自【赵彦军的博客】 文章目录效果BottomSheetBottomSheetDialogBottomSheetDialogFragment圆角效果去掉背景蒙版设置蒙版透明度点击 dialog 外部区域,dialog 不消失禁…

STC51单片机37——定时器流水灯

// 12MHz晶振 #include "reg52.h" #include "intrins.h" #define time (65536-50000) // 单次定时50ms unsigned char cn; unsigned char temp; unsigned char dir; void main(void) { cn20; //20*50ms1s temp0x80; dir0; TMOD 0x…

Vue简单示例——weex

weex的生命周期: 因为我们的Weex和Vue是绑定在一起的,所以我们讨论关于生命周期时,说的实际上是在Weex中可以使用的Vuex的生命周期,也就是Weex对于Vue生命周期的支持,好消息,Weex支持大部分的Vue中的生命周…

基于Vue+ElementUI+MySQL+Express的学生管理系统(3)

3.搭建学生考试信息的前端页面 1.在E:\vue\shiyan9目录下用cmd打开命令窗口。输入命令vue init webpack score-manage,创建一个基于webpack模板的项目。 图15 创建一个新的vue的脚手架的项目 2.执行cd score-manage,进入目录包下。下载依赖包。命令如下…

Pytorch 图像增强 实现翻转裁剪色调等 附代码(全)

目录前言1. 裁剪1.1 中心裁剪1.2 随机裁剪1.3 随机尺寸裁剪2. 翻转2.1 水平翻转2.2 垂直翻转2.3 随机旋转3. 色调3.1 灰度变换3.2 色彩抖动3.3 随机翻转颜色3.4 随机调整锐度3.5 高斯模糊4. 边缘填充5. 仿射变换前言 下文中有使用到plt,不懂的可看我这篇文章&#…

doker中的Jenkins容器配置github

1、在Jenkins插件 管理中下载github plugin和ssh和git插件 2、在Jenkins->系统管理->系统配置->github下配置凭据认证,添加凭证页面类型选择secret text 3、添加凭证页面secret栏输入githu token,其他任意输入 4、github token获取&#xf…

FANUC机器人零点复归的报警原因分析和零点标定相关步骤

FANUC机器人零点复归的报警原因分析和零点标定相关步骤 FANUC机器人零点复归时需要将机器人的机械信息与位置信息同步,来定义机器人的物理位置。 机器人通过闭环伺服系统来控制机器人各运动轴,当用户通过示教器点动机器人时,经过主板分析此命令后,带动电机旋转,电机上的SP…

软件测试入门概念

满足用户期望或正式规定文档(合同、标准、规范)所具有的条件和权能,包含用户需求和软件需求。 用户需求: 五花八门的用户需求,该需求比较简略。 软件需求: 又叫功能需求,该需求会详细描述开发…

SLAM本质剖析-Boost之Geometry函数大全(二)

4. 点云处理 4.1 add_point 将一个点添加到另一个点 4.2 add_value 将相同的值添加到点的每个坐标 4.3 assign_point 用另一个点指定一个点 4.4 assign_value 为点的每个坐标指定相同的值 4.5 cross_product 计算两个向量的叉积 4.7 divide_point 将一点除以另一点…