进程的概念以及PCB的概念

news2025/1/24 22:45:51


在linux上进程是非常重要的知识点,今天我自我发表浅见。

可执行程序与进程

当在linux上编译完毕一个源文件生成可执行程序,这个时候这可执行程序只能称为普通文件,还不能定义为进程,在加载在内存中后才可称为进程,那么我们可以把程序认为是进程吗?不是这样的,因为进程包含可执行程序,属于他们是属于包含关系,可以这样表示:进程>可执行程序

概念图

 所以进程是包含可执行程序但不等于可执行程序,而是等于可执行程序加上其他的一些东西。

  进程是由程序控制块(PCB)、程序段、数据段组成。
  PCB:    管理进程。
  程序段:程序代码存放的位置。
  数据段:程序运行时使用、产生的运算数据。如全局变量、局部变量、宏定义的常量就存放在数据段内。

这里我们先看个东西

 惊奇的发现,在磁盘上的可执行程序比该进程在内存小,这是什么情况呢?

这里我们要知道,内存空间是有限的,加载到内存上的可执行程序并不是一股脑将所有在磁盘上的数据都加载到内存中,为了有效利用空间,那么在加载可执行程序数据的时候会甄别主要数据加载到内存中进行操作,比如二进制代码段等较为主要的信息,而比如文件上次修改时间,文件的对应用户权限信息,创建时间等等无关运行的数据都不会加载到内存中,这样进程的大小比可执行程序大小要小。

 这样就解释通了为什么外存上的可执行程序比内存上的进程要大了

PCB(进程控制块)

打个比方,在家里3个孩子,那个孩子学习好不需要搞个人员名单再去奖励他,而在学校里可能有几万名学生,让校长奖励最好的同学,如果没有人员名单数据信息的话,找到最好同学成绩也许只能等上几个月才能甄别了,PCB就像人员数据信息表一样,每个人都有属于自己的信息表,而每个进程都有属于自己的进程数据信息,这里面有代码有,标识符pid,记账信息,有任务状态,有上下文数据,内存指针,有指向其他PCB的指针等等

我们先了解CUP对进程的工作原理:

CUP访问进程的时候,并不是直接访问数据代码,而是访问PCB,就像校长找学生,都会看看他的基本信息根据信息里的电话号码打电话叫该学生过来而不是自己去一个一个查数据,这样的效率十分的低下。

我们将进程的基本数据汇总做个表格,表格里存放的是关于该进程的基本数据,这个表格就叫做进程控制块(PCB),里面保存了各种数据各种指针,所有CPU是通过PCB再去访问载入内存的代码,而不是直接访问载入内存的代码。

。我们有多个进程,就像有几万个人的数据表格,我们要把这些数据钉在一起,方便增删查改,而多个进程控制块也是一个道理,要将他们都关联起来,这个时候就衍生了数据结构这门课程。

这里我们假设全部PCB以双链表相互关联,这个时候CPU只需要找到链表的头节点就可以访问整个链表了

 这样的数据结构就让cpu快速的遍历了所有的进程。

我们来介绍一下PCB中的一些重要的内容:标识符pid,记账信息,有上下文数据,内存指针,优先级信息

pid:如同身份证号码一样,在可执行程序加载内存中成为进程后,在PCB上都会有一个pid的数据,它具有唯一性,同时运行的进程pid都是绝对唯一的,哪怕创建子进程,子进程也是有自己的pid

记账信息:这里的记账信息记录可能包括,本次运行时间数据,以及以及运行的时间数据,以及运行时间限制,这里的时间限制可以查看我写的另一文章:(13条消息) 不让CPU偷懒_云的小站的博客-CSDN博客。这时保证了每个进程占用cpu资源的时间都公平合理。

内存指针:这个是记录着数据段,堆区,栈区,代码段,内存映射区等等的位置。

优先级:排队总是有先后,在进程中也有着先后顺序

 这里我们要重点理解什么是上下文数据

所谓的上下文数据,并不是上一个进程下一个进程的的数据,而是在当前进程切换前已经运行的数据信息,打个比方当前进程运行到了第200行,这个时候该进程切换到其他进程,这个时候我们需要已经运行到200行的这个信息存放起来,应该存放在哪里呢?

存放在cpu中吗?

如果存放在cpu中那么就要扩大3级缓存,寄存器的大小,如果是这样,那么有许多进程切换时候都需要将这些数据存放起来以方便下次使用CPU资源的时候可以立刻调到这些数据,但是如果存放在CPU资源那么将要增大 cpu附近存储硬件的大小,我们知道约靠近cpu的存储单位价格约昂贵,如果普通的人买个电脑光光是cpu就花费几万元,这是十分不明智的,所以上下文数据不该存放在CPU上。

存放在其他进程吗?

如果放在其他进程内,如果其他进程在运行完后就结束进程了,这个时候会销毁里面的临时数据,如果保存了其他进程上次运行的数据将会一同销毁,如果该程序还未结束,再次分配cpu资源的时候将找不到上次运行的位置,将发生错误。

所以应当上下文自产自销

应当放在自己进程中,这样在下次分配资源的时候就可以立刻准确的找到自己上次运行到位置和相关数据信息了。

自己制造,自己带走

 

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

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

相关文章

次优二叉查找树(次优查找树)_递归和非递归实现_20230414

次优二叉查找树(次优查找树)-递归和非递归实现 前言 当有序表中的各记录的查找概率相等的时候,采用折半查找效率可以提升查找性能;如果有序表中的各记录的查找概率不相等,那么折半查找就不再适用。 如果只考虑查找成功的情况&a…

Robocup 仿真2D 学习笔记(四)阵型编辑

一、阵型文件介绍 阵型文件里设置的是球员在比赛中的跑位点 基于helios base的阵型文件,在目录/src/formations-dt中 阵型的调用在/src/strategy.cpp 文件: before-kick-off.conf 是球员上场之后的阵型 (或进球等待开球) no…

有限元基础编程-何晓明老师课件-一维程序实现matlab

文章目录前言一、主程序二、一维有限元求解程序-框架三、组装刚度矩阵assemble_matrix_from_1D_integral.m2.1 算法2.2 get_standard_gauss_1D.m2.3 get_Gauss_local_1D.m前言 只是为方便学习,不做其他用途,课程理论学习来自b站视频有限元基础编程-何晓明…

RT-Thread线程管理以及内核裁剪

RT-Thread线程管理以及内核裁剪 1. RTOS概述 1.1 RTOS的定义 实时操作系统(Real-time operating system, RTOS),又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。 实时操作系统与…

核心业务2:借款人申请借款额度

核心业务2:借款人申请借款额度 1.业务流程图 ------------截止提交个人信息部分-------- 2.借款人申请借款额度数据库设计 3.借款人申请额度流程 4.前端代码逻辑 5.后端代码逻辑 ------------截止提交个人信息部分-------- 核心业务2:借款人申请借…

Linux从命令行管理文件

目录 一、创建链接文件 二、目录操作命令 1. 创建目录(make directory) 2. 统计目录及文件的空间占用情况 3. 删除目录文件 三、创建、删除普通文件 文件命名规则: (1)不能使用/来当文件名,/是用来做…

【WCH】CH32F203软件I2C驱动SSD1306 OLED

【WCH】CH32F203软件I2C驱动SSD1306 OLED📌相关篇《【WCH】CH32F203硬件I2C驱动SSD1306 OLED》📺驱动显示效果: 🌿OLED屏幕:i2c ssd1306 oled🔖驱动单片机型号:CH32F203 ✨由于CH32F203主频为96…

wordpress下载插件,安装失败,无法创建目录问题

刚开始安装这个wordpress,在发表文章时候想要在其中加上图片,不想一个个手动上传媒体库,耽误时间,然后就去下了个imagepaste这个复制粘贴的插件,当我打开安装插件搜索到的时候准备安装,尼玛出现“安装失败&…

若一个单词被拆分成多少token, word_ids得到的序号是相同的?还是序号累加的?

目录 问题描述: 问题实现: 方法一: 方法二: 问题描述: 在使用tokenizer进行编码的时候,经常会存在word被拆分成多个token的情况,不同的参数设置,会得到不同的结果。总的来说&…

redis——使用

session缓存缓存更新方式删除缓存vs更新缓存缓存和数据库操作原子性缓存和数据库操作顺序结论缓存问题缓存穿透缓存雪崩缓存击穿全局唯一ID数据并发线程安全单体分布式redis分布式锁的问题redis消息队列listpubsubstream消息推送session 问题:session存在tomcat服务…

【Linux驱动开发】023 platform设备驱动

一、前言 驱动分离目的:提高Linux代码重用性和可移植性。 二、驱动的分隔与分离 百度看了很多,大多都没讲清楚为什么使用platform驱动,为什么驱动分隔与分离可以提高代码重用性,只是在讲实现的结构体、函数接口等等&#xff0c…

npm、pnpm、yarn的常用命令

npm、pnpm、yarn的常用命令 文章目录npm、pnpm、yarn的常用命令一、常用命令1、npm命令2、pnpm命令:3、yarn命令二、对比一、常用命令 1、npm命令 npm init: 初始化一个新的npm包。 npm install: 安装项目依赖项。 npm install : 安装指定的包。 npm install --sa…

【Java数据结构】链表(Linked List)-双向链表

双向链表(Linked List)是一种常用的数据结构,它允许在所有节点中快速添加或删除元素,并且可以有效地实现反向遍历。本篇文章将介绍双向链表的基础知识,并提供使用Java语言实现该数据结构的示例代码。 一、双向链表的基…

mysql数据库事务脏读、不可重复度、幻读详解

文章目录1 事务隔离级别2 脏读3 不可重复度3.1 解决了脏读的问题。3.2 有不可重复度的问题4 幻读4.1 没有脏读和不可重复读的问题4.2 有幻读的问题5 serializable1 事务隔离级别 read-uncommitted:脏读、不可重复度、幻读,均可出现。安全性低&#xff0…

HBase架构篇 - Hadoop家族的天之骄子HBase

HBase的基本组成结构 表(table) HBase 的数据存储在表中。表名是一个字符串。表由行和列组成。 行(row) HBase 的行由行键(rowkey)和 n 个列(column)组成。行键没有数据类型&…

《花雕学AI》06:抢先体验ChatGPT的九个国内镜像站之试用与综合评测

最近ChatGPT持续大火,大家们是不是在网上看到各种和ChatGPT有趣聊天的截图,奈何自己实力不够,被网络拒之门外,只能眼馋别人的东西。看别人在体验,看别人玩,肯定不如自己玩一把舒服的啊。 上一期&#xff0…

2.5d风格的游戏模式如何制作

文章目录一、 介绍二、 绘制瓦片地图三、 添加场景物体,添加碰撞器四、 创建玩家五、 创建玩家动画六、 玩家脚本七、 2d转换成2.5d八、 “Q”键向左转动视角、“E”键向右转动视角九、 下载工程文件一、 介绍 制作一个类似饥荒风格的2.5d游戏模板。 2.5D游戏是指以…

Spring之循环依赖

什么事循环依赖 很简单的定义就是就如有两个对象A类,B类,其中两个类中的属性都有对方。 A类 public class A{private B b;}B类 public class B{ private A a; }在Spring中,什么情况下会出现循环依赖 如果要了解循环依赖,首先…

基于matlab进行雷达信号模拟

一、前言此示例说明如何将基本工具箱工作流应用于以下方案:假设有一个工作频率为 4 GHz 的各向同性天线。假设天线位于全局坐标系的原点。有一个目标,其非波动雷达横截面为0.5平方米,最初位于(7000,5000,0&…

Linux下使用ClamAV病毒查杀

一、介绍Clam AntiVirus 是一款 UNIX 下开源的 (GPL) 反病毒工具包,专为邮件网关上的电子邮件扫描而设计。该工具包提供了包含灵活且可伸缩的监控程序、命令行扫描程序以及用于自动更新数据库的高级工具在内的大量实用程序。该工具包的核心在于可用于各类场合的反病…