1.初识操作系统
1.1概念
从前文,我们知道,每个硬件都有其相应功能并能遵循冯·诺依曼体系很好的去工作,但这远远不够,什么功能在何时被执行还需要被调控。
举个例子:你是一个国家的国王,这个国家有许多人,有的人会搞艺术,有的人会搞经济,有的人擅于谈判,有的人擅于打仗。在你想要享乐时,那些会搞艺术的会被找来进行表演,在和平年代,你会重点培养那些发展经济的人,外敌来犯时,需要擅于谈判进行和解,想要打仗时,你又得需要善战的人来为你开疆拓土。如果所有的事都由你来做,那未免太累了,你需要一个人来帮忙处理这些事,只要你一个想法,那个人就能帮你实现。
我们使用计算机,大部分情况也是通过软件去访问计算机的硬件资源,硬件资源是有限的,那我们就要把硬件资源给管理好。在计算机领域中,这个管理的角色就是操作系统(OS),用户只需要戳戳屏幕,就能实现想要的功能,背后繁杂的事全部交给操作系统来完成。
简单来说,操作系统就是一款可以管理软硬件资源的软件。
任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。笼统地理解,操作系统包括:
内核:
进程管理:决定哪个程序先运行、运行多久(CPU时间分配)。
内存管理:分配/回收内存空间,防止程序互相干扰。
文件管理:组织硬盘上的数据(如NTFS、EXT4格式),控制读写权限。
驱动管理:统一管理键盘、鼠标、显卡等硬件,提供标准接口。
其他程序:例如函数库,shell程序等。

1.2目的
2.OS体系
首先,我们肉眼可见的计算机实物,也就是计算机底层的硬件,其底层全部都遵循冯·诺依曼体系。
从上文我们得知,仅仅有这些硬件是不够的,我们还需要操作系统对这些硬件进行管理,

此时有个问题,操作系统难道直接和硬件打交道吗?
举个例子:如果操作系统自己来完成键盘的读取操作,如果键盘的读取操作改变,那么操作系统的内核源代码就需要重新编译,这对操作系统来说,维护的成本太高了。
于是我们在操作系统和硬件之间,加入了一层驱动程序,驱动程序的工作就是单独处理底层硬件。比如键盘有键盘驱动,网卡有网卡驱动,硬盘有硬盘驱动,磁盘有磁盘驱动。简单来说,驱动就是去访问某个硬件,访问硬件的读,写以及硬件当前的状态等等。驱动一般是由硬件原产商提供的,或者是由操作系统的某些模块进行开发的(例如网卡)。此时操作系统只需关心何时读取数据处理数据,不用再关心数据是如何读取了。

操作系统之下我们介绍完了,接下来是操纵系统之上
操作系统再往上就来到了我们所处的位置(用户层),在这里用户可以通过命令行或图形化界面进行各种操作。

为了防止有人恶意修改数据,或者小白无意间修改数据,在用户层与操作系统之间,还加入了系统调用接口。
就好比银行为了保护自己需要将自己封闭起来,但并不是完全封闭,还会开出一些小窗口来给老百姓提供服务。这样普通用户想要取钱,贷款,都只能通过这个窗口进行。
这个窗口在计算机中就称为接口,OS的设计者用C语言写了一些内部的函数方法给外部,我们称之为系统调用接口。
但是这些系统调用接口对于普通用户来说使用难度较大,因为你使用这个接口就需要对系统提前进行一定的了解。所以我们我们在系统调用之上又构建出了一批库,比如libc和libc++。这些库包括我们在语言上使用的各种库都是封装了系统调用接口的。程序员通过调用这些库中的各种函数(比如printf,scanf)进行各语言程序的编写,设计出上层软件(用户操作接口)供普通用户使用。

3.核心功能
4.基于OS体系的思考
4.1如何管理
OS的管理方法其实类似于大学中校长,辅导员和学生的关系,可以联系起来辅助理解

问题1:校长是公认的管理者,学生是被管理者,大多数学生见校长只有两次,一次是在开学典礼,另一次是在毕业典礼,为什么校长作为管理者和被管理者见面次数如此之少?
结论1:管理者与被管理者并不需打交道。(操作系统并不与硬件直接打交道)
问题2:管理者不与管理者打交道,但却把管理者管理得明明白白,是如何做好管理的?
举个例子:比如说学校需要选出几个人去参加数学竞赛,我只需要知道哪几个学生的数学水平比较高就可以了,如果学校想给前10名奖学金,只需要给成绩排个序取前10名就可以了。
结论2:对于管理者来说,只要知道管理信息,就可以在未来进行管理决策。所以管理的本质是通过对数据的管理,达到对人的管理。(操作系统拿到数据就能对数据进行决策,管理的本质是对数据管理,从而达到对硬件的管理)
问题3:管理者是如何拿到数据的?
校长与学生之间还有一个中间角色辅导员,校长作为管理者提出决策,而辅导员是决策的执行者,结论3:也就是说管理者与被管理者之间夹着一个执行者(操作系统与硬件之间还有一个驱动程序)
4.2先描述,再组织
一个大学学生的数量是庞大的,我们不可能把数据写在表格上,在需要找人时按照表格一个一个看,面对这么多数据肯定忙不过来,而且徒增很多工作量。于是我们可以联想,虽然学生是一个个独立的个体,但他们具有相同的属性,比如姓名,性别,学号,学院,专业,班级...直接把想要的信息全部管理起来不就好了,作为程序员,你可能会想到用结构体来管理。每入学一个学生就创建一个学生类型,毕业一个学生就删除一个学生类型。但这样数据量依然很庞大,那我们要怎么管理呢,要对数据进行管理,当然是用数据结构了,我们往结构体中加入next指针,就可以将所有学生的信息串起来了,这样对学生的管理就变成了对链表的管理。

这样写有什么好处?对链表的管理本质上就是对链表进行增删查改,我们可以根据链表的特点去写一些特定的接口,比如我要找数学成绩最好的十名同学,只需要写一个接口就能找到了,不用在表格里一个一个去看了。也就是说管理者通过执行者去拿到数据,就可以将被管理者的一些信息用结构体描述出来,然后再通过某种数据结构的特点实现相关需求的算法来组织数据。
也就是所谓的先描述,再组织。
比如写一个通讯录,需要先把人描述出来,比如说有姓名,年龄,电话号码。通讯录就是要把这些人的数据组织管理起来,那么就要设计一些接口:删除联系人,添加联系人,修改联系人信息...
故未来不论开发什么软件,都是按照“先描述再组织”的思路思考。
其实我们C++的学习路线也是这样的,先学习类和对象,这是在学习如何描述,再学习stl,这是在学习如何组织数据。
另外我们还可以知道,OS管理的任何对象最终都是转化为对某种数据结构的增删查改。
4.3库文件与系统调用
在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤,这部分由操作系统提供的接⼝,叫做系统调⽤。
系统调⽤在使⽤上,功能⽐较基础,对用户的要求相对也⽐较⾼,所以,有⼼的开发者可以对部分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层⽤户或者开发者进⾏⼆次开发。

2738

被折叠的 条评论
为什么被折叠?



