文章目录
- 什么是操作系统
- 是什么
- 为什么要设计操作系统?
- 操作系统是怎么进行管理的
- 系统调用和库函数 | 理解操作系统内部
什么是操作系统
是什么
每个计算机系统都包含一个基本的程序集合,称之为操作系统(Operator System)
本质来说,操作系统也是一个软件(程序集合不就是软件嘛),只不过这个软件比较特殊
我们平时所说的操作系统,就比如我们每天都在用的Windows包括什么呢?
- 内核部分,包括进程管理,内存管理,文件管理,驱动管理
- 其他程序(函数库,shell程序等)
为什么要设计操作系统?
首先先看一张图:
在计算机系统结构中,操作系统处于硬件和用户之间,我们都知道,使用电脑我们进行打字、显示器给我们显示各种内容、保存文件到磁盘等活动,都不是我们直接和这些硬件(键盘,显示器、磁盘)进行交互,毕竟硬件这么复杂,我们直接敲一下键盘,要输出的内容就到了显示器,我们Windows下只需要用鼠标点击就可以打开某个软件等,这些工作是谁帮我们做的? 笼统的理解,是操作系统帮我们做的!也就是说操作系统的设计是为了我们使用更方便
另一方面,我们的设备底层有各种各样的硬件,还有硬件对应的驱动程序。
驱动程序: 驱动程序就是提供软件级别对硬件操控的接口,比如让磁盘读取某个区域,让网卡把数据发送出去,让显示器在某个像素点打一些文字或者文本,都是需要驱动程序提供接口,我们自己写的程序或者操作系统利用这些接口去完成这些事情!(也是软件)
显然,这些乱七八槽的驱动程序、硬件肯定不是杂乱无章的!是需要被管理、组织起来的!谁来组织管理?–操作系统!
总结:为什么要有操作系统
- 对上(用户)提供一个稳定、安全、简单的良好执行环境 (目的)
- 对下通过管理好软硬件资源的方式保证系统的稳定性 (手段)
换言之,操作系统通过管理好软硬件资源的方式保证系统稳定性从而为用户提供一个良好的使用环境!
毕竟人们是不适合直接和硬件打交道的
操作系统是怎么进行管理的
1️⃣
上面的分析我们知道,操作系统其实就是一个搞管理的软件,管理什么? 管理软硬件资源!
那么,操作系统是怎么进行管理的呢?
首先我们要知道什么是管理?
以学校管理的例子为例
我们在学校生活中,我们是被管理起来的!被谁管理呢? — 校长
可是!现实生活中我们都没怎么见过校长,你认识校长,但是校长并不认识你,那他既然都不认识我,是怎么对我进行管理的呢?
我们知道,每个学校都有一个所谓的教务管理系统。入学的时候,学校实际上是把你的数据录入了这个教务管理系统,从而你有了唯一的标识id,即你的学号。
通过你的学校,可以在教务系统中查找到你的姓名、年龄、籍贯、家庭、成绩信息以及你的奖惩功过等信息,而校长就可以根据这些数据对你进行管理。比如,某学期你一共10门课,你挂了8科,校长就可以通过做决策来开除你!既然下达了开除你的决定,他是走到你面前告诉你,你被开除了然后让你离开学校吗?不是!而是他会先从教务系统删除你的信息,也就是你的学号将不复存在,然后校长会让你的辅导员通知你,你被开除了,具体安排你的离校。这样,你就被开除了!
在这个例子中,校长就相当于操作系统
而辅导员去通知你让你离校,也就是传达决策的那个角色,其实就是驱动程序!
因此,管理者和被管理者可以不直接沟通,管理者被管理者的管理,实际上不是对被管理者人身的管理,而是对被管理者核心数据的管理!
在计算机中,管理者:操作系统, 被管理者:软硬件,执行决策:驱动程序
2️⃣
如果被管理对象数量太多,杂乱无章,操作系统要记住每一个被管理对象吗? 不
还是以学校的例子为例
今年你的学校招生了5000名学生,每一个学生都将成为该学校的被管理对象,如果每一个学生都是孤立的一个个对象,那么校长管理起来实际上是十分麻烦的!不可能记住你每一个学生的姓名、专业等信息吧??
因此,巧了,该校长呢,之前是一名十分优秀的程序员,因此他意识到,所有的学生都有一些共有的属性,比如学号、姓名、专业、年级、成绩等信息。只需要关心公共的数据,因此,校长就定义了一个 struct Stu students[5000]
然后让辅导员依次给每一个学生创建一个结构体对象,然后录入每一个学生的基本信息即可
之后如果要开除倒数前三名学生,只需要写一个依据学生成绩排序的算法,然后删除前三个即可
也就是说,管理者可以先对被管理对象进行描述,根据描述类型定义对象,然后可以把对象组织成数组、链表等数据结构
这样,对被管理对象的管理工作,就转变成了对特定数据结构的增删改查!
即
-
对被管理对象的管理 变成了对数据的管理
-
对多个对象的管理 变成了的对某种数据结构的管理
🟡总结,管理就是6个字: 先描述,在组织
描述用什么描述呢?别忘了!Linux内核就是用C语言写的,所以用struct进行描述!!!
而组织,就要用到各种数据结构。因此我们虽然不知道操作系统是怎么写的,但是一定能推断出,OS内部一定有大量的数据结构和算法!! 这也就是为什么产生了数据结构这门学科! 有了结构,才会衍生出各种算法,因此也有了算法!!
系统调用和库函数 | 理解操作系统内部
1️⃣系统调用
我们都知道操作系统是干什么的了,以及他怎么做到的
但是,我们平时在使用计算机的时候,如何利用了操作系统来进行处理我们的任务的呢?换言之,我们是如何借助操作系统来处理任务的呢?
这里以银行系统做类比
在一个银行系统中,有负责管理桌椅板凳等后勤的,有负责处理业务逻辑的,有业务经理、仓库经理,然后还有行长等职务
其中,桌椅板凳这些就相当于硬件设施,而直接负责管理这些的,就相当于 驱动程序
行长,毫无疑问就是决策者。如果某个电脑坏了,管理电脑的负责人就会手机电脑坏了的数据,上报给行长,行长进行决策是否拨款让其负责人更换电脑,如果拨款还会涉及到财务经理执行拨款决策 …
还有一部分特殊的成员就是:业务人员
这些业务人员是要完成一个个业务的,也就是任务,他们不会在乎桌椅、宿舍、电脑、仓库等硬件,他们只需要做好与用户的对接工作,完成相应业务即可,但是他们也是处于管理层的(为什么?)
我们对比一下操作系统
银行中桌椅板凳电脑仓库等设施,就相当于计算机系统中的各种硬件
直接负责桌椅板凳电脑仓库的人,就是驱动程序.
而操作系统中的内存管理、进程管理、驱动管理、文件系统怎么理解呢?
内存管理:就相当于,银行面积不够,而工作人员太多容不下怎么办?如果要扩大银行面积行长能力不足,行长就采用分时制,分为白班和晚班,有的人白天来工作,另一部分晚上工作,这样还是那么点面积但是却容纳了本容纳不了的人数,这就相当于操作系统中的内存管理
驱动管理:就是管理好那些驱动软件
进程管理:比如说,行长要推进一些业务,比如抽奖业务、贷款业务等,行长让一些人去完成这些业务,这些业务的推进情况,完成结果怎么样,哪些人做的好行长对其进行奖励,做的不好开除。这就叫做进程管理。实际上银行中的业务人员是帮我们完成任务的,进程也叫做任务,而这些工作人员就是帮我们完成任务的内核级的进程,所以 上面的银行例子中,业务工作人员放在管理层!!
文件系统:在计算机中无非就是告诉我们,数据在哪存着,数据格式是什么样的,数据如何保存等。反映到银行中就是,银行中有具体的记账信息系统,可以对每一笔转账、贷款、存钱、取钱进行记录,这些也需要被行长管理起来,这就叫做文件系统
银行的内部各种准备工作都就绪了,接下来就是开门做生意了!那么,我们回想一下,银行是怎么与客户进行交互的?
显然,他们只提供一个个很小的窗口,隔着厚厚的玻璃,只有一个小口可以容纳一个手放入来传递现金或者客户资料。说话也只能借助话筒!这是为什么呢?
本质就是安全问题!银行系统假定所有人都是坏人(毕竟有很多抢银行的!),银行不信任所有人,但是又必须给你提供服务,所以就采取了这样一种方式。这就意味着,所有人与银行进行交互都必须通过柜台的方式进行交互!
而操作系统如果把内部的细节暴露给用户,就相当于银行的用户大开。如果操作系统把底层数据收集上来,通过先描述再组织成数据结构,外部随意访问,可能就会导致操作系统不安全。
所以操作系统也假定外部是不值得信任,所以操作系统也会把内核细节给封闭起来,只留一些小窗口供与用户进行交互,换句话说,操作系统是以接口的方式对外提供功能,这个接口就叫做 系统接口。所谓的系统接口,Linux是用C语言写的,所以接口实际上就是一个个函数(System call),所以这样的接口叫做 系统调用
我们在银行存钱的时候,实际上并不只是把钱给业务员即可,而是通过业务员,涉及到财务部门,记账信息,还要把你的钱放入仓库。因此你不是只和银行柜台打交道,而是通过这个柜台来访问银行内部的各种资源,操作系统也是如此,我们是通过系统调用接口的方式来调用操作系统内部的某些软硬件资源,比如如果我想发送某条信息,发送信息到网络,首先需要用到驱动、文件系统等下达给硬件,然后由网卡把数据发送到网络当中。因此我们通过接口调用的是操作系统内部的一些软硬件资源。实际上我们平时所用到的printf,scanf等函数都要涉及到硬件操作的,因此在使用这些函数中实际上都封装了了系统调用接口我们才得以调用软硬件资源来进行操作!
2️⃣库函数
一个好的产品实际上是把用户当作傻瓜的,怎么让用户操作简便就是产品经理要思考的事情。因此无论是操作系统还是银行系统,也是以这样为目标的。而我们知道,之前去银行存取钱、办什么业务是挺麻烦的。要填各种单子,准备各种资料什么的,并且我们在银行柜台中的时候,还要饱受银行工作人员通过话筒传来的不清楚的声音,因此直接访问银行柜台其实成本也挺高的!尤其是对于一些老人来说,到了柜台可能不知道要准备什么资料,并且还听不清工作人员的说话。
因此随着产业竞争和服务业的竞争,银行也提高了人性化的服务,我们现在去银行,会发现工作人员是分为两拨人的,一部分在柜台外面,一部分在柜台里面。柜台外面的是就是为了帮助那些不会使用银行柜台的人去完成存钱取钱业务的!
即基于银行柜台之上又有了一层服务层,一旦有了服务层,一些大爷大娘直接可以把资料给这些服务层,然他们帮我们去存钱取钱即可,那么为什么会产生服务层呢?就是因为银行提供的柜台用起来不是很方便吗!
类比银行系统,操作系统提供的接口使用成本也是比较高的!最起码你要知道你要传递什么参数,返回类型是什么等 … 因此基于这个问题,有些人在系统调用接口之上就做了一些操作:
- 包裹了一些软件层,比如shell外壳,图形化界面。 比如图形化界面,我们要干什么直接用鼠标点一下即可,简化了用户的使用!用于给小白用户使用操作系统的!
- 对系统调用接口的封装,我们称之为第三方库,第三方库我们没使用过,但是库却见过不少,比如C语言标准库,C++库,boost库等,这些库里面的函数把系统调用封装起来,只是使用起来更简单了! 这是方便编程人员进行编写代码的!
然后随着时代的发展,服务也更加的人性化方便人们使用,因此出现了银行的预约流程、线上业务等。同样的,操作系统上面也出现了触控屏幕的中小型设备,操作方式更加简单。作为程序员,继续往上就有了各种语言、库、组件。比如C C++ Java python php,我们发现越往上这些语言使用越简单,组件越丰富。这就是发展的产物!!
我们目前就处于银行系统中 不会使用的大娘的那个层面!