闇の光

读书笔记 经验感受

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在直接使用低级系统调用时,在输入输出上会存在这样一个问题,就是这些调用存在着效率低的状况。为什么会这样呢?下面我们来分析一下:

  • 在产生一个系统调用时会出现性能恶化的状况,因此系统调用跟函数调用相比,要浪费得多。这是因为Linux不得不从你正在运行的程序转到正在执行它的内核代码上,然后再倒转回去。所以最好的方法就是在一个程序中使用最少的系统调用来完成尽可能多的工作,比如,宁愿每次读取或者写入大量数据也不愿读取或写入单个字符。

  • 硬件都有其局限性,因此限制了每次低级系统调用所能读取或写入的数据块的尺寸大小。比如,磁带设备通常写入数据的块大小为10k。因此,如果你想要写入的量不是10k的倍数的话,则设备将预支磁带到下一个10k数据块,同时剩余的空白将遗留在磁带上。
  • 为了提供一个高级的接口到设备和磁盘文件,一个Linux或UNIX发行版提供了一些标准库,它们都是可以放入你程序中用来处理这些问题的函数集。比如标准I/O库,它提供了输出缓冲区。这样你就可以有效地以不同的尺寸写入数据块,且为低级系统调用所安排的库函数也以使数据有效的整数据块的方式而被提供。通过这些方式都戏剧化地降低了系统调用的总开销。

    库函数通常保存在手册的第三部分,且库函数通常都有一个与它们相关的标准include文件,比如标准I/O库的stdio.h文件。

    为了概括地了解我们所讨论的内容,下图是Linux下,不同的文件函数同用户、设备驱动、内核以及硬件间的联系:


    posted on 2008-04-05 18:18  taizi  阅读(217)  评论(0编辑  收藏  举报