操作系统 2.2-多进程总体实现
多个进程使用CPU的图像

-
如何使用CPU呢?
-
通过让程序执行起来来使用CPU。
-
-
如何充分利用CPU呢?
-
通过启动多个程序,交替执行来充分利用CPU。
-
-
启动了的程序就是进程,所以是多个进程推进
-
操作系统需要记录这些进程,并按照合理的次序推进它们(分配资源、进行调度)。
-
这就是多进程图像的概念。
-
一个CPU(灯泡图标)负责调度多个进程(PID:1, PID:2, PID:3)。
每个进程有一个进程控制块(PCB),图中展示了PCB1,其中包含了进程的状态信息,例如“算出ax=1,启动磁盘写,正在等待完成...”。
进程的创建和管理

在系统启动时,最终执行的是main点C中的main函数,通过fork创建一个进程,该进程执行INT,最终启动shell,这是用户与计算机交互的开始。
操作系统通过创建初始化进程并执行shell,使用户能够执行任务。shell根据用户输入的命令创建新的进程来完成任务,如执行LS命令时,会创建一个专门执行该命令的进程。
无论是解决实际问题还是执行特定任务,操作系统都是通过启动进程来实现的。
因此,多进程图像在整个系统运行过程中非常重要,它展示了计算机在多个进程中不断推进和解决问题的状态,从而反映了计算机的使用情况。
多进程如何组织


PCB
进程控制块(PCB)是操作系统用于记录和管理进程信息的数据结构,它包含了进程的状态、优先级、程序计数器、CPU寄存器集合和内存管理信息等。PCB是操作系统感知和控制进程的基础。
操作系统通过将进程组织成不同的队列(如就绪队列、阻塞队列等)来实现进程的管理和调度。调度策略决定了哪个进程应该被调度执行,常见的调度策略包括先来先服务(FCFS)、最短作业优先(SJF)、优先级调度和时间片轮转(RR)。
进程调度与切换是操作系统中实现多任务并发的基础。它涉及到保存当前进程的执行状态(上下文),选择下一个要执行的进程,并加载其状态。这一过程包括保存当前进程的上下文到PCB、从就绪队列中选择下一个进程、加载新进程的上下文到CPU寄存器、更新PCB和状态、以及跳转到用户模式执行新进程。
进程状态图
进程状态图是描述操作系统中进程在其生命周期内所经历的不同状态及其状态转换的图形表示。它提供了进程生存期的清晰描述,并作为理解操作系统进程管理的一个窗口。进程状态图通常包括以下几个关键状态:
-
新建态(New):
-
进程正在被创建,操作系统正在为其分配资源和初始化PCB。
-
-
就绪态(Ready):
-
进程已准备好运行,等待被调度器选中以获得CPU时间。
-
-
运行态(Running):
-
进程正在CPU上执行。在单处理器系统上,任何时候只有一个进程处于此状态。
-
-
阻塞态(Blocked):
-
进程正在等待某个事件(如I/O操作完成或资源可用)而不能立即执行。
-
-
终止态(Terminated):
-
进程已完成执行或被强制终止,操作系统正在或已经清理了其资源。
-
进程状态转换
进程状态图还描述了进程状态之间的转换,常见的转换包括:
-
新建 → 就绪:进程创建完成后,变为就绪状态,等待调度执行。
-
就绪 → 运行:调度器选中就绪进程,分配CPU给它,进程开始运行。
-
运行 → 阻塞:运行中的进程需要等待某个事件(如I/O操作),进入阻塞状态。
-
阻塞 → 就绪:进程等待的事件已经发生(如I/O完成),进程重新变为就绪状态。
-
运行 → 就绪:如果进程的时间片用完或被抢占,它将从运行状态返回到就绪状态,等待下一次调度。
-
运行 → 终止:进程完成或被终止,进入终止状态。
-
就绪 → 终止:在某些情况下,就绪进程可能直接被终止。
多进程的交替
总体轮廓

代码:
// 启动磁盘读写操作
pCur.state = 'W'; // 'W' 代表阻塞态,等待磁盘操作
addToDiskWaitQueue(pCur); // 将当前进程pCur加入磁盘等待队列
schedule(); // 调用调度函数进行进程调度
void schedule() {pNew = getNext(ReadyQueue); // 从就绪队列中选择下一个要执行的进程switch_to(pCur, pNew); // 进行进程切换,从pCur切换到pNew
}
“多进程图像:多进程如何交替?”
解释了在多进程环境中,当一个进程(pCur)需要等待磁盘操作时,如何通过操作系统的调度机制切换到另一个进程执行。
-
启动磁盘读写:当前进程发起一个磁盘读写请求。
-
设置进程状态:将当前进程(
pCur)的状态设置为等待('W')。 -
放入等待队列:将
pCur进程放入磁盘等待队列(DiskWaitQueue)。 -
调度:调用
schedule()函数进行进程调度。
在schedule()函数中:
-
从就绪队列(
ReadyQueue)中获取下一个要执行的进程(pNew)。 -
调用
switch_to(pCur, pNew)函数进行上下文切换,从当前进程pCur切换到新进程pNew。
这个过程展示了多进程操作系统如何通过调度算法在多个进程之间进行切换,以实现多任务的并发执行。特别是当一个进程因为等待I/O操作而被阻塞时,操作系统可以将CPU资源分配给其他就绪的进程,从而提高系统的整体效率和响应速度。
交替的三个部分

进程调度:一个深刻的话题,涉及交替的三个部分:队列操作、调度和切换。
其中进程的调度有以下两种方法:
FIFO(先入先出):被认为是一种公平的策略,因为它不考虑进程执行的任务的区别,按照它们到达的顺序进行调度。
优先级调度:涉及如何设定优先级,如果设置不当可能会导致某些进程饥饿,即某些进程长时间得不到执行。
Switch_to函数

进程切换:包括三个主要步骤:保存当前进程的状态、选择下一个要执行的进程、恢复新进程的状态。
switch_to 函数:实现上下文切换,保存当前进程(pCur)的寄存器状态到PCB,并从新进程(pNew)的PCB加载寄存器状态到CPU。
进程与进程间的关系
在多进程操作系统中,进程间的合作和冲突是两个需要特别关注的问题。以下是对这两个问题的详细解释:
进程间的合作
进程间的合作通常发生在需要共享资源或数据的情况下。例如,多个进程可能需要访问同一个文件、数据库或缓冲区。在这种情况下,操作系统必须提供一种机制来确保这些共享资源被安全地访问,避免数据损坏或不一致。
生产者-消费者模型是进程合作的一个典型例子,其中一些进程(生产者)生成数据并放入缓冲区,而其他进程(消费者)从缓冲区取出数据进行处理。为了使这种合作能够顺利进行,操作系统需要提供同步机制,如互斥锁、信号量或条件变量,以确保生产者在缓冲区满时不会覆盖旧数据,消费者在缓冲区空时不会尝试读取数据。
进程间的冲突
进程间的冲突可能发生在多个进程试图同时访问或修改同一资源时。这种冲突可能导致数据不一致、死锁或资源竞争条件。为了避免这些冲突,操作系统实现了多种内存管理和进程同步技术:
-
内存管理:通过虚拟内存和物理内存的映射,确保每个进程有自己的内存空间,从而防止进程间直接相互干扰。
-
地址空间分离:每个进程有自己的地址空间,通过地址转换表(如页表)将虚拟地址转换为物理地址,从而实现进程间的内存隔离。
-
进程同步:使用锁、信号量、屏障等机制来控制进程对共享资源的访问,确保在适当的时机进行数据的读写操作。
进程同步
进程同步是确保多个进程能够协调执行,以实现合作而不产生冲突的关键机制。进程同步机制可以防止多个进程同时访问共享资源而导致数据不一致的问题。常见的进程同步机制包括:
-
互斥锁(Mutex):确保同一时间只有一个进程可以访问特定的资源。
-
信号量(Semaphore):允许多个进程访问资源,但限制同时访问的数量。
-
条件变量(Condition Variable):允许进程在满足特定条件时进行同步。
-
屏障(Barrier):确保一组进程在继续执行之前全部达到某个点。
通过这些机制,操作系统可以确保进程间的合作是有序和安全的,从而有效地支持多进程图像的实现。
相关文章:
操作系统 2.2-多进程总体实现
多个进程使用CPU的图像 如何使用CPU呢? 通过让程序执行起来来使用CPU。 如何充分利用CPU呢? 通过启动多个程序,交替执行来充分利用CPU。 启动了的程序就是进程,所以是多个进程推进 操作系统需要记录这些进程,并按照…...
Jasypt 与 Spring Boot 集成文档
Jasypt 与 Spring Boot 集成文档 目录 简介版本说明快速开始 添加依赖配置加密密钥加密配置文件 高级配置 自定义加密算法多环境配置 最佳实践常见问题参考资料 简介 Jasypt 是一个简单易用的 Java 加密库,支持与 Spring Boot 无缝集成。通过 Jasypt,…...
在CentOS系统上安装Conda的详细指南
前言 Conda 是一个开源的包管理系统和环境管理系统,广泛应用于数据科学和机器学习领域。本文将详细介绍如何在 CentOS 系统上安装 Conda,帮助您快速搭建开发环境。 准备工作 在开始安装之前,请确保您的 CentOS 系统已经满足以下条件&#x…...
Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程
Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程 目录 概述 什么是拦截器(Interceptor)?什么是过滤器(Filter)?两者的核心区别 使用场景 拦截器的典…...
HTML-05NPM使用踩坑
2025-03-04-NPM使用踩坑 本文讲述了一个苦逼程序员在使用NPM的时候突然来了一记nmp login天雷,然后一番折腾之后,终究还是没有解决npm的问题😞😞😞,最终使用cnpm完美解决的故事。 文章目录 2025-03-04-NPM使用踩坑[toc…...
自学嵌入式第29天-----epoll、sqlite3
1. 正确选择触发模式(ET 和 LT) 水平触发(LT):默认模式,只要文件描述符处于就绪状态,epoll_wait 会持续通知。适合大多数场景,编程简单。 边缘触发(ET)&…...
工作学习笔记:HarmonyOS 核心术语速查表(v14 实战版)
作为在 HarmonyOS 开发一线摸爬滚打的工程师,笔者在 v14 版本迭代中整理了这份带血的实战术语表。 一、架构基础术语速查 A 系列术语 术语官方定义笔者解读(v14 实战版)开发陷阱 & 解决方案abc 文件ArkCompiler 生成的字节码文件打包时…...
解决AWS EC2实例无法使用IAM角色登录AWS CLI
问题背景 有时,我们希望一台AWS EC2实例,即云服务器,能够使用AWS CLI访问AWS管理控制台资源。 例如,这里,我们想让它能够列出所有IAM用户组。 aws iam list-groups于是,我们使用下面的命令,在…...
Java核心语法:从变量到控制流
一、变量与数据类型(对比Python/C特性) 1. 变量声明三要素 // Java(强类型语言,需显式声明类型) int age 25; String name "CSDN"; // Python(动态类型) age 25 name …...
manus是什么?能干啥?
Manus哪儿来的? Manus是一款由中国团队Monica.im于2025年3月5日发布的通用型AI代理(AI Agent)产品,旨在通过自主思考、系统规划和灵活工具调用,帮助用户完成各种复杂任务,从而解放用户的时间与创…...
大型语言模型训练的三个阶段:Pre-Train、Instruction Fine-tuning、RLHF (PPO / DPO / GRPO)
前言 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 当前的大型语言模型训练大致可以分为如下三个阶段: Pre-train:根据大量可获得的文本资料&#…...
Elasticsearch 2025/3/7
高性能分布式搜索引擎。 数据库模糊搜索比较慢,但用搜索引擎快多了。 下面是一些搜索引擎排名 Lucene是一个Java语言的搜索引擎类库(一个工具包),apache公司的顶级项目。 优势:易扩展、高性能(基于倒排索引…...
发行基础:热销商品榜单
转载自官方文件 ------------------ 热销商品榜单 Steam 在整个商店范围内有各种热销商品榜单,最醒目的莫过于 Steam 主页上的榜单了。 您也可以在浏览单个标签、主题、类型时找到针对某个游戏类别的热销商品榜单。 主页热销商品榜单 该榜单出现在 Steam 主页上…...
实战案例分享:Android WLAN Hal层移植(MTK+QCA6696)
本文将详细介绍基于MTK平台,适配高通(Qualcomm)QCA6696芯片的Android WLAN HAL层的移植过程,包括HIDL接口定义、Wi-Fi驱动移植以及wpa_supplicant适配过程,涵盖STA与AP模式的常见问题与解决方法。 1. HIDL接口简介 HID…...
物联网系统搭建
实验项目名称 构建物联网系统 实验目的 掌握物联网系统的一般构建方法。 实验要求: 1.构建物联网系统,实现前后端的交互。 实验内容: CS模式MQTT(不带数据分析处理功能) 实现智能设备与应用客户端的交…...
微前端框架 Qiankun 的应用及问题分析
一、Qiankun 的核心应用场景与优势 多技术栈共存与灵活集成 Qiankun 支持主应用与子应用使用不同技术栈(如 Vue、React、Angular 等),通过 HTML Entry 方式接入子应用,无需深度改造子应用即可实现集成,降低了技术迁移成…...
设计模式-结构型模式-适配器模式
概述 适配器模式 : Adapter Pattern 是一种结构型设计模式. 作用 : 使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 实现思路 : 适配器模式通过将一个类的接口转换成客户希望的另外一个接口来实现这一点。 这里的“接口”指的是类所提供的…...
6. 机器人实现远程遥控(具身智能机器人套件)
1. 启动控制脚本 远程作到 Raspberry Pi 中,并运行以下脚本: conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登录笔记本电脑上,同时运行以下脚本: conda ac…...
多模态知识图谱融合
1.Knowledge Graphs Meet Multi-Modal Learning: A Comprehensive Survey 1.1多模态实体对齐 1.2多模态实体链接 研究进展&#...
windows 平台如何点击网页上的url ,会打开远程桌面连接服务器
你可以使用自定义协议方案(Protocol Scheme)实现网页上点击URL后自动启动远程桌面连接(mstsc),参考你提供的C代码思路,如下实现: 第一步:注册自定义协议 使用类似openmstsc://协议…...
暗黑3终极按键助手D3KeyHelper:图形化配置解放你的双手
暗黑3终极按键助手D3KeyHelper:图形化配置解放你的双手 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏神3中繁琐的技能按…...
新手也能搞定!用Simulink搭建晶闸管直流调速系统(附完整模型文件)
从零构建晶闸管直流调速系统的Simulink实战指南 电力电子领域的研究生和工程师们常常需要快速掌握经典电路仿真技能。本文将手把手带你完成晶闸管直流调速系统的建模全过程,从模块选择到参数调试,每个环节都配有详细说明和实用技巧。不同于传统教材偏重理…...
在PyCharm中上传代码到Gitee仓库
最近学习python,使用pycharm过程中配置远程仓库方式,以gitee为例新建一个项目作为演示点击菜单中的VCS,选择启用版本控制集成弹出的窗口直接点确认在左侧的菜单中找到仓库全选输入提交消息,并点击提交或者提交或推送在弹出的窗口中…...
泰米尔文TTS项目上线倒计时:ElevenLabs API v2.4.1强制启用新语音编码协议,旧集成方案将于2024年9月30日失效
更多请点击: https://intelliparadigm.com 第一章:泰米尔文TTS项目上线倒计时:ElevenLabs API v2.4.1强制启用新语音编码协议,旧集成方案将于2024年9月30日失效 ElevenLabs 已于 2024 年 7 月 15 日正式发布 API v2.4.1ÿ…...
解密Ryujinx:5个核心技术原理让你理解现代游戏模拟器的设计哲学
解密Ryujinx:5个核心技术原理让你理解现代游戏模拟器的设计哲学 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx作为一款基于C#开发的Nintendo Switch模拟器&#x…...
3步完成Android Studio中文界面配置:告别英文困扰,提升开发效率
3步完成Android Studio中文界面配置:告别英文困扰,提升开发效率 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack…...
2026届最火的十大降AI率神器解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能生成内容也就是 AIGC 技术迅猛发展着,其在学术领域的应用引发着深刻变革…...
从静态分析到代码自愈:构建自动化自我审查工具提升代码质量
1. 项目概述:从“自我审视”到“代码自愈”的工程实践在软件开发的日常中,我们常常会陷入一种“当局者迷”的困境:自己写的代码,怎么看都觉得逻辑清晰、结构完美,但一旦交给同事评审或者上线运行,各种潜在的…...
QtScrcpy:将手机屏幕变成电脑扩展屏的终极解决方案
QtScrcpy:将手机屏幕变成电脑扩展屏的终极解决方案 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...
Flutter Shimmer高级用法:创建复杂的多方向闪烁效果
Flutter Shimmer高级用法:创建复杂的多方向闪烁效果 【免费下载链接】flutter_shimmer A package provides an easy way to add shimmer effect in Flutter project 项目地址: https://gitcode.com/gh_mirrors/fl/flutter_shimmer Flutter Shimmer是一款强大…...
