408操作系统学习笔记——进程与线程、处理机调度、同步与互斥(PV操作)、死锁(一)

简介: 408操作系统学习笔记——进程与线程、处理机调度、同步与互斥(PV操作)、死锁

1.进程与线程

1.1.进程的概念

1.进程:程序的一次执行过程

2.PCB(Process Control Block):进程控制块6bb1b8c1bc554740bd4c069f50f9bffc.png

3.进程实体(进程映像)由PCB、程序段和数据段组成

进程实体反应了进程某个时刻的状态,因此,进程是动态的,进程实体是静态的

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位bc3482a396984d439cf41464f4186669.png

4.同一个程序被打开多次,则被建立多个不同的进程,它们的程序段相同,而PCB和数据段不同

1.2.进程的特征d1a279676e76459989c20992767a1184.png

1.3.进程的状态

1.创建态:为进程分配资源、初始化PCB

2.就绪态:创建完成后,进入就绪态(除处理机外的资源都具备)(CPU忙,无法为该进程服务);可能有多个就绪态;CPU空闲时,选择一个就绪进程运行

3.运行态:在CPU上运行的进程

4.阻塞态:进程运行过程中,可能会请求某个事情的发生(既没有处理机资源,也没有某种系统资源)主动,等待某种系统资源的分配),操作系统就会剥夺该进程CPU的使用权,使其进入阻塞态(同时CPU就会进入空闲状态,从而选择另外一个处于就绪态的进程执行);若该进程等待的事情处理完成后,该进程就重新从阻塞态变为就绪态

5.终止态:进程可以通过执行exit系统调用,请求操作系统终止该进程,同时该进程进入终止态;操作系统剥夺该进程CPU的使用权,回收内存空间等系统资源,并回收该进程的PCB

6.PCB中有一个变量state表示当前进程的状态

1.4.进程状态的转换image.png

1.就绪态→运行态:

处于就绪态的进程被调度后,获得处理机资源,于是进程由就绪态切换为运行态

2.运行态→就绪态:

情况1:处于运行态的进程在时间片用完后,不得不让出处理机,进而转换为就绪态

情况2:在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程执行

3.运行态→阻塞态(主动行为)

进程请求某一资源(如外设)的使用或等待某一事件的发生(如I/O操作的完成)时,它就从运行态转换为阻塞态

进程以系统调用的形式请求操作系统提供服务,这是一种特殊的,由用户态程序调用操作系统内核过程的形式

4.阻塞态→就绪态(被动行为:需要其他相关进程的协助)

进程等待的事件到来,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞态转换为就绪态

1.5.进程控制

1.PCB的state中连接各种不同的进程状态:

①通过指针的方式3b4e454b96564a75b4549582f408bd00.png

②通过索引表方式bf6bee1e89be4edebb53ae02a1852135.png

2.进程的控制需要用原语:原语的执行具有原子性(通过关中断指令、开中断指令的方式,实现期间不可被中断)

进程在控制过程中,需要两步操作(设采用指针方式):

①修改PCB中的state ②将阻塞队列放到就绪队列

如果不采用原语,则可能发生第一步完成后,就转向处理中断

3.原语:原语的执行具有原子性(通过关中断指令、开中断指令的方式,实现期间不可被中断

①创建原语:创建态→就绪态

(1)申请空白PCB:创建PCB(PCB是进程存在的唯一标志)

(2)为进程分配所需资源:内存空间等

(3)初始化PCB:分配PID、设置UID等

(4)将PCB插入就绪队列:创建态→就绪态

②引发创建原语的事件:

(1)用户登录:用户登陆成功后,系统将会建立一个新的进程

(2)作业调度:从外存中挑选一个进程放入内存中运行

(3)提供服务:用户向操作系统提出某些请求时,新建一个进程处理该请求

(4)应用请求:用户进程主动请求创建子进程

③撤销原语:就绪态/阻塞态/运行态→终止态→无

(1)找到该进程的PCB

(2)若该进程正在运行,剥夺其CPU的使用权,并将CPU分配给其他进程

(3)终止其所有子进程,并将其资源归还给父进程或操作系统

(4)删除PCB

④引发撤销原语的事件:

(1)正常结束:进程自己请求终止(exit系统调用)

(2)异常结束:整数除0、非法使用特权命令(异常)

(3)外界干预:用户选择关闭进程(任务管理器结束)

⑤阻塞原语:运行态→阻塞态

(1)找到该进程的PCB

(2)运行进程保护现场,将PCB中的信息改为阻塞态,暂停进程运行

(3)将PCB插入相应事件的等待序列

⑥引起阻塞原语的事件:

(1)需要等待某种系统资源的分配

(2)需要等待合作进程

⑦唤醒原语:阻塞态→就绪态

(1)找到该进程的PCB

(2)将PCB中从等待序列中删除,将PCB中的信息改为就绪态

(3)将PCB插入就绪队列,等待被调度

⑧引起唤醒原语的事件:等待的事件发生(引起该进程阻塞的事件)

(阻塞原语和唤醒原语成对出现)

⑨切换原语:进程A:运行态→就绪态;进程B:就绪态→运行态(两个进程状态改变)

(1)将运行环境信息某些寄存器中的内容,PSW、PC等)存入PCB,将PCB插入相应序列

(2)选择另一个进程运行,并更新其PCB(例如状态信息),并根据其PCB恢复运行环境信息

⑩引起切换原语的事件:

(1)当前进程时间片到

(2)有更高优先级的进程出现(可剥夺系统)

(3)当前进程主动阻塞

(4)当前进程终止

1.6.进程通信

1.各进程的内存地址空间相互独立

2.一个进程不可以直接访问另一个进程的地址空间

1.6.1.共享存储

1.开辟一个公共的地址空间用于信息交换(对于该公共空间进行操作必须是互斥的,例如PV)

2.基于数据结构(低级通信):限制多,速度慢(例如数组)

基于存储区(高级通信):操作系统只负责划分出一块内存区域用于共享存储,而如何共享存储区中数据的形式、数据如何存放等细节问题由进程决定,因此限制少,速度快

1.6.2.消息传递

1.进程间的数据交换以格式化的消息为单位

2.格式化的消息由消息头和消息体构成

消息头(概要信息):由发送进程ID(由谁发送)、接受进程ID(发送给谁)、消息长度(整个消息的长度)等格式化的消息

消息体(具体信息):具体的数据

3.(1)直接通信方式:发送方进程需要指明接收方进程的ID(指明由谁接受)

设发送方为p,接收方为q

①p通过发送原语将消息发送到q(指明接收方)的pcb的消息队列中(q的pcb在操作系统内核的地址空间)

②通过接受原语将消息从pcb的消息队列中找到p(指明发送方)发来的消息,并取到q的地址空间中

(2)间接通信方式:通过“信箱间接通信,指明信箱(因此又称信箱通信方式 )

①信箱存放在操作系统内核的地址空间中

②发送方指明发往哪个信箱;接收方指明从哪个信箱中接收

1.6.3.管道通信

1.数据的流向只能是单向(半双工通信),如果需要进行双向数据传输,则需要两个管道

2.管道是一个特殊的文件(本质是在内存中开辟一个大小固定的内存空间):管道满时,写阻塞;管道空时,读阻塞

3.管道和共享存储的区别:共享存储方式中,数据的读/写的在地址空间的位置是任意的;管道需要遵循FIFO的方式按顺序读/写(本质上是循环队列)

4.进程对管道的访问是互斥

5.允许多个写进程,仅允许一个读进程e4ba784ffa744922902c43bc7246fa3f.png

1.7.线程的概念

1.线程是程序执行流的最小单位(每个线程可以对应不同的代码,并发执行),也是基本的CPU执行单元(CPU调度/服务的对象为线程)——即线程是调度的基本单位

2.进程是除CPU外的系统资源的分配单元(系统资源是分配给进程的,而不是分配给线程)——即进程是资源分配的基本单位

3.进程间(切换系统开销大)、线程间(切换系统开销小)都可以并发

bb5e88989e624e81831f8bd73cb6e3a7.png

4.线程可以占用不同的CPU

5.每个线程都有线程ID(对应进程ID)、线程控制块TCB(对应进程的PCB)

6.线程有就绪、阻塞和运行三种状态

7.线程几乎不拥有系统资源(进程是资源分配的基本单位):线程使用进程的系统资源,同一进程的不同线程共享系统资源

8.共享内存地址空间→线程间通信无需系统干预

9.同一进程间的线程切换,不引起进程切换(系统开销小);不同进程间的线程切换,引起进程切换(系统开销大)

9.内核级线程是处理机分配的基本单位(操作系统能意识到的只有内核级线程)

1.8.线程的实现方式和多线程模型

1.8.1.用户级线程image.png

1.程序员自己写一个程序库实现逻辑上的线程操作系统的视角只看得到进程(因此操作系统意识不到用户级线程的存在)

2.线程的管理工作由应用程序完成(通过线程库)

3.优点:线程的切换不需要操作系统参与,由应用程序完成,因此不需要变态

4.缺点:①当一个用户级线程被阻塞后,整个程序都会被阻塞(程序需要按代码顺序执行)

多个线程不可以在多核处理机上运行(操作系统的视角下只能看到进程,因此,此时操作系统的基本调度单位仍然是进程,而非线程)

1.8.2.内核级线程(一对一模型)5866e75d4beb4b0c87cc94f0b4304ee8.png

1.线程的管理工作由操作系统完成

2.线程的切换需要CPU变态(线程的调度和切换等需要内核负责)

3.操作系统能够意识到内核级线程的存在(操作系统为每个内核级线程建立相应的TCB)

4.优点:①当一个线程被阻塞后,其余线程仍可工作(每个用户线程都有相对的内核级线程)

多个线程可以在多核处理机上运行(操作系统可以意识到内核级线程的存在,此时,线城是调度的基本单位)

5.缺点:线程切换需要变态,系统开销大

1.8.3.多线程模型——多对一模型image.png

1.8.4.多线程模型——多对多模型

image.pngimage.png

1.9.线程的状态与转换

1.线程的状态转换和对应的进程转换一致

image.png

2.线程切换时需要保存/恢复:PC(程序执行到哪)、其他寄存器(程序当前运行的结果)和堆栈指针(下处理机保存到PCB,上处理机从PCB中恢复)

①堆栈用于保存函数调用信息,例如A调用B、B调用C和函数返回地址,即C执行完后应返回B的哪一句代码等

②堆栈还用于保存局部变量

③堆栈是内存中一个很大的地址空间,保存堆栈指针可以使得我们找到该程序在堆栈中的哪个位置

相关文章
|
15天前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级队列
【10月更文挑战第31天】在计算机科学的广阔天地中,操作系统扮演着枢纽的角色,它不仅管理着硬件资源,还为应用程序提供了运行的环境。本文将深入浅出地探讨操作系统的核心概念之一——进程调度,以及如何通过优先级队列来优化资源分配。我们将从基础理论出发,逐步过渡到实际应用,最终以代码示例巩固知识点,旨在为读者揭开操作系统高效管理的神秘面纱。
|
8天前
|
消息中间件 安全 算法
深入理解操作系统:进程管理的艺术
【10月更文挑战第38天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是硬件与软件的桥梁,更是维持计算机运行秩序的守夜人。本文将带你走进操作系统的核心——进程管理,探索它是如何协调和优化资源的使用,确保系统的稳定与高效。我们将从进程的基本概念出发,逐步深入到进程调度、同步与通信,最后探讨进程安全的重要性。通过这篇文章,你将获得对操作系统进程管理的全新认识,为你的计算机科学之旅增添一份深刻的理解。
|
12天前
|
算法 调度 UED
深入理解操作系统:进程管理与调度策略
【10月更文挑战第34天】本文旨在探讨操作系统中至关重要的一环——进程管理及其调度策略。我们将从基础概念入手,逐步揭示进程的生命周期、状态转换以及调度算法的核心原理。文章将通过浅显易懂的语言和具体实例,引导读者理解操作系统如何高效地管理和调度进程,保证系统资源的合理分配和利用。无论你是初学者还是有一定经验的开发者,这篇文章都能为你提供新的视角和深入的理解。
33 3
|
14天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
15天前
|
算法 调度 UED
深入理解操作系统的进程调度机制
本文旨在探讨操作系统中至关重要的组成部分之一——进程调度机制。通过详细解析进程调度的概念、目的、类型以及实现方式,本文为读者提供了一个全面了解操作系统如何高效管理进程资源的视角。此外,文章还简要介绍了几种常见的进程调度算法,并分析了它们的优缺点,旨在帮助读者更好地理解操作系统内部的复杂性及其对系统性能的影响。
|
16天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
33 2
|
16天前
|
消息中间件 算法 Linux
深入理解操作系统之进程管理
【10月更文挑战第30天】在数字时代的浪潮中,操作系统作为计算机系统的核心,扮演着至关重要的角色。本文将深入浅出地探讨操作系统中的进程管理机制,从进程的概念入手,逐步解析进程的创建、调度、同步与通信等关键过程,并通过实际代码示例,揭示这些理论在Linux系统中的应用。文章旨在为读者提供一扇窥探操作系统深层工作机制的窗口,同时激发对计算科学深层次理解的兴趣和思考。
|
17天前
|
消息中间件 算法 调度
深入理解操作系统:进程管理与调度策略
【10月更文挑战第29天】本文将带领读者深入探讨操作系统中的核心组件之一——进程,并分析进程管理的重要性。我们将从进程的生命周期入手,逐步揭示进程状态转换、进程调度算法以及优先级调度等关键概念。通过理论讲解与代码演示相结合的方式,本文旨在为读者提供对进程调度机制的全面理解,从而帮助读者更好地掌握操作系统的精髓。
30 1
|
17天前
|
算法 调度 UED
深入理解操作系统中的进程调度
【10月更文挑战第29天】探索进程调度的奥秘,本文将带你深入了解在操作系统中如何管理和控制多个并发执行的程序。从简单的调度算法到复杂的多级反馈队列,我们将逐步揭示如何优化系统性能和提高资源利用率。准备好一起揭开进程调度的神秘面纱吧!
|
18天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!