一、操作系统的重要性
对于程序员来说,程序员创造的不是硬件,而是各种应用程序,但是如果程序员只做应用不懂硬件层面的知识的话,是无法成为硬核程序员的
在操作系统诞生之后,程序员不需要在硬件层面考虑问题,所以程序员的数量就增加了。哪怕自称 对硬件一窍不通的人也可能制作出一个有模有样的程序。不过,要想成为一个全面的程序员,有一点需要清楚的就是,掌握硬件的基本知识,并借助操作系统进行抽象化,可以大大提高编程效率
下面就看一下操作系统是如何给开发人员带来便利的,在Windows 操作系统下,用C语言制作一个具有表示当前时间功能的应用。time()是用来取得当前日期和时间的函数,printf()是把结果打印到显示器上的函数,如下:
#include <stdio.h> #include <time.h> void main(){ // 保存当前日期和时间信息 time_t tm; // 取得当前的日期和时间 time(&tm); // 在显示器上显示日期和时间 printf("%s\n",ctime(&tm)); }
● 通过time_ttm,为time_t类型的变量申请分配内存空间
● 通过time(&tm),将当前的日期和时间数据保存到变量的内存空间中
● 通过printf("%s\n",ctime(&tm)),把变量内存空间的内容输出到显示器上
应用的可执行文件指的是,计算机的CPU可以直接解释并运行的本地代码,不过这些代码是无法直接控制硬件的,事实上,这些代码是通过操作系统来间接控制硬件的。变量中涉及到的内存分配情况,以及time0和printf0这些函数的运行结果,都不是面向硬件而是面向 操作系统 的。操作系统收到应用发出的指令后,首先会对该指令进行解释,然后会对 时钟IC 和显示器用的1/0进行控制
计算机中都安装有保存日期和时间的实时时钟(Real-time clock),上面提到的时钟IC就是值该实时时钟。
应用程序通过OS调度硬件:
二、系统调用和编程语言的移植性
操作系统控制硬件的功能,都是通过一些小的函数集合体的形式来提供的。这些函数以及调用函数的行为称为 系统调用,也就是通过应用进而调用操作系统的意思。在前面的程序中用到了 time()以及printf()函数,这些函数内部也封装了系统调用
C 语言等高级编程语言并不依存于特定的操作系统,这是因为人们希望不管是 Windows 操作系统还是Linux操作系统都能够使用相同的源代码。因此,高级编程语言的机制就是,使用独自的函数名,然后在编译的时候将其转换为系统调用的方式(也有可能是多个系统调用的组合)。也就是说,高级语言编写的应用在编译后,就转换成了利用系统调用的本地代码
高级语言的函数调用在编译后变成了系统调用
在高级语言中也存在直接调用系统调用的编程语言。不过,利用这种方式做成应用,移植性并不友好
移植性:移植性指的是同样的程序在不同操作系统下运行时花费的时间,时间越少证明移植性越好