【Linux】计算机如何管理软硬件
谈谈硬件
聊到计算机硬件,我们就需要清楚冯诺依曼体系。生活中常见的计算机,如笔记本,不常见的计算机,如服务器,这些大多都遵守冯诺依曼体系。

截止目前,所认识的计算机都是由一个个硬件组件组成的:
- 输入设备:鼠标、键盘、摄像头、话筒、网卡、写板等
- 输出设备:显示器、播放器硬件、磁盘、网卡
输入、输出设备简称为外设。有的设备是纯输入,有的设备时纯输出,而有的设备既可以做输入也可以做输出。
- 存储器:内容
- 运算器:用来对数据进行计算任务(1.算数运算;2.逻辑运算)
- 控制器:对我们的计算硬件流程进行一定的控制
运算器和控制器组成中央控制器(CPU)
这五个模块都是独立的个体!各个硬件单元必须需要用“线”链接起来。这里的"线"分为两中先:(1)系统总线,也就是CPU和存储器之间的系统总线(2)IO总线,输入、输出设备和存储器之间的时IO总线。

这是计算机存储金字塔,存储每一部分都是分级别的,距离cpu越远的东西,造价越来越便宜,而容量也就越来越大。
不考虑缓存情况,CPU只能且只能对内存进行读写,不能访问外设(输入或输出设备)(数据层面)。而外设(输入或输出设备)要输出或者输出数据,也只能写入内存或者从内存中读取。一句话,所有的设备都只能直接和内存打交道。
这里可以将内存看作成一个硬件几倍的缓存空间,内存在计算机中具备核心地位,有内存才能将价格打下来。
问题:一个程序要运行,必须要加载到内存中运行?为什么?
代码必须需要CPU进行运行,而程序首先会被保存在外设中,因为体系结构规定,CPU需要运行代码,必须要从内存中获取,所以程序必须先从外设中加载到内存中,然后再从内存中加载到CPU里。
硬件是计算机的底线和边界,软件是上限。
问题:为什么写的代码,默认显示的数据,可能会缓存起来?会缓存在哪里?
数据计算完成后,也需要将数据放在内存中进行缓存,再进行刷新。
这里谈一下我目前的理解,外设存储空间很大,但是传输到CPU很慢,所以需要内存来做一个中枢设备,外设需要先传输到内存,内存具有一定的存储空间,可以保存外设传输的一部分内容,所以外设会持续为内存传输数据,内存也会持续像CPU传输数据,而CPU会对数据进行计算处理,内存和CPU之间的传输速率取决于内存,而内存与外设之间的传输速率取决于外设,而内存是具有一定存储空间的。
2.软件
这里的软件就是操作系统,任何计算机系统都包含一个基本的程序集合,成为操作系统(OS)。
笼统的来说,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)

设计操作系统的目的
设计操作系统主要是为了管理硬件,并对软件进行管理。为什么要管理呢?
- 操作系统需要帮助用户,管理号下面的软硬件资源。
- 也为了给用户提供一个良好(稳定、高效、安全)的运行环境。

总之就似乎,操作系统通过管理好底层的软硬件资源(手段),为用户提供一个良好的执行环境(目的)。这里的用户包括普通用户、程序员,而普通用户所使用的也是程序员开发处理的软件。
- 操作系统里面会有各种数据,可是操作系统并不会相信任何用户!而操作系统会帮助用户使用操作系统。
所以一般来说操作系统为了保证自身数据的安全,也为了保证给用户能够提供服务,操作系统会以接口的方式给用户提供调用的入口,以此来获取操作系统内部的数据。
- 接口:是操作系统提供,C语言实现的,自己内部的函数调用。
在开发角度,操作系统会对外表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口叫做系统调用,所有访问操作系统的行为,都只能通过系统调用来完成。
系统调用在使用上,功能比较基础,对用户的要求也比较高,所以,开发者可以对部分系统进行适度封装,从而形成库,有了库就有利于更上层用户或者开发者进行二次开发。
使用语言对底层硬件(显示器)进行输出的时候,不能直接访问底层,必须贯穿操作系统,操作系统不相信任何人,系统调用(下)和库函数(上)是上下层的关系。
操作系统如何管理
- 操作系统是如何做到对软硬件进行管理的呢?
先描述再组织
- 操作系统并不会直接管理系统中的软硬件资源,而是通过驱动程序获取相对应的软硬件资源,进而对软硬件进行管理。
- 获取到大量的软硬件资源后,通过对这些数据用struct对象进行描述,使用相对应的数据结构进行链接组织,以便方便获取相对应的数据。
- 在操作系统中,管理任何对象,最终都会转化成为对某种数据结构的增删查改。
操作系统中,一定存在大量的数据结构。计算机管理硬件:
- 用struct结构体描述
- 用链表或者其他高效的数据结构组织
