对多种IO模型的分析,很详细的资料啊
本文转载自:http://www.cnblogs.com/leealways87/archive/2012/08/24/2654946.html
一、I/O模型
首先,输入操作一般包含两个步骤:
1、等待数据准备好(waiting for data to be ready)。对于一个套接口上的操作,这一步骤关系到数据从网络到达,并将其复制到内核的某个缓冲区。
2、将数据从内核缓冲区复制到进程缓冲区(copying the data from the kernel to the process)。
二、I/O模型类型
其次了解一下五种I/O模型:
1、阻塞I/O模型
最广泛的模型是阻塞I/O模型,默认情况下,所有套接口都是阻塞的。
进程调用recvfrom系统调用,整个过程是阻塞的,直到数据复制到进程缓冲区时才返回(当然,系统调用被中断也会返回)。
2、非阻塞I/O模型
当我们把一个套接口设置为非阻塞时,就是在告诉内核,当请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。当数据没有准备好时,内核立即返回EWOULDBLOCK错误,第四次调用系统调用时,数据已经存在,这时将数据复制到进程缓冲区中。这其中有一个操作时轮询(polling)。
3、I/O复用模型
此模型用到select和poll函数,这两个函数也会使进程阻塞,select先阻塞,有活动套接字才返回,但是和阻塞I/O不同的是,这两个函数可以同时阻塞多个I/O操作,而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写。select被调用后,进程会被阻塞,内核监视所有select负责的socket,当有任何一个socket的数据准备好了,select就会返回套接字可读,我们就可以调用recvfrom处理数据。
4、信号驱动I/O模型(signal driven I/O, SIGIO)
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它来读取数据报。无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达(第一阶段)期间,进程可以继续执行,不被阻塞。免去了select的阻塞与轮询,当有活跃套接字时,由注册的handler处理。
5、异步I/O模型(AIO, asynchronous I/O)
进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。
这个模型工作机制是:告诉内核启动某个操作,并让内核在整个操作(包括第二阶段,即将数据从内核拷贝到进程缓冲区中)完成后通知我们。
这种模型和前一种模型区别在于:信号驱动I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。
相关网址:
http://www.sogou.com/labs/report/1-1.pdf
http://www.kegel.com/c10k.html
http://blog.csdn.net/shallwake/article/details/5265287
http://www.cppblog.com/sherrylso/archive/2007/07/01/27330.html
相关推荐
对python并发进行的笔记整理,个人所学习使用,主要包括多进程,多线程,协程,IO多路复用,进程线程通信等
NIO的核心组件包括Channel、Buffer和Selector,它们极大地提升了多路复用IO的能力。 总结,Java IO流是Java平台中处理输入输出的基础,其丰富的类库和设计模式为开发者提供了灵活、高效的数据传输手段。通过深入...
- **多路复用IO**: 使用select/poll/epoll等技术实现同时监听多个Socket的状态变化,提高了系统的并发能力。 **2.4 信号驱动IO模型** - **信号驱动IO**: 当用户进程发起IO操作后,内核会立即返回,当IO操作完成后...
"深入redis学习(六)--redis io(1).doc"可能涉及Redis的I/O多路复用模型,如epoll或kqueue,它们允许Redis高效地处理大量并发连接,实现非阻塞I/O。 "深入redis学习(八)--redis zipmap.doc"介绍了一种内部使用的...
Linux内核支持多种IO模型,包括阻塞IO、非阻塞IO、IO多路复用、信号驱动IO等。各种模型有不同的应用场景和性能特点,选择合适的IO模型对系统性能有重要影响。 6. Linux内核中断 Linux内核中断包括硬件中断和软件...
- I/O模型:同步异步、阻塞非阻塞,了解IO多路复用(select、poll、epoll)。 - 进程调度:了解不同的调度策略,如FCFS、短进程优先、时间片轮转等。 5. **网络编程**: - OSI七层模型与TCP/IP五层模型:理解各...
Java的网络编程接口在JDK6中得到了进一步完善,包括套接字(Socket)编程、服务器套接字(ServerSocket)以及多路复用技术(如Java NIO的Selector),为开发网络应用提供了强大的支持。 五、集合框架 Java集合框架...
### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...
- 使用多路复用IO,高效处理多个连接。 - 不需要加锁,避免了死锁问题。 - 无进程切换,减少竞争消耗。 - 背景线程处理硬盘写入和复制等任务。 但也有缺点,如长时间运行的命令可能导致阻塞,且无法充分利用...
1. **事件驱动模型**:Swoole基于事件驱动模型,通过epoll(Linux下的IO多路复用技术)来高效地处理大量的并发连接。当有新的连接请求或者数据到达时,事件驱动机制会通知Swoole进行相应的处理。 2. **异步非阻塞I/...
2. 用 epoll 事件检测技术实现 IO 多路复用,提高运行效率; 3. 采用模拟 Proacto r的事件处理模式,利用线程池实现多线程机制,实现高并发通信,减少频繁创建和销毁线程带来的开销;(信号和互斥锁) 4. 主进程负责...
例如,可以通过创建一个简单的服务器,使用ServerSocketChannel监听连接,SocketChannel处理客户端请求,结合Selector实现多路复用。同时,Buffer的使用也非常重要,学会如何正确地读写数据,以及如何有效地管理缓冲...
- **非阻塞I/O**:通过Selector支持多路复用,允许单线程同时处理多个连接,提高系统伸缩性。 - **Memory Mapped Files**:支持内存映射文件,使得文件可以直接与内存空间交互,提高文件读写性能。 4. **Buffer与...
leetcode中文版 Learning Note And Diary 内容简介 已经很久都没有更新过这个仓库了,由于中间经历过一些事情变的懒惰了,之后会继续更新这个仓库,会添加一些自己学习的笔记以及每日的简短日记,跟随 ...多路复用
他还介绍了NIO(非阻塞I/O)的概念,如何使用Selector进行多路复用,以及通道和缓冲区的操作。 六、多线程编程 Java提供了强大的多线程支持。笔记中详细阐述了线程的创建方式,包括Thread类和Runnable接口,以及...
Redis采用异步事件驱动模型处理网络IO,使用epoll或kqueue等高性能的I/O多路复用技术。当客户端发送请求时,事件处理器将请求放入队列,由事件循环处理。这种设计使得Redis能够高效地处理大量并发连接。 6. **...
- Select:多路复用,允许程序等待多个通道操作完成。 - Waitgroups:同步多个goroutine的工具,确保所有任务完成后才继续执行。 3. **Go的内存管理** - 内存分配:了解栈和堆的区别,以及Go自动进行内存分配的...
尽管 Redis 的命令执行是单线程的,但其网络事件处理器采用 IO 多路复用技术,如 Epoll 或 Kqueue,能高效处理大量并发连接。Redis 的单线程模型避免了线程上下文切换带来的开销,使得在内存操作中保持高效率。不过...