unix i/o模型

I/O模型

1.io请求划分2个阶段

等待数据就绪

从内核缓存区拷贝到进程缓冲区

2.按照请求是否阻塞

同步I/O

异步I/O

3.unix的5种I/O模型

阻塞I/O

非阻塞I/O

I/O复用(select,poll,epoll等支持I/O多路复用)

信号驱动I/O

异步I/O

前4种模型都是同步I/O

1.
阻塞I/O

        阻塞I/O模型:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用程序的缓冲区或者发生错误才返回,在此期间进程
进入睡眠或者挂起状态。(进程挂起了)

2.非阻塞I/O

      
非阻塞I/O模型:recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个ewouldblock错误,用户进程便在成功返回数据之前一直在调用recv操作询问数据可读性,轮询的操作方式。(轮询占用CPU)
    以上两种模式好比:一位大伯在一个小区,知道今天有信要到门卫那边的信箱里面,但不知道什么时候。
    阻塞I/O->大伯直接在门卫那边等,直到信过来;
    非阻塞I/O->大伯没过一段时间去看一下有没有信过来。

3.I/O复用

        
I/O复用(select,poll,epoll等支持I/O多路复用):进程通过将一个或多个连接传递给select或poll系统调用,I/O复用实现了多个连接或者多种连接(TCP,UDP等)共用了同一种等待机制,select会返回某个连接的可读条件,调用recv/recvfrom把所读的数据报拷贝到应用进程的缓冲区中。(多个连接注册同一个select,nio是基于I/O复用模型实现的)
        I/O复用->门卫收到整个小区的信时通知相应的人过来取信。

4.信号驱动I/O

        信号驱动I/O:通过sigaction系统调用实现了SIGIO信号的捕获与处理函数,它是非阻塞的。当有数据准备就绪时,就为该进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据。(捕获内核发送过来的信号)

5.异步I/O

        
异步I/O:告知内核启动某个操作,并让内核在整个操作完成后通知我们,包括将数据从内核拷贝到用户空间。(异步的)
        信号驱动I/O->门卫通知相应人过来取信
        异步I/O->门卫把信送到相应人手里

5中I/O模型的比较:

前4种模型都是同步I/O,最后一种是异步的

参考:
http://blog.csdn.net/moxiaomomo/article/details/6844469

unix i/o模型,布布扣,bubuko.com

时间: 2024-10-05 04:01:49

unix i/o模型的相关文章

浅谈 Unix I/O 模型

原文出处:http://miaoo.in/talk-about-unix-io-model.html 在实际应用中,数据操作通常分为输入和输出,那么以输入为例,在操作系统中,一个数据的输入通常分为以下两个过程: a. 等待数据准备好.b. 将准备好的数据从内核拷贝到用户空间. 下面我们将会分别讨论 I/O 模型中的两个大类,即 同步 I/O 与 异步 I/O. 1. 同步 I/O 同步与异步 I/O 的最大不同,就是在在进行数据复制时(即过程 b ),所有的同步 I/O 模型均会发生阻塞.进一步

unix网络io模型

阻塞I/O(bloking I/O) 阻塞IO的特点就是在IO执行的两个阶段(recvfrom和数据从内核空间转移到用户空间)都被block了 非阻塞I/O(non-bloking I/O) 非阻塞 IO的特点是用户进程需要不断的主动询问kernel数据是否准备好. 多路复用I/O(multiplexing I/O) 多路复用的特点是通过一种机制一个进程能同时等待IO文件描述符,内核监视这些文件描述符(套接字描述符),其中的任意一个进入读就绪状态,select, poll,epoll函数就可以返

朴素的UNIX之-进程/线程模型

UNIX的传统倾向于将一个任务交给一个进程全权受理,但是一个任务内部也不仅仅是一个执行绪,比如一个公司的所有成员,大家都在做同一件事,每个人却只负责一部分,粒度减小之后,所有的事情便可以同时进行,不管怎样,大家还都共享着所有的资源.因此就出现了线程.线程其实就是共享资源的不同的执行绪.线程的语义和朴素的UNIX进程是不同的. 0.原始进程模型-著名的fork调用 朴素的UNIX进程依托于著名的fork调用,就是这个fork调用让UNIX进程和Windows进程截然不同,也正是因为这个fork调用

记录一次配置unix网络编程环境的过程和遇到的问题

记录一次搭建unix网络编程环境过程中遇到的问题和总结 计算机环境虚拟机 linuxmint-18-xfce-64bit 1.打开unix网络编程.iso 把目录下的文件夹复制到某一目录,修改权限,可命令可鼠标操作. 2. [email protected] ~/unix/unpv13e $ sudo su [sudo] s 的密码: ss-Linux unpv13e # ./configure checking build system type... x86_64-unknown-linux

朴素UNIX之-打开历史

它可以毫不夸张地说,,UNIX模型是现代操作系统的原型.无论是真实的UNIX让我们大系列AIX,Solaris,HP-UX,FreeBSD,NetBSD,...或类别UNIX实例Linux...或基于Windows NT各种Microsoft操作系统的体系结构,基本的想法来自UNIX. 这些系统一个比一个复杂,可是请记住一句话:全部的基本思想都是也必须是朴素的,简单的!       或许,非常多人看到这里就觉得有点不屑一顾,毕竟他们觉得自己是技术狂人,觉得仅仅有摆弄复杂的东西才干证明自己的学识和

进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)

1.Unix shell的功能 shell是一个管理进程和运行程序的程序.所有常用的shell都有3个主要功能: (1)运行程序: (2)管理输入和输出 (3)可编程 shell同时也是带有变量和流程控制的编程语言. 2.Unix的进程模型 一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式的代码.运行一个程序意味着将这些机器指令序列载入内存然后让处理器(CPU)逐条执行.在Unix术语中,一个可执行程序是一些机器指令机器数据的序列.一个进程是程序运行时的内存空间和设

朴素的UNIX之-翻开历史

可以毫不夸张地说,UNIX模型就是现代操作系统的原型!不管是原汁原味的UNIX各大系列比如AIX,Solaris,HP-UX,FreeBSD,NetBSD,...还是类UNIX比如Linux...还是基于Windows NT架构的各种微软操作系统,其基本思想都是来源于UNIX.虽然这些系统一个比一个复杂,但是请记住一句话:所有的基本思想都是也必须是朴素的,简单的!       也许,很多人看到这里就觉得有点不屑一顾,毕竟他们觉得自己是技术狂人,觉得只有摆弄复杂的东西才能证明自己的学识和技术,认为

golang的内存模型与new()与make()

要彻底理解new()与make()的区别, 最好从内存模型入手. golang属于c family, 而c程序在unix的内在模型: |低地址|text|data|bss|heap-->|unused|<--stack|env|高地址| 其中: (1)text存储程序主体,即机器指令. (2)data,bss存储全局变量, data存储初始化的全局变量. bss存储未初始化的全局变量. bss全称Block start by symbol, 以符号开始的块. (3)heap: 动态内存堆 (4

Heroku创始人Adam Wiggins发布十二要素应用宣言

Heroku是业内知名的云应用平台,从对外提供服务以来,他们已经有上百万应用的托管和运营经验.前不久,创始人Adam Wiggins根据这些经验,发布了一个“十二要素应用宣言(The Twelve-Factor App)”,该宣言由国内工作于安居客的程序员梁山将其翻译为中文,InfoQ中文站摘录如下. 十二要素应用宣言 简介: 如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或“软件即服务”(SaaS).“十二要素应用程序”(12-Factor App)为构建如下的SaaS应用提供了