文章目录
- 前言
- 1. 操作系统的概念和定位
- 2. 如何理解“管理”
- 3. 操作系统为什么要做管理
- 4. 系统调用和库函数概念
- 5. 局部性原理
- 6. 计算机体系结构
前言
上一篇文章我们学习了冯诺依曼体系结构(属于计算机硬件的范畴),其中我们提到,因为有了内存的存在,我们可以把数据预加载到内存中,然后供CPU进行获取处理。
那我问大家一个问题,就是我们的数据可能非常多,那预加载的时候要先预加载那一部分数据呢?如果内存不够了怎么办?CPU在处理数据的时候如何快速找到内存里面预加载的数据?CPU处理任务的时候是一个任务执行完在执行下一个,还是同时执行多个?还有如果我们把输出的数据写到文件中,那我们如何去快速找到它呢?目录结构是谁来给我们维护的呢?
这些工作是由硬件完成的吗?
硬件呢就可以认为好比是医院里面的各种医疗设备和仪器,那医院里面只需要这些设备就可以了吗?
当然是不行的,还需要由医生等各种工作人员,比如不同科室需要有不同的医生帮助不同症状的病人看病。
那同样的,在计算机里面,光有那些硬件也是不行的,什么情况下把什么数据预加载到什么位置,内存空间不够了怎么办,输出结果要保存到文件,应该放到什么位置…等等这些问题都不是你硬件能解决的。
所以就需要另一种软件——操作系统。
那下面我们就来谈一谈操作系统
1. 操作系统的概念和定位
首先要知道:
操作系统是一种软件,这个我们之前也提到过。
那软件的话通过上一篇文章的学习我们知道软件想要运行的话就要先加载到内存里,那其实我们计算机开机的时候就是在加载操作系统。
那操作系统是一款什么样的软件呢?
这个我们之前也提过,操作系统是一款进行软硬件管理的软件!
概念:
任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
设计OS的目的:
与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境
定位:
在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件
那既然操作系统是搞管理的,那第一个问题,我们该如何理解这里的”管理“
2. 如何理解“管理”
我们先来讨论一下操作系统对硬件的管理
那要谈管理呢,就一定要谈这两种角色,即管理者和被管理者
举个栗子:
比如在学校里,我们学生就是被管理者。那下面为了方便大家理解,我们把学校的场景简化一下,假设只有下面这三种角色:校长、辅导员和学生
那大家想一下在这三种角色中谁是真正的管理者?
首先大家要明白我们做的事情无非就两种——决策和执行决策。
比如我们作为一个学生我今天醒来决定要不要去上课,下课只后我决定要不要打把游戏放松一下,如果决定了就去执行。
那学生的话其实对自己的生活即是决策者又是执行者。
而对于真正的管理者来说的话,其实它主要做的是决策。
所以,大家现在应该知道在校长、辅导员和学生这三种角色中谁是管理者了。
🆗,应该是校长。
比如校长告诉辅导员,让他下周一举办一个编程大赛,然后辅导员去落实,去准备,最后我们学生去执行。
所以可以认为这三个角色是这样的关系:
校长——决策者
辅导员——落实决策
学生——执行决策
(其它的关系我们不考虑太多,上面说了我们这里是简化的场景)
但是呢,大家想一下:
对于一个大学生来说,平时在学校和校长的接触多吗?
🆗,并不多,甚至一年都见不了一次面。
那这里就有一个问题,校长作为管理者,都没怎么见过学生,那他如何去很好的管理学生呢?
那管理者和被管理者一定需要经常接触,经常沟通吗?
答案是不需要的。
管理者和被管理者,不一定非要进行之间沟通的!
就像公司的员工,可能连老板的面都没见过,但是老板依然可以把他管理的很好。那这是怎么做到的呢?
🆗,其实只要管理者能拿到被管理者的数据就可以对其进行管理。
你在公司上班,跟老板见都没见过,但是你发现最后老板扣了你的奖金,因为老板能知道你每天的工作情况,知道你哪天迟到过,那天任务没有完成。
那既然管理者和被管理者没有之间接触,那他是如何拿到你的数据呢?
虽然你的老板和你没有之间接触,但是你的上一级,比如你们部门的领导,他和你有之间的接触,他知道你每天的情况,那他就可以把这些数据汇报给老板,那老板就知道了。
校长可以拿到学生的数据因为辅导员可以给它汇报。
下一个问题,对于管理者来说,被管理者的数据量可能非常庞大(比如一个学校有2万名学生,但是只有一个校长),那管理者如何做到对这些数据进行合理的分析呢?
🆗,虽然数据量非常大,但是这些数据的类型是一致的。
举个栗子:
比如校长要获取所有学生的信息都是它的学号、姓名、电话和期末成绩。
那如果我作为校长呢我就可以这样做:
我就可以定义一个结构体,然后把这些字段都定义为成员变量。然后我告诉辅导员,你按照这些字段把所有学生的这些信息给我汇总上来。
然后呢我就可以给这个结构体再加一个指针,我搞一个链表把这些学生的数据全部管理起来
然后呢我作为校长我做这样一个决策,我要让所有学生里面数学成绩最高的那个代表学校去参加一个数学竞赛,那我就可以遍历这个链表找出数学成绩的最大值,然后获取这个成绩对应的学生姓名,然后把辅导员叫过来,告诉他让他找这个学生去参加比赛。
那此时这个决策就转换成了对这个链表的遍历操作。
那后续其它的一些管理工作比如要开除一个学生,新转来一个学生,两个学生要换宿舍,其实就都转换成了对这个链表的增删查改。
那上述我们就完成了对管理工作的一个建模的过程。
那从中我们也能够得出:
计算机管理硬件,管理的本质:先描述、再组织
以我们上面举的例子来说
描述被管理对象——描述起来,用struct结构体
组织被管理对象——组织起来,用链表或其他高效的数据结构
那我们上面例子中提到的校长、辅导员、学生这个三个角色对应到计算机里面又是什么呢?
🆗,那校长其实就对应计算机中的操作系统,学生就对应计算机中的软硬件,而辅导员则对应硬件驱动。
3. 操作系统为什么要做管理
那操作系统为什么要对软硬件资源进行管理呢?
计算机本质是为用户服务的,所以操作系统对软硬件进行管理其实就是为了更好地为用户提供服务的,不能今天这个硬件出问题了,明天那个软件出问题了。
总结一下就是:
操作系统对下通过管理好软硬件资源(手段),对上给用户提供良好(安全、稳定、高效、功能丰富)的的执行环境(目的)。
那操作系统进行软硬件管理是为了给用户提供更好的服务,那在日常生活中,也有类似的例子:
比如说银行,银行里面肯定也有自己的管理体系来给人们提供良好的服务,在银行系统中,可以认为行长就对应计算机中的操作系统OS,他可以管理员工,也可以管理银行里面的各种设备,就像OS可以管理软硬件一样。
那我问大家一个问题,银行是给人们提供服务的,但是银行相信我们吗?
什么意思呢?
比如你想去银行的仓库里面看看,别人取钱的时候你想进行看看,或者你想看看银行工作人员的电脑,人家会让你干吗?
不会的,银行虽然是给我们提供服务的,但是他不相信我们。
它要保证自身的安全。
那对于操作系统也是这样的:
操作系统是给用户提供服务的,但是他不相信任何人,不允许用户访问它任何内部的细节,它要维护自身的安全。
4. 系统调用和库函数概念
那它如何做到即为我们提供服务,又要防备我们,保护自身的安全呢?
那大家先想一下银行是怎么做的?
🆗,他是不是提供了一个个的窗口,每个窗口都有厚厚的玻璃,只留一个开口来让工作人员为我们提供服务。
那它这样既可以为我们提供服务,同时也保证自己的安全。
那同样的,对于操作系统来说:
我们能直接访问或修改操作系统内部的东西吗?
当然是不行的,操作系统给我们提供服务,但是他不相信任何人。
所以,和银行的做法类似:
在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。
比如有些操作系统上有人就基于系统调用接口写了图形化界面,有的操作系统设计者就基于系统调用接口写了shell和工具集,还有比如C语言里面的一些库函数或者Linux上的一些命令,我们可以直接使用,但他的底层可能就是去调用对应的系统调用去完成对应的操作,是会贯穿体系结构的。
5. 局部性原理
再来补充一个东西
上一篇文章我们提到,由于内存的存在,数据可以预加载到内存,这可以提高了CPU的处理速度,那数据预加载到内存这个工作其实就是操作系统做的。
那问题就是:要处理的数据可能很多,操作系统如何决定要把那些数预先加载到内存呢?
这就是我们这里要了解的一个——局部性原理
局部性原理(Principle of Locality)是计算机系统设计和优化的重要原则,它基于观察到在计算机程序中,数据和指令的访问往往具有一定的局部性特征。局部性原理可以分为两个方面:时间局部性和空间局部性。
时间局部性(Temporal Locality):时间局部性指的是程序中执行的指令和访问的数据在一段时间内很可能会再次被使用。这意味着如果一个数据项或指令刚被访问过,那么在不久的将来它很可能会再次被使用。因此,在计算机系统中,对最近使用的指令和数据进行缓存,可以减少对主存的访问延迟,提高程序的运行速度。
空间局部性(Spatial Locality):空间局部性指的是程序中执行的指令和访问的数据往往具有空间上的连续性。即,如果一个数据项被访问,那么在接下来的一段时间内,其相邻的数据项也很可能会被访问。因此,通过预取相邻的数据项和指令到高速缓存中,可以利用空间局部性减少对主存的访问次数,提高访问效率。
6. 计算机体系结构
那通过我们前面的铺垫和讲解,我们最终就得出了计算机的整个体系结构: