【多线程】进程调度的基本过程

news2024/10/6 0:12:19

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

操作系统本身是一个大的话题,是一个非常复杂的软件

操作系统中的功能非常多,其中有一个功能模块,叫做进程管理

那么什么是进程(process)/任务(task)?

一个运行起来的程序,就是进程。

进程管理

为什么需要进程管理?因为进程多了,才需要管理

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

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

例如

一个学校中有很多的学生,学生很多,需要进行管理

第一步:明确每个学生的相关属性信息

第二步:通过一定的数据结构把这些学生的信息存放起来(例如表格)

2. 描述一个进程

描述进程的结构体里面有哪些属性?(属性非常多,只是挑几个核心的)

描述进程的结构体叫PCB(process control block)——进程控制块

那么PCB里面有哪些属性呢?

  1. pid(process identity)进程标识

    每个进程需要有一个唯一的身份标识

  2. 内存指针:当前这个进程使用的内存是哪一部分。(标志了进程运行的时候,使用了哪些内存上的资源)

    进程运行起来,就需要消耗一定的硬件资源,比如,内存

  3. 文件描述符表(标志了进程运行的时候,使用了哪些硬盘上的资源)

文件描述符表,是一个顺序表,存储的元素是文件描述符。
文件描述符和文件相关。

文件:硬盘上存储的数据,往往就是以文件为单位进行整理的

进程每次打开一个文件,就会产生一个”文件描述符“(标识了这个被打开的文件)

一个进程可能会打开很多文件,对应一组文件描述符。

把这些文件描述符放到一个顺序表这样的结构里,就构成文件描述符表

  1. 接下来这一组属性,都是描述和cpu资源相关的属性

    这些属性都是辅助进行进程调度的。

3. 什么是进程调度?

程序能够运行,全靠cpu。那么cpu怎么运行呢?我们经常听到描述cpu是8核16线程。意思是8个物理核心,16个逻辑核心。8个干活的人,能够干16个人的活。但是这个也是不够的,因为我们的进程有上百个image-20230424103836571

因此我们有了,“并行”和“并发”两个概念

并行:同一时刻,两个核心,同时执行两个进程,此时这两个进程就是“并行”执行的

并发:一个核心,先执行进程1,执行一会之后,再去执行进程2,再执行一会之后,再去执行进程3,此时只要这里的切换速度足够快,看起来进程123就是“同时”执行的

此时,虽然只有16个核心,也可以通过“并行+并发”方式,同时执行很多个任务了。不过“并行+并发”完全是操作系统自身控制的,程序员感知不到,所以很多时候,就把 “并行+并发”统称为并发

为了保证进程并发时候的进程切换的足够高效,这个时候就需要进程调度。

3.1 进程状态

简单认为,进程状态主要是这两个:就绪态和阻塞态

就绪态:该进程已经准备好,随时可以上cpu执行

阻塞态:该进程暂时无法上cpu执行

3.2 进程的优先级

进程之间的调度不一定是“公平”的,有的进程要优先调度

3.3 进程的上下文

上下文,就是描述当前进程执行到哪里这样的“存档记录”

进程在离开cpu的时候就要把当前运行的中间结果进行“存档”

等到下次进程回到cpu的时候,再恢复之前的“存档”,从上次的结果继续往后执行

这里“存档记录”就是进程运行过程中,cpu内部的一系列寄存器的值

注意1:cpu中存空间的地方,我们叫做寄存器,寄存器有很多种,其中最典型的作用就是保存当前进程执行的中间结果,包括进程运行到哪一条指令,进程离开cpu,就需要把这些寄存器的值保存到PCB的上下文字段中,进程下次回来cpu,再把PCB中的值给恢复到寄存器中。

注意2:cpu上有哪些寄存器,这些寄存器的含义是什么,不做过多讨论,我们不太关注底层

3.4 进程的记账信息

统计了每个进程,在cpu上执行了多久

可以作为调度的参考依据

PCB的属性是非常多的,我们只是讲了几个重点来介绍

4. 组织这些进程

操作系统往往使用双向链表这样的结构来组织pcb

换言之

  1. 创建一个进程,就是创建一个链表的节点
  2. 销毁一个进程,就是把链表的节点给删除
  3. 遍历进程列表,就是在遍历链表

因此进程调度的过程就是操作系统描述进程,调度进程,组织进程的过程。

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

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

相关文章

【用户体验分析报告】 按需加载组件,导致组件渲染卡顿,影响交互体验?组件拆包预加载方案来了!

首先,我们看一些针对《如何提升应用首屏加载体验》的文章,提到的必不可少的措施,便是减少首屏幕加载资源的大小,而减少资源大小必然会想到按需加载措施。本文提到的便是一个基于webpack 插件与 react 组件实现的一套研发高度自定义…

nginx入门 - 学习笔记

一、初识 1、相关概念 1)正向代理 一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标,然后代理向原始服务器转交请求并将获得内容返回给客户端。 2)反向代理…

【C++】多态,虚函数表相关问题解决

文章目录 多态概念及其触发条件重写和协变(考点1)(考点2) 虚函数表及其位置(考点3) 多继承中的虚函数表 多态概念及其触发条件 多态的概念:通俗来说,就是多种形态。具体点就是去完成…

DSA之图(2):图的存储结构

文章目录 0 图的结构1 邻接矩阵1.1 无向图的邻接矩阵1.2 有向图的邻接矩阵1.3 网(有权图)的邻接矩阵表示法1.4 邻接矩阵的建立1.4.1 采用邻接矩阵建立无向网1.4.2 采用邻接矩阵建立有向网 1.5 邻接矩阵的优缺点1.5.1 优点1.5.2 缺点 2 邻接表2.1 无向图的…

Java将汉字转拼音以及判断字符是否为汉字

首先是将汉字转换为拼音&#xff1a; 导入依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>创建转拼音的静态方法toPinyin&#xf…

掌握 Python RegEx:深入探讨模式匹配

动动发财的小手&#xff0c;点个赞吧&#xff01; 什么是正则表达式&#xff1f; 正则表达式通常缩写为 regex&#xff0c;是处理文本的有效工具。本质上&#xff0c;它们由一系列建立搜索模式的字符组成。该模式可用于广泛的字符串操作&#xff0c;包括匹配模式、替换文本和分…

在线阅读版:《2023中国软件供应链安全分析报告》全文

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 专栏供应链安全 数字化时代&#xff0c;软件无处不在。软件如同社会中的“虚拟人”&#xff0c;已经成为支撑社会正常运转的最基本元素之一&#xff0c;软件的安全性问题也正在成为当今社会的根本性、基础性问题。 随…

火车头采集器伪原创【php源码】

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python中按钮的位置怎么摆放&#xff0c;python中按钮怎么设置颜色&#xff0c;现在让我们一起来看看吧&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 1、用python的pygame,做一个按钮 唔...摁钮&#xff1f;…

【万字长文】SpringBoot整合SpringSecurity+JWT+Redis完整教程(提供Gitee源码)

前言&#xff1a;最近在学习SpringSecurity的过程中&#xff0c;参考了很多网上的教程&#xff0c;同时也参考了一些目前主流的开源框架&#xff0c;于是结合自己的思路写了一个SpringBoot整合SpringSecurityJWTRedis完整的项目&#xff0c;从0到1写完感觉还是收获到不少的&…

MYSQL导入excel数据后只显示500条

问题&#xff1a;明明显示数据全部导入成功&#xff0c;但是点开table后发现只显示了500条 解决步骤&#xff1a;&#xff08;以datagrip为例&#xff09; 其实大家已经把数据导入了&#xff0c;只是在工具里&#xff0c;它在设置里面做了限制&#xff0c;只显示500条数据。只…

Kotlin 内联函数语法之let、apply、also、run、with的用法与详解

一、介绍 kotlin的语法千奇百怪&#xff0c;今天我们将介绍项目中频率使用比较高的几个内联函数。 二、什么叫内联函数&#xff1f; 内联函数 的语义很简单&#xff1a;把函数体复制粘贴到函数调用处 。使用起来也毫无困难&#xff0c;用 inline关键字修饰函数即可。 语法&a…

三菱FX5U系列PLC内置定位功能的基本使用方法介绍

三菱FX5U系列PLC内置定位功能的基本使用方法介绍 三菱FX5U系列PLC本体自带的高速脉冲输出可以实现定位功能,具体的使用方法可参考以下内容: 参数设定 如下图所示,新建一个工程,在左侧的项目树中找到参数–模块参数—高速I/O,双击进入后找到输出功能—定位—点击进入详细设…

BHQ 1Mal,BHQ-1 Maleimide,BHQ1马来酰亚胺,黑洞猝灭剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ PART1----产品描述&#xff1a; BHQ-1 Maleimide黑洞猝灭剂-1(BHQ-1)被归类为暗猝灭剂&#xff0c;该淬灭剂能够将一定距离内荧光基团发出的光全部吸收&#xff0c;实现对荧光信号的淬灭&#xff0c;所以可得到更强的特异性…

基于SpringBoot+Vue的学习平台设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

神经网络的初始化方法

文章目录 1、随机初始化2、Xavier初始化3、He初始化4、权重预训练初始化5、零初始化 对于神经网络的训练过程中&#xff0c;合适的参数初始化方法有助于更好的处理梯度消失和梯度爆炸问题。通常有以下几种初始化方法&#xff1a; 1、随机初始化 随机初始化&#xff08;Random…

[JavaWeb]MySQL的安装与介绍

MySQL的安装与介绍 一.数据库相关概念1.1 数据库1.2 常见的关系型数据库管理系统 二.MySQL数据库1.MySQL的安装2.配置环境变量3.新建MySQL配置文件4.初始化MySQL5.注册MySQL的服务6.修改默认账户与密码7.连接MySQL服务8.MySQL的卸载 三.MySQL的数据模型1.关系型数据库 一.数据库…

static关键字和继承

1、static关键字 1.1案例题目 • 编程实现People类的封装&#xff0c;特征有&#xff1a;姓名、年龄、国籍&#xff0c;要求提供打印所有特征的方法。 • 编程实现PeopleTest类&#xff0c;main方法中使用有参方式构造两个对象并打印。 /*编程实现People类的封装*/ public cl…

Python+Texturepacker自动化处理图片

前言 本篇在讲什么 PythonTexturepacker自动化处理图片 本篇需要什么 对Python语法有简单认知 依赖Python2.7环境 依赖Texturepacker工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &…

ubuntu18.04 安装php7.4-xdebug

文章目录 场景解决 场景 apt install php7.4-xdebug 下载失败, 只好通过编译解决了 解决 https://xdebug.org/wizard 输入php -i的执行结果

mybatisplus映射解读

目录 自动映射 表映射 字段映射 字段失效 视图属性 Mybatis框架之所以能够简化数据库操作&#xff0c;是因为他内部的映射机制&#xff0c;通过自动映射&#xff0c;进行数据的封装&#xff0c;我们只要符合映射规则&#xff0c;就可以快速高效的完成SQL操作的实现。既然…