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

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

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.mzph.cn/diannao/55827.shtml

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

相关文章

chatGPT模型接口分享

前言: 仅供学习和交流&#xff0c;请合理使用。 API&#xff1a;https://api.gptnet.org key&#xff1a;sk-x9Rmq3HeHh5z9EIi8wFaXCl02OfxRSk5UAFodYm1o4zo5X3i 支持模型&#xff1a;gpt-3.5-turbo、gpt-3.5-turbo-16k、gpt-4o-mini、llama-3.1-405b 暂时支持以上四个模型…

Java基础-基础知识体系小结 Q/A

文章目录 知识体系Q&AJava 中应该使用什么数据类型来代表价格?怎么将 byte 转换为 String?Java 中怎样将 bytes 转换为 long 类型?存在两个类&#xff0c;B 继承 A&#xff0c;C 继承 B&#xff0c;我们能将 B 转换为 C 么? 如 C (C) B&#xff1b;Java 中 操作符是线…

Java初阶~~四种内部类总结

文章目录 1.内部类的分类2.局部内部类2.1.基本语法2.2就近原则的理解 3.匿名内部类3.1基于接口的匿名内部类3.2基于普通类的匿名内部类3.3基于抽象类的匿名内部类3.4匿名内部类的细节3.5匿名内部类实践3.5.1作为实参进行传递3.5.2实践案例 4.成员内部类4.1基本介绍4.2外部类&am…

5本一投就中的极速期刊,性价比高,1周-1个月录用,见刊极快!

在当今快节奏的学术界&#xff0c;研究者们不仅追求高质量的研究成果&#xff0c;还希望能够迅速地将这些成果分享给全球的同行。为此&#xff0c;科检易学术精心挑选了10本以高效审稿流程著称的期刊&#xff0c;这些期刊不仅性价比高&#xff0c;而且从投稿到录用的时间极短&a…

ARM base instruction -- asr

算术右移&#xff0c;结果带符号。 Arithmetic Shift Right (immediate) shifts a register value right by an immediate number of bits, shifting in copies of the sign bit in the upper bits and zeros in the lower bits, and writes the result to the destination reg…

数据结构_绪论(选择题)

2-1 在数据结构中&#xff0c;从逻辑上可以把数据结构分成&#xff08; &#xff09;。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 2-2 与数据元素本身的形式、内容、相对位置、个数无关的是数据的&#xff08; &am…

SD NAND Flash 小容量存储解决方案及其STM32测试例程讲解

文章目录 前言一、Flash闪存是什么&#xff1f;二、SD NAND Flash三、STM32测试例程四、总结 前言 随着移动存储技术的快速发展和便携式数字设备的广泛应用&#xff0c;Flash闪存作为非易失性存储解决方案&#xff0c;在各种电子设备中扮演着越来越重要的角色。本文提供关于Fl…

【含开题报告+文档+PPT+源码】基于SpringBoot乡村助农益农平台的设计与实现

开题报告 近年来&#xff0c;随着社会经济的快速发展和人民生活水平的提高&#xff0c;人们对优质农产品的需求越来越高。然而&#xff0c;传统的农产品销售管理模式存在一些问题。首先&#xff0c;农产品供应链信息不透明&#xff0c;导致生产者难以了解市场需求和价格变动趋…

iMazing只能苹果电脑吗 Win和Mac上的iMazing功能有区别吗

在当今数字时代&#xff0c;管理和备份手机数据变得越来越重要。无论是转移照片、备份短信&#xff0c;还是管理应用程序&#xff0c;一个强大的工具可以大大简化这些操作。iMazing作为一款备受好评的iOS设备管理软件&#xff0c;已经成为许多用户的选择。但是&#xff0c;许多…

《C++代码热更新:为高效开发注入新活力》

一、引言 在软件开发的过程中&#xff0c;我们常常面临着这样的挑战&#xff1a;当程序已经部署到生产环境后&#xff0c;发现了一些需要紧急修复的 bug 或者需要添加新的功能。传统的方法是停止程序运行&#xff0c;进行代码修改&#xff0c;然后重新编译、部署&#xff0c;这…

请用python写一个小程序,把浏览器中打开的页面设置为深色模式

要实现将浏览器中打开的页面设置为深色模式,可以使用Python的selenium库来控制浏览器。以下是一个示例程序: from selenium import webdriver from selenium.webdriver.chrome.options import Options# 创建Chrome浏览器选项对象 chrome_options = Options()# 设置深色模式 …

Anaconda创建环境

目录 前言 第一步&#xff1a;更改环境创建位置 第二步&#xff1a;安装环境 前言 在我们创建多个项目的时候&#xff0c;有时会安装的库版本冲突&#xff0c;所以最好是一个项目一个环境 第一步&#xff1a;更改环境创建位置 新安装Anaconda后&#xff0c;在创建环境时环…

Go版数据结构 -【8.3 插入排序】

8.3 插入排序 插入排序是一种简单且直观的排序算法&#xff0c;它的基本思想是将数组分为已排序和未排序两个部分。 通过逐步将未排序部分的元素插入到已排序部分的正确位置&#xff0c;逐步构建整个有序序列。 看起来与选择排序是差不多的&#xff0c;但是还是有一些差别的…

【React】setState (useState) 是怎么记住上一个状态值的?

在 React 中&#xff0c;setState 通过 React 内部的状态管理机制来记住上一个状态值。即使每次组件重新渲染时&#xff0c;函数组件会被重新执行&#xff0c;React 仍能通过其内部的状态管理系统保持和追踪组件的状态变化。下面详细解释其工作原理&#xff1a; 1. setState 的…

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码&#xff1a;路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…

ctfshow-web 萌新题

给她 spring漏洞 pyload: 1.dirsearch扫描&#xff0c;发现git 2. GitHack工具得到.git文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>…

python 实现graph list图列算法

graph list图列算法介绍 图列&#xff08;Graph List&#xff09;算法通常指的是在图的表示中&#xff0c;使用列表&#xff08;List&#xff09;或更具体地说&#xff0c;邻接表&#xff08;Adjacency List&#xff09;来表示图的一种算法。邻接表是图的一种常见表示方法&…

Python知识点:结合Python工具,如何使用GPT进行文本生成

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何使用Python工具进行GPT文本生成 概述 GPT&#xff08;Generative Pre-trai…

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…

Apache NiFi最全面试题及参考答案

目录 解释什么是Apache NiFi以及它的主要用途。 NiFi 的数据处理流程是怎样的? NiFi 的架构包括哪些组件? 解释 NiFi 的 “FlowFile” 概念及其组成部分。 NiFi 的 “Processor” 是什么?有哪些类型? 如何在 NiFi 中创建一个新的数据流? NiFi 的 “Connection” 有…