【Linux系统编程】进程概念(一)冯诺依曼体系结构、操作系统
【Linux系统编程】进程概念(一)冯诺依曼体系结构、操作系统
- 1. 冯诺依曼体系结构
- 1.1 体系结构效率问题
- 1.2 存储分级问题
- 1.3 为什么要有内存
- 1.4 计算机的效率问题
- 2. 操作系统(Operator System)
- 2.1 概念
- 2.2 设计OS的目的
- 2.3 lib库和系统调用的关系
- 2.4 操作系统如何进行管理?
- 3. 冯诺依曼体系结构和操作系统的相关题目
1. 冯诺依曼体系结构
冯诺依曼体系结构是由冯诺依曼提出的计算机设计的基本框架,它包含了五大部件:输入设备、存储器、运算器、控制器、输出设备。我们常见的计算机,如笔记本,我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。

截至目前,我们所认识的计算机,都是由一个个的硬件组件组成
- 输入单元/输入设备:键盘、鼠标、扫描仪、写板、摄像头、话筒、网卡、磁盘等
- 存储器:内存
- 中央处理器(CPU):运算器、控制器等
- 运算器:对我们的数据进行计算任务(算数运算、逻辑运算)
- 控制器:对我们计算机硬件流程进行一定的控制
- 输出单元/输出设备:显示器、打印机、内置的喇叭、网卡、磁盘等
输入设备和输出设备统称为外部设备(外设),外设相比较CPU,速度特别慢。
1.1 体系结构效率问题
根据木桶效应,我们知道计算器算的快不快取决于慢的,也就是外设。

1、为什么不把外设也换成CPU,这样速度不就快了?
2、那冯诺依曼体系为什么还要在 输入 -> 计算 之间加一个存储器(内存)呢?这不是多此一举吗?
1.2 存储分级问题
对 1 的解答。

总结:速度越快造价越高且存储小,速度越慢造价越低且存储大。
所以冯诺依曼体系横空出世了!!!
1.3 为什么要有内存
对 2 的解答。
局部性原理
因为数据可以提前加载到内存,所以大部分情况下,处理数据的时候,就可以转换为内存和CPU的交互,那么计算机的效率就以内存为主了。
因此我们得出了一个结论:在数据层面,CPU不和外设直接打交道(输入or输出),CPU读写数据,只会和内存打交道。
从对于世界发展的角度看:计算机的效率以内存为主 -> 让普通人以较低的价格获得效率不错的计算机 -> 冯诺依曼为电脑提供性价比 -> 被人们广泛接受 -> 形成了全球范围内的网民数量 -> 孵化出互联网
所以说 冯诺依曼体系结构 是划时代的。
1.4 计算机的效率问题
我们口中的输入输出,是站在存储器(内存)的角度考虑问题的。
输入设备向内存中加载数据,本质上就是将输入设备上的数据拷贝到内存中,那么内存和CPU之间以及内存和输出设备之间的数据传递,本质上不也是拷贝吗?

因此,计算机数据的流动过程,本质就是拷贝。即计算机的效率问题,由设备的拷贝效率决定。
2. 操作系统(Operator System)
2.1 概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理、内存管理、文件管理、驱动管理)
- 其他程序(例如函数库、shell程序等)

内核四大功能:
1、内存管理
2、文件管理
3、驱动管理
4、进程管理
任何计算机类的设备,都是需要这四大功能的。
2.2 设计OS的目的
- 对下,与硬件交互,管理所有的软硬件资源
- 对上,为用户程序(应用程序)提供一个良好的执行环境

操作系统对下
-
操作系统是一款搞管理的软件,它通过对下管理好底层的软硬件资源(手段),为用户提供良好(稳定,高效,安全)的执行环境(目的)。
-
通常来讲,这个用户我们将其理解为程序员,而不是普通用户,普通用户使用的客户端和手机app软件是由程序员开发出来的软件,并不是使用的操作系统,而程序员要开发软件,就注定要使用操作系统,所以这个用户特指程序员。
操作系统对上
-
操作系统里会有各种数据,但操作系统并不相信用户,因为用户可能会对操作系统造成伤害,造成数据丢失等,所以就有了系统调用接口,用户发出指令,系统调用接口去获取操作系统内部的数据,从而保证数据的安全。
-
这个调用方式称为系统调用,用于调用的接口是由操作系统提供的,且使用C语言实现的接口,它是操作系统自己内部的函数调用。
-
因此所有访问操作系统的行为,都只能通过系统调用来完成。
2.3 lib库和系统调用的关系
-
lib库函数和系统调用接口的关系是lib库函数调用系统调用接口,因为lib库函数要访问操作系统,而要访问操作系统又只能通过系统调用,所以lib库函数只能通过调用系统调用接口才能对操作系统访问,即lib库函数和系统调用接口的关系是上下层的调用和被调用的关系
-
当我们知道了lib库和系统调用的关系后,就可以知道,任何计算机语言例如C、C++、Java等,本质就是对系统调用接口进行一定封装而形成的语言。
2.4 操作系统如何进行管理?
先描述,再组织
操作系统的本质是一个资源管理者。要理解其管理机制,我们可以将其解构为三个核心角色:
- 管理者:操作系统内核,负责决策与调度。
- 执行者:驱动程序等,负责执行内核的指令,并反馈硬件状态。
- 被管理者:软件与硬件资源,如进程、文件、内存、设备等。
一个生动的类比:大学管理体系
- 管理者(校长):如同操作系统内核,制定宏观策略(如创建新进程、分配内存)。
- 执行者(辅导员):如同驱动程序,是校方与学生之间的桥梁。他们收集学生的信息(硬件状态)上报给校长,并将校方的决策(驱动指令)传达并督促学生执行。
- 被管理者(学生):如同硬件资源,是最终执行具体任务的实体。
在这个管理结构中,操作系统要实现对资源的高效管控,其方法可以概括为两个步骤:先描述,再组织。
第一步:先描述——将资源“数据化”
管理的首要问题是“管理谁?”以及“如何定义管理对象?”。
操作系统的做法是:为每一类被管理的资源,创建一个称为“内核对象”的数据结构。在Linux这类用C语言开发的操作系统中,这个数据结构就是一个struct。这个结构体内部包含了管理该资源所需的全部属性(数据)。
当需要一个实体(如打开一个文件、启动一个程序)时,内核就会实例化一个对应的结构体对象。这个对象,就是该实体在内核中的“身份证”和“档案袋”。于是,对物理资源的管理,就转化为了对这个数据结构中数据的管理。
第二步:再组织——将对象“结构化”
当存在成千上万个需要管理的对象时(例如系统中有上百个进程),如何高效地进行遍历、查找、增删?这就需要“再组织”。
操作系统会采用高效的数据结构,将这些孤立的struct对象串联起来。最常见的组织方式就是链表,此外还有树、哈希表等。
- 例如,Linux内核将所有进程的
task_struct通过链表和树形结构组织起来。 - 所有打开的文件对象也被组织在各种数据结构中。
这个过程就是建模。它将离散的管理对象,整合成一个有机的、可被高效访问的数据模型。
管理的实现:对数据结构的增删查改
通过“先描述,再组织”,操作系统对一切资源的管理,最终都简化为了对某一种数据结构的增、删、查、改操作。
3. 冯诺依曼体系结构和操作系统的相关题目
1、不属于冯诺依曼体系结构必要组成部分是:
A.CPU
B.Cache
C.RAM
D.ROM
2、冯诺依曼体系结构计算机的基本原理是?
A.信息存储
B.存储智能
C.数字控制
D.存储程序和程序控制
3、操作系统的主要功能有()
A.控制和管理计算机系统软硬件资源
B.对汇编语言,高级语言和甚高级语言程序进行翻译
C.管理用各种语言编写的源程序
D.管理数据库文件
4、下面关于系统调用的描述中,错误的是()
A.系统调用把应用程序的请求传输给系统内核执行
B.系统调用函数的执行过程应该是在用户态
C.利用系统调用能够得到操作系统提供的多种服务
D.是操作系统提供给编程人员的接口
E.系统调用给用户屏蔽了设备访问的细节
F.系统调用保护了一些只能在内核模式执行的操作指令
5、下面的函数哪个是系统调用而不是库函数()?
A.printf
B.scanf
C.fgetc
D.read
E.print_s
F.scan_s
答案
第一题:B
A CPU 运算器与控制器
B Cache 缓存(一种技术)
C RAM 内存(存储器)
D ROM 磁盘(输入输出设备)
第二题:D
计算机就是为了完成指定的数据处理,而通过指令按指定流程完成指定功能,指令的合集就是一段程序。说白了计算机就是按照指定的指令执行流程完成对指定数据的处理
第三题:A
操作系统的定位就是控制和管理计算机上软硬件资源让计算机更加好用,因此A选项是 正确的
对汇编语言,高级语言和甚高级语言程序进行翻译,这个功能是编译器的功能,将高级语言解释为机器指令能够被机器识别执行。因此B选项不正确,这不是操作系统的主要功能,而是一个外部应用的主要功能
源程序以及数据库文件都是存储在磁盘上的,这是操作系统中,文件系统管理部分的主要功能,因此C和D选项不正确。
第四题:B
系统调用是操作系统向上层提供的用于访问内核特定功能的接口。
A正确,应用程序通过系统调用将自己需要完成的功能传递给内核,进行执行完成
B错误,系统调用的运行过程是在内核态完成的,操作系统并不允许用户直接访问内核,也就是说用户运行态并不满足访问内核的权限。
C正确,因为系统调用就是想上层提供用于完成特定内核服务或功能的。
D正确,
E正确,用户只需要将自己的请求以及数据通过系统调用接口传递给内核,内核中完成对应的设备访问过程,最终返回结果正确
F正确,系统向上层提供系统调用接口用于访问内核服务或功能的很大原因也是因为这样可以最大限度的保护内核的稳定运行。
第五题:D
库函数是用户对系统调用接口的进一步封装接口
printf函数是glibc中封装的用于实现格式化输出的接口
scanf函数是glibc中封装的用于实现格式化输入的接口
fgetc函数是glibc中封装的用于实现从输入流中获取字符的接口
read是系统提供的用于从输入设备获取数据的接口
print_s以及scan_s这两个函数不存在,至少在C语言的常见典型的跨平台移植代码库中不存在。
