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

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

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.xdnf.cn/news/1556078.html

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

相关文章

猫头虎深度解读:过去2周,AI领域的十大突破事件与未来展望

猫头虎深度解读&#xff1a;过去2周&#xff0c;AI领域的十大突破事件与未来展望 &#x1f680;&#x1f916; 大家好&#xff0c;我是猫头虎技术团队的代表&#xff01;这两周&#xff0c;人工智能领域再次掀起了技术与应用的新浪潮。从立法到技术进展&#xff0c;再到前沿应…

初始爬虫12(反爬与反反爬)

学到这里&#xff0c;已经可以开始实战项目了&#xff0c;多去爬虫&#xff0c;了解熟悉反爬&#xff0c;然后自己总结出一套方法怎么做。 1.服务器反爬的原因 服务器反爬的原因 总结&#xff1a; 1.爬虫占总PV较高&#xff0c;浪费资源 2.资源被批量抓走&#xff0c;丧失竞争力…

交叉熵的数学推导和手撕代码

交叉熵的数学推导和手撕代码 数学推导手撕代码 数学推导 手撕代码 import torch import torch.nn.functional as F# 二元交叉熵损失函数 def binary_cross_entropy(predictions, targets):# predictions应为sigmoid函数的输出&#xff0c;即概率值# targets应为0或1的二进制标…

MathType软件7.7最新版本下载安装教程+使用深度评测

嘿&#xff0c;各位亲爱的朋友们&#xff01;&#x1f44b; 今天我要来给大家安利一个神器——MathType软件&#xff01;&#x1f389; 如果你是一位学生、老师或者需要经常和数学公式打交道的科研工作者&#xff0c;那这个软件绝对是你的不二选择&#xff01;&#x1f60e; M…

ctf.bugku-备份是个好习惯

访问页面得到字符串 这串字符串是重复的&#xff1b; d41d8cd98f00b204e9800998ecf8427e 从前端、源码上看&#xff0c;除了这段字符串&#xff0c;没有其他信息&#xff1b;尝试解密&#xff0c;长度32位&#xff1b;各种解密方式试试&#xff1b; MD5免费在线解密破解_MD5在…

市面上8款AI论文大纲一键生成文献的软件推荐

在当前的学术研究和写作领域&#xff0c;AI论文大纲自动生成软件已经成为提高写作效率和质量的重要工具。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。本文将分享市面上8款AI论文大纲一键生成文献的软件&#xff0c;并特别推…

[git] github管理项目之环境依赖管理

导出依赖到 requirements.txt pip install pipreqs pipreqs . --encodingutf8 --force但是直接使用pip安装不了torch&#xff0c;需要添加源&#xff01;&#xff01; pip install -r requirements.txt -f https://download.pytorch.org/whl/torch_stable.htmlpython 项目中 …

Stable Diffusion绘画 | AI 图片智能扩充,超越PS扩图的AI扩图功能(附安装包)

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

【数据结构】【链表代码】移除链表元素

移除链表元素 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val) { // 创建一个虚拟头节点&#xff0c;以处理头节点可能被删除的情况 struct…

代码随想录Day54

今天是国庆假期后的恢复做题的第一天&#xff0c;摆了那么久感觉还是有点没摆够哈哈哈哈&#xff01;今天两道题都是困难题&#xff0c;两道题都去看讲解了&#xff0c;感觉这两道题是高度相似的&#xff0c;接雨水用单调递增栈来做&#xff0c;柱状图中最大的矩形用单调递减栈…

tcp/ip、以太网、mqtt、modbus/tcp复习

1.osi参考模型 2. modbus是应用层报文传输协议&#xff0c;没有规定物理层&#xff0c;只规定了协议帧&#xff0c;但是定义了控制器能够认识和使用的消息结构&#xff0c;不管它们是经过何种网络进行通信的&#xff0c;具有很强的适应性。 一主多从&#xff0c;同一时间主机…

【动态规划-最长公共子序列(LCS)】力扣1035. 不相交的线

在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#xff0c;这些直线需要同时满足&#xff1a; nums1[i] nums2[j] 且绘制的直线不与任何其他连线&#xff08;非水平线&#xff09…

Rethinking Graph Neural Networksfor Anomaly Detection

AAAI24 推荐指数 #paper/⭐⭐ (由于这个领域初读&#xff0c;因此给的推荐分可能不好) 个人总结&#xff1a; 其在半监督&#xff08;1%&#xff0c;40%&#xff09;的情况下&#xff0c;使用多通滤波器&#xff0c;将不同滤波器得到的特征拼接起来&#xff0c;来做分类&…

【Blender Python】2.结合Kimi生成

概述 结合Kimi这样的AI工具可以生成Blender Python代码&#xff0c;用来辅助生成一些或简单或复杂的图形。当然&#xff0c;出不出错这就不一定了。因为AI所训练的版本可能并不是Blender的最新版本&#xff0c;类似的问题也出现在Godot上。 测试 在kimi中提问&#xff0c;获…

2024/10/6周报

文章目录 摘要Abstract广西的一些污水处理厂工艺解析1. A/O工艺&#xff08;厌氧-缺氧-好氧工艺&#xff09;2. 氧化沟工艺3. MBR工艺&#xff08;膜生物反应器&#xff09;4. SBR工艺&#xff08;序批式活性污泥法&#xff09;5. 生物接触氧化法 其它补充一体化改良氧化沟工艺…

LeetCode讲解篇之1143. 最长公共子序列

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题我们可以采用动态规划求解&#xff0c;用一个二维数组记录text1的0 ~ i区间子串和text2的0 ~ j区间子串的最长公共子序列的长度&#xff0c;我们假设该二维数组是f 这个数组有一个特性&#xff0c;如果a <…

会议时如何实现扫码签到?

如何实现扫码签到&#xff1f; 在现代活动管理中&#xff0c;签到环节是不可或缺的一部分。它不仅关系到活动的顺利进行&#xff0c;还涉及到参与者的体验。传统的签到方式往往耗时且效率不高&#xff0c;而随着技术的发展&#xff0c;扫码签到成为了一种高效且便捷的解决方案。…

如何在算家云搭建CosyVoice(文生音频)

一、CosyVoice简介 CosyVoice 是一个开源的超强 TTS&#xff08;‌文本转语音&#xff09;‌模型&#xff0c;‌它支持多种生成模式&#xff0c;‌具有极强的语音自然可控性。‌ 具有以下特点&#xff1a; 语音合成 &#xff1a;能够将文本转换为自然流畅的语音输出。多语种…

redis——哨兵机制

redis中提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 主从复制是实现redis高可用性的基石&#xff0c;从节点宕机时我们仍然可以将请求发送给主节点或者其他从节点&#xff0c;而当主节点宕机的时候&#xff0c;无法执行写操作&#xff0c;无…