这篇文章我们来介绍一下操作系统相关的知识。
说到操作系统,我们肯定是要介绍冯诺依曼体系结构的。
冯诺依曼体系结构
常见的输入设备有键盘,网卡,显卡,话筒等等
常见的输出设备有显示器,磁盘,网卡,显卡等
存储器就是我们所说的内存
运算器和控制器就是CPU
IO = input + output
我们来分析一下这个体系结构的合理之处。
冯诺依曼体系结构设计了存储器这个十分核心的设备。CPU的速度随着硬件的发展速度之快,已经到达了纳秒级别的速度。而我们的输入设备和输出设备是很慢的,如果输入设备和输出设备直接和CPU取得关联的话,那么会严重制约CPU的速度,就好比博尔特必须把脚和一个老人绑在一起跑步,就算博尔特再快也没用。
存储器的出现让我们的输入设备和输出设备把数据往存储器存入以及从存储器里面输出数据,存储器就像一个缓冲区一样,当CPU需要的时候就往存储器里面读取就可以了。
这样做的好处是:
- 削峰填谷,当外设IO数据多的时候,我们把较多的数据往内存里面存,CPU只管从内存里面读数据,这样数据多的时候CPU也不会因为来不及处理而崩溃。当数据少的时候,CPU可以继续处理内存里面剩下的数据,使得不管IO如何变化,CPU总是可以以一个相对稳定的速度来处理数据,不至于过载或者闲置。
- 解耦合,这个世界需要解耦合,例如快递小哥只负责送快递,他不在意你的货是什么,店商只负责把东西交给快递小哥,不在乎快递小哥是通过什么方式送货的。解耦合可以让分工明确,效率高效。我们的外设IO只负责把东西给内存,内存经过处理之后给CPU,而CPU只负责从内存里面取数据,不需要关心外设的不同情况。
其实,在操作系统中,很多设计都遵循着这样的思想。
接下来,我们来详细的介绍一下这些思想:
缓冲区思想
操作系统中很多地方都有缓冲区,也不光是操作系统,网络等等很多地方都用得到缓冲区。例如语言层的语言缓冲区,系统层的内核缓冲区,网络中TCP的缓冲区等等。
缓冲区的好处有:
- 将程序清晰地划分模块,建立良好的模块化架构,使得写入和读出成为高聚合,低耦合的模块。
- 对于写入和读出的处理可能产生的快慢不均匀的情况进行平衡,使得整个处理的速度趋于平滑的均匀状态,避免出现读出模块处理的慢速使得写入模块等待使得响应速度下降的状况;同样,也避免写入模块的快慢不均匀,使得读出模块忙闲不一的情况。
- 可以增加处理的并发性。由于写入和读出模块的良好设计和划分,可以使得它们彼此隔离和独立,从而,使用线程和进程产生不同的并发处理,并通过缓冲区大小的调节,使得这个处理达到良好的匹配和运行状态。例如,写入模块可以有N个线程或进程,读出模块可以有M个线程和进程,缓存冲区可以配置L的大小。N、M、L可以通过模拟试验设定适应具体应用的值。也可以建立一套自动调节的机制,当然,这样会造成设计的复杂性。
但是它也有对应的缺点:
- 数据的接收处理原本就是密切相关,难以划分模块。
- 处理中的模块间明显不存在处理不均匀的情况,或者不是主要问题。
- 需要同步响应的情况。显然,写入端只是将信息push到队列中,并不能得到读出端的处理响应信息,只能适合于异步的信息传递的情况。
解耦合思想
解耦合就是把一个任务清晰的可以分离成很多个单独的任务,然后分别解决,不能形成一个任务制约或者被另一个任务制约的情况。例如前后端分离就是很典型的一种解耦合的思想。如果我们的前端和后端都是交给一个人做的,那么效率会很低,无法分工,换一个人写代码就看不懂上一个人写的代码了,而前后端分离可以让任务快速的进行,提高效率。在操作系统中存在很多解耦合的思想:例如驱动层可以理解为一种解耦合,虚拟地址空间也可以,到时候我们会在对应的文章详细的去理解。
Linux下一切皆文件
Linux操作系统之下所有的东西都是文件,例如我们的命令行,命令行在Linux操作系统里面有对应的文件。包括我们的外设硬件设备也有对应的文件与之对应。这样做的好处是我们可以通过一套管理文件的方式来管理任何东西,方便操作系统的管理。
先描述再组织原则
其实我们说了这么多设计思想,但是我们还没用搞清楚操作系统的定义呀:
OS是什么?是一款专门针对软硬件资源进行管理工作的软件。
对下管理好软硬件资源,对上给用户提供稳定,高效,安全的运行环境。
那么操作系统的管理原则是什么呢?
先描述再组织。
什么意思呢?
我们举一个例子,校长该怎么管理学生呢?校长管理学生的时候是管理学生这个人吗,学生这么多,校长应该怎么管理呢?校长肯定是不会直接管理学生的,校长会先管理辅导员,然后由辅导员来管理学生。这就好比是:学生是硬件,辅导员是驱动,校长是操作系统,操作系统想要进行对硬件的管理,就必须有一个驱动程序,由驱动程序管理硬件,操作系统管理驱动程序。这里体现了解耦合的思想,因为不同种类的外设管理方法不一样,需要驱动进行一个统一,方便操作系统管理。
还有一个问题,就是我们在管理的时候真的是在管理你这个人吗,还是通过你的数据来管理你?校长处分你的时候,是通过你的数据,得知你应该被处分,不一定是亲自接触到了你这个人。因此我们需要把描述的对象数据化,通过数据来描述你这个人。 那么如何用数据对你进行描述呢?在C语言里面我们可以用一个结构体,把你的相关信息存放在结构体里面,这样就完成了对你的描述。
例如:
struct student {
int id;
char *name;
// ...
}
我们有了描述一个学生的方法,但是这样无法达成管理的效果,因为我们的学生很多,要管理这些学生我们需要找到组织学生的方法,例如组建班级,在OS中的组建方法就是把代表你的结构体用用双向链表链接起来。这样就完成了描述和组织!
以上就是对操作系统的大概理解和认识,当我们有这些认识之后再去看后面的文章,会好理解很多。