操作系统 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://协议…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
