进程的管理与控制

news2025/2/24 23:10:28

一、进程与线程

1. 进程

程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
进程(Process):是指计算机中已执行的程序,是动态的。

(1)进程的组成

当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的编号,即进程ID(Process ID,PID),操作系统此时要记录PID。除此之外,操作系统还需要记录进程所属用户ID(UID)、给进程分配的资源、进程的运行情况等。

这些信息都被保存在一个数据结构 进程控制块(Process Control Block,PCB ) 中,操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中。

PCB是进程存在的唯一标志,当进程被创建时,操作系统为其创建PCB,当进程结束时,会回收其PCB。

除了PCB,进程还需要程序段来存放程序的代码,并使用 数据段 保存进程执行时产生的数据(如程序中定义的变量)。
一个进程实体(进程映像)由PCB、程序段、数据段组成。其中程序段用来存放程序的代码(指令), 数据段 用来保存进程执行时产生的数据。

进程是动态的,进程实体(进程映像)是静态的。进程实体反应了进程在某一时刻的状态(如:x++后,x=2)

程序运行示意图:

在这里插入图片描述

(2)进程的特征

程序是静态的,进程是动态的,相比于程序,进程拥有以下特征。

  1. 动态性:进程是程序的一次执行,经历创建、活动、暂停、终止等过程,具有一定的生命周期,是动态产生、变化和消亡的基本特征。

  2. 并发性:多个进程实体能够同时存在于内存中,在一段时间内同时运行,提高资源利用率,并发性是进程的重要特征,也是操作系统的关键特征。

  3. 独立性:进程实体是一个能够独立运行、独立获取资源和独立接受调度的基本单位。未建立PCB的程序无法作为独立单位参与运行。

  4. 异步性:由于进程相互制约,导致执行间断性,进程按照各自独立且不可预知的速度向前推进,需配置进程同步机制以处理异步性带来的挑战。

  5. 结构性:每个进程通过PCB进行描述,包含程序段、数据段和进程控制块三部分组成。这种结构性有助于管理和控制进程的执行和状态转换。

(3)多个进程之间的PCB组织方式

在一个系统中,通常会存在成百上千个PCB。为了有效管理它们,需要采取适当的方式来组织这些PCB。

进程的PCB组织方式包括链接方式和索引方式。

  1. 链接方式:在链接方式中,每个进程的PCB包含一个指向下一个PCB的指针,形成一个链表结构。当系统需要访问某个特定进程的PCB时,可以顺着链表依次查找直到找到目标PCB。这种方式适合于需要频繁插入和删除进程的情况,但可能会增加查找时间。
    在这里插入图片描述

  2. 索引方式:在索引方式中,系统维护一个索引表,其中记录了所有进程PCB的位置信息或关键字,通过索引表可以直接查找到对应进程的PCB。这种方式可以提高查找效率,适合于需要快速访问进程PCB的情况。
    在这里插入图片描述

选择使用链接方式还是索引方式取决于系统的需求和设计考虑,不同的方式各有优劣,可以根据具体情况进行选择。

2. 进程的状态

(1)进程的五种状态

进程在操作系统中通常有五种状态,包括:

  1. 创建态(new):进程被创建时处于“创建态”状态,操作系统为其分配资源并初始化PCB,为进程的正常运行做准备。

  2. 就绪态(Ready):创建完成后,进程进入“就绪态”,表示它已经准备好运行,但由于没有空闲CPU,暂时无法执行。

  3. 运行态(Running):当进程获得CPU时间并开始执行对应的程序指令时,处于“运行态”,CPU会按照指令序列执行该进程。

  4. 阻塞态(Blocked / Waiting):在执行过程中,进程可能因等待某事件发生而无法继续执行,此时进程会进入“阻塞态”,操作系统会让其释放CPU,并等待事件发生。当CPU空闲时,操作系统会选择另一个“就绪态”进程继续执行。

  5. 终止态(Terminated):进程通过调用exit系统调用请求终止时,进入“终止态”,操作系统回收资源、释放内存空间等,并最终销毁该进程。一旦终止完成,进程从系统中彻底消失。

其中就绪态(Ready)、运行态(Running)、阻塞态(Blocked)为进程的三种基本状态。

(2)进程状态的转换

在这里插入图片描述
下面是对进程状态转换的简要描述:

  1. NULL → 新建态:执行一个程序,创建一个子进程,进程从NULL状态转变为新建态。

  2. 新建态 → 就绪态:当操作系统完成了进程创建的必要操作,并且系统性能和虚拟内存容量允许时,进程从新建态转变为就绪态,表示已准备好运行但暂时无法执行。

  3. 运行态 → 终止态:当进程达到自然结束点、出现无法解决的错误、被操作系统或其他有终止权的进程终结时,进程从运行态转为终止态。

  4. 运行态 → 就绪态:当进程的运行时间片用完或出现更高优先级的进程时,进程从运行态转为就绪态等待重新调度。

  5. 运行态 → 等待态:进程等待使用资源(如外设传输),需要等待人工干预或其他事件发生时,进程从运行态转为等待态。

  6. 就绪态 → 终止态:在某些操作系统中,未在状态图中显示,但父进程可能允许终结子进程,此时进程从就绪态直接转为终止态。

  7. 等待态 → 终止态:和上一条类似,在某些操作系统中,虽未在状态图中显示,但允许父进程终结子进程,进程从等待态直接转为终止态。

  8. 终止态 → NULL:进程完成所有清理工作后,从终止态返回到NULL状态,整个进程生命周期结束。

3.进程的控制

进程控制的主要功能是对系统中所有进程进行有效管理,包括创建新进程、撤销已有进程和实现进程状态转换等。操作系统中通常将用于进程控制的程序段称为原语,其特点是在执行期间不允许中断,是一个不可分割的基本单位。原语的不可中断性确保了进程控制操作的完整性和一致性,防止出现竞争条件和数据不一致的情况,从而提高了系统的稳定性和可靠性。
进程的创建、终止、阻塞和唤醒是进程控制中的重要过程,它们包括以下步骤:

  1. 创建进程

    • 为新进程分配一个唯一的进程标识号,并为进程分配空白的PCB,并填写控制和管理信息,若PCB申请失败,则进程创建失败。
    • 为进程分配资源,为新进程的程序和数据及用户栈分配必要的内存空间(在PCB 中体现)。若资源不足(如内存空间),则处于阻塞态,等待内存资源;
    • 将PCB插入就绪队列,等待调度执行。
  2. 终止进程

    • 查找要终止的进程的PCB。
    • 如果进程正在执行,立即终止其执行,并释放CPU资源。
    • 如果进程有子进程,将子进程交给父进程或由1号进程(init)接管。
    • 归还进程拥有的资源给操作系统,从PCB队列中删除该进程。
  3. 阻塞进程

    • 找到需要阻塞的进程的标识对应的PCB。
    • 如果进程正在运行,保护其现场,将状态转换为阻塞状态,暂停运行。
    • 将PCB插入阻塞队列中。
  4. 唤醒进程

    • 在阻塞队列中找到相应事件的阻塞进程的PCB。
    • 将其移出阻塞队列,并设置为就绪状态。
    • 将PCB插入就绪队列,等待调度程序调度运行。

进程的阻塞和唤醒是进程控制中重要的操作,确保进程间的合理执行和资源利用。进行这些操作时,需要保证相应的阻塞和唤醒语句成对出现,以确保进程状态转换的正确性。

4.进程的通信

  1. 管道(Pipes):是⼀种半双⼯的通信⽅式,数据只能单向流动,用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
  2. 共享内存(Shared memory):使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
  3. 消息队列(Message Queuing):消息队列是消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载⽆格式字节流以及缓冲区⼤⼩受限等缺点。
  4. 套接字(Sockets):适⽤于不同机器间进程通信,在本地也可作为两个进程通信的⽅式。
  5. 信号(Signal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  6. 信号量(Semaphores):信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。

5.线程

线程(Thread)通常被称为轻量级进程,因为线程是在进程内部创建和管理的,相较于整个进程来说,线程具有更小的开销和更快的上下文切换速度。线程是一个基本的CPU执行单元,也是程序执行流的最小单位。多个线程可以在同一个进程内并发执行,并且它们共享该进程的资源,如内存空间、文件句柄、网络连接等。

举例来说,当你打开微信时,可能会有多个不同的线程在后台同时执行不同的任务。例如,存在一个专门负责拉取别人给你发送的最新消息的线程,该线程定期检查服务器是否有新消息,并将其显示在你的微信聊天界面上。同时,还可能有其他线程负责处理用户的输入、更新UI界面等任务。

引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)

二、进程调度

1. 调度

(1)调度的概念

进程都期望能够占用CPU进行工作,当有一堆任务要处理,但由于资源有限,这些事情没法同时处理。这就需要确定某种规则来决定处理,这些任务的顺序,这就是“调度”研究的问题。
这种选择进程并让其运行的功能是由操作系统中的调度程序(scheduler)完成的。调度程序负责根据一定的调度算法,决定在给定时刻哪个进程应该优先获得CPU的使用权,从而实现对系统资源的合理调度和分配。
通过调度程序的工作,操作系统能够有效地管理系统中多个进程的执行顺序和时间片分配,以确保系统资源的高效利用和任务的及时完成。不同的调度算法可能导致不同的进程调度方式,如先来先服务、最短作业优先、轮转调度等。

(2)调度的三个层次
  1. 高级调度(作业调度):按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时才撤销PCB。
  2. 中级调度(内存调度):按照某种策略决定将哪个处于挂起状态的进程重新调入内存。一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
  3. 低级调度(进程调度/处理机调度):按照某种策略从就绪队列中选取一个进程,将处理机分配
    给它。
调度方法调度发生位置发生频率进程状态
高级调度(作业调度)按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程外存->内存(面向作业)最低无->创建态->就绪态
中级调度(内存调度)按照某种规则,从挂起队列中选择合适的进程将其数据调回内存外存->内存(面向进程)中等挂起态->就绪态(阻塞挂起->阻塞态)
低级调度(进程调度)按照某种规则,从就绪队列中选择一个进程为其分配处理机内存->CPU最高就绪态->运行态

2. 调度算法

  1. 先来先服务调度算法(First Come First Severd, FCFS):先来后到,每次从就绪队列选择最先进入队列的进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择第一个进程接着运行。
  2. 最短作业优先调度算法(Shortest Job First, SJF):它会优先选择运行时间最短的进程来运行,这有助于提高系统的吞吐量。
  3. 高响应比优先调度算法(Highest Response Ratio Next, HRRN):主要是权衡了短作业和长作业。每次进行进程调度时,先计算“响应比优先级”,然后把“响应比优先级”最高的进程投入运行。
  4. 时间片轮转调度算法(Round Robin, RR):每个进程被分配一个时间段,称为时间片(Quantum),即允许该进程在该时间段中运行。
  5. 最高优先级调度算法(Highest Priority First,HPF):调度是有优先级的,即希望调度程序能从就绪队列中选择最高优先级的进程进行运行
  6. 多级反馈队列调度算法(Multilevel Feedback Queue):“时间片轮转算法”和“最高优先级算法”的综合和发展。

三、进程的同步与互斥(更新中)

四、死锁(更新中)

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

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

相关文章

SQLCipher:SQLite加密工具的实用指南

本文还有配套的精品资源,点击获取 简介:SQLCipher是一个开源工具,用于为SQLite数据库提供透明的数据加密功能,确保数据安全。其工作原理是通过在SQLite的API上增加一层加密层,并使用AES加密算法确保数据在未授权访问…

如何将 JavaWeb 项目部署到云服务器

1. 搭建 Java 部署环境 接下来以 Ubuntu 来进行演示 1.1. apt 包管理工具 apt 就相当于手机上的应用市场 列出所有软件包:apt list 这个命令输出所有包的列表,内容比较多,可以使用 grep 命令过滤输出:apt list |grep "jd…

自动驾驶算法——卡尔曼滤波器平滑感知车道线参数【C++代码实现】

1.算法原理 在工程实践中,由于感知识别到的车道线偶尔存在较大的跳变,导致后端控制算法计算出的控制角度也存在较大的跳变,所以我们需要对感知输入的车道线系数进行平滑处理。 已知卡尔曼滤波算法主要分为以下几大步骤: 感知将车道线以三次螺旋曲线方程 y = c 0 + c 1 x +…

用python替换和循环插入excel的内容

用python替换和循环插入excel的内容 目的: 1.有一个word模板和一个有数据的excel表格 2.需要将excel中的数据经过更改成需要的字符串插入word段落中 3.更改word中的字符串 4.写一个现阶段可以用的程序,并用作以后更新迭代复用。 过程: …

UE5基本数据类型

bool: 表示布尔值,只有两个取值:true 或 false,用于表示逻辑条件。int8: 表示 8 位的有符号整数,范围是 −128−128 到 127127。uint8: 表示 8 位的无符号整数,范围是 00 到 255255。int16: 表示 16 位的有符号整数&am…

【Unity高级】在编辑器中如何让物体围绕一个点旋转固定角度

本文介绍如何在编辑器里让物体围绕一个点旋转固定角度,比如上图里的Cube是围绕白色圆盘的中心旋转45度的。 目标: 创建一个在 Unity 编辑器中使用的旋转工具,使开发者能够在编辑模式下快速旋转一个物体。 实现思路: 编辑模式下…

深度学习:从入门到精通的全面学习路径

摘要: 本文详细阐述了深度学习从入门到精通的系统学习路线。从基础数学与编程知识的夯实,到深度学习核心技术栈的深入掌握,包括 TensorFlow 与 PyTorch 等框架的应用;再到各类主流深度学习算法的原理学习与实践,涵盖神…

CC2530传感器应用实例

1.CC2530流水灯实验 //基于CC2530微控制器的程序&#xff0c;用于控制三个LED灯的闪烁。#include <ioCC2530.h>#define uint unsigned int #define uchar unsigned charuint代表无符号整型&#xff0c;uchar代表无符号字符型。#define LED1 P1_0 #define LED2 P1_1 #defi…

深度和法线纹理

屏幕后期处理效果的基本原理就是当游戏画面渲染完毕后通过获取到该画面的信息进行额外的效果处理 之前的边缘检测、高斯模糊、Bloom、运动模糊等效果都是基于获取当前屏幕图像中的像素信息进行后期处理的 如果仅仅根据像素信息来进行一些效果处理&#xff0c;存在以下问题&…

Oracle之表空间迁移

问题背景&#xff1a;一个数据表随着时间的累积&#xff0c;导致所在表空间占用很高&#xff0c;里面历史数据可以清除&#xff0c;保留近2个月数据即可 首先通过delete删除了2个月以前的数据。 按网上的教程进行空间压缩&#xff0c;以下sql在表所在用户执行: -- 允许表重新…

非父子通信(扩展)-- event bus 事件总线

创建一个空实例Bus&#xff0c; export default 导出Bus 过程:由A组件对Bus组件进行监听&#xff0c;B组件触发Bus对应的事件&#xff0c;由于A组件进行监听&#xff0c;触发事件之后就会进行A组件的回调&#xff0c;那么就可以将消息发送给A了 在src文件夹下新建utils文件夹&a…

vue深入理解(1)

本文章内容主要来源于《vue.js设计与实现》 视图层框架设计 命令式和声明式 范式上&#xff0c;视图层框架通常分为命令式和范式 JQuery就是典型的命令式框架&#xff0c;命令式框架的一大特点就是关注过程 例子&#xff1a; $(#app) // 获取app.text(hello world) // 设置…

CSDN博客如何修改删除上传的资源

CSDN博客是我用过的最好用的博客&#xff0c;它对用户发布文章的限制比较少&#xff0c;而且还支持用户利用知识创新来获取收益&#xff0c;不象51CTO这种垃圾博客&#xff0c;动不动就给扣分限号。但我发现CSDN也有设计缺陷&#xff0c;虽然其上传资源的入口很好找&#xff0c…

【SpringBoot】Day11-10 yml文件配置

三种配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件以外&#xff0c;还支持另外一种类型的配置文件&#x…

React路由使用入门react-router-dom

1.安装react-router-dom npm i react-router-dom 2.配置 &#xff08;1&#xff09;创建router实例对象并且配置路由对应关系 &#xff08;2&#xff09;路由绑定 import {createBrowserRouter,RouterProvider} from react-router-dom//&#xff08;1&#xff09;创建rou…

web复习(二)

编程题 1.编写一个函数&#xff0c;接收一个数组作为参数&#xff0c;返回一个对象&#xff0c;其中包含数组中每个元素及其出现次数。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewpo…

【CANoe示例分析】Basic UDP Multicast(CAPL)

1、工程路径 C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 16.6.2\Ethernet\Simulation\UDPBasicCAPLMulticast 在CANoe软件上也可以打开此工程:File|Sample Configurations|Ethernet - Simulation of Ethernet ECUs|Basic UDP Multicast(CAPL) 2、示例目…

在Linux(ubuntu22.04)搭建rust开发环境

1.安装rust 1.安装curl: sudo apt install curl 2.安装rust最新版 curl --proto ‘https’ --tlsv1.2 https://sh.rustup.rs -sSf | sh 安装完成后出现&#xff1a;Rust is installed now. Great! 重启当前shell即可 3.检验是否安装成功 rustc --version 结果出现&…

react跳转传参的方法

传参 首先下载命令行 npm react-router-dom 然后引入此代码 前面跳转的是页面 后面传的是你需要传的参数接参 引入此方法 useLocation()&#xff1a;这是 react-router-dom 提供的一个钩子&#xff0c;用于获取当前路由的位置对象location.state&#xff1a;这是从其他页面传…

路径规划之启发式算法之九:灰狼优化算法(Grey Wolf Optimizer,GWO)

灰狼优化算法&#xff08;Grey Wolf Optimizer&#xff0c;GWO&#xff09;是一种智能优化算法&#xff0c;由澳大利亚格里菲斯大学学者Mirjalili等人在2014年提出。该算法灵感来源于灰狼群体的捕食行为&#xff0c;通过模拟灰狼的社会等级分层和狩猎机制来解决复杂的优化问题。…