Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798034
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-27 17:34:03

所有的操作系统都提供了应用程序可以调用内核服务的服务接口(service points)。UNIX系统的所有实现版本都提供一个良好定义的、数量有限的进入内核的入口点,称为系统调用(system calls)。Research UNIX系统的第7个版本提供了大给50个系统调用,4.4BSD提供了大约110个,SVR4有大约120个。Linux根据不同的版本有240到260个。FreeBSD有大约320个。


系统调用接口一直被定义在UNIX Programmre's Manual的Section 2。它们以C语言定义,但不规定它们的具体实现。这点与许多更老的操作系统不同,它们把内核入口定义为汇编语言。


每个UNIX系统调用在标准C库里都有同名函数的定义,用户进程用C语言的调用方式调用这些函数,而后这些函数会调用正确的内核服务,不管内部使用何种技 术来实现这些函数。例如:函数可以接受一个或多个参数并把它们放到通用寄存器(general registers)里,然后执行一些机器指令在内核中产生一个软件中断(software interrupt)。我们可以简单地把系统调用看作是C函数。


UNIX Programmre's Manual的Section 3里定义了一个可用的通用(general-purpose)函数。虽然这些函数可能会调用一个或多个内核系统调用,但它们不是内核入口。比 如:printf函数可能使用write系统调用来输出字符串,但strcpy和atoi函数不会使用系统调用。


从实现者的角度看,系统调用和库函数的区别是很重要的,但对于用户而言,这并没有那么重要--系统调用和库函数看起来都是普通的C函数。两者都为应用程序提供服务。尽管如此,我们必须意识到,我们可以根据需要替换库函数,但通常不能替换系统函数。


例如malloc函数。有很多方法可以实现内存分配和垃圾回收,没有一种技术对所有应用程序都是最优化的。分配内存的系统调用sbrk并不提供一个通用的 内存管理:它让进程增加或减少指定数量字节的地址空间,这些地址空间如果管理则取决于进程。内存分配函数malloc实现了一种特殊的分配方式。如果我们 不喜欢这个操作,我们可以定义我们自己的malloc函数,在实现时很可能会调用sbrk系统调用。事实上有不少软件包都使用sbrk系统调用实现他们自 己的内存分配算法。


这里我们有一个很清晰的责任区分:内核里的系统调用为进程分配一大块内存,而库函数malloc在用户态(user level)管理这些内存。


另一个区分系统调用和库函数的例子是UNIX系统提供的获得当前时间和日期的接口。一些操作系统提供一个系统调用来返回时间,和另一个系统调用来返回日 期。任何特殊操作,比如进行夏令时的转换,可以由内核处理,也可以是人为处理。UNIX系统提供了仅有的一个系统调用来返回从Epoch至今的秒数。这个 值的任何解释,比如用本地时区把它转换成可读的时间和日期,都交给用户进程。标准C函数库提供了一些函数来处理大多数的转换,比如各种夏令时转换的算法。


应用程序既可以调用系统函数也可以调用库函数,而且许多库函数也都调用了系统函数。两类函数的另一个区别是系统调用通常提供一个最小化的接口,而库函数提供更智能的功能。比如sbrk和malloc,还有unbuffered I/O和standard I/O。


进程控制系统调用(fork、exec和wait)通常会被用户程序直接调用,然而一些函数库提供了简化普遍情况的方法,比如system库和popen库。
阅读(978) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~