Linux进程概念(一)

1.冯诺依曼体系结构

下面进入系统部分,进入第一个话题,先来谈谈硬件:我们现在遇到的各种各样的计算机,比如笔记本、台式机、服务器等它本质是一大堆硬件集合,有cpu、内存、显卡等各种设备。不是说把这么多硬件毫无章法的放在一起就是计算机了,硬件和硬件之间首先要有协同的能力,就注定了硬件和硬件之间要能组合好,构成一个系统才能对外提供输出、计算服务。我们当代计算机它的基本构成都是由冯若依曼体系结构来构成的计算机基本单元:

输入设备把数据放到存储器,然后将数据读取到运算器中进行运算,把运算结果写回存储器,再将数据从存储器写到输出设备。图上的设备都是硬件,用这种结构构建出的就称为冯诺依曼体系结构。首先看看存储器指的是什么?指的是内存。那输入设备通常指什么?计算机是为了给人提供服务的,前提条件是人要把数据先交给计算机,可计算机只认识二进制,人平时输入的是人懂的语言,因此决定了要有一些设备把信息转换为二进制交给计算机,也决定了人没法直接访问内存怎么样,必须要有一些输入输出设备。常见的有键盘、摄像头、话筒、磁盘、网卡。输出设备一般有:显示器、播放器、磁盘、网卡等。把输入、输出设备也叫做外部设备,通过上面发现有的设备是纯的输入或输出,有的设备即是输入又是输出。下面说说运算器和控制器,运算器对我们输入的数据进行计算任务(算数运算、逻辑运算),这样就可以把运算完的数据打印到输出设备上了。但什么时候把数据写到存储器,什么时候运算完了再读到存储器需要有东西来统一协调,这个东西就是控制器,它可以对我们的计算硬件流程进行一定的控制,我们把运算器和控制器也统称为中央处理器(CPU)。以上介绍了五大单元,它们构成了五大块功能体,这五大块功能模块每一个都是独立个体。这五个独立个体能构成计算机,注定了各个硬件单元必须用"线"接起来,这个线叫总线,分为系统总线和IO总线。cpu和内存交互的线我们称为系统总线,内存和外设交互的线我们称为IO总线。冯诺依曼体系不仅仅规定了硬件构成,它还规定了一些软性东西如数据,必须是数据先从输入设备到内存中;中央处理器不能从外拿取数据只能从存储器拿数据,拿完做计算后不能把数据直接输入到外设中,必须再写回存储器,再刷新到输出设备。

下面说说存储的背景知识:像cpu、内存、磁盘等很多设备是具有数据存储能力的。像cpu内部对应的寄存器存储效率是非常高的,内存的存储效率也是很不错的,像外设的存储效率一般是很低下的。在存储领域有个存储金字塔:

在计算机中进行数据存储时,如果存储容量很大,它的存储效率都会比较低一些,价格也会低。一般在存储生态中,距离cpu越远的设备所对应的容量会越大,效率会越低。cpu的存储速度是纳秒级别的,内存是微妙级别,外设是毫秒级别,因此存储是分级的。那计算体系结构中为啥要有存储器呢?直接用cup替代不就行了,反正数据给内存,再给cpu,不妨直接给?因为外设和cpu的速度代差太大了(木桶效应),若直接交互整个计算机结构效率就下降了,所以要引入内存,平衡起来。这样输入设备给存储器给数据时,cpu内也在运算着数据,串行变并行,外设影响变小了,所以可将存储器看作硬件级别的缓存空间。也正是因为有存储器,我们才能用到廉价的计算机。再看下一部分,一个程序写好在磁盘存着,此时要运行,必须要先加载到内存中运行,为什么?因为写的程序对应的代码和数据都要被cpu执行和计算,要让cpu运行代码和数据必须要到内存里,因为cpu只从内存拿数据,所以注定了要把外设的数据加载到内存,这都是由冯诺依曼体系结构规定的。再看下一个问题,为什么我们写的进度条,默认显示的数据是可能会缓存起来的,在哪里缓存?被缓存到了内存中的某个区域,缓存的本质就是按照冯诺依曼体系结构的正常流程写到内存的,只是没有刷新罢了,数据计算完后的结果也要在存储器中进行保存。

下面来看一个场景:我和一个人用电脑qq聊天,整个数据是怎么流动的(不考虑网络)?首先两个人的计算机都各自是一个冯诺依曼体系结构,然后两个人都要登陆qq,这个就相当于把qq这个软件加载到计算机中,经过网络后到了朋友的网卡,然后交给内存,再交给cpu对数据解包,然后写回内存,再刷到朋友的显示器:

这就叫基于冯诺依曼整个软件的数据流动。再比如我给我朋友发了一份实验报告,此时整个过程怎么走的?首先实验报告是文档,一个保存数据的文件,此时从我的磁盘读取数据到内存,经过cpu处理写回到内存,再通过网卡发送;同理朋友的网卡收到数据,再写到内存,通过cpu处理写回内存,再把文档放到磁盘上。因此和朋友互传文件时本质是,把数据从我的磁盘远程的通过两台冯诺依曼拷贝到了对方的磁盘(先简单这样理解)。

2.操作系统(Operator System)

下面进入第二个话题,谈谈软件------操作系统。前面说了冯诺依曼体系结构,所有的设备都为我们提供了功能,那谁用这些功能?比如键盘只具备获取用户数据,把用户数据写到内存的能力,但什么时候用这个能力,应该怎么用?所以是需要有一个控制逻辑在上面的,因此操作系统诞生了,操作系统是一款进行管理的软件,首先要管的是上面说的一堆硬件(未来也要对软件管理,就像人可以管理设备也能管理人一样)。下面有些问题:为什么操作系统要做管理?它所谓的管理是什么?它具体是怎么管的?一般说操作系统分两部分,第一部分是OS本身,它做进程、内存、文件、驱动管理,把这最核心的部分称为OS的内核;除了内核外还包括其它程序,比如函数库,shell程序,合起来称为一套操作系统。以上是宏观谈OS,细微上谈只是指的是内核。操作系统存在的重大意义有二个:

计算机上的宏观结构是由层状结构构成的:计算机中最底层的是一堆硬件,这堆硬件最终以冯诺依曼体系结构把硬件之间用总线连接起来。所有硬件要能被OS控制起来必须要有与硬件匹配的驱动程序的概念,所有硬件要被软件去访问都要配上对应的驱动程序,若没有驱动程序硬件是访问不了的(鼠标插上后过一会可以动的例子),驱动程序可以把硬件动起来,具体怎么动再由上层决定。然后才是对应的OS,它的核心功能一共分为4块:内存/进程/文件/驱动管理。那先看为什么有OS?首先OS帮助用户,管理好下面的软硬件资源。那为什么OS要把软硬件资源管理好?管理不好电脑会时常出问题,管理好是为了给用户提供一个良好、稳定、高效、安全的运行环境。因此OS存在的理由是,通过管理好底层的软硬件资源(手段),为用户提供一个良好的执行环境(目的)。这里的用户包含普通用户、程序员,那作为一名普通用户,是真的在直接使用操作系统吗?没有,作为普通用户用的是抖音、淘宝等客户端,用的其实是程序员开发出来的软件。其实根上是程序员用了OS接口,程序员才能基础OS之上开发出好玩的应用让用户用。

再看下一部分:平时我们用电脑大部分动作都会转为某种硬件动作,比如打开音乐,不就是软件通过话筒把声音放出来。但我们并没有用任何访问硬件的接口,用的是程序员提供的接口。我们对应的用户不能绕过OS直接访问底层硬件,因此用户只能通过OS访问底层硬件,那用户应该怎么根据OS来访问?操作系统是个软件,它里面会有各种数据,这些数据会被用户访问,可是OS本身不相信任何用户(像银行不相信人一样)。因为OS里面的数据很重要,怕用户乱弄乱改OS核心数据,因此OS需要把自己封闭起来。但是为了给用户提供良好的环境,就要给用户提供让用户访问OS内数据的接口。因此OS为了保证自己数据安全,也为了保证给用户能够提供服务,OS以接口的方式给用户提供函数的入口,来获取OS内部的数据。那所谓的接口又怎么理解?OS是c语言写的,所以接口是OS提供的用c实现的自己内部的函数调用(类比银行的小窗口),也将OS为用户提供的访问接口称为系统调用。所以所有访问OS的行为,都只能通过系统调用完成。因此OS再往上有了system call,系统调用接口。有了系统接口,就允许用户对底层软硬件资源进行间接管理了,所以有很多人基于系统调用接口来设计实现各种软件,比如外壳程序,执行命令就要把命令从磁盘加载到内存,外壳本身没有这个能力,是通过调用系统接口来完成的。但OS的调用接口使用难度很大,所以有人对这些接口做了各种上层封装,甚至涉及了各种语言帮助构成,把它们封装成了库。因此任何一门语言,要进行间接访问硬件必须要经过OS,这就必须调系统调用,这人也就可以让用户进行开发了(以上包含了前两个问题)。

理解了上述后,如何更好理解OS是怎么做到软硬件资源管理的呢?下面谈谈什么是管理:管理是什么不知道,但我们一定知道被管理,被管理后很多事情自主权并不在我们手上。比如学校就是在管理体系下诞生的系统,在学校我们就是最典型的被管理者。下面有个问题,我们在学校见过校长吗?校长有早上敲宿舍门来看学生为啥不上课吗?因此我们可以发现一个奇怪的现象,我们学生是被管理者,我们对校长是管理者是有共识的,可是我们竟然没有见过管理者确能把我们管起来,因此管理者和被管理者是不需要见面的。那面都不见,管理者是怎么做好管理的呢?比如校长手上有学生上了几门课、表现情况、考试情况等信息,所以事实上不用见面,只要能拿到学生身上的一些状态数据就能对学生实行某种意义上的管理。因此只要能够得到管理信息,就可以在未来进行管理决策。因此管理的本质,是通过对数据的管理,达到对人的管理(比如校长拿到了学生排名,可发奖学金)。但是校长连学生的面都不见,校长怎么拿到学生的数据呢?也就是拿数据不一定通过管理者的手,在管理者和被管理者之间还有个角色是辅导员,那辅导员是管理者吗?我们世界上所做的事情就分两种:1.决策。2.执行。显然辅导员是什么角色我们不清楚,但我们明显感受到管理者的核心工作在决策上,导员对学生大部分工作没有决策权,因此不是真正意义上的管理者,导员只是在做执行层面上的事情。校长可以通过辅导员拿数据,也就是决策者通过执行者拿到数据。这样三方关系构成了一个层状结构,校长相当于OS,辅导员相当于驱动程序,学生相当于被管理的软硬件资源。因此OS要管理软硬件资源不需要和硬件见面,由驱动程序获取数据交给OS,OS做某种意义上的管理。比如有计算机在用网卡,网卡现在有问题,驱动程序就把有问题的数据交给OS,OS检测到硬件有问题向上报给用户,这就是一种管理体系。但是比如学校只有两个学生,导员把2个学生的数据拿给校长,校长很好做决策。但如果学校有上万名学生,每个导员把各种大量数据给校长,校长面对大量数据很难做决策。那如何让校长高效的进行管理决策工作呢?在校长心中所有同学是一样的,比如虽然大家的名字不一样,但大家都有个属性是姓名;虽然大家电话不一样,但大家都有个属性是电话。于是校长做了一个标准化学生模板:

类似于这样的表格。以前辅导员给的数据是乱的,现在校长让辅导员按照他的表格要求获取学生信息,拿到信息后给校长,此时校长想找什么信息遍历就行,其中校长把学生用表格修饰的行为称为描述过程。但这样看表格还是很麻烦,于是校长定义了一个学生结构:

把每个学生初始化属性形成了每个独立的学生对象,再用指针把每个学生对象连接起来,这样校长只要把学生链表结构管理好就可以了。那校还要一个个数吗?不用,他写了链表的配置方法,于是校长成功的将对学生的管理工作转为了对链表的增删查改,这样把学生连接起来构成某种数据结构的过程叫做组织的过程。因此软硬件资源将来要被OS管理,OS只需要对数据管理,所以OS拿到了软硬件资源的数据。可是软硬件资源数据很大,OS很难很好做管理,每一种硬件都有公共属性,都定义成设备对象,这样OS对设备的管理变成了对数据结构的管理。把这样的思路称为先描述(按属性定义结构,有个类型),再组织(组织为数据结构),因此所有管理动作变为最终都可以转化为对某种数据结构的增删查改。比如我们以前写通讯录:

先写结构包含了人的基本属性,再写了一个结构把许多人组织起来,然后再写了各种方法。通讯录就是要对一个人的基本信息做管理,因此就必须先描述,再组织。再如stl本质是对象的组织方式,c++天然为我们先描述,再组织,只不过组织人家用容器帮我们做了。因此如何管理设备就是先描述,再组织。所以OS要管理各种设备,其实OS内部用同一个结构体描述了一个个的设备,不同的设备添上自己的属性构建出不同对象,再把所有对象用数据结构管理起来;OS中要增或删设备都变成了增删查改,所以注定OS中一定存在大量的数据结构。

再看下一部分:比如有A和B两个学校,A学校有个同学学计算机学的好,B学校没有,所以B学校校长想借A学校学生打个比赛。但是B学校校长直接去找学生,此时A学校的校长会这样想:我是他的管理者,你应该先要找我,因此正确的做法是B校长去找A校长。那我们用printf把数据写到了硬件上,不是我们直接访问写到硬件上的,因为硬件是被人管理的,要操作硬件就要让他的管理者知道,因此必须贯穿OS。而曾经说过OS是不相信任何人的,只会给用户提供系统调用接口,注定了上层printf属于一个c标准库函数,它的底层绝对要封装系统调用接口,因此库函数和系统调用是上下层的调用和被调用关系。继续看下一部分,现在也不知道进程是什么,但OS里面可能会有很多进程,那OS管理进程应该怎么管理?先描述,再组织。所以任何进程都要先有描述进程的结构体,这个结构体对象就变成了某一个进程,接下来把这些对象再以特定的数据结构组织起来,所以对进程的管理变成了对某种数据结构的增删查改。

相关推荐
煜3642 小时前
Linux初识与基本指令
linux·运维·服务器
执笔论英雄3 小时前
【大模型推理】cudastream 学习
linux·运维·学习
shada3 小时前
在Linux x86_64系统中编译mission
linux
佑白雪乐3 小时前
<Linux基础第14集>总结前面知识点,不含Linux命令
linux·运维·服务器
YLXA3 小时前
1.helle_cuda学习
linux·学习·算法
Lau_way3 小时前
windows通过xshell局域网连接linux
linux·运维·服务器
ken22323 小时前
(a-) 在不同软件包里:相同名称和用途的软件工具,功能不完全一样 + 查询网络路径中的最小 MTU 值工具 (***)
linux·运维·服务器
tjuarch3 小时前
技术备忘录:华硕 A43S (Ubuntu) 插电限频故障修复
linux·chrome·ubuntu·技术备忘录
爱莉希雅&&&3 小时前
haproxy安装以及haproxy+nginx简单案例详解
linux·运维·nginx·haproxy