目录
一、操作系统是什么
1、操作系统概念
2、操作系统的定位
3、设计OS的目的
4、操作系统的重要性
二、 理解操作系统
三、系统调用
系统调用和库函数的关系
一、操作系统是什么
1、操作系统概念
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库, shell程序等等)
操作系统组成结构:
2、操作系统的定位
在整个计算机软硬件架构中,操作系统的定位是一款进行软硬件资源管理的软件。
3、设计OS的目的
- 与硬件交互,管理所有的软硬件资源
- 为用户程序(应用程序)提供一个良好的执行环境
4、操作系统的重要性
计算机硬件大部分为冯诺依曼体系结构,在硬件之上有一层软件。我们在对计算机输入数据时,会把数据预加载到内存之中,供 CPU 进行数据读取。
然而计算器中的数据这么多,他怎么知道需要预加载那一部分数据呢?加载过程中内存不够了怎么办?CPU在进行计算操作时如何快速的找到预加载的数据?在CPU执行计算时,是先把当前任务完成再做下一个任务还是多个任务同时执行?
这些等等问题都不是由硬件决定的。而是由一个软件——操作系统决定的。操作系统的重要性不言而喻。
二、 理解操作系统
我们知道操作系统是进行软硬件资源管理的,那么我们就来重点聊一聊操作系统如何进行硬件管理。
我们谈管理就一定有两种角色:管理者与被管理者。
假设有这样一个场景:一个学校里有三个群体,分别是校长、辅导员、学生。
其中校长是进行决策的人,所以校长为管理者。辅导员是执行校长决策的人,即保证决策被执行的人。而学生显然是被管理者,参与执行。
虽然校长是管理者,进行决策,但是同学们不妨回想一下我们在学校里见过几回校长呢?几乎没有见过面。所以管理者与被管理者是不需要直接沟通的。
那么校长是怎么管理学生的呢?事实上,校长管理学生是通过管理这个学生的数据,比如成绩、违纪情况等等。所以管理的本质是对被管理对象的数据进行管理。
校长获取学生的数据是通过辅导员获取的,而学生有很多,信息也很杂乱,有姓名、年级、电话、成绩、紧急联系人等等。为了方便提取,就可以把每个学生都抽象成一个结构体 struct ,并把这些结构体节点都链接起来形成一个单链表:
一个节点代表一个学生的所有信息。
现在校长做了一个决策:让这些学生中数学成绩最好的那一个代表学校参加数学竞赛,此时,这个决策就转变成了对链表的遍历查找工作。
校长又做了一个决策:开除成绩最差的学生,这个决策被转变为对链表的遍历与删除工作。
实际上,校长做出的任何决策都可以被转化成对链表的增删查改。以上校长所做的工作称为一个管理模型的建模。
经过上面的介绍,我们可以把管理的本质使用六个字进行总结:先描述,再组织。这六个字在之后会贯穿整个Linux学习的过程。
其中描述的过程就是面向对象的过程,组织的过程就是我们所学习的数据结构的用法。这也是我们学习语言与数据结构的意义。
在上面的故事里,校长、辅导员、学生对应到操作系统中,分别为:
- 校长——操作系统
- 辅导员——硬件驱动
- 学生——硬件(软件)
所以操作系统在进行硬件管理时,会通过各种驱动程序,对各种硬件的属性信息做提取,把这些硬件面向对象式的先描述成设备结构体,构建设备节点,然后将所有被管理的设备以某种数据结构组织起来。从此之后,对设备的管理就转换成了对数据结构的管理。这是一个对管理做建模的过程。
三、系统调用
操作系统对下通过管理好软硬件资源(手段),对上给用户提供良好、安全、稳定、高效、功能丰富的执行环境(目的)。
前面我们已经基于对下进行管理进行了一部分的讲述说明,现在来讲一讲对上给用户提供服务的相关内容。
操作系统给用户提供了良好的服务,那么操作系统相信用户吗?
这样问可能会有些奇怪,我们来举个例子方便理解:张三去银行存钱,那么在张三进入银行的时候,就已经是银行的客户了,银行的工作人员会给张三倒水、整理相关资料,对张三进行各种应有的服务,但是会把金库的门打开,让张三自己进入金库存放现金吗?这是肯定不会的,银行不信任张三。
那么银行是如何做到在不信任客户、不允许客户查看银行系统的前提下,给客户提供各种存款、借贷服务的呢?
在银行里有多个小窗口,客户通过窗口把银行卡、身份证等证件交给工作人员,由工作人员给客户办理相关业务。这样既避免了客户查看银行的系统,保证了银行的安全,又给客户提供了服务。
类比到操作系统当中,操作系统给我们提供非常良好的服务,并不代表操作系统会相信我们,相反,操作系统不相信任何人。
用户是不被允许进入到操作系统内部去对数据进行任意访问与修改的。那么操作系统又是怎么在这样的前提下给用户提供服务的呢?
操作系统把一些特定功能以接口的方式供给用户使用,我们把这批接口称为操作系统的系统调用。
我们知道 Linux 是使用C语言编写的,所以 Linux 的系统调用其实就是操作系统设计的C函数。通过这种方式,既能保证操作系统本身的封装性,又能保证给用户提供相应的功能。
而系统提供的这些接口使用起来成本会比较高,可能要求使用者具备对应的相关知识。
为了降低使用成本,方便更多的人使用,就有一些人基于系统调用接口进行了二次软件开发。这些二次软件开发中,有一部分是图形化界面,还有一部分是 shell与工具集。
整个计算机体系的软硬件结构是层状的,我们无法绕过特定层,而是必须从上到下贯穿、从下到上获取。以我们以前学习过的指令为例:
比如创建文件指令 touch ,我们只写入了一条 touch 指令,看似简单,但是这条指令要通过系统调用接口,由操作系统向磁盘发起文件创建的相关指令,然后驱动程序就会拿着这些指令交给对应的硬件来执行,把文件信息写入磁盘后,再把完成信息依次向上返回。所以单单是一条简单的指令,也是要贯穿操作系统的体系结构的。
系统调用和库函数的关系
系统调用是操作系统提供的接口,库函数是对系统调用的封装。但不是所有的库函数都会封装系统调用,比如一些单纯进行计算、加密的库函数不需要访问外设,也就无需调用系统调用。
经过特定系统调用的组合,可以给用户提供功能更加丰富的库函数,通过调用库函数可以大大的提高开发效率。
与操作系统(OS)相关内容就讲到这里,希望同学们多多支持,如果有不对的地方欢迎大佬指正,谢谢!