操作系统的功能历史

操作系统其实也是一种软件,任何新事物的出现肯定都有它的历史背景,那么操作系统也不是凭空出现的,肯定有它的历史背景。

在计算机尚不存在操作系统的年代,完全没有任何程序,人们通过各种按钮来控制计算机,这一过程非常麻烦。于是,有人开发出了仅具有加载和运行功能的监控程序,这就是操作系统的原型。通过事先启动监控程序,程序员可以根据需要将各种程序加载到内存中运行。虽然仍旧比较麻烦,但比起在没有任何程序的状态下进行开发,工作量得到了很大的缓解。
在这里插入图片描述
监控程序可以说是操作系统的原型。随着时代的发展,人们在利用监控程序编写程序的过程中发现很多程序都有公共的部分。例如,通过键盘进行文字输入,显示器进行数据展示等,如果每编写一个新的应用程序都需要相同的处理的话,那真是太浪费时间了。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就是这样诞生了。
在这里插入图片描述
初期的操作系统=监控程序+基本的输入输出程序。类似的想法可以共用,人们又发现有更多的应用程序可以追加到监控程序中,比如硬件控制程序,编程语言处理器(汇编、编译、解析)以及各种应用程序等,结果就形成了和现在差异不大的操作系统,也就是说,其实操作系统是多个程序的集合体。
在这里插入图片描述
操作系统是多个程序的集合体
在这里插入图片描述
对于程序员来说,程序员创造的不是硬件,而是各种应用程序,但是如果程序员只做应用不懂硬件层面的知识的话,是无法成为硬核程序员的。现在培训机构培养出了一批怎么用的人才,却没有培训出为什么这么做的人才,毕竟为什么不是培训机构教的,而是学校教的,我很相信这句话:学习没有速成这回事。言归正题。

在操作系统诞生之后,程序员不需要在硬件层面考虑问题,所以程序员的数量就增加了。哪怕自称对硬件一窍不通的人也可能制作出一个有模有样的程序。不过,要想成为一个全面的程序员,有一点需要清楚的就是,掌握硬件的基本知识,并借助操作系统进行抽象化,可以大大提高编程效率。

下面就看一下操作系统是如何给开发人员带来便利的,在Windows操作系统下,用C语言制作一个具有表示当前时间功能的应用。time() 是用来取得当前日期和时间的函数,printf() 是把结果打印到显示器上的函数,如下:
在这里插入图片描述

  • 通过time_ t tm,为time_ t类型的变量申请分配内存空间
  • 通过time(&tm),将当前的日期和时间数据保存到变量的内存空间中
  • 通过printf(" %s\n",ctime(&tm), 把变量内存空间的内容输出到显示器上

应用的可执行文件指的是,计算机的CPU可以直接解释并运行的本地代码,不过这些代码是无法直接控制硬件的,事实上,这些代码是通过操作系统来间接控制硬件的。变量中涉及到的内存分配情况,以及time()和printf()这些函数的运行结果,都不是面向硬件而是面向操作系统的。操作系统收到应用发出的指令后,首先会对该指令进行解释,然后会对时钟IC和显示器用的/O进行控制。
在这里插入图片描述
系统调用和编程语言的移植性
操作系统控制硬件的功能,都是通过一些小的函数集合体的形式来提供的。这些函数以及调用函数的行为称为系统调用,也就是通过应用进而调用操作系统的意思。在前面的程序中用到了time() 以及printf()函数, 这些函数内部也封装了系统调用。

C语言等高级编程语言并不依存于特定的操作系统,这是因为人们希望不管是Windows 操作系统还是Linux操作系统都能够使用相同的源代码。因此,高级编程语言的机制就是,使用独自的函数名,然后在编译的时候将其转换为系统调用的方式(也有可能是多个系统调用的组合)。也就是说,高级语言编写的应用在编译后,就转换成了利用系统调用的本地代码。
在这里插入图片描述
高级语言的函数调用在编译后变为了系统调用
不过,在高级语言中也存在直接调用系统调用的编程语言,利用这种方式做成应用,移植性并不友好。
在这里插入图片描述
操作系统和高级编程语言使硬件抽象化
通过使用操作系统提供的系统调用,程序员不必直接编写控制硬件的程序,而且,通过使用高级编程语言,有时也无需考虑系统调用的存在,系统调用往往是自动触发的,操作系统和高级编程语言能够使硬件抽象化,这很了不起。
下面让我们看一个硬件抽象化的具体实例:
在这里插入图片描述
上述代码使用C编写的程序,fputs() 是用来往文件中写入字符串的函数,fclose( )是用来关闭文件的函数。

磁盘就如同树的年轮,磁盘的读写是以扇区为单位的,通过磁道来寻址,如果直接对硬件读写的话,那么就会变为通过向磁盘用的I/O指定扇区位置来对数据进行读写了。但是,在上面代码中,扇区压根就没有出现过传递给fopen()函数的参数,是文件名MyFile.txt 和指定文件写入的w。传递给fputs()的参数,是往文件中写入的字符串“你好"和fp,传递fclose()的参数,也仅仅是fp,也就是说磁盘通过打开文件这个操作,把磁盘抽象化了,打开文件这个操作就可以说是操作硬件的指令。
在这里插入图片描述
下面让我们来看一下代码清单中fp的功能,变量fp中被赋予的是fopen() 函数的返回值,该值被称为文件指针。应用打开文件后,操作系统就会自动申请分配用来管理文件读写的内存空间。内存地址可以通过fopen()函数的返回值获得。用fopen()打开文件后,接下来就是通过制定的文件指针进行操作,正因为如此,fputs()和fclose()以及fclose()参数中都制定了文件指针。

由此我们可以得出一个结论,应用程序是通过系统调用,磁盘抽象来实现对硬盘的控制的。

Windows操作系统的特征
Windows 操作系统是世界上用户数量最庞大的群体,作为Windows操作系统的资深用户,你都知道Windows操作系统有哪些特征吗?下面列举了一些Windows操作系统的特性:

  • Windows 操作系统有两个版本: 32位和64位
  • 通过API函数集成来提供系统调用
  • 提供了采用图形用户界面的用户界面
  • 通过WYSIWYG 实现打印输出,显示器上显示的图形和文本都是可以原样输出到打印机打印的
  • 提供多任务功能,即能够同时开启多个任务
  • 提供网络功能和数据库功能
  • 通过即插即用实现设备驱动的自设定
  • 通过API函数集来提供系统调用

Windows是通过名为API 的函数集来提供系统调用的。API是联系应用程序和操作系统之间的接口,全称叫做Application Programming Interface,应用程序接口。当前主流的64位版WindowsAPI也称为Win64API ,之所以这样命名,是需要和不同的操作系统进行区分。API通过多个DLL文件来提供,各个API的实体都是用C语言编写的函数。所以,在C语言环境下,使用API更加容易,比如API所用到的MessageBox() 函数,就被保存在了Windows提供的user32.dll这个DLL文件中。

提供采用了GUI的用户界面
GUI(Graphical User Interface)指得就是图形用户界面,通过点击显示器中的窗口以及图标等可视化的用户界面,举个例子:Linux 操作系统就有两个版本,一种是简洁版,直接通过命令行控制硬件,还有一种是可视化版,通过光标点击图形界面来控制硬件。

通过WYSIWYG实现打印输出
WYSIWYG指的是显示器上输出的内容可以直接通过打印机打印输出。在Windows中,显示器和打印机被认作同等的图形输出设备处理的,该功能也为WYSIWYG提供了条件。借助WYSIWYG功能,程序员可以轻松不少。最初,为了是现在显示器中显示和在打印机中打印,就必须分别编写各自的程序,而在Windows中,可以借助WYSIWYG基本上在一个程序中就可以做到显示和打印这两个功能了。

提供多任务功能
多任务指的就是同时能够运行多个应用程序的功能,Windows是通过时钟分割技术来实现多任务功能的。时钟分割指的是短时间间隔内,多个程序切换运行的方式。在用户看来,就好像是多个程序在同时运行,其底层是CPU 时间切片,这也是多线程多任务的核心。
在这里插入图片描述
提供网络功能和数据库功能
Windows中,网络功能是作为标准功能提供的。数据库(数据库服务器)功能有时也会在后面追加。网络功能和数据库功能虽然并不是操作系统不可或缺的,但因为它们和操作系统很接近,所以被统称为中间件而不是应用。意思是处于操作系统和应用的中间层,操作系统和中间件组合在一起, 称为系统软件。应用不仅可以利用操作系统,也可以利用中间件的功能。
在这里插入图片描述