利用计算机运行程序大部分都是为了提升处理效率。例如,Microsoft Word 这样的文字处理软件,是用来提升文本文件处理效率的程序,Microsoft Excel 等表格计算软件,是用来提升帐本处理效率的程序。这种为了提升特定处理效率的程序统称为 应用
程序员
程序员的工做就是编写各类各样的应用来提升工做效率,程序员通常不编写操做系统,可是程序员编写的应用离不开操做系统,此篇文章咱们就针对 Windows 操做系统来讲明一下操做系统和应用之间的关系。数据库
操做系统
其实也是一种软件,任何新事物的出现确定都有它的历史背景,那么操做系统也不是凭空出现的,确定有它的历史背景。编程
在计算机尚不存在操做系统的年代,彻底没有任何程序,人们经过各类按钮
来控制计算机,这一过程很是麻烦。因而,有人开发出了仅具备加载和运行功能的监控程序
,这就是操做系统的原型。经过事先启动监控程序,程序员能够根据须要将各类程序加载到内存中运行。虽然仍旧比较麻烦,但比起在没有任何程序的状态下进行开发,工做量获得了很大的缓解。windows
随着时代的发展,人们在利用监控程序编写程序的过程当中发现不少程序都有公共的部分。例如,经过键盘进行文字输入,显示器进行数据展现等,若是每编写一个新的应用程序都须要相同的处理的话,那真是太浪费时间了。所以,基本的输入输出部分的程序就被追加到了监控程序中。初期的操做系统就是这样诞生了。服务器
相似的想法能够共用,人们又发现有更多的应用程序能够追加到监控程序中,好比硬件控制程序
,编程语言处理器(汇编、编译、解析)
以及各类应用程序等,结果就造成了和如今差别不大的操做系统,也就是说,其实操做系统是多个程序的集合体。网络
我在 程序员须要了解的硬核知识之CPU这篇文章中提到了汇编语言,这里简单再提一下。汇编语言是一种低级语言,也被称为
符号语言
。汇编语言是第二代计算机语言,在汇编语言中,用助记符代替机器指令的操做码,用地址符号或标号代替指令或操做数的地址。用一些容易理解和记忆的字母,单词来代替一个特定的指令,好比:用ADD
表明数字逻辑上的加减,MOV
表明数据传递等等,经过这种方法,人们很容易去阅读已经完成的程序或者理解程序正在执行的功能,对现有程序的bug修复以及运营维护都变得更加简单方便多线程
能够说共用思想真是人类前进的一大步,对于解放生产力而言简直是过重要了。编程语言
对于程序员来讲,程序员创造的不是硬件,而是各类应用程序,可是若是程序员只作应用不懂硬件层面的知识的话,是没法成为硬核程序员的。如今培训机构培养出了一批怎么用的人才,却没有培训出为何这么作的人才,毕竟为何
不是培训机构教的,而是学校教的,我很相信耗子叔说的话:学习没有速成这回事。言归正题。函数
在操做系统诞生以后,程序员不须要在硬件层面考虑问题,因此程序员的数量就增长了。哪怕自称对硬件一窍不通
的人也可能制做出一个有模有样的程序。不过,要想成为一个全面的程序员,有一点须要清楚的就是,掌握硬件的基本知识,并借助操做系统进行抽象化,能够大大提升编程效率。性能
下面就看一下操做系统是如何给开发人员带来便利的,在 Windows 操做系统下,用 C 语言制做一个具备表示当前时间功能的应用。time()
是用来取得当前日期和时间的函数,printf()
是把结果打印到显示器上的函数,以下:
#include <stdio.h> #include <time.h> void main(){ // 保存当前日期和时间信息 time_t tm; // 取得当前的日期和时间 time(&tm); // 在显示器上显示日期和时间 printf("%s\n", ctime(&tm)); }
读者能够自行运行程序查看结果,咱们主要关注硬件在这段代码中作了什么事情
应用的可执行文件指的是,计算机的 CPU 能够直接解释并运行的本地代码,不过这些代码是没法直接控制硬件的,事实上,这些代码是经过操做系统来间接控制硬件的。变量中涉及到的内存分配状况,以及 time() 和 printf() 这些函数的运行结果,都不是面向硬件而是面向操做系统
的。操做系统收到应用发出的指令后,首先会对该指令进行解释,而后会对 时钟IC
和显示器用的 I/O 进行控制。
计算机中都安装有保存日期和时间的实时时钟(Real-time clock),上面提到的时钟IC 就是值该实时时钟。
操做系统控制硬件的功能,都是经过一些小的函数集合体的形式来提供的。这些函数以及调用函数的行为称为系统调用
,也就是经过应用进而调用操做系统的意思。在前面的程序中用到了 time()
以及 printf()
函数,这些函数内部也封装了系统调用。
C 语言等高级编程语言并不依存于特定的操做系统,这是由于人们但愿不论是Windows
操做系统仍是 Linux
操做系统都可以使用相同的源代码。所以,高级编程语言的机制就是,使用独自的函数名,而后在编译的时候将其转换为系统调用的方式(也有多是多个系统调用的组合)。也就是说,高级语言编写的应用在编译后,就转换成了利用系统调用的本地代码。
不过,在高级语言中也存在直接调用系统调用的编程语言,不过,利用这种方式作成应用,移植性并不友好。
移植性:移植性指的是一样的程序在不一样操做系统下运行时所花费的时间,时间越少证实移植性越好。
经过使用操做系统提供的系统调用,程序员没必要直接编写控制硬件的程序,并且,经过使用高级编程语言,有时也无需考虑系统调用的存在,系统调用每每是自动触发的,操做系统和高级编程语言可以使硬件抽象化,这很了不得。
下面让咱们看一个硬件抽象化的具体实例
#include <stdio.h> void main(){ // 打开文件 FILE *fp = fopen("MyFile.txt","w"); // 写入文件 fputs("你好", fp); // 关闭文件 fclose(fp); }
上述代码使用 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 操做系统的特性
API
函数集成来提供系统调用WYSIWYG
实现打印输出,WYSIWYG 其实就是 What You See Is What You Get ,值得是显示器上显示的图形和文本都是能够原样输出到打印机打印的。这些是对程序员来说比较有意义的一些特征,下面针对这些特征来进行分别的介绍
这里表示的32位操做系统表示的是处理效率最高的数据大小。Windows 处理数据的基本单位是 32 位。这与最一开始在 MS-DOS
等16位操做系统不一样,由于在16位操做系统中处理32位数据须要两次,而32位操做系统只须要一次就可以处理32位的数据,因此通常在 windows 上的应用,它们的最高可以处理的数据都是 32 位的。
好比,用 C 语言来处理整数数据时,有8位的 char
类型,16位的short
类型,以及32位的long
类型三个选项,使用位数较大的 long 类型进行处理的话,增长的只是内存以及磁盘的开销,对性能影响不大。
如今市面上大部分都是64位操做系统了,64位操做系统也是如此。
Windows 是经过名为 API
的函数集来提供系统调用的。API是联系应用程序和操做系统之间的接口,全称叫作 Application Programming Interface
,应用程序接口。
当前主流的32位版 Windows API 也称为 Win32 API
,之因此这样命名,是须要和不一样的操做系统进行区分,好比最一开始的 16 位版的 Win16 API
,和后来流行的 Win64 API
。
API 经过多个 DLL 文件来提供,各个 API 的实体都是用 C 语言编写的函数。因此,在 C 语言环境下,使用 API 更加容易,好比 API 所用到的 MessageBox()
函数,就被保存在了 Windows 提供的 user32.dll 这个 DLL 文件中。
GUI(Graphical User Interface)
指得就是图形用户界面,经过点击显示器中的窗口以及图标等可视化的用户界面,举个例子:Linux 操做系统就有两个版本,一种是简洁版,直接经过命令行控制硬件,还有一种是可视化版,经过光标点击图形界面来控制硬件。
WYSIWYG 指的是显示器上输出的内容能够直接经过打印机打印输出。在 Windows 中,显示器和打印机被认做同等的图形输出设备处理的,该功能也为 WYSIWYG 提供了条件。
借助 WYSIWYG 功能,程序员能够轻松很多。最初,为了是如今显示器中显示和在打印机中打印,就必须分别编写各自的程序,而在 Windows 中,能够借助 WYSIWYG 基本上在一个程序中就能够作到显示和打印这两个功能了。
多任务指的就是同时可以运行多个应用程序的功能,Windows 是经过时钟分割
技术来实现多任务功能的。时钟分割指的是短期间隔内,多个程序切换运行的方式。在用户看来,就好像是多个程序在同时运行,其底层是 CPU 时间切片
,这也是多线程多任务的核心。
Windows 中,网络功能是做为标准功能提供的。数据库(数据库服务器)功能有时也会在后面追加。网络功能和数据库功能虽然并非操做系统不可或缺的,但由于它们和操做系统很接近,因此被统称为中间件
而不是应用。意思是处于操做系统和应用的中间层,操做系统和中间件组合在一块儿,称为系统软件
。应用不只能够利用操做系统,也能够利用中间件的功能。
相对于操做系统一旦安装就不能轻易更换,中间件能够根据须要进行更换,不过,对于大部分应用来讲,更换中间件的话,会形成应用也随之更换,从这个角度来讲,更换中间件也不是那么容易。
即插即用(Plug-and-Play)
指的是新的设备链接(plug) 后就能够直接使用的机制,新设备链接计算机后,计算机就会自动安装和设定用来控制该设备的驱动程序
设备驱动是操做系统的一部分,提供了同硬件进行基本的输入输出的功能。键盘、鼠标、显示器、磁盘装置等,这些计算机中必备的硬件的设备驱动,通常都是随操做系统一块儿安装的。
有时 DLL 文件也会同设备驱动文件一块儿安装。这些 DLL 文件中存储着用来利用该新追加的硬件API,经过 API ,能够制做出运行该硬件的心应用。
文章参考:
《程序是怎样跑起来的》第九章