当前位置: 首页 > 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。 

相关文章:

  • c++调用动态库LNK2019无法解析的外部符号LNK1120无法解析的外部命令
  • 【C++】植物大战僵尸杂交版自动存档——防闪退存档消失
  • 【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
  • 常见的api:Runtime Object
  • day 37 738.单调递增的数字
  • Springboot引入redis启动报错问题的解决
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • 【教程】如何实现WordPress网站降级(用于解决插件和主题问题)
  • C++STL---stack queue模拟实现
  • 混合关键性系统技术【同构异构】【SMP、AMP、BMP】【嵌入式虚拟化】
  • C语言中typedef的四种用法(附带详细解析!!)
  • 【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘
  • 玩转微服务-GateWay
  • 容器多机部署eureka及相关集群服务出现 Request execution failed with message: AuthScheme is null
  • 阿里 Qwen2 模型开源,教你如何将 Qwen2 扩展到百万级上下文
  • [PHP内核探索]PHP中的哈希表
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • mysql外键的使用
  • php ci框架整合银盛支付
  • Redis 中的布隆过滤器
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 关于字符编码你应该知道的事情
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 入门到放弃node系列之Hello Word篇
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 通过git安装npm私有模块
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • (4)事件处理——(7)简单事件(Simple events)
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (循环依赖问题)学习spring的第九天
  • (转)linux 命令大全
  • (转)视频码率,帧率和分辨率的联系与区别
  • .NET Core Web APi类库如何内嵌运行?
  • .NET gRPC 和RESTful简单对比
  • .NET HttpWebRequest、WebClient、HttpClient
  • .net 程序发生了一个不可捕获的异常
  • .NET是什么
  • /boot 内存空间不够
  • /proc/stat文件详解(翻译)
  • ::前边啥也没有
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • []T 还是 []*T, 这是一个问题
  • []常用AT命令解释()
  • [android] 天气app布局练习
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [Angular] 笔记 6:ngStyle
  • [BZOJ 1040] 骑士
  • [BZOJ] 2044: 三维导弹拦截