本篇博客整理了操作系统相关的基础知识,先从硬件之冯•诺依曼体系结构,再结合软件之操作系统,旨在帮助读者理解计算机的软硬件资源,和操作系统的管理软硬件资源的手段。
目录
一、冯•诺依曼体系结构
1.计算机硬件设备
2.体系结构的再推导
3.内存的意义
4.计算机之间的数据交互
二、操作系统
1.计算机的层状结构
1.1-操作系统之下
1.2-操作系统之上
2.先描述,再组织
2.1-如何管理
2.2-如何维护硬件信息
一、冯•诺依曼体系结构
现在常见的计算机(如笔记本、台式机)和不常见的计算机(如服务器等),它们本质都是一堆硬件——cpu、内存、网卡、磁盘等的集合。但并不是说,把这些硬件随意放在一起就能够组成计算机,而是各硬件之间首先要具备协同能力,这就要求硬件与硬件之间要组织好,构建成一个系统,这样才能对外提供计算输出服务。
数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯•诺依曼体系结构。
冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。
1.计算机硬件设备
- 输入设备:鼠标、键盘、摄像头、磁盘、网卡等。
为了给用户提供计算服务,就需要用户先把数据交给计算机。但计算机只认识二进制的0和1且通过各种电路信号来计算,而用户提供的数据一般是文字、图片、音频等,所以就需要有一些设备,能够把用户的数据转换成二进制,然后再交给计算机。于是这就决定了,用户是无法直接访问到内存、中央处理器等硬件的,而必须要经过输入设备来访问。例如通过键盘上输入一串字符“abcd”,对于用户而言,输入的是一个字符串,但对于计算机而言,用户输入的是一串0和1的序列。
- 输出设备:显示器、音响、磁盘、网卡、显卡等。
计算机运算完毕后,也只能输出二进制,为了将这些二进制结果转换成文字、图片等用户可以看懂的形式,就需要经过输出设备的处理。因此,输入、输出设备一般是用来进行人和计算机,计算机和计算机之间互相传递信息的外部设备。
- 外存:光盘、U盘、磁盘、磁带、硬盘、软盘等。
外存存储器的存储容量很大,是计算机存储数据的主力。计算机要从外存(例如硬盘)读取数据,会先将外存中的一部分数据加载到内存,再通过CPU调度输入设备来改写或通过CPU调度输出设备来查看。
外存、输入设备、输出设备统称为计算机的外设。
- 中央处理器(CPU):运算器 + 控制器 + 寄存器。
中央处理器(CPU)由运算器和控制器共同组成。在不考虑缓存的情况下,CPU只能对内存进行读写,不能访问外设(输入、输出设备)。
其中,运算器是对用户输入的数据执行计算任务,分为算数运算和逻辑运算,前者就是加减乘除,后者就是真假判断;而控制器是对计算过程,即硬件流程进行控制,协调各组件与各单元间的工作;寄存器可用于传送和暂存数据,也可参与算术运算和逻辑运算,并保存运算结果。
- 存储器(内存 )
内存包含主存和高速缓存,是一种硬件级别的缓存空间,作为CPU和输入输出设备、外存之间的中转站,在冯•诺依曼体系结构中占据核心地位。存储数据的硬件随着存储容量越来越大,访问数据的速度会越来越慢,访问成本也会越来越高(存储金字塔理论),为了保证计算机的运算效率,冯诺依曼体系结构要求,数据必须先从输入设备写入内存,CPU再从内存读取数据进行运算,CPU不能直接从输入设备读取数据,同样CPU的运算结果也不能直接写入到输出设备,而是要先写入内存,再从内存中将结果刷新到输出设备。
- 【补】总线
冯诺依曼体系结构中涉及的五大模块——输入设备、存储器、运算设备、控制器、输出设备——都是独立的个体,有各自独立的功能。而这些独立的个体要共同组成一个计算机,就必须要将它们组织联系起来。输入设备需要把数据交给内存,CPU再从内存中读取数据进行运算,将运算结果再写入内存,内存最终再把数据交给输出设备。
为了实现数据在五大模块间的流动,就需要把用“线”把各个硬件单元连接起来,这个“线”在计算机中就被称作总线。
总线可分为系统总线和IO总线。前者是用于连接CPU和内存,后者是连接内存和外设(输入、输出设备)。
有些总线在我们拆开计算机后可以直接看到,有些则是直接集成在硬件电路上。
2.体系结构的再推导
数据在计算机中的运算,主要是一系列的算术运算和逻辑运算(运算器)。
想要计算机为用户提供计算服务,首先需要用户将数据输入到计算机中,于是,计算机必须要有输入设备来接收用户的数据。
当计算机计算完毕后,还需要将结果反馈给用户,于是,计算机必须要有输出设备来输出计算的结果。
但是计算机中只有算术运算和逻辑运算是远远不够的,还需要有一种控制功能(控制器),来控制何时从输入设备获取数据、何时输出结果到输出设备等。拿一个C语言程序来类比,算术运算对应的是一系列的加减乘除,逻辑运算对应的是一系列的逻辑 & 和逻辑 | 等等,控制功能对应的是C语言条件判断、循环、各个函数的调用等等。
而当需要运算的数据较多,以及运算后的结果较多,不能及时处理,此时就需要一种存储功能(寄存器),将要输入的数据和要输出的结果暂时存起来,等待处理。
这个具有算术运算功能、逻辑运算功能、控制功能、一定容量的存储功能的模块就被称为中央处理器,简称CPU。
在实际的操作中,用户输入的数据和需要获取的结果当下未必要交给CPU处理,可能在未来用到,至于在未来什么时候用到,还不清楚,但在这期间可能还会有新的不必及时处理的数据,于是就需要一种容量较大的存储功能(存储器)将数据先保存起来,以期在需要时使用。
3.内存的意义
冯诺依曼体系结构要求:数据必须先从输入设备写入存储器,CPU再从存储器读取数据进行运算,CPU不能直接从输入设备读取数据,同样CPU的运算结果也不能直接写入到输出设备,而是要先写入存储器,再从存储器中将结果刷新到输出设备。
这是因为,在计算机体系结构中,不同部分的材料不同,它们的性能也不同,所以存储是分级的。
其中,不同部分的访问速度是:CPU内的寄存器 > 存储器(内存) > 外设(外存、输入输出设备),且它们之间的关系不是大于,而是远大于。它们的访问速度并不在一个量级,例如CPU是纳秒级别的,内存是微秒级别的,而外设是毫秒级别的。由于CPU和外设之间的速度差距很大,如果将CPU与外设直接进行连接,就会在木桶效应的影响下,导致计算机整体的运算速度下降。
如果CPU直接和外设连接,那么,就算CPU的运算速度再快,计算机整体的运算能力也会被外设的读取速度所限制。
假设CPU需要一个数据,这个数据在输入设备和内存中都有,如果从输入设备中拿需要1毫秒,那么从存储器中拿就只需要1微秒;假设CPU需要传出一个数据,如果直接给输出设备的话,也是需要1毫秒,但给存储器的话只要1微秒。
因此,为了降低木桶效应对计算机整体运行速度的影响,冯·诺依曼体系结构要求CPU只能和内存进行数据交互。
内存除了读取速度较快以外,还起着第三方中介的作用。数据可以从输入设备预先加载到内存,等CPU空闲了,再直接到内存读取数据。CPU的运算和内存从外设中读取数据,是可以同时进行的,这使得计算机整体的运行速度大幅提升。
而如果没有内存,外设与CPU直接相连,那此时外设就必须等CPU当前的运算结束后,才能继续将数据传给CPU以及继续从CPU中获取结果。
此外,由于冯·诺依曼体系结构要求CPU只能和内存进行数据交互,一个程序要运行就必须先加载到内存。
所有软件的设计,都必须遵循硬件结构的规律,硬件是整个计算机的下限,而软件是上限。基础决定上层,只要是硬件的要求,所有软件都必须要遵守。
一个可执行程序(软件)一般是由一些源文件编译生成的,然后才能运行。而这些源文件和编译生成的可执行程序都是保存在外设(硬盘或磁盘等)上。运行可执行程序,就是让CPU来执行文件中的代码,对其中的数据进行运算,而根据冯·诺依曼体系结构的要求,CPU只能从内存中拿数据,因此,一个程序想要运行,就必须先加载到内存。
【小结】
- 冯·诺依曼体系结构要求,CPU只能和内存进行数据交互。
- 内存的意义是,在存储分级和木桶效应的影响下,尽可能提升计算机的整体运行速度。
- 冯·诺依曼体系结构保证了CPU的运算和IO可以同时进行。
- 外设和CPU在数据层面不会直接交互,但是在信号控制阶段,CPU和外设是可以直接进行交互的。
- 所有软件的设计,都必须遵循硬件结构的规律;一个程序要运行,就必须先加载到内存。
4.计算机之间的数据交互
以“我”通过QQ与朋友进行通讯为例。
- 要用QQ软件进行通讯,首先“我”和朋友的电脑都需要联网。
- “我”和朋友的电脑都是冯·诺依曼体系结构,当“我”向朋友发了一句“在吗?”,“我”电脑中的键盘充当了输入设备,显示器和网卡充当了输出设备;而朋友电脑中的网卡因为从网上获取“在吗?”又将“在吗?”加载到内存,充当了输入设备,显示器充当了输出设备。
- 当“我”开始在键盘当中输入“在吗?”,键盘将“在吗?”加载到内存,此时“我”电脑的显示器也从内存中获取了“在吗?”进而显示在显示器上;而CPU从内存获取到“在吗?”并对其进行各种封装,然后再将其写回内存,好让网卡可以获取;“我:电脑的网卡获取“在吗?”后,会在网络中经过一系列处理。
- 朋友电脑的网卡会从网络中获取“我”发给他的“在吗?”,并将“在吗?”加载到内存中;CPU再从内存中获取“在吗?”并对其进行解包,然后将解包好的“在吗?”写回内存;最后,朋友电脑的显示器就可以从内存中获取“我”发的“在吗?”,并显示在显示器上让他看到。
二、操作系统
上文中提到的很多硬件设备,如键盘、显示器、网卡、CPU等,都各有所职,发挥着各自的功能。但在实际中这是不够的,它们需要相互配合来共同完成任务,而这最好有一个角色能将它们管理起来,让它们在合适的时机有合适的分工——操作系统就是这样一个角色。
简单来说,操作系统就是一款管理软硬件资源的软件,其中包括内核(进程管理、内存管理、文件管理、驱动管理)与其他程序(例如函数库、shell程序等等)这两个部分,既可以管理和调配好硬件资源,又可以为软件提供一个良好的执行环境。
那么,操作系统是如何进行管理的呢?
1.计算机的层状结构
1.1-操作系统之下
肉眼可见、触手可及的计算机硬件,看似是一个个独立且独特的部件,其实在底层互有联系,共同组成了冯·诺依曼体系结构。
但如果只有这些底层硬件,对于完成计算机的任务来说是远远不够的。内存何时从输入设备读取数据?读取多少数据?内存何时刷新缓冲区到输出设备?——这些都需要一个角色来进行管理和调度,而这个角色就是操作系统。
但实际上,操作系统并不是直接管理底层硬件的。
这是因为,比如说操作系统直接在键盘中读取数据,只要键盘的读取方式发生改变,那么操作系统的内核源代码就需要重新编译,这样一来,操作系统的维护成本就太高了。
为了降低操作系统的维护成本,操作系统与底层硬件之间增加了一层驱动程序。
驱动程序的主要功能就是控制底层硬件,可以访问硬件的读写和当前的状态等等,和硬件直接打交道,完成了操作系统与底层硬件之间的解耦。例如,键盘有相应的键盘驱动,网卡有相应的网卡驱动,硬盘有相应的硬盘驱动等等。驱动一般是由硬件制造厂商提供,或是根据操作系统的相关模块进行开发的(比如网卡)。有了驱动,操作系统就只需操心何时读取数据,而不必操心数据是如何读取的了。
既然实际是驱动程序在负责管理底层硬件,那操作系统又管理的是什么呢?——
- 内存管理:内存分配、内存共享、内存保护、内存扩容等。
- 驱动管理:对计算机设备的驱动程序进行分类、更新、删除等操作。
- 文件管理:对文件存储空间的管理、目录的管理、文件操作的管理、文件的保护等。
- 进程管理:主要是对进程的调度。
1.2-操作系统之上
操作系统之上就是用户层,用户就是在这一层使用命令行或图形化界面进行各种操作的。
而实际上,用户也不是直接在操作系统上进行操作的。为了保护操作系统,保证稳定、安全、高效的程序执行环境,操作系统不允许用户对其直接进行操作,而是为用户一些接口,让用户间接在操作系统进行操作。这一系列接口被称为系统调用接口。
但系统调用接口对于普通用户来说,上手成本又太高了,要直接系统调用接口,就必须要求用户对系统有一定了解。于是,为了降低上手成本,方便用户使用,系统调用接口之上又构建出了一系列用户操作接口。其实,在语言级别上使用的各种库函数,就是封装了系统调用接口的,例如C语言的printf()、scanf()等。
【小结】库函数调用和系统调用
- 站在开发的角度,操作系统对外可以视为一个整体,会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用接口,是操作系统的一部分。
- 系统调用接口在使用上,功能比较基础,但对用户的要求很高,所以开发者对部分系统调用进行了适度封装,从而形成库,这样更有利于上层用户或开发者进行后续的开发。
- 库函数调用和系统调用之间是调用和被调用的关系,库函数调用在上层,系统调用在下层。
2.先描述,再组织
操作系统对下可以管理好硬件资源,对上可以为软件提供一个良好的执行环境,为用户提供一个良好的使用环境。那么,操作系统是如何进行管理的呢?——答案是先描述,再组织!
2.1-如何管理
要理解操作系统是如何进行管理的,就得先正确理解管理。
这里以校园管理为例。校长作为学校的管理者,学生作为学校里被管理对象,校长是如何管理学生的呢?
如今,每个学校都有自己的教务系统,教务系统有学生的各种信息——姓名、学号、年级、绩点等等。
假设某一天,学校要评选奖学金,校长作为管理者,只需在教务系统中依据每个学生的成绩排个序,就完成了对学生成绩的排名,然后根据这份排名就可以把奖学金发给排在前例的学生。
又假设某一天,一名学生挂科的学分太多,需要留级处理,校长作为管理者,只需要更改这名学生在教务系统中的年级信息即可。
在以上事例中,校长作为管理者在进行校园管理的时候,并没有与作为被管理对象的学生见面;而实际上,校长也不是直接在管理学生,而是在对教务系统中学生的信息进行增删改查的操作。也就是说:
- 在管理过程中,管理者和被管理对象其实不必见面。
- 管理本质是对被管理对象的属性的增删改查操作。
那校长作为做决策的管理者,是如何知道学生的各种信息的呢?——从执行决策的执行者那里得知。而在学校里,辅导员就扮演执行者这一角色。比如说,校长需要知道学生们的假期去向——放假后什么时间离校,去哪里,怎么去——于是安排辅导员去收集学生的信息;辅导员收到校长的安排后,就开始执行,在vx群里通知学生,让学生填表,然后自己将表格收集起来交给校长。这样一来,校长就知道学生们的假期去向了。
- 管理者和执行者的本质区别在于,管理者拥有决策权,而执行者是没有决策权的,只负责执行管理者的决策。
回到计算机当中,来操作系统就相当于是校长,属于管理者;驱动程序就相当于是辅导员,属于执行者;硬件就相当于学生,属于被管理者——
计算机 | 身份 | 角色 |
操作系统 | 校长 | 管理者 |
驱动程序 | 辅导员 | 执行者 |
底层硬件 | 学生 | 被管理对象 |
也就是说,操作系统是通过驱动程序来获取到硬件的各种信息,以实现对硬件的管理。比如,网卡在使用的过程中发生了故障,驱动程序就会把错误信息报告给操作系统;如果操作系统本身如果解决不了,就会把信息报告给用户,提示用户需要更换网卡。
2.2-如何维护硬件信息
管理本质是对被管理对象的属性的增删改查操作,换句话说,操作系统管理底层硬件,本质是在维护硬件的信息。
【Tips】操作系统对底层的管理:
- 先描述:用结构体定义被管理对象的属性;
- 再组织:借助数据结构,将描述硬件属性的结构体组织起来。
再以校园管理为例,先将作为被管理对象的学生的信息用结构体封装起来:
struct student
{
//学生的各种信息
char name[10]; //姓名
int id[20]; //学号
int age; //年龄
int grade; //年级
int GPA; //绩点
//...
struct student* next;
struct student* prev;
};
再借助数据结构,如链表,将封装学生信息的结构体组织起来:
这样一来,对学生信息的增删改查,就变成了对一个链表的增删改查。
回到计算机当中,同理,先将底层硬件的信息用结构体封装起来,再借助数据结构,如链表,将这些结构体组织起来:
【小结】 操作系统对底层硬件的管理,最终都会转换为对某种数据结构的增删查改(这同时也决定了操作系统中含有大量的数据结构)。