andylei

常用链接

统计

最新评论

Unix下IO模型

Unix下我们可用的五种IO模型是:
  • 阻塞I/O
  • 非阻塞I/O
  • I/O复用
  • 信号驱动I/O
  • 异步I/O(POSIX.1的aio_序列函数
  1. 阻塞I/O
    是最流行的I/O模型,以recvfrom为例,此系统调用直到数据到达且拷贝到应用缓冲区或出错才返回.进程阻塞于该系统调用,然后1).等待数据到达内核缓冲区,2)将数据从内核缓冲区中拷贝到用户空间中应用程序缓冲区. 拷贝完成后,返回成功指示.

  2. 非阻塞I/O
    进程不阻塞于I/O函数(recvfrom),不会等待数据, 如果数据没有到达,就立即从recvfrom返回到应用进程,然后等待一段时间,再次调用recvfrom,这个过程叫轮询(进程对一个非阻塞描述字循环调用I/O函数). 通过轮询不断查询内核,看看操作是否准备好,这对CPU时间是极大浪费.
  3. I/O复用
    通过select或poll调用,在这两个调用中的某一个阻塞,而不是阻塞于真正的系统调用. 这样的好处在于select可这等待多个描述字,阻塞IO模型在真正的系统调用recvfrom上阻塞,而recvfrom一次只能读一个描述字,对它的阻塞使得进程只能为这个描述字傻傻等待. 一般应用系统中都会有多个描述字.使用select可这很方便地对所有提供的描述字进行等待.
  4. 信号驱动I/O
    在描述字准备好后,让内核给应用进程发一个信号SIGIO,应用进程捕捉到该信号后再对描述字调用recvfrom. 首先允许套接口进行信号驱动,并通过系统调用sigaction安装一个信号处理程序,此系统调用立即返回,进程继续工作.
  5. 异步I/O(POSIX.1的aio_序列函数
    异步I/O是指Posix.1的1993版本中的新内容。异步的意思是,让内核启动操作,并在整个操作完成后(包括将数据从内核拷贝到应用进程的缓冲区中)通知我们。这种模型与其他四种模型的主要区别在于,信号驱动IO是由内核通知我们什么时候可以启动一个io操作, 而异步io模型是由内核通知我们io操作何时完成。
各种模型比较:
1.前四种模型在第一阶段(等待数据阶段)的行为不同, 在第二阶段基本相同:在将数据从内核拷贝到调用者的缓冲区时,进程都阻塞于recvfrom调用。
2.异步io模型处理的两个阶段都不同于前四种。

同步I/O 与异步I/O
同步I/O操作引起请求进程阻塞,直到IO操作完成
异步I/O操作不引起请求进程阻塞
上述前四种IO模型都属于同步IO, 因为真正的IO操作(recvfrom)阻塞进程。



posted on 2010-03-30 16:28 逆水行舟 阅读(710) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理