当前位置: 首页 > news >正文

【Linux】进程2——管理概念,进程概念

1.什么是管理?

那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?

很简单,先把进程描述起来,再把进程组织起来!

我们拿大学为例子

  • 最典型的管理者——校长
  • 最典型的被管理者——学生

1.我们平时见得到校长吗?见不到——管理者和被管理者是不需要见面的

2. 这个就引出一个新的问题,管理者在不见被管理者的情况下,如何做好的管理?

  • 我们在学校就清楚,我们考试考了多少分,旷了多少节课,个人信息,校长想看都能看到
  • 就算校长来见我们,也是为了获取我们更多的信息
  • 所以只要校长有足够多的我们的信息,不见面都可以对我们进行有效的管理
  • 管理的本质就是:通过对数据的管理,达到对人的管理

3.管理者和被管理者面都不见,管理者怎么拿到被管理者的数据呢?

  •  我们还是拿校长和学生为例
  • 校长是通过老师,辅导员来获取学生的数据

4.拿老师和辅导员是不是管理者?

  • 不是,因为老师和辅导员只是在执行他们该做的东西,所以他们不是真正的管理者
  • 他们更多的是执行者
  • 校长相当于操作系统,老师,辅导员相当于驱动程序,学生相当于被管理的软硬件资源
  • 这样子就理解了操作系统怎么管理底层的软硬件资源了

5.操作系统怎么管理软硬件资源?——先描述,后组织

  • 操作系统只需要获取对应的软硬件资源的状态数据即可,获取状态数据的这个过程是通过驱动程序来执行的
  • 虽然每个学生的信息都不同,但是他们都有下面这些属性——电话,姓名,身高,体重,成绩,籍贯......
  • 校长可以通过一个结构体来记录这些属性,这样子学生的属性不就被描述起来了吗!!!——这个有点像面向对象编程里的抽象啊
  • struct student
    {
    char name[20];
    int number[20];
    ...
    struct student*next;
    };

  • 这样子我们就可以使用一个结构体对象来记录一个学生的信息,每个学生都带有一个指向下一个学生的结构体指针,这样子就很好管理了
  • 这样子校长对学生的管理工作就变成了对链表的增删查改
  • 校长找成绩最高的同学,只需要不断遍历链表即可
  • 上面这个把学生描述成结构体的过程叫做描述的过程
  • 将每个学生结构体通过结构体指针链接成一条链表的过程叫做组织的过程

我们的软硬件资源被操作系统管理,操作系统通过软硬件的数据对它进行管理,可是软硬件资源的数据太大,那么操作系统很难做管理

但是每一种设备都有共同的属性,我们描述清楚设备的属性,然后通过一定方法组织起来

这样子,操作系统对软硬件的管理就变成了对数据结构的管理 

管理的核心理念

  1. 操作系统管理软硬件资源时,必须先描述起来,再组织 
  2. 在操作系统中,我们管理对象,最终都可以转变为对某种数据结构的增删查改——这个一般叫建模
  3. 描述事物的方法:c语言的struct,c++的类等

    组织方式:依赖于某种数据结构

这个咋这么像面向对象编程的抽象!!!c++的类,STL容器!!!这个直接给了我们提供了这样一种描述事物的方式,这样子就能完成对事物的统一管理

理解了管理的概念,我们就会知道

  • 操作系统中注定存在大量的数据结构

linux操作系统是c语言写的,c语言只能用结构体来描述对象,所以linux只能用struct来描述对象 

2.c/c++库函数调用和系统调用的关系

 我们用c语言编写了一个程序,在屏幕打印一个hello world,但是在但是屏幕是硬件,硬件是受操作系统管理,操作系统不信息任何人,所以操作系统肯定封装了一个c语言函数调用接口

所以他们是上下层的调用和被调用的关系,库函数在上,系统调用在下

3.进程

  1. 进程:一个已经加载到内存的程序
  2. 进程:正在运行的程序
  3. 进程:任务

 我们可以查看linux的进程

widows里面也有进程

事实上

进程就是内核PCB数据结构对象+你自己的代码和数据 

3.1.PCB 

我们知道一个操作系统可以同时进行多个进程

 

程序要运行的话,就得先把相关数据加载到内存中,等待cpu运行产生进程,那么加载进内存该如何管理呢?操作系统需要直接面向加载到内存中的代码嘛?

答案是不需要。

我们可以先把进程类比上面的学生,先描述进程,再把它们组织起来

任何一个进程,在加载到内存的时候,形成真正的进程的时候,操作系统,要先创建描述进程的结构体对象——PCB(process control block),也就是进程控制块

3.1.1.理解PCB的本质

 人是怎么样辨别认识一个事物或者对象?

  • 都是通过属性认识的

举个例子,叫你自我介绍,你基本都是在讲你的属性——名字,兴趣,才能,成就,籍贯等等

当属性的集合够多的时候,你就能知道这个对应的是什么了

比如,它是一个人,他是中国最顶级的动作明星,他是男生,他演过《十二生肖》

我们就很容易得知这个人就是成龙

同样的我们描述进程,就是把进程足够多的属性描述起来,多到只有一个进程与之匹配,那么我们就能将这堆足够多的属性集合来描述进程,这个集合就是PCB,linux操作系统是c语言写的,c语言只能用结构体来描述对象,所以linux只能用struct来描述对象,所以PCB就是一个结构体

这个也是面向对象编程的核心理念

3.1.2.PCB的历程/作用

  1. 进程创建时,操作系统先为它新建一个PCB,该结构之后常驻内存,任意时刻都可以存取,并在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志。
  2. 进程执行时,系统通过其 PCB 了解进程的现行状态信息,以便操作系统对其进行控制和管理;进程结束时,系统收回其PCB,该进程随之消亡。

3.在进程的整个生命期中,系统总是通过PCB对进程进行控制的,亦即系统唯有通过进程的PCB才能感知到该进程的存在。

  • 当操作系统欲调度某进程运行时,要从该进程的 PCB 中查出其现行状态及优先级;
  • 在调度到某进程后,要根据其PCB 中所保存的处理机状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存始址,找到其程序和数据;
  • 进程在运行过程中,当需要和与之合作的进程实现同步、通信或访问文件时,也需要访问 PCB;
  • 当进程由于某种原因而暂停运行时,又需将其断点的处理机环境保存在PCB中。

 

3.2.PCB的组织方式

在一个系统中,通常存在着许多进程的PCB,有的处于就绪态,有的处于阻塞态,而且阻塞的原因各不相同。操作系统怎么管理这么多进程呢?

为了方便进程的调度和管理,需要将各进程的PCB用适当的方法组织起来。

这样子对进程的管理就变成了对数据结构的增删查改

目前有下面几种组织方式

  • 1.线性表方式:不论进程的状态如何,将所有的PCB连续地存放在内存的系统区。这种方式适用于系统中进程数目不多的情况,不适合频繁的进程调度
  • 2.索引表方式:该方式是线性表方式的改进,系统按照进程的状态分别建立就绪索引表、阻塞索引表等。其中进程阻塞可能由于I/O请求、申请缓冲区失败、等待解锁、获取数据失败等原因造成,将其组成一张表忽略了进程的优先级,不利于进程的唤醒。

  • 3.链接表方式:系统按照进程的状态将进程的PCB组成队列,从而形成就绪队列、阻塞队列、运行队列等。

3.3程序段

程序段就是能被进程调度程序调度到CPU执行的程序代码段。

3.4数据段

一个进程的数据段,可以是进程对应程序加工处理的原始数据,也可以是程序执行时候产生的中间或最终结果。

 4.Linux是怎么取管理进程的?

  • 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct 。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)⾥里并且包含着进程的信息。

4.1.task_ struct内容分类

实际上这个结构体的成员非常多,我们只列举最主要的

  1. 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  2. 状态: 任务状态,退出代码,退出信号等。
  3. 优先级: 相对于其他进程的优先级。
  4. 程序计数器: 程序中即将被执行的下一条指令的地址。
  5. 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  6. 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  7. I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  8. 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  9. 其他信息

4.3.组织进程

可以在内核源代码里找到它。

所有运行在系统里的进程都以task_struct双向链表的形式存在内核里。

4.4.查看进程

(1)进程信息可以通过 /porc系统文件夹查看,具体查看那个进程,需要得知其标识符(PID)。

看到以下有很多的数字还是蓝标的,数字就是PID,蓝标说明这是个目录,

 比如接下来我想看看PID为1的进程信息。

这个信息查看的不够详细,所以可以带上 -l选项查看详细信息 

(2)用ps工具来查看

关于ps工具,咱们只需要记住,只查看自己的bash进程选项为 -l,查看系统所有运行的进程选项为aux,这个不加-

这里可以看到,标识符PID展示出来了,还有一个PPID,这是父进程的PID,我们惊奇的发现,下面的ps指令的PPID是上面bash的PID。

命令行上的命令的父进程基本上都是bash。 

相关文章:

【Linux】进程2——管理概念,进程概念

1.什么是管理? 那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢? 很简单,先把进程描述起来,再把进程组织起来! 我们拿大学为例子 最典型的管理者——校长最典型的被管理…...

【C++】植物大战僵尸杂交版自动存档——防闪退存档消失

植物大战僵尸杂交版现已更新到v2.0.88,闪退问题还是偶有发生,参考网上现有的方案,简单实现了一个。 原理就是监控存档目录的文件变化,一旦有新的存档,则将其备份。如发生闪退,则还原备份即可。 原目录&…...

通过Excel,生成sql,将A表数据插入B表

文章目录 投机取巧的方式,进行表数据初始化通过navicat搜索A表数据,然后复制进excel中通过excel的函数方式,将该批量数据自动生成插入B表的sql语句然后一次性拷贝生成的sql语句,放进navicat中一次执行,直接完成数据初始化...

如何在MySQL中实现upsert:如果不存在则插入?

目录 1 使用 REPLACE 2 使用 INSERT ... ON DUPLICATE KEY UPDATE 使用 INSERT IGNORE 有效会导致 MySQL 在尝试执行语句时忽略执行错误 INSERT 。这意味着 包含 索引或 字段 INSERT IGNORE 中重复值的语句 不会 产生错误,而只是完全忽略该特定 命令。其明显目的是…...

MyBatis中 set标签

1、set标签特点: set标签用于更新语句中set标签解析为set关键字set可以去除跟新语句中无用的逗号通常是和if标签一起使用 2、set标签的使用 编写接口方法编写sql语句 注意 当set标签中有条件成立时就会附加set关键字,字段为null时该列不会被更新。se…...

mysql自带分页

select 查询列表 from 表 limit offset,pagesize; offset代表的是起始的条目索引,默认从0开始size代表的是显示的条目数offset(n-1)*pagesize -- 第-页 limit 0 5 -- 第二页 limit 5,5 -- 第三页 limit 10,5 -- 第n页limit(n-1)*pagesize,pagesize -- pages…...

小学一年级数学上册,我终于学完了

目录 一、背景二、过程1.我对课程中的一些知识的思考2.我对于产品的思考3.我对自己儿子与知识产品结合的思考4.产品反馈的那些有意思的数据 三、总结 一、背景 简约而不简单,即是曾经的再现,也是未来的延伸,未来已来,就在脚下。 …...

使用wireshark分析tcp握手过程

开启抓包 tcpdump -i any host 127.0.0.1 and port 123 -w tcp_capture.pcap 使用telnet模拟tcp连接 telnet 127.0.0.1 123 如果地址无法连接,则会一直重试SYN包,各个平台SYN重试间隔并不一致,如下: 异常站点抓包展示&#xff…...

在ArcGIS中,矢量数据有.shp,.mdb和.gdb,为啥建议使用gdb?

在ArcGIS中,矢量数据可以存储在多种格式中,如 .shp (Shapefile)、.mdb (Microsoft Access Database) 和 .gdb (Geodatabase)。每种格式都有其特定的用途和优缺点,但通常推荐使用 Geodatabase(.gdb)格式,原因如下: 1. 更高的数据容量和性能 容量: Shapefiles 和 MDB 文…...

C++STL---stack queue模拟实现

前言 对于这两个容器适配器的模拟实现非常简单,因为stack和queue只是对其他容器的接口进行了包装,在STL中,若我们不指明用哪种容器作为底层实现,栈和队列都默认是又deque作为底层实现的。 也就是说,stack和queue不管是…...

Spring Cloud系列——使用Sentinel进行微服务保护

文章目录 一、引言1. 雪崩问题的产生原因2. 解决雪崩问题的思路 二、微服务保护1. 服务保护方案1.1 请求限流1.2 线程隔离1.3 服务熔断 2. Sentinel2.1 安装2.2 微服务整合2.2.1 请求限流2.2.2 线程隔离①OpenFeign整合Sentinel②配置线程隔离 2.2.3 服务熔断①编写降级逻辑②配…...

Android开机动画,framework修改Bootanimation绘制文字。

文章目录 Android开机动画,framework修改Bootanimation动画绘制文字。opengl绘制源码分析 Android开机动画,framework修改Bootanimation动画绘制文字。 frameworks/base/cmds/bootanimation/bootanimation.cpp 绘制时间的一个方法 // We render 12 or …...

2024河南高考作文ChatGPT

阅读下面的材料,根据要求写作。(60分) 随着互联网的普及、人工智能的应用,越来越多的问题能很快得到答案。那么,我们的问题是否会越来越少? 以上材料引发了你怎样的联想和思考?请写一篇文章。 要…...

整理好了!2024年最常见 20 道分布式、微服务面试题(一)

一、什么是分布式系统? 分布式系统是由多个独立的计算机(通常称为节点)组成的系统,这些计算机通过网络连接在一起,协同工作以完成一个共同的任务或服务。以下是分布式系统的关键特点和概念: 网络依赖性&am…...

要想数据形成好的数据集,必须数据治理(目的之一是防止大模型产生灰色数据等),用于炼丹(训练数据私有化模型)的数据才是好数据

数据治理:必要性、实施方法及挑战 引言 在当今数字化时代,数据已经成为企业最重要的资产之一。随着数据量的爆炸性增长,如何有效地管理和利用数据成为企业面临的重大挑战。数据治理(Data Governance)作为一种系统化的…...

外部mysql导入

利用这个命令&#xff1a; mysql -u username -p database_name < file.sql 然后就这样。成功导入。...

Qwen-VL论文阅读

论文地址 其他同学的详细讲解 模型结构和参数大小 &#xff08;1&#xff09;LLM&#xff1a;Qwen-7B &#xff08;2&#xff09;Vision Encoder&#xff1a;ViT架构&#xff0c;初始化参数是 Openclip’s ViT-bigG。 在训练和推理过程中&#xff0c;输入的图像都被调整到…...

超详细的java Comparable,Comparator接口解析

前言 Hello大家好呀&#xff0c;在java中我们常常涉及到对象的比较&#xff0c;不同于基本数据类型&#xff0c;对于我们的自定义对象&#xff0c;需要我们自己去建立比较标准&#xff0c;例如我们自定义一个People类&#xff0c;这个类有name和age两个属性&#xff0c;那么问…...

Java使用GDAL来解析KMZ及KML实战

目录 前言 一、在GQIS中浏览数据 1、关于空间参考 2、属性表格 二、GDAL的相关驱动及解析实战 1、GDAL中的KMZ驱动 2、GDAL实际解析 三、数据解析成果 1、KML解析结果 2、KMZ文件入库 四、总结 前言 在前面的博客中讲过纯Java实现Google地图的KMZ和KML文件的解析&…...

【vuex小试牛刀】

了解vuex核心概念请移步 https://vuex.vuejs.org/zh/ # 一、初始vuex # 1.1 vuex是什么 就是把需要共享的变量全部存储在一个对象里面&#xff0c;然后将这个对象放在顶层组件中供其他组件使用 父子组件通信时&#xff0c;我们通常会采用 props emit 这种方式。但当通信双方不…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...