操作系统中的进程管理详细介绍——进程的调度与通信

        进程管理是操作系统中至关重要的功能之一,它负责协调和管理计算机系统中运行的所有进程。以下是对进程管理各个方面的详细介绍:

1. 进程调度

进程调度是操作系统决定哪个进程在何时运行的过程,目的是最大化CPU的利用率和系统的整体性能。常见的调度策略包括:

  • 先来先服务(FCFS):按照进程到达的顺序进行调度。简单易实现,但可能导致短进程长时间等待长进程。

  • 短作业优先(SJF):优先调度运行时间最短的进程。可以减少平均等待时间,但需要预知进程的运行时间。

  • 优先级调度:每个进程被赋予一个优先级,调度器优先运行优先级最高的进程。可能导致低优先级进程饥饿。

  • 时间片轮转(Round Robin):每个进程被分配一个固定的时间片,时间片用完后,进程被放回队列末尾,等待下一次调度。公平且适用于多任务环境。

  • 多级反馈队列调度:结合了时间片轮转和优先级调度,进程在不同优先级的队列间移动,以适应不同进程的需求。

2. 进程状态管理

1. 新建(New)
  • 定义:在这个状态下,进程正在被创建。此时,操作系统正在为该进程分配所需的资源,包括内存、进程控制块(PCB)等。
  • 操作
    • 进程的新建过程通常涉及调用相应的系统调用(如 Unix 的 fork() 或 Windows 的 CreateProcess())。
    • 系统将进程信息(如状态、优先级、程序计数器等)存储在 PCB 中。
  • 转换:一旦进程的创建完成并且资源分配妥当,进程将转入就绪状态。
2. 就绪(Ready)
  • 定义:在就绪状态下,进程已准备好运行,等待 CPU 的分配。此时进程已经拥有了所有执行所需的资源。
  • 特点
    • 在此状态,进程并不实际执行,但可以立即运行。
    • 就绪队列是一个数据结构,用于管理所有处于就绪状态的进程。
  • 调度
    • 一旦调度程序选择该进程,进程将根据调度策略(如先来先服务、时间片轮转等)转换到运行状态。
  • 转换:进程可能从就绪状态进入运行状态,也可能在某些情况下(如优先级更高的进程到达)被移至就绪队列的末尾。
3. 运行(Running)
  • 定义:在运行状态下,进程正在 CPU 上执行其指令。
  • 特点
    • 进程拥有 CPU 的控制权,可以执行计算、处理数据、进行 I/O 操作等。
    • 只有一个进程可以在任一时刻占用 CPU(在单核 CPU 系统中),而在多核 CPU 系统中,多进程也可以同时运行。
  • 转换
    • 进程在运行中可能因时间片耗尽而被调度程序抢占,转入就绪状态。
    • 若进程请求 I/O 操作或等待某些事件,则会转入等待状态。
    • 进程执行完毕或被操作系统终止后,将进入终止状态。
4. 等待(Waiting)
  • 定义:此状态的进程正在等待某个事件的发生(例如 I/O 完成、信号到达等),暂时无法继续执行。
  • 特点
    • 等待状态是阻塞状态,进程无法执行,因为其请求的资源或事件尚未满足。
    • 操作系统通常会维护一个等待队列,以跟踪所有处于等待状态的进程。
  • 转换
    • 当等待的事件发生时,进程将从等待状态转回就绪状态,准备再次争夺 CPU。
    • 例如,完成的 I/O 操作会使等待的进程被唤醒,转入就绪状态。
5. 终止(Terminated)
  • 定义:终止状态表示进程已完成其执行,或被操作系统强制终止。
  • 特点
    • 在此状态下,进程不再占用 CPU 和其他资源,但可能仍在系统中保留信息,直到其父进程读取状态。
    • 操作系统在进程终止后需要进行资源回收,包括内存、文件描述符等的释放。
  • 转换:一旦收回所有资源,进程将完全从系统中消失。

状态转换图如下:

新建 -> 就绪 <-> 运行 -> 终止|       |└-------等待

3. 进程间通信(IPC)

1. 信号量(Semaphore)

信号量是一种同步机制,用于控制多个进程对共享资源的访问。信号量可以实现进程间的互斥和同步。

  • 信号量的类型

    • 二进制信号量:只能取值 0 或 1,适用于互斥锁(Mutex),用于控制一个资源的访问。
    • 计数信号量:可以取任意非负整数,用于管理可以同时访问某个共享资源的多个进程数量。
  • 基本操作

    • P(等待)操作:当进程执行 P 操作时,如果信号量值大于 0,则将其减 1,进程继续执行;如果为 0,则进程被挂起,等待信号量被释放。
    • V(释放)操作:当进程完成对共享资源的使用后,执行 V 操作将信号量值加 1,如果有其他进程在等待,则唤醒其中一个进程。
  • 应用场景:信号量通常用于实现互斥锁,防止多个进程同时访问共享资源(如文件、打印机等)。

2. 消息队列(Message Queue)

消息队列是一种为进程提供异步通信的机制,使进程可以通过发送和接收消息进行数据交换。

  • 结构:消息队列由系统内核维护,形成一个先进先出的(FIFO)缓冲区。

  • 基本操作

    • 发送消息:进程可以将消息写入消息队列,消息可能会在队列中停留一段时间,直到被目标进程读取。
    • 接收消息:进程可以从消息队列中读取消息,读取操作通常是阻塞的,即如果没有消息可读,进程会被挂起。
  • 优点

    • 提供了不同进程间的异步通信,可以在不需要直接共享内存的情况下完成数据交换。
    • 消息队列可以存储多个消息,提供了一种可靠的通信方式。
  • 应用场景:适用于需要交换数据而不需要立即响应的情况,如任务调度、事件通知等。

3. 共享内存(Shared Memory)

共享内存是一种高效的进程间通信机制,多个进程可以直接访问同一块内存区域,从而实现数据交换。

  • 机制

    • 系统内核为共享内存区分配一段内存,使用时多个进程映射这段内存区域以进行读写。
  • 同步问题

    • 由于多个进程可以同时访问共享内存,必须使用同步机制(如信号量、互斥锁等)来控制对共享内存的访问,避免数据冲突和不一致。
  • 优点

    • 速度快,因为数据直接在内存中交换,不必通过系统调用进行数据传输。
    • 高效适用于大量数据交换的场景。
  • 应用场景:用于需要快速数据共享的场景,如图形处理、数据库服务等。

4. 管道(Pipe)

管道是一种单向的数据流通信机制,主要用于将一个进程的输出连接到另一个进程的输入。

  • 类型

    • 匿名管道:仅支持具有亲缘关系的进程(如父子进程)之间的通信,数据默认是 FIFO 方式传递。
    • 命名管道(FIFO): allowing unrelated processes to communicate. 通过在文件系统中创造一个特殊的文件进行读写,可以实现无亲缘进程间的通信。
  • 基本操作

    • 一个进程(写入端)将数据写入管道,另一个进程(读取端)从管道中读取数据。
    • 管道是阻塞的:若写入端满,则写入进程会被阻塞;若读取端无数据,则读取进程会被阻塞。
  • 优点:实现简单,易于使用,适合在父子进程之间进行快速的简单数据传输。

  • 应用场景:广泛用于 shell 脚本和命令行中,通过管道将一个命令的输出直接传递给另一个命令。

5. 套接字(Socket)

套接字是一种用于网络通信的 IPC 机制,支持在不同主机上的进程间通信。

  • 类型

    • 面向连接的套接字(TCP):通过建立连接进行可靠的数据传输。数据传输是流式的,确保数据的顺序和完整性。
    • 无连接的套接字(UDP):适用于数据报文的发送,不保证数据传输的可靠性和顺序。效率高,但不适合需要保证可靠传输的应用。
  • 基本操作

    • 创建套接字:使用 socket 系统调用创建一个套接字。
    • 绑定(Bind):将套接字与一个本地地址(如 IP 地址和端口号)绑定,以接收数据。
    • 监听(Listen):等待远程连接请求(适用于 TCP)。
    • 接受(Accept):建立连接(适用于 TCP);
    • 发送(Send)和接收(Recv):数据的发送和接收。
  • 优点:灵活性高,可以在本地和远程进程间进行通信,适用于各种应用场景。

  • 应用场景:广泛用于网络应用,如网页浏览、电子邮件、实时聊天等。

4. 进程创建与终止

操作系统负责创建新进程和终止不再需要的进程,以确保系统资源得到有效利用。

进程创建

进程创建涉及操作系统为新进程分配资源并初始化其环境。以下是几个常见的进程创建机制:

1. fork() 系统调用

fork() 是类Unix系统中用于创建新进程的系统调用。它的工作原理如下:

  • 创建新进程fork() 调用会创建一个新进程,新进程是原进程的精确副本。这意味着新进程拥有与原进程相同的内存映像、打开的文件、环境变量等。
  • 父子进程fork() 调用后,系统中会有两个几乎相同的进程:父进程和子进程。父进程是调用 fork() 的进程,子进程是新创建的进程。
  • 返回值fork() 调用会返回两次:一次在父进程中,返回子进程的 PID(进程标识符);另一次在子进程中,返回 0。父进程通过返回值可以区分自身和子进程,子进程则可以通过返回值为 0 来确认自己是子进程。
2. exec() 系统调用

exec() 是一组系统调用(如 execl()execv()execle()execve() 等),用于加载并运行一个新的程序,替换当前进程的内存映像。其工作原理如下:

  • 加载新程序exec() 调用会用新程序的代码和数据替换当前进程的内存映像。新程序从入口点开始执行。
  • 参数传递exec() 调用可以传递命令行参数和环境变量给新程序。
  • 进程标识不变:尽管内存映像被替换,但进程的 PID 保持不变,其他资源(如打开的文件)也保持不变。
3. CreateProcess() 函数(Windows)

CreateProcess() 是 Windows 系统中用于创建新进程的函数。它提供了更丰富的功能,可以指定新进程的各种属性。其工作原理如下:

  • 参数设置CreateProcess() 允许指定新进程的可执行文件路径、命令行参数、环境变量、工作目录、安全属性等。
  • 创建进程:函数调用后,系统会创建新进程,并返回一个布尔值表示创建是否成功。
  • 父子进程关系:与 Unix 的 fork() 不同,CreateProcess() 不会创建父进程的副本,而是直接创建一个新进程。父进程可以通过 HANDLE 来管理子进程。
进程终止

进程终止是指进程结束其执行并释放其所占用的资源。以下是进程终止的几种方式:

1. 正常终止

进程完成其任务后,可以通过调用 exit() 系统调用来正常终止。其工作原理如下:

  • 释放资源exit() 调用会通知操作系统进程即将终止,操作系统会释放进程占用的内存、文件描述符等资源。
  • 返回状态exit() 可以传递一个状态码给父进程(通常是 0 表示成功,非 0 表示失败)。
  • 等待机制:父进程可以通过 wait() 或 waitpid() 系统调用(在 Unix 中)或 WaitForSingleObject() 函数(在 Windows 中)来等待子进程的终止。
2. 异常终止

进程可能因错误或外部信号而异常终止。常见的情况包括:

  • 错误:例如程序中的严重错误(如除零错误)可能导致进程异常终止。
  • 信号:操作系统可以通过发送信号来终止进程。例如:
    • SIGTERM:表示请求进程终止,进程有机会进行清理工作。
    • SIGKILL:强制终止进程,进程无法进行任何清理工作。
3. 资源回收

操作系统负责回收终止进程的资源,以确保系统资源得到有效利用。资源回收的过程包括:

  • 内存回收:操作系统会释放进程占用的内存空间,包括代码段、数据段和堆栈等。
  • 文件描述符回收:操作系统会关闭进程打开的文件和网络连接。
  • 其他资源回收:如信号量、共享内存等,操作系统会确保这些资源被正确释放,避免资源泄漏。

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python FFmpeg 安装使用教程

文章目录 什么是 FFmpeg&#xff1f;主要功能包括&#xff1a; Windows 下载安装下载解压安装配置环境变量 使用案例使用 ffmpeg-python 库转换视频格式视频剪辑添加字幕 使用 subprocess.run 执行视频格式转换 其它问题ffmpeg 不是内部或外部命令,也不是可运行的程序 个人简介…

虹软人脸 报错 Can‘t find dependent libraries

系列文章目录 文章目录 系列文章目录一、虹软人脸 报错 Can‘t find dependent libraries 一、虹软人脸 报错 Can‘t find dependent libraries 在项目中使用了 虹软 人脸识别SDK&#xff0c;环境一直出错。 错误&#xff1a; Can’t find dependent libraries 从错误信息来…

Arduino UNO R3自学笔记21 之 Arduino基础篇学习总结

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;目前将Arduino的大多数基础内容学习了&#xff0c;做个总结。 1.编程语言 学习单片机&#xff0c;在面向单片机编程时&#xff0c;语言是最基础的&#…

Web前端入门

文章目录 前言1 Web前端概述1.1 网站和网页1.2 HTML语言1.3 网页的形成1.4 常用浏览器1.5 浏览器内核&#xff08;渲染引擎)1.6 web标准 2 HTML标签2.1 开发工具2.2 HTML语法规则2.3 标签的关系2.4 HTML注释标签2.5 结构标签 3 常用标签3.1 标题标签3.2 段落标签3.3 换行标签3.…

HAL库常用的函数:

目录 HAL库&#xff1a; 1.GPIO常用函数&#xff1a; 1.HAL_GPIO_ReadPin( ) 2.HAL_GPIO_WritePin( ) 3.HAL_GPIO_TogglePin( ) 4.HAL_GPIO_EXTI_IRQHandler( ) 5.HAL_GPIO_EXTI_Callback( ) 2.UART常用函数&#xff1a; 1.HAL_U…

详细分析Spring Framework中 @ConditionalOnProperty的基本知识(附Demo)

目录 前言1. 基本知识2. Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 从实战中学习启发 1. 基本知识 Conditiona…

2025考研今天开始预报名!攻略请查收

2025年全国硕士研究生招生考试 今天起开始预报名 有什么流程&#xff1f;需要准备哪些信息&#xff1f; 这份考研报名攻略速查收 ↓↓↓ 全国硕士研究生招生考试报名包括网上报名和网上确认两个阶段&#xff1a; 网上预报名时间为10月9日至10月12日&#xff08;每日9&#xff1…

虚幻引擎GAS入门学习笔记(二)

虚幻引擎GAS入门(二) 学习位置UE5.3 GAS入门教程重置版 小明 MVC框架与技能初始化 让一开始创建的蓝图的基础GameplayAbility蓝图继承我们写好的BaseGameplayAbility类 创建一个库函数&#xff0c;写一些常用的函数在里面第一个得到玩家与玩家控制器 获取角色面对目标的方向…

【优选算法】(第三十二篇)

目录 ⼆进制求和&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 字符串相乘&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆进制求和&#xff08;easy&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&a…

双十一好物必买榜:数码好物推荐!

​双十一该入手一些好物来准备度过下一年&#xff0c;选择几款数码好物和工作都用得到的实用好物陪伴冬天是能够让自己更积极的迎接生活&#xff0c;能够让自己更开心满足的方式。适当的购物也是能够缓解工作压力&#xff0c;心情不好的方法&#xff0c;但依然要选择买回家不会…

团员申请书怎么写?这里归纳了一些模板

团员申请书怎么写&#xff1f;随着社会的快速发展和时代的进步&#xff0c;越来越多的青年人意识到加入团组织的重要性。作为新时代的青年&#xff0c;我们应当积极响应国家的号召&#xff0c;参与到团组织的建设中来。而想要成为共青团员&#xff0c;首先需要撰写一份规范的团…

Umi中的微前端

umi/max 内置了 Qiankun 微前端插件&#xff0c;它可以一键启用 Qiankun 微前端开发模式&#xff0c;帮助您轻松地在 Umi 项目中集成 Qiankun 微应用&#xff0c;构建出一个生产可用的微前端架构系统。 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代…

golang grpc初体验

grpc 是一个高性能、开源和通用的 RPC 框架&#xff0c;面向服务端和移动端&#xff0c;基于 HTTP/2 设计。目前支持c、java和go&#xff0c;分别是grpc、grpc-java、grpc-go&#xff0c;目前c版本支持c、c、node.js、ruby、python、objective-c、php和c#。grpc官网 grpc-go P…

【牛客刷题实战】BC120 争夺前五名

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 牛客题目&#xff1a; BC120 争夺前五名 题目描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 示例2 解题思路&#xff1a; 具体思路&#xff1a; 题目要点&#xff1a; 完整代码&#xff1a; 兄弟们共…

python爬虫 - 数据提取

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、数据类型及其对应的提取策略 &#xff08;一&#xff09;文本数据 &…

【设计模式】软件设计原则——开闭原则里氏替换单一职责

开闭原则内容引出 开闭原则 定义&#xff1a;一个软件实体&#xff0c;类&#xff0c;函数&#xff0c;模块&#xff1b;对扩展开放&#xff0c;对修改关闭。用抽象构建框架&#xff0c;用实现扩展细节。可以提高软件的可复用性和可维护性。 开发新功能时&#xff0c;尽量不修…

猿人学— 第一届第1题(解题思路附源码)

猿人学 — 第一届第1题&#xff08;解题思路附源码&#xff09; F12进入开发者工具—> 发现停止在debugger处 —> 右键点击Never pause here后下一步 翻页&#xff0c;抓包后发现请求携带page和m两个参数&#xff0c;page应该就是页数&#xff0c;m则需要逆向 依次查…

微服务中传递公共参数,在网关层header添加参数,各子微服务,openfeign,线程池等地方拿到网关传递过来的参数

需求&#xff1a; 网关层在header中添加参数&#xff0c;header-user_id1001&#xff0c;header-user_name小明 各个子微服务&#xff0c;可以通过openfeign&#xff0c;线程池等方式拿到上面的参数1 网关层 gateway添加需要传递的参数信息 import cn.hutool.core.net.URLEnco…

MySQL从0到1基础语法笔记(下)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 多表问题分析&#xff1a; 部门数据可以直接删除&#xff0c;然后还有部分员工…

Python对PDF文件的合并操作

在处理 PDF 文件时&#xff0c;合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能&#xff0c;其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口&#xff0c;包括 merge() 方法&#xff0c;可…