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

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

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


第二章 进程与线程

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进程的组织、控制、通信

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

image.png

(二)进程控制

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

1、进程的创建:创建原语

2、进程的终止:正常结束、异常结束、外界干预,都是终止原语

3、进程的阻塞和唤醒:正在执行的进程,由于期待的某些事件未发生,便调用阻塞原语(Block),由运行态变为阻塞态;当被阻塞进程所期待的时间出现时,调用唤醒原语(Wakeup),将等待该事件的进程唤醒。

(三)进程的通信

定义:进程通信是指进程之间的信息交换。PV操作时低级通信方式;高级通信方式是指以较高的效率传输大量数据的通信方式,有三种:共享存储、消息传递、管道通信。

2.1.3进程和多线程模型

(1)线程的基本概念:引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的是减小程序在并发执行时所付出的空间开销,提高操作系统的并发性能。

------线程最直接理解是“轻量级进程”,是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程ID、程序计数器、寄存器集合和堆栈组成。

线程和进程可以从 调度、并发性、拥有资源、独立性、系统开销、支持多处理机系统等方面比较

为什么线程有利于提高系统并发性?

线程切换时可能会发生进程切换,也可能不发生,平均来说每次切换的开销减小了,所以能让更多的线程参与并发,且不会影响到响应时间的问题。

(2)线程的状态和转化

各个线程之间也存在共享资源和相互合作的制约关系,致使线程在运行时具有间断性。

image.png

(3)线程的组织和控制由 线程控制块(TCB)、线程的创建、线程的终止组成。

--------被终止但尚未释放资源的线程仍可被其他线程调用,以使被终止线程重新恢复运行。

线程的实现方式分为两类:用户级线程和内核级线程(内核支持的线程)

(4)多线程模型

就是三种模型来说,多对多模型是最优解,为什么呢?

多对多模型,线程管理是在用户空间进行的,效率高;当一个线程被阻塞后允许调度另一个线程运行,并发能力强;集成了a和b模型的优点,且克服了多对一模型并发度不高的缺点和一对一模型的一个用户进程占用太多内核级线程而开销太大的缺点。

2.2处理机调度

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

(1)调度的概念

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

一个作业从开始到完成,要经历如图所示的三级调度:

image.png

(2)调度的目标

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

image.png

(3)调度的实现

调度程序(调度器)如下图所示:

不能进行程序的调度与切换的情况有:在处理中断的过程中、进程在操作系统内核临界区中、其他需要完全屏蔽中断的原子操作过程中

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

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

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

image.png

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死锁的预防和避免

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

、破坏互斥条件

、破坏不剥夺条件

、破坏请求并保持条件

、破坏循环等待条件

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

2.4.3死锁的检测和解除

简化资源分配图可检测系统状态S 是否为死锁状态,如下图;

死锁如何解除呢?方法有如下三种:

image.png

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

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进程同步互斥的区别和联系

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

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
4天前
|
算法 调度
深入理解操作系统:进程调度与优先级反转问题
【9月更文挑战第36天】操作系统是计算机科学中的核心概念,它管理着计算机的硬件资源和软件进程。在多任务处理环境中,进程调度是保证系统高效运行的关键机制之一。本文将探讨进程调度的基本概念、调度算法以及它们如何影响系统性能。同时,我们还将讨论优先级反转问题,这是一个在实时系统中常见的问题,它可能导致系统响应时间不可预测。通过分析优先级反转的原因和解决方案,我们可以更好地理解操作系统的设计和优化策略。
|
6天前
|
消息中间件 Linux 调度
深入理解操作系统的进程管理
【9月更文挑战第34天】本文将深入浅出地介绍操作系统中的进程管理,从进程的概念开始,逐步展开到进程调度、进程同步与通信等核心内容。我们将通过简单的代码示例,帮助读者更好地理解进程管理的原理和实践。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的参考。
26 12
|
6天前
|
算法 调度 UED
深入理解操作系统的进程调度策略
【9月更文挑战第34天】在计算机科学中,操作系统是硬件与用户之间的桥梁,它管理着系统资源和提供各项服务。本文旨在通过浅显易懂的语言和实际代码示例,揭示操作系统的核心机制之一——进程调度策略。我们将探讨进程调度的目的、常见的调度算法以及它们如何影响系统性能和用户体验。无论你是编程新手还是资深开发者,这篇文章都将帮助你更好地理解并运用这些知识来优化你的应用程序和系统配置。
25 11
|
2天前
|
算法 调度 UED
探索操作系统的心脏:进程调度策略解析
在数字世界的每一次跳动背后,是操作系统中进程调度策略默默支撑着整个计算生态的有序运行。本文将深入剖析进程调度的奥秘,从理论到实践,揭示其对计算性能和系统稳定性的决定性影响。通过深入浅出的讲解和实例分析,我们不仅能理解不同调度策略的工作原理,还能学会如何根据实际应用场景选择或设计合适的调度算法。让我们跟随这篇文章的脚步,一起走进操作系统的核心,解锁进程调度的秘密。
|
1天前
|
iOS开发 MacOS
MacOS环境-手写操作系统-40-进程消息通讯 和 回车键处理
MacOS环境-手写操作系统-40-进程消息通讯 和 回车键处理
9 2
|
8天前
|
算法 调度 UED
探索操作系统的心脏:进程调度算法
【9月更文挑战第32天】在数字世界的每一次心跳中,都隐藏着一个不为人知的英雄——进程调度算法。它默默地在后台运作,确保我们的命令得到快速响应,应用程序平稳运行。本文将带你走进操作系统的核心,一探进程调度的奥秘,并通过代码示例揭示其背后的智慧。准备好跟随我一起深入这趟技术之旅了吗?让我们开始吧!
|
2天前
|
算法 调度
探索操作系统的心脏:进程管理与调度
【8月更文挑战第70天】本文深入剖析操作系统中至关重要的进程管理与调度机制,通过生动的比喻和直观的示例代码,带领读者理解进程的生命旅程以及调度算法如何影响系统性能。文章旨在启发读者思考操作系统设计背后的哲学,并鼓励动手实践,从而加深对这一核心主题的理解。
|
10天前
|
算法 Linux 调度
深入理解操作系统的进程调度
【9月更文挑战第30天】本文将带你进入操作系统的核心—进程调度。我们将探讨其工作原理,分析几种常见的调度算法,并通过实际代码示例来揭示这些理论是如何在真实系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都能帮助你更好地理解操作系统的这一关键组成部分。
|
10天前
|
消息中间件 算法 调度
探索操作系统核心:进程管理与调度策略
【9月更文挑战第30天】在数字化时代的心脏,操作系统扮演着至关重要的角色。本文将深入探讨操作系统的基石之一——进程管理,以及如何通过调度策略优化系统性能。我们将从进程的基本概念出发,逐步解析进程状态、进程控制和进程间通信等关键要素。同时,我们会探讨几种常见的进程调度算法,并分析它们的优缺点。最后,文章将展示一个简单的代码示例,以加深对理论部分的理解和应用。
|
2天前
|
算法 Linux 调度
深入理解操作系统:进程管理与调度策略
在数字世界的心脏跳动着的,是那些不眠不休的操作系统。它们如同宇宙中的星系,以精妙的进程管理和调度策略维系着计算秩序的和谐。本文将带您穿梭于操作系统的微观世界,探索进程生命周期的每一个阶段,以及如何通过调度算法确保系统的高效与公平。正如甘地所言:“你必须成为你希望在世界上看到的改变。”在操作系统的世界中,这句话激励我们深入理解并改进这些复杂的系统。