【程序是怎样跑起来的】第9章:操作系统和应用的关系

监控程序,系统调用,Windows操作系统

Posted by x-jeff on August 30, 2024

博客为参考《程序是怎样跑起来的》一书,自己所做的读书笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.操作系统功能的历史

👉第9章热身问答:

  1. 监控程序的主要功能是什么?
    • 程序的加载和运行。监控程序也可以说是操作系统的原型。
  2. 在操作系统上运行的程序称为什么?
    • 应用或应用程序。
  3. 调用操作系统功能称为什么?
    • 系统调用(system call)。应用通过系统调用(system call)间接控制硬件。
  4. Windows Vista是多少位的操作系统?
    • 32位(也有64位的版本)。
  5. GUI是什么的缩写?
    • Graphical User Interface(图形用户界面)。
  6. WYSIWYG是什么的缩写?
    • What You See Is What Your Get(所见即所得)。WYSIWYG是指可以直接将显示器中显示的内容在打印机上打印出来。这也是Windows的特征之一。

在计算机中尚不存在操作系统的年代,完全没有任何程序,因此程序员就需要编写出处理相关的所有程序。用机器语言编写程序,然后再使用开关将程序输入,这一过程非常麻烦。于是,有人开发出了仅具有加载和运行功能的监控程序,这就是操作系统的原型。通过事先启动监控程序,程序员就可以根据需要将各种程序加载到内存中运行。虽然依旧比较麻烦,但比起在没有任何程序的状态下进行开发,工作量得到了很大的缓解(图9-1)。

随着时代的发展,人们在利用监控程序编写程序的过程中,发现很多程序都有共通的部分。例如,通过键盘输入文字数据、往显示器输出文字数据等。这些处理,在任何程序下都是一样的。而如果每编写一个新的程序都要记述相同的处理的话,那真的是太浪费时间了。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了(图9-2)。

之后,随着时代的进一步发展,开始有更多的功能被追加到监控程序中,比如,为了方便程序员的硬件控制程序、编程语言处理器(汇编、编译、解析)以及各种实用程序等,结果就形成了和现在相差不大的操作系统。因此,操作系统本身并不是单独的程序,而是多个程序的集合体(图9-3)。

2.要意识到操作系统的存在

代码清单9-1表示的是,在Windows操作系统下,用C语言制作一个具有表示当前时间功能的应用。time()是用来取得当前日期和时间的函数,printf()是用来在显示器上显示字符串的函数。程序的运行结果如图9-4所示。

在操作系统这个运行环境下,应用并不是直接控制硬件,而是通过操作系统来间接控制硬件的。变量定义中涉及的内存的申请分配,以及time()printf()这些函数的运行结果,都不是面向硬件而是面向操作系统的。操作系统收到应用发出的指令后,首先会对该指令进行解释,然后会对时钟IC(实时时钟$^1$)和显示器用的I/O进行控制。

  1. 计算机中都安装有保存日期和时间的实时时钟(Real-time clock)。

3.系统调用和高级编程语言的移植性

操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(system call),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了time()printf()等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字符串等功能的系统调用的函数名,并不是time()printf()。系统调用是在time()printf()函数的内部执行的。

C语言等高级编程语言并不依存于特定的操作系统。这是因为人们希望不管是Windows还是Linux,都能使用几乎相同的源代码。因此,高级编程语言的机制就是,使用独自的函数名,然后再在编译时将其转换成相应操作系统的系统调用(也有可能是多个系统调用的组合)。也就是说,用高级编程语言编写的应用在编译后,就转换成了利用系统调用的本地代码(图9-6)。

在高级编程语言中,也存在可以直接调用系统调用的编程语言。不过,利用这种方式做成的应用,移植性并不友好(也俗称为有恶意行为的应用)。例如,直接调用Windows系统调用的应用,在Linux上显然是无法运行的。

4.操作系统和高级编程语言使硬件抽象化

通过使用操作系统提供的系统调用,程序员就没必要编写直接控制硬件的程序了。而且,通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。

5.Windows操作系统的特征

Windows操作系统的主要特征如下所示:

  1. 32位操作系统(也有64位版本)。
  2. 通过API函数集来提供系统调用。
  3. 提供采用了图形用户界面的用户界面。
  4. 通过WYSIWYG实现打印输出。
  5. 提供多任务功能。
  6. 提供网络功能及数据库功能。
  7. 通过即插即用实现设备驱动的自动设定。

👉(1)32位操作系统。

这里的32位表示的是处理效率最高的数据大小。Windows处理数据的基本单位是32位。

👉(2)通过API函数集来提供系统调用。

Windows是通过名为API的函数集来提供系统调用的。API是联系作成应用的程序员和操作系统之间的接口。所以称为API(Application Programming Interface,应用程序接口)。

32位版Windows API也称为Win32 API。64位版就是Win64 API。在Win32 API中,各函数的参数及返回值的数据大小,基本上都是32位。

API通过多个DLL文件来提供。各API的实体都是用C语言编写的函数。因而,C语言程序的情况下,API的使用更加容易。

👉(3)提供采用了GUI的用户界面。

👉(4)通过WYSIWYG实现打印输出。

WYSIWYG指的是显示器上显示的内容可以直接通过打印机打印输出。

👉(5)提供多任务功能。

多任务指的是同时运行多个程序的功能。Windows是通过时钟分割技术来实现多任务功能的。

时钟分割指的是在短时间间隔内,多个程序切换运行的方式。在用户看来,就是多个程序在同时运行。也就是说,Windows会自动切换多个程序的运行(图9-9)。此外,Windows中还具有以程序中的函数为单位来进行时钟分割的多线程功能。

👉(6)提供网络功能及数据库功能。

网络功能和数据库功能,虽并不是操作系统本身不可欠缺的功能,但因为它们和操作系统很接近,所以被统称为中间件而不是应用。意思是处于操作系统和应用的中间(middle)。操作系统和中间件合在一起,也称为系统软件。应用不仅可以利用操作系统,也可以利用中间件的功能(图9-10)。

相对于操作系统一旦安装就不能轻易替换,中间件则可以根据需要进行任意的替换。不过,大多数情况下,中间件变更后应用往往也需要变更。

👉(7)通过即插即用实现设备驱动的自动设定。

即插即用(Plug-and-Play)指的是新的设备连接(Plug)后立刻就可以使用(Play)的机制。新的设备连接到计算机后,系统就会自动安装和设定用来控制该设备的设备驱动程序。

设备驱动是操作系统的一部分,提供了同硬件进行基本的输入输出的功能。键盘、鼠标、显示器、磁盘装置等,这些计算机中必备的硬件的设备驱动,一般都是随操作系统一起安装的。如果之后再追加新的网卡(NIC$^1$)等硬件的话,就需要向操作系统追加该硬件专用的设备驱动。大家购买的新的硬件设备中,通常都会附带着软盘或CD-ROM,里面通常都收录着该硬件的设备驱动。

  1. NIC(Network Interface Card)是计算机连接网络(LAN)时使用的设备。也称为网卡或者LAN卡。

有时DLL文件也会同设备驱动文件一起安装。这些DLL文件中存储着用来利用该新追加硬件的API(函数集)。通过API,可以制作出运用该新硬件的应用。