Linux系统编程(1)--简单了解OS
冯诺依曼体系结构
我们的计算机硬件方面:
CPU=运算器+控制器+其他(图中没有体现)
CPU有自己的一套二进制代码指令集,其功能简单来说就是执行别人下发的指令并计算别人提供的数据。
输入设备(如磁盘、键盘),输出设备(如网卡、显示器)相对于CPU和内存而言相当于外设。
从上述结构图中,我们可以了解到一个关键信息:
在数据层面,CPU只和内存交互,不和外设交互。外设中数据时,只能载入到内存;同时内存中数据,也只能写出到外设。数据在内存和外设中交互,称为IO(INPUT/OUTPOUT)。
故:程序要运行必须先加载到内存,因为CPU只从内存访问数据。
随之而来的问题就是:为什么需要使用内存,而不直接将数据从输入设备给到CPU,再由CPU写出到输出设备?
内存是临时的数据存储,即断电数据丢失,硬盘是永久存储设备,但内存的读写速度比硬盘快多个数量级,这是物理层面上决定的。CPU的计算速度极快,和硬盘的读写速度及其不匹配,为了缓解两者的速度差异,提高整机性能,便使用内存作为一层缓存层。
操作系统
在上述物理架构的基础上,需要数据将数据从外设加载到磁盘,CPU才能访问数据。那么“什么时候加载数据?”、“每次加载多少数据?”、“内存中的数据CPU不使用了又该如何处理?” ,这样类似的多种问题,便需要操作系统(OS)来帮我们进行各种策略。
操作系统本质上是:进行软硬件管理的软件。
首先我们需要先对"管理"有一个充分的理解:管理者做决策,被管理者做执行,而管理者和被管理者并不需要直接的交互,管理者依然能够管理被管理者。好比在公司中,上层老板是管理者,下层员工是被管理者,而老板对公司的管理,对员工的管理,并不需要直接和员工交互(或者说咱底层员工真正见过大老板几面😂)。
管理者的决策要有依据,依据便是数据。虽然员工不和大老板交互,但是员工的数据,如干了多久、多大年龄、多少产出...,大老板都能知道。
故,管理的本质是对数据的管理。
当数据过多时,又应该如何更好的管理数据?
所有的管理,其本质逻辑方法:先描述(成结构/类),再(使用对应的数据结构)组织。
故在操作系统中,对软硬件的管理,也就转化为了对其描述出的数据结构的管理。
该图中,OS往下通过驱动对硬件进行管理,按照“先描述,再组织”的管理方法,我们大致可以猜到OS内核中大概会有类似这样的代码来管理硬件:
struct dev {
struct dev* next;
int type;
int status;
...
} // 先描述硬件设备
list dev_list; // 再使用链表结构进行管理
struct dev disk_dev;
struct dev keyboard_dev;
dev_list.insert(dist_dev);
dev_list.insert(keyboard_dev);
OS对下要保证自身和底层设备的安全,所以OS不能相信任何用户。好比一家银行系统不会相信任何一个用户,其不可能让用户直接去他们的仓库直接取钱或者存钱,但银行又必须为用户提供服务,故其提供了银行柜台窗口来为用户提供接口式的服务。OS同理,OS保证自身安全的同时,又必须为上层用户提供服务,故OS为上层提供了OS接口,这些接口也就称为系统调用。
故,系统调用本质上就是:OS通过C语言提供的函数调用。
而要求用户直接使用系统调用及其麻烦,也就出现上层的多种工具封装了系统调用如shell(提供指令操作),c/cpp的库(提供编程操作),图形化界面等来简化用户使用OS的难度。