【Linux】进程概念(一):从冯诺依曼体系到 PCB 的进程核心解析

文章目录


前言

本节我们将学到以下内容:

  • 管理本质:先描述,在组织
  • 系统调用与库函数是上下层关系
  • 进程 = PCB(内核数据结构) + 代码和数据
  • 管理进程不是对数据做管理,而是对PCB做管理

一、冯诺依曼体系结构

我们常⻅的计算机,如笔记本。我们不常⻅的计算机,如服务器,⼤部分都遵守冯诺依曼体系。

截⾄⽬前,我们所认识的计算机,都是由⼀个个的硬件组件组成

  • 输⼊单元:包括键盘, ⿏标,扫描仪, 写字板等(还有磁盘、网卡)
  • 中央处理器(CPU):含有运算器和控制器等,运算器主要完成算数运算和逻辑运算,控制器是控制代码,进行逻辑控制的。
  • 输出单元:显⽰器,打印机等(还有磁盘、网卡)

关于冯诺依曼,必须强调⼏点:

  • 这⾥的存储器指的是内存,而我们熟悉的如磁盘、固态硬盘通常是外存,是属于输入输出设备范畴。
  • 不考虑缓存情况,这⾥的CPU能且只能对内存进⾏读写,不能访问外设(输⼊或输出设备)------数据层面
  • 外设(输⼊或输出设备)要输⼊或者输出数据,也只能写⼊内存或者从内存中读取。
  • ⼀句话,所有设备都只能直接和内存打交道

接下来我们再分点更细致的聊一聊冯诺依曼体系结构:

1、之前我们认识过一个结论:可执行程序要运行必须先加载到内存里,那如何从冯诺依曼体系结构的角度来解释呢?

这里先介绍一个有关存储设备的效率的结论:输入输出设备(外设) << 内存 << CPU,也就是如果离CPU更近,效率就会更高,但是容量更小,成本也更高。

那么如果CPU直接和输入输出设备打交道,它们之间的效率差距就太大了,所以CPU通常不和输入输出设备直接打交道,通常需要存储器(内存)来起过度作用。

这里又可以得出一个结论:内存是外设和CPU之间的缓存,所有可执行程序都会事先预加载到内存中,所以计算机整体的效率由存储器决定。如果没有内存的话,计算机效率就由外设效率决定,而外设效率非常低,如果抛弃掉内存,直接用寄存器的话,效率固然会更高,但是相应的成本也会变更高。

所以正是使用冯诺依曼结构,引入内存,可以让用户以不怎么高的成本,获得一台效率不错的计算机,是内存的出现让计算机更有 "性价比",人人都能买得起计算机,互联网时代才会到来。

2、我们再从数据流动层面来认识一下冯诺依曼体系结构,数据从输入设备流向内存本质就是input,从内存流向输出设备本质就是output,这就是我们之前熟悉的IO。

打开文件操作本质就是把在硬盘中的文件数据预先加载到内存里。

我们需要认识到数据流动本质就是拷贝,所以计算机效率在数据流动层面就是设备间拷贝的效率。

二、操作系统(Operator System)

概念

操作系统本质就是一款软件,它主要用来对软硬件进行资源管理。我们从打开计算机到计算机运行之间的这段时间其实就是将处在磁盘的操作系统软件加载到内存里所需的时间。

操作系统包括:

内核(进程管理,内存管理,⽂件管理,驱动管理)

其他程序(例如函数库,shell程序等等)

以后我们谈操作系统主要是是指狭义操作系统。

设计OS的⽬的

这里小编先输出一个结论:任何计算机问题,都可以通过添加一层软件层来解决 ,由此可以推出:计算机的软硬件体系结构,本质是层状的

上面是计算机的软硬件体系结构的示意图,底层硬件由冯诺依曼体系结构组织,其他层下面再详细解释。

首先我们需要认识到操作系统存在的必要性:

我们使用计算机,本质就是通过软件访问计算机的各种硬件资源,用户的需求是无限的,而硬件资源的有限的,所以就需要把硬件资源管理好,来满足用户的各种需求。

结合上面的图片我们可以总结出操作系统是通过对下管理 好软硬件资源(手段),对上给用户提供一个良好(稳定、安全、高效)的运行环境。(目的)

这里我们重点要理解管理这个词,管理可以浓缩成这六个字:

先描述,再组织,我们要管理世界上的所有事物,首先要把它描述成一个类或结构体,然后再把相关联的事物通过某种数据结构组织在一起。这六个字也揭示了世界管理的本质,并且会伴随我们整个linux系统部分的学习。

系统调⽤和库函数概念

在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤,这部分由操作系统提供的接⼝,叫做系统调⽤。系统调⽤本质就是操作系统提供的函数,用户传参数后系统调用返回对应值。系统调⽤可以让操作系统安全地被用户访问。
系统调⽤在使⽤上功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层⽤⼾或者开发者进⾏⼆次开发。比如我们使用的C标准库和C++标准库,这也表示如果我们学会了任意一门编程语言就能操作计算机。

这里我们可以认识到库和系统调用是上下层的关系,库在上层,系统调用在下层。

这里小编还想介绍一点,只要库函数访问了硬件外设,那么对应库函数内部一定封装了系统调用,大部分库函数其实都封装了系统调用。
我们前面介绍的系统调⽤和库函数的使用都需要使用者有一定计算机基础,也就是开发者,但是除了开发者还有计算机纯正的使用者和小白,所以在库函数之上还有各种上层应用以供这些人使用,比如linux的shell、windows的图形化界面、或者各种各样的APP。
这里小编举一个例子来加深理解上面的层状结构,我们通常所说安卓是基于linux内核开发的,结合层状结构解释就是安卓是基于linux的系统调用层重新包装安卓自己的开发库,也就是是说安卓和linux操作系统在系统调用层及以下是完全一样的。所以安卓斌不需要自己做底层的软硬件资源管理工作,而是交给linux内核,自己只用在上层开发自己所需的框架和库函数就行了。
这里我们可以理解要发明一门语言,除了需要语言的语法和支持它的编译器,语言本身还需要提供各种基本功能,这些基本功能需要基于系统调用封装成对应的语言库来实现。

三、进程基本概念

描述进程-PCB

我们前面对操作系统有了宏观认识后,接下来就需要更细致的学习操作系统的各种模块细节,我们前面已经知道了操作系统有四大核心功能模块(子系统),我们接下来先学习其中的进程管理模块。首先我们从进程的定义入手,在课本中,进程定义如下:
进程(Process) 是指程序的一次动态执行过程,是系统进行资源分配和调度的基本单位。 光看定义我们很难理解,这里小编结合示例来解释一下,不论是电脑还是手机,我们启动一个可执行程序或者app系统就会把在磁盘里对应的二进制可执行程序加载到内存,启动的每一个可执行程序都可以叫做是一个进程。

我们可以同时启动多个应用程序,所以在系统当中会同时存在大量进程。

那操作系统是如何把这些大量的内存管理起来的呢?所以这里也遵循先描述,再组织,需要先描述一个进程,在操作系统中,进程相关的所有属性信息 都被包含在PCB(Process Control Block)中,我们知道操作系统是用C语言写的,所以这里的PCB本质就是一个结构体。所以系统在将某一进程加载到内存分为三步,首先会对当前进程创建对应的PCB,然后将可执行代码数据加载进内存,再将PCB和内存中的代码数据关联起来。

之后再组织的含义就是通过某种数据结构将所有进程的PCB组织起来,那么对进程的管理,就转化成了对该种数据结构的增删查改。所有进程的 PCB组合到一起构成了系统中进程管理的内核数据结构集合。 所以以今天我们可以总结:
进程 = PCB(内核数据结构) + 代码和数据 补充:PCB 是内核数据结构中 "专门描述进程" 的那一部分

在linux系统下,PCB叫做task_struct:

cpp 复制代码
struct task_struct 
 {} 

至此,为什么?是什么? 怎么办?中前两个问题我们已经清楚了,为什么有PCB是因为先描述再组织 ,PCB是用来描述进程的内核进程控制块,里面包含了进程的所有属性。至于怎么办就是我们接下来要介绍的task_struct内部有关进程的常见属性内容分类和组织形式。

task_ struct

内容分类

  • 标⽰符(pid): 描述本进程的唯⼀标⽰符,⽤来区别其他进程。一般是无符号整数。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器(PC指针): 程序中即将被执⾏的下⼀条指令的地址。

CPU当中存在一个寄存器PC,无法被我们用户直接使用,它里面存储的就是即将被执⾏的下⼀条指令的地址。CPU当中还有一个IR(Instruction

Register)寄存器里面存储的是当前CPU正在执行的指令。

  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。

PCB中的内存指针可以直接或间接的找到task_ struct所对应的代码或数据。

  • 上下⽂数据: 进程执⾏时处理器的寄存器中的数据[休学例⼦,要加图CPU,寄存器。

当一个进程在持久运行时,会在CPU中形成大量的临时数据,这些临时数据包括但不限于代码在哪一行运行,进程创建的函数栈帧相关数据等等,这些临时数据都存在CPU内部的一套寄存器中,而这里CPU寄存器里存放有关该进程的临时数据就叫做该进程的硬件上下文。

小编这里再介绍一个进程的动态属性来和刚才介绍的硬件上下文相结合:

我们可以打开多个应用程序并同时运行可以说明CPU执行进程的逻辑不是执行完一个进程后再执行下一个,所以当进程在被执行时,是会被切换和调度的,这是进程的动态属性,当进程被切换和调度时一定会伴随CPU对进程的硬件上下文进行保存和恢复工作,以防进程数据的丢失和不同进程间数据的干扰。

(以目前的知识储备我们暂时认为硬件上下文会被保存到进程的test_struct里)

  • I∕O状态信息: 包括显⽰的I/O请求,分配给进程的I∕O设备和被进程使⽤的⽂件列表。
  • 记账信息: 可能包括处理器时间总和,使⽤的时钟数总和,时间限制,记账号等。
  • 其他信息:具体详细信息后续会介绍

组织进程

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


以上就是小编分享的全部内容了,如果觉得不错还请留下免费的关注和收藏
如果有建议欢迎通过评论区或私信留言,感谢您的大力支持。
一键三连好运连连哦~~

相关推荐
游九尘3 小时前
服务器都是用的iis, 前端部署后报跨域,不是用同一个服务器 是前端项目的服务器做Nginx转发,还是后端项目的服务器做Nginx转发?
服务器·前端·nginx
tangweiguo030519873 小时前
Django REST Framework 构建安卓应用后端API:从开发到部署的完整实战指南
服务器·后端·python·django
JAVA数据结构3 小时前
Linux 运维常用命令详解
linux
huangyuchi.3 小时前
【Linux系统】初见线程,概念与控制
linux·运维·服务器·页表·linux线程概念·linux线程控制·分页式存储管理
葡萄城技术团队3 小时前
SpreadJS:让多源数据筛选排序如 Excel 般便捷高效
运维·服务器·excel
宇钶宇夕3 小时前
S7-200 SMART 实战:自动包装控制系统的指令应用拆解
运维·自动化
MacroZheng3 小时前
堪称一站式管理平台,同时支持Linux、MySQL、Redis、MongoDB可视化管理!
java·linux·后端
人生匆匆3 小时前
openEuler 24.03 (LTS-SP2)简单KVM安装+桥接模式
linux·服务器·桥接模式
代码的余温4 小时前
UNIX与Linux:五大核心差异解析
linux·服务器·unix