博客内容摘自Unix/Linux编程实践教程
1. 简单的程序模型
你可能写过各种各样的程序,有柯学计算方面的,金融方面的,图像方面的,文字处理方面的等,大部分的程序都是基于以下模型
在这个模型中,程序就是可以再计算机上运行的一段代码,程序把输入数据做相应处理后输出,例如用户在键盘上输入数据,然后在屏幕得到输出,程序可能对磁盘进行操作,还可能会用到打印机
遵循上述模型。看以下代码
/*copy from stdin to stdout*/
main() {
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
这段代码对应以下模型
在图中键盘和显示器与程序直接相连,在简单的个人计算器中,实际情况是很类似的,键盘和显示卡直接连到计算机的主板上,CPU和内存也是通过插槽直接连载主板上,它们通过主板上的印刷线路,连为一体,如果能打开机箱,所看到的大致如此。
2.系统模型
如果所使用的系统是一个多用户系统,如经典的Linux模型,那会是一幅怎样的情景呢
刚才的简单模型已经不适用,此图会更接近一些
在这个系统中有多个用户同时运行多个程序,可能需要访问多个设备。
虽然模型复杂了,但对程序而言,他还是从键盘得到数据,将结果显示在显示器上,也可以对磁盘进行读写,这些操作都没有任何问题,它使用的还是简单模型
接下来考虑一种更为复杂的情况,有许多键盘/显示器,它们可以随意地连接到不同的程序,随意地操作他们,这种情况如下图所示
实际上,在计算机内部,这种随意的连接是不允许的,必须采用一种机制进行管理
3.操作系统的职责
计算机用操作系统来管理所有的资源,并将不同的设备和不同的程序连接起来,从链接的角度来讲,操作系统的作用就行主板上的印刷线路一样
有了操作系统后,上图的混乱状态就可以得到该百年,新的模型如图五所示
图五
操作系统也是程序,与普通程序一样,也运行在内存中,同时他又是一个特殊的程序,他能把普通程序与其他程序或设备连接起来。
4.为程序提供服务
现在的问题(系统中的多个用户和程序是如何连接起来的)和大致的解决办法(通过一个管理程序已经很清楚了,接下来看具体的解决方法
首先要节视一些属于,内存空间用来存放程序和数据,就想古雅典人腾出空间来放衣服一样,所有的程序都必须在内存空间中才能运行,用来容纳操作系统的内训空间叫做系统系统空间,容纳应用程序的内存空间叫做用户空间
操作系统也被称为内核,有了内核的概念后,再来看计算机系统的连接情况,如图6所示
注意,在图6中可以发现,程序要访问设备(如键盘,磁盘和打印机)必须通过内核,所以只有内核才能直接管理设备
程序如果要从键盘得到数据,必须向内核发出请求,若在显示器上显示结果,也要通过内核,程序中所有对设备的操作都是通过内核进行的
图6的线是内核提供的虚拟连接线,内核向程序提供服务一遍程序能够访问到设备
了解到这些内容后,再来看什么是系统编程,编写普通程序时可以认为,程序是直接连到键盘,显示器,磁盘等设备的,但在进行系统编程时,必须对系统的结构和工作方式有更深的了解,要知道内核提供那些服务(系统调用),如何使用他们,系统有哪些资源和设备,不同的资源和设备该如何操作。