首页 > 编程语言 >《程序是怎样跑起来的》·第九章 操作系统和应用的关系

《程序是怎样跑起来的》·第九章 操作系统和应用的关系

时间:2023-02-18 00:22:15浏览次数:37  
标签:操作系统 第九章 32 程序 硬件 Windows 应用

阅读正文前,让我们先回答下面的问题来热热身吧:

  1. 监控程序的主要功能是什么?
  2. 在操作系统上运行的程序称为什么?
  3. 调用操作系统功能称为什么?
  4. Windows Vista 是多少位的操作系统?
  5. 图形用户界面是什么的缩写?
  6. 所见即所得 是什么的缩写?

答案:

  • 程序的加载和运行
  • 应用或应用程序
  • 系统调用(系统调用))
  • 32 位(也有 64 位的版本)
  • 图形用户界面(图形用户界面)
  • 所见即所得(所见即所得)

1.操作系统功能的历史

操作系统的原型:仅具有加载和运行功能的监控程序。
通过事先启动监控程序,程序员就可以根据需要的各种程序加载到内存中运行。如下图:

 

   在利用监控程序编写程序的过程中,发现很多程序都要共通的部分。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了(图 9-2 )。

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

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

  制作应用的程序员们意识到一点:那就是你们制作的不是硬件,而是利用操作系统功能的应用。
 下面就来看一下操作系统是如何给开发人员带来便利的。代码清单9-1 表示的是,在 Windows 操作系统下,用C语言制作一个具有表示当前时间功能的应用。time 是用来取得当前日期和时间的函数printf0) 是用来在显示器上显示字符串的函数。程序的运行结果如图 9-4所示。

 运行代码清单9-1 的应用时,硬件的受控过程如下所示:

(1)通过 time ttm;,为 timet类型的变量申请分配内存空间。
(2)通过 time(&tm);,将当前的日期和时间数据保存到变量的内存空间中。
(3)通过 printf(”%sin",ctime(&tm));,把变量内存空间的内容输出到显示器上。
应用的可执行文件指的是,计算机的 CPU 可以直接解释并运行的本地代码。不过这些代码是无法直接控制计算机中配置的时钟 IC 及显示器用的 I/O 等硬件的。那么,为什么代码清单 9-1 的应用能够控制硬件呢?
在操作系统这个运行环境下,应用并不是直接控制硬件,而是通过操作系统来间接控制硬件的。变量定义中涉及的内存的申请分配以及 time() 和 printf() 这些函数的运行结果,都不是面向硬件而是面向操作系统的。操作系统收到应用发出的指令后,首先会对该指令进行解释,然后会对时钟 IC(实时时钟 )和显示器用的 I/O 进行控制。

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

  操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(systemcall),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了 time() 及 printf() 等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在 Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字符串等功能的系统调用的函数名,并不是 time() 和 printf()。系统调用是在time0)和 printf) 函数的内部执行的。大家可能会认为这个方法有些绕不过这是有原因的。
C 语言等高级编程语言并不依存于特定的操作系统。这是因为人们希望不管是 Windows还是 Linux,都能使用几乎相同的源代码。因此高级编程语言的机制就是,使用独自的函数名,然后再在编译时将其转换成相应操作系统的系统调用(也有可能是多个系统调用的组合 )。也就是说,用高级编程语言编写的应用在编译后,就转换成了利用系统调用的本地代码(如下图所示)。

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

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

  通过使用操作系统提供的系统调用,程序员就没必要编写直接控制硬件的程序了。而且,通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。这是因为操作系统和高级编程语言能够使硬件抽象化。这是个非常了不起的处理。
下面就让我们来看一下硬件抽象化的具体实例。

   代码清单 9-2 是用C 语言编写的往文件中写人字符串的应用。fopen()是用来打开文件的函数,fputs0()是用来往文件中写人字符串的函数,fclose() 是用来关闭文件的函数。

  该应用在编译运行后,MyFile.txt 文件中就会被写人“你好”字符串。文件是操作系统对磁盘媒介空间的抽象化。就如第 5 章中介绍的那样,作为硬件的磁盘媒介,就如同树木的年轮一样,被划分为了多个扇区,并以扇区为单位对磁盘进行读写。如果直接对硬件进行操作的话,那就变成了通过向磁盘用的 I/O 指定扇区位置来对数据进行读写了。

  但是,在代码清单 9-2 的程序中,扇区根本没有出现过。传递给fopen0函数的参数,是文件名“MyFile.txt”和指定文件写入的“w"。传递给 fjputs( 的参数,是往文件中写人的字符串”你好”和 f。传递给fclose 的参数,也仅仅是 p。也就是说,磁盘媒介的读写采用了文件这个概念,将整个流程抽象化成了打开文件用的 fopen(、写人文件用的fputs0)、关闭文件用的 fclose0)( 如下图):

  下面让我们来看一下代码清单 9-2 中变量的功能。变量力中被赋予的是 fopen( 函数的返回值。该值称为文件指针。应用打开文件后,操作系统就会自动申请分配用来管理文件读写的内存空间。这个内存空间的地址可以通过 fpen0 函数的返回值获得。用 fopen0) 打开文件后,接下来就是通过指定文件指针来对文件进行操作。正因为如此,fputs0) 及 fclose() 的参数中都指定了文件指针(变量p)。

  至于用来管理文件读写的内存空间的内容实际在哪里,程序员则没必要关注。只要能意识到“用来操作磁盘媒介的某些信息在某个地方存储着”,就可以制作应用了。

5.Windows操作系统的特征

Windows操作系统的主要特征如下所示:
(1)32位操作系统(也有64位版本)
(2)通过API函数集来提供系统调用
(3)提供采用了图形用户界面的用户界面
(4)通过WYSIWYG实现打印输出
(5)提供多任务功能
(6)提供网络功能及数据库功能
(7)通过即插即用实现设备驱动的自动设定
这里只列出了对程序员有意义的一些特征。接下来将依次对Windows操作系统的特征,以及其对编程的影响进行说明。
(1)32位操作系统
虽然现在的Windows也有64位版本,但一般广泛普及的还是32位版本。这里的32位表示的是处理效率最高的数据大小。Windows处理数据的基本单位是32位。习惯在以前的MS-DOS等16位操作系统下编程的程序员,可能不太愿意使用32位的数据类型。因为他们认为处理32位的数据,要比处理16位的数据更花时间。确实,在16位操作系统中处理32位的数据时,因为要处理两次16位的数据,所以会多花一些时间。而如果是32位操作系统的话,那么只需要1次就可以完成32位的数据的处理了。所以说,凡是在Windows上运行的应用,都可以毫无顾虑地尽可能地使用32位的数据。
例如,用C语言来处理整数数据时,有8位的char类型、16位的short类型,以及32位的long类型(还有int类型)三个选项。使用位数大的long类型的话,虽然内存及磁盘的开销较大,但应用的运行速度并不会下降。这在其他编程语言中也是同样的。

(2)通过 API 函数集来提供系统调用
Windows是通过名为API的函数集来提供系统调用的。API是联系作成应用的程序员和操作系统之间的接口。所以称为API(Application Programming Interface,应用程序接口)。
当前主流的32位版Windows API也称为Win32 API。之所以这样命名,是为了便于和以前的16位版的Win16 API,以及更先进的64位版的Win64 API区分开来。Win32API中,各函数的参数及返回值的数据大小,基本上都是32位。
API通过多个DLL文件来提供。各API的实体都是用C语言编写的函数。因而,C语言程序的情况下,AIP的使用更加容易。截至到现在,本书示例程序中用到的API中都有MessageBox(。MessageBox0被保存在Windows提供的user32.dll这个DLL文件中。
(3)提供采用了GUI的用户界面
GUI (Graphical User Interface,图形用户界面)指的是通过点击显示器中显示的窗口及图标等即可进行可视化操作的用户界面。对用户来说,GUI是图形、鼠标,但对程序员来说,GUI并不仅是这些。这是因为想要作成一个实现GUI的应用,并不是一件容易的事情。曾经有一首徘句是这样的:“GUI,用的时候是天堂,做的时候是地狱”,大家可以想象它的难度了吧。
之所以这样困难,是因为在GUI中用户按照怎样的顺序操作是无法确定的。例如,图9-8是Web浏览器(Internet Explorer 7)的一个窗口。通过多个标签页的切换,就可以进行各种项目设定。从Web浏览器的用户角度来说,这样的窗口不仅使用方便,操作也简单,但对负责开发的程序员来说,却决不是简单的事情。

 在像MS-DOS这种没有使用GUI的操作系统中,应用的处理流程由程序员决定,用户按照定好的流程来进行操作即可。与此相反,采用GUI的操作系统中运行的应用,则是由用户决定处理流程的。因此,程序员就必须要制作出在任何操作顺序下都能运行的应用。这就要求以前的程序员要改变观念。这就是GUI的难点。如果程序员最初接触的操作系统就是Windows的话,那他或许会认为GUI是理所当然的。

(4)通过WYSIWYG实现打印输出
WYSIWYG指的是显示器上显示的内容可以直接通过打印机打印输出。在Windows中,显示器和打印机是被作为同等的图形输出设备处理的,而该功能也就为WYSIWYG的实现提供了条件。
借助WYSIWYG功能,程序员可以轻松不少。最初,为了实现在显示器中显示和在打印机中打印,就必须分别编写各自的程序。而在Windows中,借助WYSIWYG功能,基本上在同一个程序中就可以实现显示和打印这两方面的操作了(当然,也可以将显示和打印的内容放在不同的程序中处理)。
(5)提供多任务功能
多任务指的是同时运行多个程序的功能。Windows是通过时钟分割技术来实现多任务功能的。
时钟分割指的是在短时间间隔内,多个程序切换运行的方式。在用户看来,就是多个程序在同时运行。也就是说,Windows会自动切换多个程序的运行(图9-9)。

此外,Windows中还具有以程序中的函数为单位来进行时钟分割的多线程“功能。

(6)提供网络功能及数据库功能
Windows中,网络功能是作为标准功能提供的。数据库(数据库服务器)功能有时也会在之后进行追加。网络功能和数据库功能,虽并不是操作系统本身不可欠缺的功能,但因为它们和操作系统很接近。
以被统称为中间件而不是应用。意思是处于操作系统和应用的中间(middle)。操作系统和中间件合在一起,也称为系统软件。应用不仅可以利用操作系统,也可以利用中间件的功能(图9-10)。

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

(7)通过即插即用实现设备驱动的自动设定
即插即用(Plug-and-Play)指的是新的设备连接(Plug)后立刻就可以使用(Play)的机制。新的设备连接到计算机后,系统就会自动安装和设定用来控制该设备的设备驱动程序。
设备驱动是操作系统的一部分,提供了同硬件进行基本的输入输出的功能。键盘、鼠标、显示器、磁盘装置等,这些计算机中必备的硬件的设备驱动,一般都是随操作系统一起安装的。如果之后再追加新的网卡(NIC”)等硬件的话,就需要向操作系统追加该硬件专用的设备驱动。大家购买的新的硬件设备中,通常都会附带着软盘或CD-ROM,里面通常都收录着该硬件的设备驱动。

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

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

标签:操作系统,第九章,32,程序,硬件,Windows,应用
From: https://www.cnblogs.com/Chenyaxuan/p/17131824.html

相关文章