linux进程——概念理解与PCB

        前言:本篇讲解Linux进程概念相关内容。 操作系统被称为计算机世界的哲学, 可以见得操作系统的知识并不好理解。 对于这篇进程概念的讲解, 博主认为, 如果没有一些前置知识的话,里面的有些概念并不好理解。 但是如果学习了冯诺依曼体系结构, 再了解了操作系统是如何对硬件进程管理之后, 进程就变得会好理解很多。 

        ps:本篇内容适合学过一些数据结构的友友门进行观看, 但是可能有些概念理解不了, 最好了解一些冯诺依曼体系结构和操作系统对硬件的管理再来学习本节。 对于这两个知识块, 博主已有文章:

linux_进程周边知识——理解冯诺依曼体系结构-CSDN博客

linux进程周边知识——内核对硬件的管理——计算机世界的管理-CSDN博客

目录

进程的定义

linux下的进程

理解linux下的进程

操作系统对进程的管理  (先描述, 再组织)

PCB


进程的定义

        已经加载到内存的程序, 就叫做进程。 有些教科书上面叫做任务。 

linux下的进程

下面是windows下面的进程:

linux下面的进程, 我们要查看怎么查看呢? ——需要输入ps指令, 如下图:

ps axj就能查看当前机器下所有的进程。但是也有另一个指令能够查看进程, 这个进程是top 

现在, 我在这里创建一个程序:

我现在将这个程序跑出来:

然后打开进程管理, 查看当前的进程:

也有的教材中称正在运行的程序叫做进程。 

其实正在运行的程序本质上就是cpu正在对该程序进行计算, 而想要让cpu计算一个程序, 那么首先这个程序就要被加载到内存中。 所以正在运行的程序本质上也是被加载到内存中的程序。 同样是进程。 

那么思考另一个问题, 对于操作系统来说, 他是一个软件。 一个做软硬件管理的软件, 那么他管理这些硬件的时候, 一定是运行着的, 也就是说, 操作系统也是一个进程。 其实, 本质上, 我们在电脑开机的时候, 其实就是在将操作系统从磁盘缓存到内存中, 让其成为一个进程。

理解linux下的进程

        如何理解上面的概念呢?

        上面是一个简化的冯诺依曼, 现在, 假如有一个程序需要需要运行, 这个程序就要从磁盘加载到内存中, 一个程序, 归根结底就是数据和代码构成的。 而这些的本质都是代码。 

        而且一个操作系统之中, 不仅仅只有一个进程, 他有很多进程。 比如说我们一边听歌一遍聊, 或者一遍打游戏, 一边听歌, 一边聊天。 

        这都是多进程的体现, 更不用说还有许多后台进程, 这些进程我们看不到, 但他们确确实实存在。 

        然后, 既然进程多了, 那么操作系统为了这些进程能够在系统内合理的运行, 就要对他们进行管理, 那么如何管理呢? 就是和操作系统管理硬件的思路是一样的——事实上, 计算机世界的管理甚至是现实中的管理都是这样的, 也就是——先描述, 再组织。 

         任何一个进程, 在加载到内存的时候, 形成真正的进程时, 都要现在内存中开一个进程(属性)的结构体对象, 简称PCB。 全程process cral block —— 进程控制块。 

        这里我们可以思考一个问题, 那就是人是如何辨认一个事物或者对象的? 我们在和别人描述一个人时, 是不是像那个人描述一个人的身高, 体重, 外表是白是黑? 等等。 这些描述的, 其实就是属性。 当我们进行描述的属性够多。 那么是不是就越能指向一个人? 所以, 当特征足够多的时候, 这些属性的集合, 那么就能指向一个人。 所以, 对于上面的PCB来说, 它就是一个进程属性的集合。 

        那么我们知道, 对于操作系统来说, 它是用c语言写的。 所以形成的结构体对象, 就一定是结构体。 那么这里要提三个概念:

        进程编号: 我们知道, 对于一个学校的学生来说, 每一个学生都有一个学号, 目的就是为了区分每一个学生。 那么对于进程也是一样, 每一个进程都有自己的编号, 这个就叫做进程编号。 

        进程的状态: 每一个进程都有自己的状态, 有的进程可能在运行, 有的进程可能在休眠。 所以, 就需要进程的状态进行标识。 

        进程的优先级: 进程需要被cpu运行, 调度, 那么势必就需要一个东西——优先级。 

        未来当进程加载到内存中时, 操作系统就要为进程创建相应的PCB对象。 那么就是说只要进程加载到内存中, 那么操作系统中就有一根这个进程的代码, 一份保存这个进程属性的PCB代码块。

        对于PCB来说, 我们可以这么理解: 就像我们升学一样, 我们升学, 就要将我们的学籍档案进入即将升入的学校, 然后我们的人再到学校进行报道。 这个时候, 我们才是这个学校的学生。 如果我们只有人进入到了学校。 那么我们不算这个学校的学生, 就比如保安大爷, 虽然人在学校, 但是它们不算是学校的学生。 如果我们只有学籍档案到了学校, 但是人没有到学校。 就比如开学的当天, 我们这个时候还没有到学校报道, 但是学籍档案还在学校。 我们就不是这个学校的学生。 而这里的PCB就相当于学籍档案, 这里的data就相当于我们自己。 

        现在看下面这个图:        

        这里的PCB是由操作系统自己生成并且维护的。 代码和数据是程序加载到内存中的。 那么既然我们的程序加载到内存, 操作系统同时会自动创建一个PCB, 那么就是说, 这里的数据代码和PCB合起来, 才能叫做进程。 

        所以, 这里就可以按照我们自己的理给一个进程的定义: 进程 = 内核创建的PCB对象(用来描述程序也就是代码的属性值) + 你自己写的代码和数据

操作系统对进程的管理  (先描述, 再组织)

        操作系统管理进程的时候, 看的是PCB对象而不是我们的代码和数据。 在操作系统中, 对于一个进程来说,PCB里面有一个指针指向自己的代码和数据。 如下图:

        对于多个进程来说, 这些进程不是随意分散在内存中的, 而是由某个或者多个数据结构保存起来的。 最简单的就是双链表数据结构, 如下图为链接的简单图:(就是每个PCB都有一个指向自己的代码和数据的指针, 用来找到代码代码本体。 还有一个后指针指向下一个进程, 一个前指针指向前一个进程, 注意: 这里的前指针没有画, 但不代表没有。)

        这样, 操作系统对于进程的管理就转化为了对于双链表的数据结构的管理。 

        其实对于这种PCB和数据代码分开, 只管理PCB的管理模式, 在生活中很常见。 就比如我们在竞争部门委员的时候。 我们给学校的部门投递自己的简历。面试我们的这些学长, 他们在面试我们的时候是让我们在屋外排队等待面试吗? 不是的, 他们是让我们在一个静候室里面, 按照简历的顺序, 给我们安排面试的顺序。 而这里的简历,不就是操作系统中的PCB? 这里的我们本人, 不就是加载到内存中的程序?——这上面的过程, 本质上就是一个先描述, 再组织。 

PCB

        linux下的PCB叫做task_struct

  •         task_struct里面封装了很多东西, 他包含了进程内部的所有属性, 所以非常大。 我们知道, 在c/c++语言中, struct 结构体内部其实就是封装一个事物的所有属性, 这些属性, 其实描述的就是对象, 这就是面向对象, 所以task_struct描述的就是进程。 

        那么, task_struct里面到底有什么东西呢? 

  •         标识符:也叫做PID, 这个是用来区别其他的进程。
  •         状态: 用来记录当前进程的状态, 进程可以是运行中, 可以是休眠中, 可以是暂停中等等。
  •         优先级:进程要被cpu调度, 但是cpu就那么点空间, 而进程那么多, 所以这些进程是要竞争的。 为什么这个进程这个时候要被运行。 而其他进程不运行呢? 这就是优先级。 
  •         程序计数器:当前运行程序的下一条指令的地址——这里不好理解, 回想一下我们学习的函数栈帧, 程序在调用函数时, 是不是会先将这个函数处的下一条指令的地址保存下来? 这个其实就是类似于程序计数器。程序计数器是cpu里面的一个寄存器, 它专门保存当前指令的下一条指令。 
  •         内存指针:PCB找到自己的代码和数据。 
  •         上下文数据和IO状态信息: 这两个博主知识储备不足,本篇文章也不会涉及, 有兴趣的友友可以自己学习
  •         记账信息:记录程序运行的时间等等。 可以衡量调度器的优劣。

再次强调:

        在进程当中, 我们管理进程, 其实是对PCB进行管理。 

        那么, 在linux中, 内核是如何组织进程的呢? 在linux内核中, 最基本的组织进程task_struct的方式, 是采用双向链表进行组织的。 

        但是, 要注意, pcb不仅仅属于一个双链表, 在操作系统中, pcb内部可能不仅仅只有一个链表指针, 也有可能有队列的指针之类。 意思就是说, pcb不仅仅可能只被链在在了一个链表里, 同时pcb也可能被链在了一个队列里。或者放在其他的一个数据结构当中。 

        那么利用上面的特性PCB就可以拥有不同的状态, 比如PCB此时正在运行, 那么就把他链入运行队列当中, 比如PCB正在等待, 就把他链入等待队列当中, 比如PCB正在休眠, 就把他链入休眠队列当中。 

        所以, 进程如何工作, 取决于我们被他放到了哪个数据结构当中。 

现在我们来看另一个问题, 下午是正在跑的两个程序, 左边是查看当前正在跑的右边的两个程序:

        之所以会有第三个是因为指令也算是一个进程, 但是因为很快, 一般我们查不到, 但是对于过滤来说, 过滤的后面也有process, 所以在cpu进行调度的时候, 就要将grep也给带上。 

        这里最重要的是前面的那几个数字。这个东西叫做PID, 也叫做进程的标识符, 虽然我们运行的两个程序, 都是process-7-11.exe, 但是对于操作系统来说, 这是两个程序, 那么他就会生成两份PCB对象。 所以, 内核看的不是有几分代码,而是有几个进程!!

        另一个知识点是proc: 可以查看当前系统中运行的进程。 我们可以使用 -l 查看细节。 

然后我们就会发现, 这些进程都是目录, 并且这些目录的名字都是数字。 

既然进程都可以在proc目录下以文件的形式显示, 那么我们就可以查看我们当前的process-7-11.exe进程:

现在我们来看上面的绿色字段, 这个绿色字段前面是exe, 后面是一个路径, 这个路径其实就是process-7-11.exe的文件位置。 对于上面的蓝色字段, 这个蓝色字段其实就是运行的程序所在的工作目录, 现在我们来思考一个问题。 为什么对于一个touch指令, mkdir指令这些来说, 创建的文件都在当前目录下。 答案就是进程中的这个cwd文件。 这个文件默认保存了当前进程的运行路径, 那么在使用路径的时候, 就会在当前路径创建文件了。 

--------------------------------以上, 就是本节的全部内容。下面是博主的笔记:

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

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

相关文章

SQL Server 用户应当如何防范 Mallox (.hmallox) 勒索软件袭击

勒索软件领域的特点是随着时间的流逝,参与者群体和恶意软件家族都会大量流失,只有少数参与者表现出相对长寿的寿命。曾经令人担忧的威胁,如 REvil 和 Conti,要么被铲除,要么被解散,而其他威胁——例如 ALPH…

UGUI优化篇(更新中)

UGUI优化篇 1. 基础概念2. 重要的类1. MaskableGraphic类继承了IMaskable类2. 两种遮罩的实现区别RectMask2DMask 3. 渲染部分知识深度测试深度测试的工作原理 渲染队列透明物体在渲染时怎么处理为什么透明效果会造成性能问题 1. 基础概念 所有UI都由网格绘制的如image由两个三…

Leetcode(经典题)day4

滑动窗口 长度最小的子数组 209. 长度最小的子数组 - 力扣(LeetCode) 使用滑动窗口,当前窗口大小的数组的和比目标值小就加大窗口(r),当前窗口大小的数组的和比目标值大或相等,就减小窗口大小…

力扣题解(不同的子序列)

115. 不同的子序列 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 109 7 取模。 思路: 本题研究的是t在s中出现的次数,注意t一定是小的那个,是s的子串。 dp[i][j]表示t的&#xff…

25届平安产险校招测评IQ新16PF攻略:全面解析与应试策略

尊敬的读者,您好。随着平安产险校招季的到来,许多应届毕业生正积极准备着各项测评。本文旨在提供一份详尽的测评攻略,帮助您更好地理解平安产险的校招测评流程,以及如何有效应对。 25届平安产险平安IQ(新)测…

AI大模型探索之旅:深潜大语言模型的训练秘境

在人工智能的浩瀚星空中,大语言模型无疑是最耀眼的星辰之一,它们以无与伦比的语言理解与生成能力,引领着智能交互的新纪元。本文将带您踏上一场探索之旅,深入大语言模型的训练秘境,揭开其背后复杂而精妙的全景画卷。 …

Java常用API---Object类

Object类概述 概述 Object类是所有类的父类,任何一个类的对象(包括数组),都可以调用Object类的方法 目标: 掌握Object类的常用方法 常用方法: boolean equals(Object obj):判断当前对象是否与参数对象"相等" Strin…

Linux时间查看和设置

查看时间 date 命令,输出 Sun Jul 14 07:23:03 PM CST 2024timedatectl 命令,输出 Local time: Sun 2024-07-14 10:30:00 CSTUniversal time: Sun 2024-07-14 02:30:00 UTCRTC time: Sun 2024-07-14 02:30:00Time zone: Asia/Shanghai (CST, 0800) Sys…

汇编学习基础知识【记录】

前言 又是快乐的学习汇编的一天,时间如白驹过隙,抓紧时间,在学习能力最好的年纪多学习一些知识,朝着美好生活而奋斗!哈哈哈 参考文章: https://blog.csdn.net/Z_H_Z_0/article/details/106574292 知识补…

给 「大模型初学者」 的 LLaMA 3 核心技术剖析

编者按: 本文旨在带领读者深入了解 LLaMA 3 的核心技术 —— 使用 RMSNorm 进行预归一化、SwiGLU 激活函数、旋转编码(RoPE)和字节对编码(BPE)算法。RMSNorm 技术让模型能够识别文本中的重点,SwiGLU 激活函…

现在有哪些微服务解决方案?

Dubbo:是一个轻量级的Java微服务框架,最初由阿里巴巴在2011年开源。它提供了服务注册与发现、负载均衡、容错、分布式调用等。Dubbo更多的被认为是一种高性能的RPC框架(远程过程调用),一些服务治理功能依赖第三方组件完…

以一个springboot项目中创建用户会话的业务背景来说明threadlocal的用法

在Spring Boot项目中,ThreadLocal 是一个非常有用的工具,特别是在处理用户会话信息时。ThreadLocal 允许你在同一个线程中存储和访问变量,而不会与其他线程的变量发生冲突。这对于存储用户会话信息、请求上下文等非常有用。 以下是一个示例&…

第一部分:C++入门

目录 前言 1、C关键字(C98) 2、命名空间 2.1、命名空间定义 2.2、命名空间的使用 3、C输入&输出 4、缺省参数 4.1、缺省参数的概念 4.2、缺省参数的分类 5、函数重载 5.1、函数重载的概念 5.2、C支持函数重载的原理 6、引用 6.1、引用的概念 6.2、引用特性 …

Unity与Unreal Engine:AR建筑应用开发之选

在AR技术的浪潮中,建筑行业正迎来一场技术革新。对于希望为建筑工人开发AR应用的创业者来说,选择正确的开发平台至关重要。本文将基于社区讨论,深入分析Unity与Unreal Engine两款引擎在AR施工应用中的优劣,为开发者提供决策参考。…

深圳晶彩智能JC3636W518C开箱实现电脑副屏功能

深圳晶彩智能发布了JC3636W518C 这是一款中国制造的,铝合金外壳,价格非常震撼的开发板。原创是billbill的up播主萨纳兰的黄昏设计的ESP32太极小派,由深圳晶彩智能批量生产。 该款 LCD 模块采用 ESP32-S3R8 芯片作为主控,该主控是双核 MCU&…

LightDM和SDDM显示管理器学习小知识

LightDM和SDDM是两种不同的显示管理器(Display Manager),它们可以与多种Linux桌面环境配合使用。以下是它们常见的对应关系: ### LightDM LightDM是一个跨桌面的显示管理器,它允许用户选择不同的桌面环境。以下是一些…

C++入门基础篇(2)

欢迎大家的来到小鸥的博客&#xff0c;今天我们继续C基础的第二篇吧&#xff01; 这也是入门基础篇的最后一篇wo~ 目录 1.引用 引用的概念 引用的特性及使用 const常引用 指针和引用的关系 2.inline内联函数 定义 相关特性及使用​ 3.nullptr >>后记<< …

摩尔投票算法

文章目录 什么是摩尔投票算法算法思想 相关例题摩尔投票法的扩展题目解题思路代码奉上 什么是摩尔投票算法 摩尔投票法&#xff08;Boyer-Moore Majority Vote Algorithm&#xff09;是一种时间复杂度 为O(n),空间复杂度为O(1)的方法&#xff0c;它多数被用来寻找众数&#xf…

深入理解Symfony框架中的数据验证机制

Symfony是一个高度灵活的PHP Web应用框架&#xff0c;它提供了一整套工具和实践来帮助开发者构建复杂的Web应用。数据验证是确保应用数据完整性和安全性的关键环节。在Symfony中&#xff0c;数据验证是通过一系列的组件和方法来实现的&#xff0c;这些组件和方法遵循DRY&#x…

Manim的代码练习02:在manim中Dot ,Arrow和NumberPlane对象的使用

Dot&#xff1a;指代点对象或者表示点的符号。Arrow&#xff1a;指代箭头对象&#xff0c;包括直线上的箭头或者向量箭头等。NumberPlane&#xff1a;指代数轴平面对象&#xff0c;在Manim中用来创建包含坐标轴的数学坐标系平面。Text&#xff1a;指代文本对象&#xff0c;用来…