操作系统 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://协议…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...