计算机用户与计算机操作系统的交互类似于银行客户与银行的交互。对应关系如下:计算机硬件—金库,操作系统—银行,系统接口—办事窗口,计算机程序—银行客户。类比银行通过办事窗口向客户提供服务,操作系统通过系统接口向用户提供服务。
为什么要有操作系统呢?如果大家都能直接操作硬件,将会导致数据混乱不安全,同时也会提高使用计算机的难度。操作系统本质上也是一个软件(系统软件),它能够充分组织利用计算机的各种硬件资源(CPU、内存、硬盘、网络等),使资源利用效率最大化。操作系统的设计者为普通用户提供了一些方便使用的接口(系统调用),用户可以通过这些接口编写计算机程序高效利用计算机硬件,以实现特定的功能;类似于银行办事窗口的存取款业务,只要用户提供特定的信息,如身份证信息、存取款信息,银行便会借助金库为客户实现存取款功能。
总之,操作系统的主要任务就是为用户提供方便使用、功能强大的服务。
系统编程就是利用操作系统提供的系统调用(system call,即所谓的接口、函数)进行编程,以达到操作各种计算机硬件资源(如磁盘、终端、网络等)的目的。
计算机开机时,首先运行一段名为boot loader的小程序,其主要功能是检查各种硬件,为操作系统内核的运行提供正确的环境。随后,计算机将操作系统内核加载到内存中(内核空间),这也是计算机一开机便会被占用一部分内存的原因。内存中除内核空间之外的空间叫做用户空间,主要运行用户程序等。系统编程主要研究操作系统提供的系统调用,包括系统调用的分类、功能、调用方法等,同时还要掌握系统调用的原理。
无法跨平台(OS)。类比于不同银行内部的运作机制大同小异,不同操作系统底层运行的机制也会有所差别,其向用户提供的系统调用也各有千秋,如 Linux 和 Windows 都有自己独特的系统调用,调用方法、功能也不一样。
速度慢。用户空间到内核空间的切换需要时间,所以系统编程本身并不高效。
更加底层,接口更复杂。系统调用的功能十分强大、可操作性高,但是使用起来极其复杂。
调用 Glibc
库时,库文件和函数原型为:
#include
FILE *fopen(const char *path, const char *mode);
进行系统调用时,库文件和函数原型为:
#include
#include
#include
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);