【操作系统核心概念】进程管理和进程调度

news2024/10/7 0:34:04

文章目录

  • 前言
  • 1. 什么是操作系统
  • 2. 操作系统的定位
  • 3. 进程管理
    • 3.1 什么是进程/任务 (Process/Task)
    • 3.2 进程管理怎么做的
    • 3.3 进程控制块抽象PCB (Process Control Block)
      • 3.3.1 进程调度属性
  • 4. 内存分配 ---- 内存管理 (Memory Manage)
  • 5. 进程间通信 (Inter Process Communication)
  • 总结


前言

本文主要讲的是操作系统的一些核心概念, 主要讲解进程管理和进程调度的问题, 当然学习完本篇并不会让你能从零打造一个操作系统, 而只是让读者有了对操作系统核心概念的基本认识.

关注收藏, 开始学习吧🧐


1. 什么是操作系统

操作系统是一组做计算机资源管理的软件的统称, 其本质上也是一个软件, 目前常见的操作系统有: Windows系列, Unix系列, Linux系列, OSX系列, Android系列, iOS系列, 鸿蒙等等.

2. 操作系统的定位

操作系统, 对下要管理好各种硬件设备, 对上要给各个软件提供稳定的运行环境.

在这里插入图片描述

比如某个软件程序, 想要操作某个硬件设备, 此时就需要通过操作系统来完成.

操作系统有两个基本功能:

  • 防止硬件被时空的应用程序滥用.
  • 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备.

操作系统本身是一个很大的话题, 是一个十分复杂的软件, 其功能是非常多的, 其中有一个对于我们来讲十分重要的功能模块, 那就是进程管理.

3. 进程管理

3.1 什么是进程/任务 (Process/Task)

每个应用程序运行于现代操作系统之上时, 操作系统会提供一种抽象, 好像系统上只有这个程序在运行, 所有的硬件资源都被这个程序在使用. 这种假象是通过抽象了一个进程的概念来完成的, 进程可以说是计算机科学中最重要和最成功的概念之一.

进程是操作系统对一个正在运行的程序的一种抽象, 换言之, 可以把进程看做程序的一次运行过程. 同时, 在操作系统内部, 进程又是操作系统进行资源分配的基本单位.

简单来说, 一个运行起来的程序, 就是进程.

在这里插入图片描述
.exe的是一种可执行文件(程序), 当双击这个文件, 程序就会跑起来, 我们就会打开QQ, 从而就在操作系统中形成了一个进程.

我们也可以打开任务管理器Ctrl + Alt + Delete来查看系统中都在进行哪些进程.

在这里插入图片描述

可以看到, 系统中有这么多进程都在同时运行. 就是由于进程多了, 所以操作系统才需要去管理进程, 否则这么多进程, 会导致操作系统卡死的.

3.2 进程管理怎么做的

所谓的管理, 其实就是分两步:

  1. 描述一个进程: 使用结构体或者对象, 把一个进程有哪些信息都表示出来.
  2. 组织这些进程: 使用一定的数据结构, 把这些结构体或对象都放到一起.

在Java中就是对象的概念, 在C++中就是结构体的概念

3.3 进程控制块抽象PCB (Process Control Block)

计算机内部要管理任何现实事物, 需要将其抽象成一组有关联的, 互为一体的数据. 在 Java 语言中, 我们可以通过类/对象来描述这一特征. 而在操作系统中是用PCB来描述的.
注: 操作系统往往使用 双向链表 这样的数据结构来组织 PCB.

// 以下代码是 Java 代码的伪码形式,重在说明,无法直接运行
class PCB {
	// 进程的唯一标识 —— pid
    // 内存指针
    // 文件描述符表
    // 进度调度属性
}

PCB的核心属性:

  1. pid
    每个进程需要有一个唯一的标识符, 有点类似于数据库中的主键.
  2. 内存指针
    描述当前这个进程使用的是哪一部分内存.
    进程要跑起来, 就需要消耗一定的硬件资源, 比如内存. 而内存指针就是用来描述进程运行的时候, 使用了哪些内存上的资源.
  3. 文件描述符表
    硬盘上存储的数据, 往往是以文件为单位来进行整理的.
    进程每打开一个文件, 就会产生一个 “文件描述符” (用来标识这个被打开文件), 一个进程可能打开很多文件, 对应了一组文件描述符. 把这些文件描述符放到一个顺序表这样的结构里, 就构成了文件描述符表.
  4. 进程调度属性
    在讲进程调度属性前, 我们先引入一个 CPU 的概念, 计算机中的程序能运行, 全得依靠 CPU, 每个程序相当于一组 “二进制指令” 的集合, 在CPU 中有一个概念, 核心数.
    在这里插入图片描述
    这个截图是我计算机的核心数, 8核16线程表示, CPU 中有8个核心, 但是每个核心一个顶两, 8个人就可以干16个人的活, 即8个物理核心, 16个逻辑核心.
    而我们计算机中通常会有很多进程需要同时处理.
    在这里插入图片描述
    那么计算机是如何用少数人来完成多数人的工作的呢? 下面我再介绍一下并行和并发的概念.
    并行: 同一时刻, 两个核心, 同时执行两个进程, 此时这两进程就是并行执行的.
    并发: 一个核心, 先执行进程1, 执行一会儿后, 再去执行进程2, 再执行一会儿后, 又去执行进程3… 此时只要这里的切换速度足够的快, 进程123看起来就像是 “同时” 执行的一样.
    此时, 虽然我的计算机只有16个核心, 也可以同时执行这137个进程了, 就是通过 并行并发 的方式来完成的.
    接下来这一组属性, 都是用来描述和 CPU 资源相关的属性, 这些属性来辅助进行进程调度.

3.3.1 进程调度属性

  1. 进程的状态
    简单认为, 进程主要有两种状态:
    • 就绪态: 表示该进程已经准备好, 随时可以上 CPU 执行.
    • 阻塞态: 表示该进程还未准备好, 暂时无法上 CPU 执行.
  2. 进程的优先级
    进程之间的调度不是完全公平的, 有的进程要优先调度.
  3. 进程的上下文
    上下文, 就是描述当前进程执行到哪里, 当进程离开 CPU 时, 就要把当前运行的中间结果 “存档记录”, 等到下次进程回来 CPU 上的时候, 再恢复之前的 “存档”, 也就是进行 “读档”, 从上次的结果继续往后执行.
    如果进程结束了, 就不必进行存档, 如果是暂时离开, 就得存.
    而读档存档在进程中, 是靠 CPU 内部的一系列寄存器来实现的. 寄存器有很多种, 其中最典型的作用, 就是保存当前进程执行的中间结果, 包括进程运行到哪一条指令.
    • 存档: 进程离开 CPU, 就需要把这些寄存器的值, 保存到 PCB 的上下文字段中.
    • 读档: 进程回来 CPU, 再把 PCB 中的值给恢复到寄存器中.
  4. 进程的记账信息
    用来统计每个进程, 在 CPU 上执行了多久, 可以作为进程调度的参考依据.

4. 内存分配 ---- 内存管理 (Memory Manage)

我们再了解一下内存管理的概念: 操作系统对内存资源的分配, 采用的是空间模式 ---- 不同进程使用内存的不同区域, 互相之间不会干扰.

简单来说, 就是操作系统给进程分配的内存, 是以 “虚拟地址空间” 的方式来进行分配的, 每个进程访问的内存地址, 都不是真实的物理内存地址.
在这里插入图片描述
站在左边这两进程的角度看, 他们代码中操作的内存地址, 都是 0x00 - 0xff 这一段, 但是这里访问的内存就会被操作系统自动映射到真实的物理内存上, 但是进程本身感知不到实际的物理地址是啥.

5. 进程间通信 (Inter Process Communication)

如上所述, 进程是操作系统进行资源分配的最小单位, 这意味着各个进程互相之间是无法感受到对方存在的, 这就是操作系统抽象出进程这一概念的初衷, 这样便带来了进程之间互相具备 “隔离性(Isolation)”.

但现代的应用, 要完成一个复杂的业务需求, 往往无法通过一个进程独立完成, 总是需要进程和进程进行配合地达到应用的目的, 如此, 进程之间就需要有进行“信息交换“的需求. 而进程间通信的需求就应运而生.

目前, 主流操作系统提供的进程通信机制有如下:

  1. 管道
  2. 共享内存
  3. 文件
  4. 网络
  5. 信号量
  6. 信号

其中, 网络是一种相对特殊的 IPC 机制, 它除了支持同主机两个进程间通信, 还支持同一网络内部非同一主机上的进程间进行通信.

简单来说, 所谓进程间通信, 就是在隔离性的前提下, 找一个公共的区域, 让两个进程借助这个区域来完成数据交换.


总结

✨ 感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习。

感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/717881.html

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

相关文章

带你看懂串口服务器

1、背景 串口服务器提供串口转网络功能,能够将RS-232/485/422串口转换成TCP/IP网络接口,实现RS-232/485/422串口与TCP/IP网络接口的数据双向透明传输。使得串口设备能够立即具备TCP/IP网络接口功能,连接网络进行数据通信,极大的扩…

Mac 脚本编辑器 (scriptEditor)

文章目录 1、打开 scriptEditor2、编写脚本3、执行脚本 1、打开 scriptEditor command 空格 输入 scriptEditor 2、编写脚本 脚本语言可以保存问文件,可以重复编辑 如下,每次打开一个新终端,执行新命令 tell application "Terminal&…

冒泡排序(附图详解)

目录 什么是冒泡排序? 冒泡排序的算法思想 算法图解 参考代码 运行结果 优化代码 运行结果 什么是冒泡排序? 将两个相邻的元素进行比较,如果前面的元素大(从小到大排序),就交换两个元素,…

ESP32设备驱动-ICM-20948 运动跟踪驱传感器驱动

ICM-20948 运动跟踪驱传感器驱动 文章目录 ICM-20948 运动跟踪驱传感器驱动1、ICM-20948介绍2、硬件准备3、软件准备4、驱动实现1、ICM-20948介绍 ICM-20948 是功耗非常低的 9 轴运动跟踪设备,非常适合智能手机、平板电脑、可穿戴传感器和物联网应用。 功率是现有 9 轴设备的…

02、PIC16F877的ADC模块

02、PIC16F877的ADC模块 一、ADC的一般配置步骤 二、ADC的软件滤波 三、性能提高 四、A/D器件推荐

【Java基础教程】(一)入门介绍篇 · 上:快速掌握核心概念,开启Java世界的探索之旅!这篇Java入门宝典助你翱翔~

Java基础教程之入门介绍 上 本节学习目标1️⃣ Java发展简史1.1 诞生1.2 发展1.3 分支 2️⃣ 特征3️⃣ 代码执行过程🌾 总结 本节学习目标 清楚Java语言的发展历史以及语言主要特点;清楚Java代码从源文件到解释执行的大致过程;理解Java实现…

react—Hook(1)

1. useState——见react语法(2) 2. useEffect——见react语法(2) 3. useRef—获取页面元素 用来获取页面中的元素,这样就可以对这个元素进行操作。获取元素需要使用.current才能获取到页面中的具体元素。 定义&…

thinkphp6使用think-queue实现普通队列和延迟队列

Redis的延迟队列可以用于以下场景: 需求说明: 当用户申请售后,商家未在n小时内处理,系统自动进行退款。 商家拒绝后,用户可申请客服介入,客服x天内超时未处理,系统自动退款。 用户收到货物&…

Xray-基础详细使用

一:Xray介绍 Xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,可支持与AWVS,BP等众多安全工具联合使用。 二:Xray简易架构: 说明:了解 Xray 的整体架构可以更…

python语法 变量、print、注释和运算符

文章目录 1. 变量1.1 变量名1.2 变量值1.3 查看变量类型 2. print2.1 常规使用2.2 格式化操作符 %2.2.1 格式化符号2.2.2 格式化操作符的辅助指令2.2.3 转义字符 2.2 .format() 3. 注释4. 算术运算符5. 逻辑运算符6. 按位操作符7. 比较运算符8. 复合赋值运算符5. 成员操作符 1.…

Spring 最全入门教程详解

目录 一、Spring Framwork简介1. Spring Framework五大功能模块2. Spring Framework特性 二、IOC容器1. IOC思想2. IOC容器在Spring中的实现3.基于xml管理Bean3.1 引入依赖3.2 创建类3.3 创建Spring的配置文件3.4 创建测试类3.5 总结 4.DI依赖注入4.1 setter注入4.2 构造器注入…

基于Java电脑配件销售系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Vue脚手架开发入门

Vue脚手架开发入门 安装脚手架及初始化项目 略过 后续使用的项目就是新搭建的一个项目 组件间的通信 父传子 查看《Vue初始化项目加载逻辑》这篇文章即可 父组件 子组件 子传父 场景:例如你的购物车,里面有很多商品,每个商品是一个…

PoseiSwap 治理通证POSE登录PancakeSwap,开盘涨幅超2100%

在 7 月 4 日,PoseiSwap 治理通证 $POSE 上线了 BNB Chain 上的头部 DEX PancakeSwap(POSE/ZBC 交易对),在 $POSE 开盘交易的 10 分钟内,其最高涨幅达到了 2169.22%,所有的早期投资者基本都从中获得了不菲的…

测试与产品的那些撕逼大战

产品与测试,本该是一对好兄弟,一个为产品质量负责,一个为产品质量服务。但往往事与愿违,经常出现产品与测试撕逼大战。 为需求而撕逼 测试:需求不明确,测试用例写不出来! 产品:你不…

合并回文子串(区间dp)

传送门 输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。 我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两…

Dlib —— 对视频流进行人脸识别(附C++源码)

照片效果 视频效果 注意:Dlib检测人脸在Release版耗时与CPU有关,本人I7 10代约100ms左右,这里本人将人脸检测用Yolov5对人脸简单抠图训练后 使用yolov5推理检测人脸,之后将检测到的人脸输入给Dlib做特征,发现人脸特征部分耗时也较…

androidx.appcompat.widget.SearchView怎么改搜索框提交按钮

searchView.isSubmitButtonEnabled true,运动后如下图: 怎么改搜索框提交按钮,按下图操作: 或者 打开SearchView进入看,一样 搜索框提交按钮改好了,如下图:

SparkSQL的数据结构DataFrame构建方式(Python语言)

SparkSQL 是Spark的一个模块, 用于处理海量结构化数据,其提供了两个操作SparkSQL的抽象,分别是DataFrame和DataSet,spark2.0之后,统一了DataSet和DataFrame,以后只有DataSet。 以Python、R语言开发Spark,使…

BurpSutie拓展插件推荐-原始模块增强插件

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 Logger(1)工具介绍(2)下载地址(3)使用说明 02 HAE(1)工具介绍(2)下载地址&…