Linux I/O

来源:互联网 发布:为什么卸载不了软件 编辑:程序博客网 时间:2024/05/16 16:56

计算机系统中除CPU和内存外的其他设备都可以看作I/O设备。I/O设备按其工作方式的不同大体可分为字符设备、块设备(标准的计算机组成结构中这部分和内存都属于存储器)和网络设备三类。

  • 字符设备(character/raw device):以字符为单位进行传输的设备,只能顺序存取以字节为最小单位的数据,不能随机存取数据。
  • 块设备(block device):以块为单位进行传输的设备,以块为基本传输单位,可随机存取数据。
  • 网络设备:进行数据网络传输的设备,是面向数据包的传输。

Linux的内核将所有外部设备都可以看做一个文件来操作,应用程序通过调用文件操作的系统调用和内核交互,来实现外部设备的访问和操作。每一个字符设备和块设备都会在devfs文件系统(/dev/)中创建一个文件作为入口点,用户可利用基本的文件I/O操作来访问这些文件。而网络设备在devfs文件系统中没有入口点,用户需要借助socket实现网络设备的访问。

I/O操作

Linux的I/O操作根据在用户空间中操作中有无buffer可分为(与内核中有无buffer无关)bufferedI/O和unbuffered I/O两类。

  • Unbuffered I/O:Linux系统提供的I/O方法,直接使用系统调用接口来实现其open/read/write操作
  • Buffered I/O:标准 C提供的一种流操作方法,通过在用户空间创建buffer缓存操作数据来减少系统调用的次数以提高效率。

在Linux中大部分字符设备和网络设备都支持unbuffered I/O,块设备两种方法都支持。

I/O同步/异步

同步/异步是消息的通知机制。

  • 同步(synchronous):在发出一个功能调用时,在没有得到结果之前,该调用就不返回
  • 异步(asynchronous):当一个异步过程调用发出后,调用者不会立刻得到结果。实际处理这个调用的部件是在调用发出后,通过状态、通知来通知调用者,或通过回调函数处理

I/O阻塞/非阻塞

阻塞/非阻塞是程序在等待消息(无所谓同步或者异步)时的状态。
  • 阻塞(blocking):调用结果返回之前当前线程会被挂起,函数只有在得到结果之后才会返回
  • 非阻塞(non-blocking):在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回
参考
http://blog.chinaunix.net/uid-26000296-id-3754118.html

0 0