进程管理And线程实现(上)

简介: 进程管理And线程实现(上)

进程的描述



进程的定义


一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程.

1687777902143-c5ec7b04-82e6-4178-ae11-b949f27d7abb.png


进程的组成


包括 :


  • 程序的代码
  • 程序处理的数据
  • 程序计数器中的值, 指示下一条将运行的指令
  • 一组通用的寄存器的当前值, 堆, 栈
  • 一组系统资源(如打开的文件)


程序和进程的联系:


  • 程序是产生进程的基础
  • 程序的每次运行构成不同的进程
  • 进程是程序功能的体现
  • 通过多次执行, 一个程序可以对应多个进程, 通过调用关系, 一个进程可包括多个程序.


进程和程序的区别


  • 进程是动态的, 程序是静态的 : 程序是有序代码的集合. 进程是程序的执行, 进程有核心态 / 用户态.
  • 进程是暂时的, 程序是永久的. 进程是一个状态变化的过程, 程序可以长久保存.
  • 进程和程序的组成不同 : 进程的组成包括程序, 数据和进程控制块(进程状态信息)


进程的特点


  • 动态性 : 可动态地创建, 结果进程;
  • 并发性 : 进程可以被独立调度并占用处理机运行; (并发:一段, 并行:一时刻)
  • 独立性 : 不同进程的工作不相互影响;(页表是保障措施之一)
  • 制约性 : 因访问共享数据, 资源或进程间同步而产生制约.


1687778829320-3e7cbc91-d1f7-4bc1-b290-d55ec1f425eb.png


**问题 **:


如果你要设计一个OS, 怎么样来实现其中的进程管理机制?


进程控制结构


进程也可以说是一个程序 , 我们都知道程序 = 数据结构 + 算法

所以我们进程也会需要这些。

在进程中 , 我们用 进程控制块(Process Control Block)[PCB]来作为进行的数据结构 。

操作系统为每个进程都维护了一个PCB, 用来保存与该进程有关的各种状态信息.


进程控制块 :


进程控制块 : 操作系统管理控制进程运行所用的信息集合.


  1. 进程的创建 : 为该进程生成一个PCB
  2. 进程的终止 : 回收它的PCB
  3. 进程的组织管理 : 通过对PCB的组织管理来实现


(PCB具体包含什么信息? 如何组织的? 进程的状态转换?)


PCB有以下三大类信息 :


  • 进程标志信息. 如本进程的标志, 本进程的产生者标志(父进程标志). 用户标志
  • **处理机状态信息保存区 **: 保存进程的运行现场信息 :


用户可见寄存器. 用户程序可以使用的数据, 地址等寄存器

控制和状态寄存器. 如程序计数器(PC), 程序状态字(PSW)

栈指针. 过程调用, 系统调用, 中断处理和返回时需要用到它


  • 进程控制信息


调度和状态信息. 用于操作系统调度进程并占用处理机使用.

进程间通信信息. 为支持进程间与通信相关的各种标志, 信号, 信件等, 这些信息都存在接收方的进程控制块中.

存储管理信息. 包含有指向本进程映像存储空间的数据结构.

进程所用资源. 说明由进程打开, 使用的系统资源. 如打开的文件等.

有关数据结构的链接信息. 进程可以连接到一个进程队列中, 或连接到相关的其他进程的PCB.


进程的状态(进程的动态特点)



进程的生命期管理


进程从产生到结束


  • 进程创建
  • 进程运行
  • 进程等待
  • 进程唤醒
  • 进程结束


进程创建


引起进程创建的3个主要事件 :


  • 系统初始化;
  • 用户请求创建一个新进程;
  • 正在运行的进程执行了创建进程的系统调用.


进程运行


内核选择一个就绪的进程, 让它占用处理机并执行

(为何选择? && 如何选择?)


进程等待


在以下情况下, 进程等待(阻塞):


  1. 请求并等待系统服务, 无法马上完成
  2. 启动某种操作, 无法马上完成
  3. 需要的数据没有到达


进程只能自己阻塞自己, 因为只有进程自身才能知道何时需要等待某种事件的发生.


进程唤醒


唤醒进程的原因 :


被阻塞进程需要的资源可被满足

被阻塞进程等待的事件到达

将该进程的PCB插入到就绪队列

进程只能被别的进程或操作系统唤醒


进程结束

四种情况下, 进程结束 :


  • 正常退出(自愿)
  • 错误退出(自愿)
  • 致命错误(强制性)
  • 被其他进程杀死**(强制性)**

1687780119512-cff4c79d-c9b3-4e03-887f-add17eb546a8.png


进程状态变化模型


进程的三种基本状态 : 进程在生命结束前处于三种基本状态之一.

不同系统设置的进程状态数目不同.


三种基本状态


  1. 运行状态(Running) : 当一个进程正在处理机上运行时
  2. 就绪状态(Ready) : 一个进程获得了除处理机之外的一切所需资源, 一旦得到处理机即可运行
  3. 等待状态(阻塞状态 Blocked) : 一个进程正在等待某一时间而暂停运行时. 如等待某资源, 等待输入/输出完成.

1687780210222-3fb1b7ca-5f3a-4fd2-b242-d0da4e593feb.png

还可以有创建状态 && 结束状态


状态变化图


1687780258242-61ec0f2a-f8aa-42df-b631-e346974c9e1c.png

  1. NULL → New : 一个新进程被产生出来执行一个程序
  2. New → Ready: 当进程创建完成并初始化后, 一切就绪准备运行时, 变为就绪状态
  3. Ready → Running : 处于就绪态的进程被进程调度程序选中后, 就分配到处理机上来运行
  4. Running → Exit : 当进程表示它已经完成或者因出错, 当前运行进程会由操作系统作结束处理
  5. Running → Ready : 处于运行状态的进程在其运行过程中, 由于分配它的处理机时间片用完而让出处理机
  6. Running → Blocked: 当进程请求某样东西且必须等待时
  7. Blocked → Ready : 当进程要等待某事件到来时, 它从阻塞状态变到就绪状态


进程挂起模型


1687781009126-005ab9a6-922c-4bae-b55b-8fbc578bef6e.png

**挂起 : **意味着进程没有占用内存空间。 处于挂起的进程映像在磁盘上


两种挂起状态 :


  1. 阻塞挂起状态 : 进程在外存并等待某事件的出现;
  2. 就绪挂起状态 : 进程在外存, 但只要进入内存, 即可运行.


挂起的状态之间的转换【把一个进程从内存到外存】


  • 阻塞到阻塞挂起 : 没有进程处于就绪状态或就绪进程要求更多内存资源时, 会进行这种转换, 以提交新进程或运行时就绪进程.
  • **就绪到就绪挂起 : **当有高优先级阻塞(系统认为会很快就绪的)进程和低优先级就绪进程时, 系统会选择挂起低优先级就绪进程.
  • **运行到就绪挂起 : **对抢先式分时系统, 当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时, 系统可能会把运行进程转导就绪挂起状态.


在外存时的状态转换 :


  • 阻塞挂起到就绪挂起 : 当有阻塞挂起因相关事件出现时, 系统会把阻塞挂起进程转换为就绪挂起进程


**解挂/ 激活【 把一个进程从内存到外存】 : **


  • 就绪挂起到就绪 : 没有就绪进程或挂起就绪进程优先级高于就绪进程时, 会进行这种转换.
  • 阻塞挂起到阻塞 : 当一个进程释放足够内 存时, 系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转换为阻塞进程.


状态队列:


  • 由操作系统来维护一组队列, 用来表示系统当中所有进程的当前状态;
  • 不同的状态分别用不同的队列来表示(就绪队列, 各种类型的阻塞队列);
  • 每个进程的PCB都根据它的状态加入到相应的队列当中, 当一个进程的状态发生变化时, 它的PCB从一个状态中脱离出来, 加入到另外一个队列.

1687781775256-24f26176-0dfb-499e-88f2-0730e3f752c0.png



目录
相关文章
|
1月前
|
调度 开发者 Python
深入浅出操作系统:进程与线程的奥秘
在数字世界的底层,操作系统扮演着不可或缺的角色。它如同一位高效的管家,协调和控制着计算机硬件与软件资源。本文将拨开迷雾,深入探索操作系统中两个核心概念——进程与线程。我们将从它们的诞生谈起,逐步剖析它们的本质、区别以及如何影响我们日常使用的应用程序性能。通过简单的比喻,我们将理解这些看似抽象的概念,并学会如何在编程实践中高效利用进程与线程。准备好跟随我一起,揭开操作系统的神秘面纱,让我们的代码运行得更加流畅吧!
|
3月前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
59 1
|
1月前
|
消息中间件 Unix Linux
【C语言】进程和线程详解
在现代操作系统中,进程和线程是实现并发执行的两种主要方式。理解它们的区别和各自的应用场景对于编写高效的并发程序至关重要。
59 6
|
1月前
|
调度 开发者
深入理解:进程与线程的本质差异
在操作系统和计算机编程领域,进程和线程是两个核心概念。它们在程序执行和资源管理中扮演着至关重要的角色。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
61 5
|
1月前
|
算法 调度 开发者
深入理解操作系统:进程与线程的管理
在数字世界的复杂编织中,操作系统如同一位精明的指挥家,协调着每一个音符的奏响。本篇文章将带领读者穿越操作系统的幕后,探索进程与线程管理的奥秘。从进程的诞生到线程的舞蹈,我们将一起见证这场微观世界的华丽变奏。通过深入浅出的解释和生动的比喻,本文旨在揭示操作系统如何高效地处理多任务,确保系统的稳定性和效率。让我们一起跟随代码的步伐,走进操作系统的内心世界。
|
1月前
|
调度 开发者
核心概念解析:进程与线程的对比分析
在操作系统和计算机编程领域,进程和线程是两个基本而核心的概念。它们是程序执行和资源管理的基础,但它们之间存在显著的差异。本文将深入探讨进程与线程的区别,并分析它们在现代软件开发中的应用和重要性。
57 4
|
2月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
2月前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
2月前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
32 1
|
2月前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
46 2