Linux 进程前篇(冯诺依曼体系结构和操作系统)
目录
一.冯诺依曼体系结构
1.概念
2.硬件层面的数据流
3.总结加补充
二.操作系统 (Operating System)
1.概念
2.设计OS的目的
3.定位
4.操作系统的管理
5.计算机体系的层状结构
在我们认识进程之前,我们先了解什么是冯诺依曼体系结构
一.冯诺依曼体系结构
1.概念
冯 • 诺伊曼结构,是一种将程序指令存储器和数据存储器合并在一起的电脑设计概念结构。
冯·诺伊曼理论的要点是:计算机的数制采用二进制逻辑;计算机应该按照程序顺序执行。人们把冯·诺伊曼的这个理论称为冯·诺伊曼体系结构。
这是数学家冯·诺伊曼于 1946 年提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。
我们常见的计算机,如笔记本;我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
我们用的电脑基本都是一个个硬件组成起来的
输入设备: 键盘、鼠标、扫描仪、写板、磁盘等。
输出设备:显示器,打印机等。
由运算器和控制器组成的CPU:运算器完成加、减、乘、除等算术运算以及与、或、非、异或等逻辑运算以及移位、补位等运算。 控制器从内存中取指令、翻译指令、分析指令,然后根据指令的内存向有关部件发送控制命令,控制相关部件执行指令所包含的操作。
存储器:存储程序和各种数据,但都要以二进制文件形式存储
冯诺依曼体系结构的计算机该如何工作呢?
输入设备输入数据时,先将数据放到存储器里储存,因为存储器自己是没有计算能力的,所以CPU读取存储器里的数据进行运算和逻辑操作,并通过一些方式写回到存储器中,最后输出设备从存储器中读取数据
为什么不直接将数据放入CPU运算输出,而是先放入存储器中,通过CPU的运算再输出呢?
从效率层面上说
CPU寄存器 > L1~L3Cache > 内存 > 外设(磁盘)> 光盘磁带
CPU读取速度最快效率更高,而输入设备和输出设备又非常的慢,如果没有存储器(也就是内存),那么整体的效率是非常慢的。
所以我们要先把数据放到存储器中,再让 CPU 一级一级的去访问,而且 CPU 在运算的同时,输入/输出设备还可以继续将数据写入内存或从内存中读出,这样就可以将 IO 的时间和运算的时间重合,从而提升效率。
2.硬件层面的数据流
通过了解冯诺依曼体系结构,通过对在QQ上发送信息就行描述数据的流动过程
在 QQ 上发送消息,数据的流动过程:
电脑联网后,我用键盘敲下要发送的消息:“在吗?”,此时输入设备是键盘,键盘将该消息写入到内存中,CPU 间接从内存中读取到消息。对其进行运算处理后,再写回内存,此时输出设备网卡从内存中读取消息,并经过网络发送到对方的网卡,同时输出设备显示器从内存中读取消息并刷新出来,显示在我的电脑上。
我朋友的电脑的输入设备是网卡,接收到消息后,网卡将该消息写入到内存中,CPU 间接从内存中读取到消息,对其进行运算处理后,再写回内存,此时输出设备显示器从内存中读取消息并刷新出来,显示在我朋友的电脑上。
所以硬件层面的数据流:
键盘(输入设备)→内存→CPU→内存→网卡→网卡经过网络到对方网卡→内存→CPU→内存→显示器(输出设备)
3.总结加补充
- 这里的存储器指的是内存。
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
- 一句话,所有设备都只能直接和内存打交道。
二.操作系统 (Operating System)
1.概念
- 内核(进程管理,内存管理,文件管理,驱动管理)。
- 其他程序(例如函数库,shell程序等等)。
2.设计OS的目的
- 与硬件交互,管理所有的软硬件资源
- 为用户程序(应用程序)提供一个良好的执行环境
3.定位
在整个计算机软硬件架构中,操作系统的定位是: 一款纯正的“搞管理”的软件
4.操作系统的管理
操作系统是纯正的"搞管理"的软件,那该如何管理呢?
其实是六个大字:先描述,后组织
在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件
我们在学校里面很少见到校长,说明管理者和被管理者可以不见面和直接打交道(就像公司里的员工和董事长平时并不见面和直接打交道)。
既不见面又不直接打交道,那么校长如何对学生进行管理呢?校方又是如何知道你是该学校的学生呢?
因为你的个人信息在学校的系统中,所以你是该学校的学生。
举个例子:
比如 23 级计科专业有 50 名学生,我们想要给其中特定的一名学生发奖学金,那是否需要校长跑到该专业学生的宿舍里面挨个询问同学们的各科成绩和学分绩点是多少呢?显然不是的,当他想要做发奖学金这个决策时,他只需要通过学校的教务系统,拉取 23 级计科专业 50 名学生的名单,按照学分绩点来进行排名,在排名后再根据其它的一些要求,综合一批数据来做出一个决策:给张三同学发奖学金。当校长做完决策后,通知计科专业的辅导员过来,让他开个表彰大会奖励下张三同学。辅导员说:“好的,校长。”,此时辅导员就开始做执行。
以上就完成了一个管理过程。
既然是管理数据,就一定先要把学生的个人信息抽取出来,而抽取要管理的数据的这个过程,就可以称之为:描述学生。
C 语言用什么来描述学生呢?
C 语言用 struct 结构体来描述学生。如果要管理 1w 个学生,那就有 1w 个结构体变量,每个结构体变量里面保存着每一个学生的所有信息。
// 描述学生
struct student
{
char name[10]; //名字
char sex; //性别
int age; //年龄
double score; //分数
char addr[100]; //家庭住址
// ...
};
如果我们想找出成绩最好的同学,只需要将其每个同学的成绩拿出来进行比较即可。但如果每个结构体变量之间没有任何关联的话,是不方便进行管理的,也很难快速找到成绩最好的同学。
这个时候就需要将这些结构体变量组织起来,比如在 struct 中包含一些指针信息,将所有的结构体变量链接起来,此时就形成了一个双链表。
校长要管理学生,只要有双链表的头指针就行。如果校长想要开除某位学生,只需要遍历双链表,再将该学生所属的节点从双链表中删除即可;如果有新生报到,只需要将该学生所属节点插入到双链表中即可。所以校长并不是单独对一个人进行管理的,而是将学生的个人信息组织起来,对数据结构进行管理。
经过上面的过程,最终我们就将对学生的管理工作转化成对双链表的增删查改操作。
结论:
所有管理的工作,本质上就是对数据的管理。
管理的本质:先描述,再组织。
我们在实际生活中的管理变成了对某种数据结构下的结构体变量的管理,这是操作系统管理的本质。
- 描述起来,用 struct 结构体。
- 组织起来,用链表或其他高效的数据结构(不同的数据结构决定了不同的增删查改的特征和效率,也决定了不同的组织方式)。
在计算机中,校长通常指的是操作系统,辅导员可以称为驱动,学生可以称为软硬件。
操作系统不会直接和硬件(比如磁盘,网卡,鼠标)打交道,而是通过驱动程序和硬件打交道,那操作系统怎么去管理硬件呢?
先描述,再组织。所以操作系统要描述各种各样的硬件,然后形成特定的数据结构,对硬件的管理,最后变成了对数据结构的管理。
举例:操作系统要管理磁盘,那得要有一个描述硬盘的 struct 结构体,而描述一个事物,通常用的是事物的属性,比如磁盘的大小、磁盘的型号等等;操作系统卸载一个硬件,并不是要把这个硬件从电脑中拆卸走,而是把这个硬件对应的描述信息给删除掉。
所以操作系统为了管理好被管理对象,在系统内部维护了大量的数据结构。
5.计算机体系的层状结构
硬件部分
遵循冯诺依曼体系结构
驱动程序
操作系统中默认会有一部分驱动。如果有新外设,就需要单独安装驱动程序,该驱动程序会通过某种方式将该硬件的信息上报给操作系统,告诉操作系统,多了这个硬件。(驱动程序更多是一种执行者的角色)
操作系统
操作系统最重要的四个功能:进程管理、内存管理、文件管理、驱动管理。
系统调用接口
- 操作系统是不相信任何用户的,操作系统为了保证自己的数据安全,也为了保证给用户能够提供服务,操作系统以接口的方式给用户提供调用的入口。来获取系统内部的数据。但即使这样,系统调用接口用起来也不是特别方便。所以一般我们会在系统调用接口上再封装一层(比如:shell 外壳,系统库,部分指令,这些的底层一般都是封装的系统调用接口)
- 不断的封装,也是为了让用户用起来更简单。比如:安装 C/C++ 环境时,系统会默认带上 C/C++ 标准库,这些库提供给用户的接口是一样的,但是底层可能不一样,在 Windows 中调用的就是 Windows 的系统接口,在 Linux 中调用的就是 Linux 的系统接口。
用户调用接口
底层大都是封装的系统调用接口。
6.库函数和系统调用的概念
- 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
- 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
- 库函数:语言或者第三方库给我们提供的接口。(实际上我们使用的函数,底层一般就两种情况,要么调用了系统接口,比如 printf;要么没有调用系统接口,比如自己写的 add 函数,自己写的循环等)。
- 系统调用:操作系统提供的接口。