目录
对操作系统认识的初步定位
简单来说,操作系统就是一款进行软硬件资源管理的软件。其本身也是软件!!!
换句话说操作系统就是在整个计算机软硬件框架中,操作系统的定位时:一款纯正的“搞管理”的软件。
操作系统的概念
任何计算机系统都包含一个基本的程序集合,我们将其称之为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
设计操作系统的目的
与硬件进行交互,管理所有的软硬件资源。
为用户程序(应用程序)提供一个良好的执行环境。
操作系统之上之下分别有什么
我们经常说硬件啊,软件啊。但是这俩到底是什么呢?
首先,我们买回来一台电脑。肉眼可见的就是计算机实物,也就是计算机底层的硬件。比如说:主板,中央处理器(CPU),内存(RAM),硬盘或固态硬盘(HDD/SSD),显卡(GPU)......这些硬件看似是一个个罗列出来的,但实际在底层都遵守冯诺依曼的组织形式。你要问为什么要遵守冯诺依曼体系的结构,那原因就是冯诺依曼体系结构就是这么要求的。
而单单只有这些硬件设备是远远不够的,还需要将他们管理的软件。例如,在冯诺依曼体系结构中,内存何时从输入设备读取数据?读取多少数据?内存何时刷新缓冲区到输出设备?是按行刷新还是全刷新?这些都是由软件进行管理的,而这个软件就是操作系统(Operator System),缩写OS。
此时我们就会产生另一个疑问:难道操作系统直接和底层硬件打交道吗?
举个例子,如果操作系统自己来完成键盘的读取操作,那么只要你的键盘读取方式(比如说由原来的有线改为了蓝牙)进行了改变,那么操作系统的内核源代码就需要进行重新编译,这对操作系统来说维护成本太高了。
于是我们又在操作系统与底层硬件之间增加了一层驱动层,驱动层的主要工作就是单独去控制底层硬件的。例如,键盘有键盘驱动,网卡有网卡驱动,硬盘有硬盘驱动,磁盘有磁盘驱动。驱动简单来说就是去访问某个硬件,访问这个硬件的读、写以及硬件当前的状态等等,驱动层就是直接和硬件打交道的。而驱动一般是由硬件制造厂商提供的,或是由操作系统相关的模块进行开发的(例如网卡)。
此时操作系统就只需关心何时读取数据,而不用关心数据是如何读取的了,也就是完成了操作系统与硬件之间的解耦。
那操作系统究竟管理些什么呢?操作系统主要进行以下四项管理:
内存管理:内存分配、内存共享、内存保护以及内存扩张等等。
驱动管理:对计算机设备驱动驱动程序的分类、更新、删除等操作。
文件管理:文件存储空间的管理、目录管理、文件操作管理以及文件保护等等。
进程管理:其工作主要是进程的调度。
而操作系统再往上就是我们所处的位置,在这里我们就可以用命令行或是图形化界面进行各种操作,这一层被称为用户层。
但操作系统为了保护自己,对上只暴露了一些接口,而不会让用户直接访问操作系统,这一系列接口被称为系统调用接口。就好比我们去银行取钱,银行是不会让你直接接触到钱,而是由他们的工作人员帮助你,为你服务,并且在服务期间,你与工作人员之间还有着一个厚厚的钢化玻璃,这就就是说,你可以去银行,也可以访问银行,但是终归银行是不信任你的,毕竟群众之中有坏人,你所有访问银行的操作,都是要由工作人员代替你去完成,你只需要去与银行工作人员去商量。
那么在这个过程中你就是作为用户,银行就是操作系统,工作人员就是系统调用接口。你所有访问操作系统的行为都是只能通过系统调用接口来完成。
但这些系统调用接口对我们普通用户来说使用成本又太高了,因为要使用系统调用前提条件是你得对系统有一定了解。所以在系统调用接口之上又构建出了一批库,例如libc和libc++。实际上在语言级别上使用的各种库,就是封装了系统调用接口的,我们就是通过调用这些库当中的各种函数(例如printf和scanf)进行各种程序的编写。
最后,我们对这部分进行分类,分为三部分,分别是硬件部分,系统软件部分,用户部分。
管理的精髓:先描述,再组织
最后,要想学好操作系统,那么就必须正确理解操作系统到底什么怎么管理软硬件的。其原理就是先描叙在组织。
简单的总结就是一句话,但实际上他还有很多细节与奥妙,为了使得更好的理解与掌握,这里就不单单陈述知识了。而是采用生活中的案例进行比喻,使得更好理解。
现在给出三个角色:学生、辅导员和校长。很明显,校长在这三个人当中是管理者,学生是被管理者,那么辅导员充当什么角色呢?
仔细想象后就可以反应过来,我们对于一个事情,其实是经过决策与执行两部走,那么操作系统是由人设计出来的,那么其也应该符合人的常理,应该也是先决策,然后再执行,所以校长作为管理者,工作就是决策。辅导员的身份就是执行者,其工作是执行校长的决策。
那么在学校中,对于一个事情,校长作为管理者,其他不会直接去管理学生,而是产生决策,下达命令让辅导员去执行。
那么上过大学的就会知道一个事情,你四年见到校长的次数特别的少,甚至四年就见到过两三次,那么校长是如何做到在不看到我们的情况下对我们进行管理的呢?
在这个过程中校长是没有见到过这十个人的就完成了决策工作,就对其进行了管理,他根据的是什么?没错,他根据的是各个同学的信息,也就是计算机中的数据。
实际上,学校将我们每个学生的各种信息都进行了管理,基本信息、成绩信息以及健康信息等等。
我们规定,每一套这样的信息他都代表着一名学生,校长通过对这些信息的管理就能做到对学生的管理,就不需要直接去见到各个学生。这么一套信息在C语言当中我们抽象的称之为结构体,而在C++当中又叫做面向对象的类。
当学生数量增加时,校长可以将所有学生的信息进行有效的组织和管理,而组织方式有多种选择,如链表、顺序表或树等。每种方式各有其独特的优势,因此就有了专门教授如何管理数据的课程——数据结构。在这个假设中,我们设想校长使用双链表来组织学生信息,这种结构能够灵活地进行插入和删除操作。
此时校长对各个学生的管理,实际上就变成了对这个双链表的增删查改。当有新生时直接向该双链表加入一个结点,当学生毕业后直接将学生信息从该双链表当中移除即可。
总结
管理者管理被管理者,实际上是先将被管理者的各种信息进行描述,然后再将多个被管理者的描述信息根据某种数据结构组织起来,最后管理者管理被管理者实际上就是对数据结构的管理。
管理的本质:是通过对数据的管理,从而达到对某个准确的对象的管理。
管理者(操作系统)可由执行者(驱动程序)拿到数据。在这个过程中管理者与被管理者是二者不见面的。
操作系统的管理为:只要做描述过程(先)与组织过程(后)。描述过程就变为了对某种数据结构的增删查改。
系统调用与库函数的概念
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能呢比较基础,对用户的能力要求也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次封装。