Linux操作系统的IO模型详解.docx

上传人:安*** 文档编号:17709363 上传时间:2022-05-26 格式:DOCX 页数:12 大小:20.31KB
返回 下载 相关 举报
Linux操作系统的IO模型详解.docx_第1页
第1页 / 共12页
Linux操作系统的IO模型详解.docx_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《Linux操作系统的IO模型详解.docx》由会员分享,可在线阅读,更多相关《Linux操作系统的IO模型详解.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Linux操作系统的IO模型详解Linux操作系统中IO模型是很常见的。下面由学习啦我为大家整理了Linux操作系统的IO模型详解,希望对大家有帮助!Linux操作系统的IO模型详解Linux下的五种IO模型阻塞IO(blockingIO)非阻塞IO(nonblockingIO)IO复用(select和poll)(IOmultiplexing)信号驱动IO(signaldrivenIO(SIGIO)异步IO(asynchronousIO(thePOSIXaio_functions)前四种都是同步,只要最后一种才是异步IO。阻塞IO模型在这个模型中,应用程序(application)为了执行这个

2、read操作,会调用相应的一个systemcall,将系统控制权交给kernel,然后就进行等待(这其实就是被阻塞了)。kernel开场执行这个systemcall,执行完毕后会向应用程序返回响应,应用程序得到响应后,就不再阻塞,并进行后面的工作。非阻塞IO在linux下,应用程序能够通过设置文件描绘符的属性O_NONBLOCK,IO操作能够立即返回,但是并不保证IO操作成功。也就是讲,当应用程序设置了O_NONBLOCK之后,执行write操作,调用相应的systemcall,这个systemcall会从内核中立即返回。但是在这个返回的时间点,数据可能还没有被真正的写入到指定的地方。也就是讲

3、,kernel只是很快的返回了这个systemcall(只要立马返回,应用程序才不会被这个IO操作blocking),但是这个systemcall详细要执行的事情(写数据)可能并没有完成。而对于应用程序,固然这个IO操作很快就返回了,但是它并不知道这个IO操作能否真的成功了,为了知道IO操作能否成功,一般有两种策略:一是需要应用程序主动地循环地去问kernel(这种方法就是同步非阻塞IO);二是采用IO通知机制,比方:IO多路复用(这种方法属于异步阻塞IO)或信号驱动IO(这种方法属于异步非阻塞IO)。IO多路复用(异步阻塞IO)和之前一样,应用程序要执行read操作,因而调用一个system

4、call,这个systemcall被传递给了kernel。但在应用程序这边,它调用systemcall之后,并不等待kernel的返回结果而是立即返回,固然立即返回的调用函数是一个异步的方式,但应用程序会被像select()、poll和epoll等具有复用多个文件描绘符的函数阻塞住,一直等到这个systemcall有结果返回了,再通知应用程序。也就是讲,在这种模型中,IO函数是非阻塞的,使用阻塞select、poll、epoll系统调用来确定一个或多个IO描绘符何时能操作。所以,从IO操作的实际效果来看,异步阻塞IO和第一种同步阻塞IO是一样的,应用程序都是一直等到IO操作成功之后(数据已经被

5、写入或者读取),才开场进行下面的工作。不同点在于异步阻塞IO用一个select函数能够为多个描绘符提供通知,提高了并发性。举个例子:假设有一万个并发的read请求,但是网络上仍然没有数据,此时这一万个read会同时各自阻塞,如今用select、poll、epoll这样的函数来专门负责阻塞同时监听这一万个请求的状态,一旦有数据到达了就负责通知,这样就将之前一万个的各自为战的等待与阻塞转为一个专门的函数来负责与管理。与此同时,异步阻塞IO和第二种同步非阻塞IO的区别在于:同步非阻塞IO是需要应用程序主动地循环去询问能否有操作数据可操作,而异步阻塞IO是通过像select和poll等这样的IO多路复

6、用函数来同时检测多个事件句柄来告知应用程序能否能够有数据操作。信号驱动IO(signaldrivenIO(SIGIO)应用程序提交read请求的systemcall,然后,kernel开场处理相应的IO操作,而同时,应用程序并不等kernel返回响应,就会开场执行其他的处理操作(应用程序没有被IO操作所阻塞)。当kernel执行完毕,返回read的响应,就会产生一个信号或执行一个基于线程的回调函数来完成这次IO处理经过。从理论上讲,阻塞IO、IO复用和信号驱动的IO都是同步IO模型。由于在这三种模型中,IO的读写操作都是在IO事件发生之后由应用程序来完成。而POSIX规范所定义的异步IO模型则

7、不同。对异步IO而言,用户能够直接对IO执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及IO操作完成后内核通知应用程序的方式。异步IO读写操作总是立即返回,而不管IO能否阻塞的,由于真主的读写操作已经过内核接管。也就是讲,同步IO模型要求用户代码自行执行IO操作(将数据从内核缓冲区读入用户缓冲区,或将数据从用户缓冲区写入内核缓冲区),而异步IO机制则是由内核来执行IO操作(数据在内核缓冲区和用户缓冲区之间的移动是由内核在后台完成的)。你能够这样以为,同步IO向应用程序通知的是IO就绪事件,而异步IO向应用程序通知的是IO完成事件。linux环境下,aio.h头文件中定义的函数提供了对异

8、步IO的支持。异步IO(asynchronousIO(thePOSIXaio_functions)异步IO与上面的异步概念是一样的,当一个异步经过调用发出后,调用者不能立即得到结果,实际处理这个调用的函数在完成后,通过状态、通知和回调来通知调用者的输入输出操作。异步IO的工作机制是:告知内核启动某个操作,并让内核在整个操作完成后通知我们,这种模型与信号驱动的IO区别在于,信号驱动IO是由内核通知我们何时能够启动一个IO操作,这个IO操作由用户自定义的信号函数来实现,而异步IO模型是由内核告知我们IO操作何时完成。为了实现异步IO,专门定义了一套以aio开始的API,如:aio_read.小结:

9、前四种模型阻塞IO、非阻塞IO、多路复用IO和信号驱动IO都属于同步形式,由于其中真正的IO操作(函数)都将会阻塞进程,只要异步IO模型真正实现了IO操作的异步性。IO复用为了解释这个名词,首先来理解下复用这个概念,复用也就是共用的意思,这样理解还是有些抽象,为此,咱们来理解下复用在通信领域的使用,在通信领域中为了充分利用网络连接的物理介质,往往在同一条网络链路上采用时分复用或频分复用的技术使其在同一链路上传输多路信号,到这里我们就基本上理解了复用的含义,即公用某个介质来尽可能多的做同一类(性质)的事,那IO复用的介质是什么呢?为此我们首先来看看服务器编程的模型,客户端发来的请求服务端会产生一

10、个进程来对其进行服务,每当来一个客户请求就产生一个进程来服务,然而进程不可能无限制的产生,因而为了解决大量客户端访问的问题,引入了IO复用技术,即:一个进程能够同时对多个客户请求进行服务。也就是讲IO复用的介质是进程(准确的讲复用的是select和poll,由于进程也是靠调用select和poll来实现的),复用一个进程(select和poll)来对多个IO进行服务,固然客户端发来的IO是并发的但是IO所需的读写数据多数情况下是没有准备好的,因而就能够利用一个函数(select和poll)来监听IO所需的这些数据的状态,一旦IO有数据能够进行读写了,进程就来对这样的IO进行服务。理解完IO复用

11、后,我们在来看下实现IO复用中的三个API(select、poll和epoll)的区别和联络,select,poll,epoll都是IO多路复用的机制,IO多路复用就是通过一种机制,能够监视多个描绘符,一旦某个描绘符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。但select,poll,epoll本质上都是同步IO,由于他们都需要在读写事件就绪后本人负责进行读写,也就是讲这个读写经过是阻塞的,而异步IO则无需本人负责进行读写,异步IO的实现会负责把数据从内核拷贝到用户空间。三者的原型如下所示:intselect(intnfds,fd_set*readfds,fd_set*

12、writefds,fd_set*exceptfds,structtimeval*timeout);intpoll(structpollfd*fds,nfds_tnfds,inttimeout);intepoll_wait(intepfd,structepoll_event*events,intmaxevents,inttimeout);补充:相关的概念讲明用户空间与内核空间如今操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,能够访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户

13、进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址000000000到0xBFFFFFFF),供各个进程使用,称为用户空间。进程切换为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。因而能够讲,任何进程都是在操作系统内核的支持下运行的,是与内核严密相关的。从一个进程的运行转到另一个进程上运行,这个经过

14、中经过下面这些变化:保存处理机上下文,包括程序计数器和其他寄存器。更新PCB信息。把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。选择另一个进程执行,并更新其PCB。更新内存管理的数据构造。恢复处理机上下文。进程的阻塞正在执行的进程,由于等待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使本人由运行状态变为阻塞状态。可见,进程的阻塞是进程本身的一种主动行为,也因而只要处于运行态的进程(获得CPU),才可能将其转为阻塞状态。当进程进入阻塞状态,是不占用CPU资源的。文件描绘符文件描绘符(Filedescr

15、iptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。文件描绘符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创立一个新文件时,内核向进程返回一个文件描绘符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描绘符展开。但是文件描绘符这一概念往往只适用于UNIX、Linux这样的操作系统。缓存IO缓存IO又被称作标准IO,大多数文件系统的默认IO操作都是缓存IO。在Linux的缓存IO机制中,操作系统会将IO的数据缓存在文件系统的页缓存(pagecache)中,也就是讲,数据会先被拷贝到

16、操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。缓存IO的缺点:数据在传输经过中需要在应用程序地址空间和内核进行屡次数据拷贝操作,这些数据拷贝操作所带来的CPU以及内存开销是非常大的。同步与异步阻塞与非阻塞在进行网络编程时,我们经常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式,先理解一些概念性的东西。1.同步与异步同步与异步同步和异步关注的是消息通信机制(synchronouscommunication/asynchronouscommunication)所谓同步,就是在发出一个调用时,在没有得到结果之前,该

17、调用就不返回。但是一旦调用返回,就得到返回值了。换句话讲,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话讲,当一个异步经过调用发出后,调用者不会立即得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。典型的异步编程模型比方Node.js。2016.4.17更新:POSIX对这两个术语的定义:同步I/O操作:导致请求进程阻塞,直到I/O操作完成异步I/O操作:不导致请求进程阻塞2.阻塞与非阻塞阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。阻塞调用是指调用结果返回之前,当前

18、线程会被挂起。调用线程只要在得到结果之后才会返回。非阻塞调用指在不能立即得到结果之前,该调用不会阻塞当前线程。关于阻塞/非阻塞同步/异步愈加形象的比喻老张爱喝茶,废话不讲,煮开水。出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。1.老张把水壶放到火上,立等水开。(同步阻塞)老张觉得本人有点傻2.老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)老张还是觉得本人有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀的噪音。3.老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得这样傻等意义不大4.老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)老张觉得本人聪明了。所谓同步异步,只是对于水壶而言。普通水壶,同步;响水壶,异步。固然都能干活,但响水壶能够在本人完工之后,提示老张水开了。这是普通水壶所不能及的。同步只能让调用者去轮询本人(情况2中),造成老张效率的低下。所谓阻塞非阻塞,仅仅对于老张而言。立等的老张,阻塞;看视的老张,非阻塞。情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。固然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 策划方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁