zl程序教程

您现在的位置是:首页 >  系统

当前栏目

初识操作系统(OS)

2023-09-27 14:19:51 时间


1. 概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。

笼统的理解,操作系统包括:

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(例如函数库,shell 程序等等)

2. 设计操作系统的目的

  • 与硬件进行交互,管理所有的软硬件资源。
  • 为用户程序(应用程序)提供一个良好的执行环境。

3. 定位

简单来说,操作系统是一款搞管理的软件,它对下要管理好软硬件资源,对上要提供良好的、稳定的、完全的,软件服务。

进言之,在整个计算机软硬件架构中,操作系统的定位是:一款纯正的 “搞管理” 的软件。

4. 如何理解管理

管理的本质:不是对 被管理对象 进行直接管理,而是只要拿到 被管理对象的所有的相关数据。我们对数据的管理,就可以体现对人的管理。

下面我通过一个例子来说明,什么叫管理!

在学校里,有这样的三种角色:校长、辅导员、学生。那么很明显,校长是管理者,而学生是被管理的对象,那么辅导员是什么角色呢?

在这里插入图片描述

校长作为管理者来管理学生,校长实际上就是那个做决策的人,但是校长作出决策后并不需要自己来执行,而是让辅导员去执行,所以辅导员的主要任务就是执行管理者的决策,我们通常将其称为执行者。

在这里插入图片描述

但是,校长连我的面都见不到,他如何来管理我呢?

那么仔细想一下,管理你需要做到和你见面吗?你在学校除了开学典礼和毕业典礼,平时会见到校长来你班级对你进行管理吗?

其实很简单,假设现在校长要求计算机科学与技术专业的辅导员将该专业综合成绩靠前 10 名同学的资料拿给他,他从这 10 名同学中选出最优秀的 3 名学生去参加 ACM 大赛,当辅导员将资料拿来后,校长选出 3 名学生说:“就这三个了,你找个老师对这三名学生进行一下强化训练,然后参加本次的 ACM 大赛”。然后校长就什么也不管了。

你可以发现,在整个过程中,校长根本没见过这 3 名同学,就对其进行了管理,他根据的是什么?没错,他根据的是数据。

实际上,学校将我们每个学生的各种信息都进行了管理,基本信息、成绩信息以及健康信息等等。

在这里插入图片描述

像这样抽取所有同学的属性,描述对应的同学。这么一套信息在 C 语言当中我们称之为结构体,而在 C++ 当中又叫做面向对象。

当学生的数量多起来了,校长就可以将全部学生的信息组织起来,当然组织的方式有很多种(链表、顺序表、树),而每种组织方式都有其自己的优势,这里我们假设校长以双链表的形式将学生的信息组织起来。

在这里插入图片描述

此时校长对各个学生的管理,实际上就变成了对这个双链表的增删查改。当有新生时直接向该双链表加入一个结点,当学生毕业后直接将学生信息从该双链表当中移除即可。

所以,管理的本质就是对数据做管理,那么对数据的管理就是对某种数据结构的管理!

5. 再谈操作系统

我们主要分为硬件部分、系统软件部分、用户部分。

🍑 硬件部分

我们看得见的,就是计算机底层的硬件。

这些硬件看似是一个个罗列出来的,但实际在底层都遵守冯诺依曼的组织形式。

在这里插入图片描述

🍑 操作系统

如果只有这些硬件是不够的,还需要有一个软件来对这些硬件进行管理。

例如,内存何时从输入设备读取数据?读取多少数据?内存何时刷新缓冲区到输出设备?是按行刷新还是全刷新?这些都是由软件进行管理的,而这个软件就是操作系统(Operator System)。

在这里插入图片描述

操作系统主要进行以下四项管理:

  • 内存管理:内存分配、内存共享、内存保护以及内存扩张等等。
  • 驱动管理:对计算机设备驱动驱动程序的分类、更新、删除等操作。
  • 文件管理:文件存储空间的管理、目录管理、文件操作管理以及文件保护等等。
  • 进程管理:其工作主要是进程的调度。

操作系统的核心工作就是去做管理,管理的重要理念就是:先描述,再组织!

🍑 驱动程序

请问操作系统可以直接和底层硬件打交道吗?

举个例子,如果操作系统自己来完成键盘的读取操作,那么只要你的键盘读取方式进行了改变,那么操作系统的内核源代码就需要进行重新编译,这对操作系统来说维护成本太高了。

于是我们又在操作系统与底层硬件之间增加了一层驱动层,驱动层的主要工作就是单独去控制底层硬件的。例如,键盘有键盘驱动,网卡有网卡驱动,硬盘有硬盘驱动,磁盘有磁盘驱动。

驱动简单来说就是去访问某个硬件,访问这个硬件的读、写以及硬件当前的状态等等,驱动层就是直接和硬件打交道的。而驱动一般是由硬件制造厂商提供的,或是由操作系统相关的模块进行开发的(例如网卡)。

此时操作系统就只需关心何时读取数据,而不用关心数据是如何读取的了,也就是完成了操作系统与硬件之间的解耦。

在这里插入图片描述

🍑 用户部分

操作系统再往上就是我们所处的位置,在这里我们就可以用命令行或是图形化界面进行各种操作,这一层被称为用户部分。

在这里插入图片描述

🍑 系统调用接口

操作系统为了保护自己,对上只暴露了一些接口,而不会让用户直接访问操作系统,这一系列接口被称为系统调用接口。

在这里插入图片描述

那么为什么要提供这些系统接口呢?

相信大家都去过银行吧,银行并不相信任何人,所以把银行的整个系统是用对应的玻璃全部隔开,只给大家开个小窗口,用来办理业务!

操作系统也是一样,并不相信任何的用户,它不会将自己所有的数据结构、所有的结构体、所有的代码、所有的数据全部暴露给用户,是为了防止用户恶意或者误操作,修改了操作系统中的代码,从而影响了操作系统的稳定性!

所以操作系统对外提供的所有服务是以系统调用的方式,对外提供的操作系统方面的接口!

🍑 用户接口操作

但这些系统调用接口对我们普通用户来说使用成本又太高了,因为要使用系统调用前提条件是你得对系统有一定了解,所以在系统调用接口之上又构建出了一批库,例如 libc 和 ibc++。

实际上在语言级别上使用的各种库,就是封装了系统调用接口的,我们就是通过调用这些库当中的各种函数(例如 printf 和 scanf)进行各种程序的编写。

在这里插入图片描述

6. 总结

计算机管理硬件:

  • 先描述,用 struct 结构体。
  • 再组织,用链表或者其他高效的数据结构

系统调用和库函数概念:

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。