在计算机中尚不存在操作系统的年代,完全没有任何程序,因此程序员就需要编写出处理相关的所有程序。用机器语言编写程序,然后再使用开关将程序输入,这一过程非常麻烦。于是,有人开发出了仅具有加载和运行功能的监控程序,这就是操作系统的原型。通过事先启动监控程序,程序员就可以根据需要将各种程序加载到内存中运行。虽然依旧比较麻烦,但比起在没有任何程序的状态下进行开发,工作量得到了很大的缓解。随着时代的发展,人们在利用监控程序编写程序的过程中,发现很多程序都有共通的部分。例如,通过键盘输入文字数据、往显示器输出文字数据等。这些处理,在任何程序下都是一样的。而如果每编写一个新的程序都要记述相同的处理的话,那真的是太浪费时间了。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了
虽然对程序员来说,掌握硬件的基本知识是必需的,不过,在操作系统诞生以后,就没有必要再编写直接控制硬件的程序了。这样一来,制作应用的程序员就逐渐同硬件隔离开来了。也就是说,程序员是很少关注现实世界(硬件)的。由于操作系统诞生后,程序员无需再考虑硬件的问题,因此程序员的数量也增加了。哪怕是自称“对硬件一窍不通”的人,也可能会制作出一个有模有样的应用。不过,要想成为一个全面的程序员,有一点需要清楚的是,掌握基本的硬件知识,并借助操作系统进行抽象化,可以大大提高编程效率。
操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(system call),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了 time() 及 printf() 等函数,这些函数内部也都使用了系统调用。用高级编程语言编写的应用在编译后,就转换成了利用系统调用的本地代码。
通过使用操作系统提供的系统调用,程序员就没必要编写直接控制硬件的程序了。而且,通过使用高级编程语言,有时甚至也无需考虑系统调用的存在。作为硬件的磁盘媒介,就如同树木的年轮一样,被划分为了多个扇区,并以扇区为单位对磁盘进行读写。如果直接对硬件进行操作的话,那就变成了通过向磁盘用的 I/O 指定扇区位置来对数据进行读写了。下面让我们来看一下代码清单 9-2 中变量 fp 的功能。变量 fp 中被赋予的是 fopen() 函数的返回值。该值称为文件指针。应用打开文件后,操作系统就会自动申请分配用来管理文件读写的内存空间。这个内存空间的地址可以通过 fopen() 函数的返回值获得。用 fopen() 打开文件后,接下来就是通过指定文件指针来对文件进行操作。正因为如此, fputs() 及 fclose() 的参数中都指定了文件指针(变量 fp)。
Windows 操作系统的主要特征如下所示。
(1)32 位操作系统(也有 64 位版本)
(2)通过 API 函数集来提供系统调用
(3)提供采用了图形用户界面的用户界面
(4)通过 WYSIWYG实现打印输出
(5)提供多任务功能
(6)提供网络功能及数据库功能
(7)通过即插即用实现设备驱动的自动设定