オペレーティングシステムとアプリケーションのプログラマは、知識のハードコアを理解する必要があります

コンピュータプログラムを使用すると、処理効率を向上させるために、主に実行されます。たとえば、Microsoft Wordのようなワープロソフトとして、テキストファイルは、プログラムの処理効率を向上させるために使用され、Microsoft Excel、その他の表計算ソフトソフトウェアは、プログラムの本の処理効率を向上させるために使用されます。この特定のプログラムの処理効率を向上させるために参照として应用

プログラマーの仕事は効率を改善するための様々なアプリケーションを書くことで、プログラマは一般的に動作を説明するために、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));
}

读者可以自行运行程序查看结果,我们主要关注硬件在这段代码中做了什么事情

  • 通过 time_t tm,为 time_t 类型的变量申请分配内存空间;
  • 通过 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 操作系统有哪些特征吗?下面列举了一些 Windows 操作系统的特性

  • Windows 操作系统有两个版本:32位和64位
  • 通过 API 函数集成来提供系统调用
  • 提供了采用图形用户界面的用户界面
  • 通过 WYSIWYG 实现打印输出,WYSIWYG 其实就是 What You See Is What You Get ,值得是显示器上显示的图形和文本都是可以原样输出到打印机打印的。
  • 提供多任务功能,即能够同时开启多个任务
  • 提供网络功能和数据库功能
  • 通过即插即用实现设备驱动的自设定

这些是对程序员来讲比较有意义的一些特征,下面针对这些特征来进行分别的介绍

32位操作系统

这里表示的32位操作系统表示的是处理效率最高的数据大小。Windows 处理数据的基本单位是 32 位。这与最一开始在 MS-DOS 等16位操作系统不同,因为在16位操作系统中处理32位数据需要两次,而32位操作系统只需要一次就能够处理32位的数据,所以一般在 windows 上的应用,它们的最高能够处理的数据都是 32 位的。

比如,用 C 语言来处理整数数据时,有8位的 char 类型,16位的short类型,以及32位的long类型三个选项,使用位数较大的 long 类型进行处理的话,增加的只是内存以及磁盘的开销,对性能影响不大。

现在市面上大部分都是64位操作系统了,64位操作系统也是如此。

通过 API 函数集来提供系统调用

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 的用户界面

GUI(Graphical User Interface) 指得就是图形用户界面,通过点击显示器中的窗口以及图标等可视化的用户界面,举个例子:Linux 操作系统就有两个版本,一种是简洁版,直接通过命令行控制硬件,还有一种是可视化版,通过光标点击图形界面来控制硬件。

通过 WYSIWYG 实现打印输出

WYSIWYG 指的是显示器上输出的内容可以直接通过打印机打印输出。在 Windows 中,显示器和打印机被认作同等的图形输出设备处理的,该功能也为 WYSIWYG 提供了条件。

借助 WYSIWYG 功能,程序员可以轻松不少。最初,为了是现在显示器中显示和在打印机中打印,就必须分别编写各自的程序,而在 Windows 中,可以借助 WYSIWYG 基本上在一个程序中就可以做到显示和打印这两个功能了。

提供多任务功能

多任务指的就是同时能够运行多个应用程序的功能,Windows 是通过时钟分割技术来实现多任务功能的。时钟分割指的是短时间间隔内,多个程序切换运行的方式。在用户看来,就好像是多个程序在同时运行,其底层是 CPU 时间切片,这也是多线程多任务的核心。

提供网络功能和数据库功能

Windows 中,网络功能是作为标准功能提供的。数据库(数据库服务器)功能有时也会在后面追加。网络功能和数据库功能虽然并不是操作系统不可或缺的,但因为它们和操作系统很接近,所以被统称为中间件而不是应用。意思是处于操作系统和应用的中间层,操作系统和中间件组合在一起,称为系统软件。应用不仅可以利用操作系统,也可以利用中间件的功能。

相对于操作系统一旦安装就不能轻易更换,中间件可以根据需要进行更换,不过,对于大部分应用来说,更换中间件的话,会造成应用也随之更换,从这个角度来说,更换中间件也不是那么容易。

通过即插即用实现设备驱动的自动设定

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

设备驱动是操作系统的一部分,提供了同硬件进行基本的输入输出的功能。键盘、鼠标、显示器、磁盘装置等,这些计算机中必备的硬件的设备驱动,一般都是随操作系统一起安装的。

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

文章参考:

https://baike.baidu.com/item/汇编语言/61826?fr=aladdin

《程序是怎样跑起来的》第九章

https://baike.baidu.com/item/Windows操作系统/852149?fr=aladdin

关注公众号后台回复 191106 即可获得《程序是怎样跑起来的》电子书

おすすめ

転載: www.cnblogs.com/cxuanBlog/p/11886261.html