Netty学习之三--Java I/O模型
来源:互联网 发布:手机 Ubuntu 编辑:程序博客网 时间:2024/06/07 16:33
1.Linux 网络I/O模型简介
Linux的内核将所有外部设备都看做一个文件来操作。对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。
对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符),描述符就是一个数字,指指向内核中的一个结构体(文件路径、数据区等一些属性)。
2.IO模型
2.1针对网络IO的操作,可以分成 两个阶段 ,准备阶段和操作阶段。
1,准备阶段是判断是否能够操作(即等待数据是否可用),在内核进程完成的;
2,操作阶段则执行实际的IO调用,数据从内核缓冲区拷贝到用户进程缓冲区。
2.2阻塞( blocking )、非阻塞( non-blocking )
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
2.3同步( synchronous )、异步( asynchronous )
同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回。但是一旦调用返回,就得到返回值了。
换句话说,就是由*调用者*主动等待这个*调用*的结果。
而异步则是相反,*调用*在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在*调用*发 出后,*被 调用者*通过状态、通知来通知调用者,或通 过回调函数处理这个调用。
3.UNIX提供的5种I/O模型
1、阻塞I/O
2、非阻塞I/O
3、I/O复用(select和poll)
4、信号驱动I/O(SIGIO)
5、异步I/O
4.I/O模型详解
1、阻塞I/O
在准备阶段即同步阻塞,应用进程调用I/O操作时阻塞,只有等待要操作的数据准备好,并复制到应用进程的缓冲区中才返回
在两个阶段上面都是阻塞的
2、非阻塞I/O
当应用进程要调用的I/O操作会导致该进程进入阻塞状态时,该I/O调用返回一个错误,一般情况下,应用进程需要利用轮询的方式
在第1阶段,程序不断的轮询直到数据准备好,第2阶段还是阻塞的
3、I/O复用(select和poll)
多路IO共用一个同步阻塞接口,任意IO可操作都可激活IO操作,这是对阻塞IO的改进(主要是select和poll、epoll,关键是能实现同时对多个IO端口进行监听)。
此时阻塞发生在select/poll的系统调用上,而不是阻塞在实际的I/O系统调用上。IO多路复用的高级之处在于:它能同时等
待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select等函数就可以返回。
在第1阶段,当一个或者多个IO准备就绪时,通知程序,第2阶段还是阻塞的,在第1阶段还是轮询实现的,只是所有的IO都集中在一个地方,这个地方进行轮询
4、信号驱动I/O(SIGIO)
注册一个IO信号事件,在数据可操作时通过SIGIO信号通知线程,这应该算是一种异步机制;
当数据准备完毕的时候,信号通知程序数据准备完毕,第2阶段阻塞;
5、异步I/O
应用进程通知内核开始一个异步I/O操作,并让内核在整个操作(包含将数据从内核复制到应该进程的缓冲区)完成后通知应用进程。
两个阶段都不阻塞
5.总结
上述五种I/O模型,前四种均属于同步I/O(它们等待方式不同,搬迁动作相同),因为recvfrom调用均阻塞了当前请求进程。
只有最后一种io属于异步I/O !
所谓同步,数据从存储介质拷贝到内核缓冲区(数据准备的过程)完成之后,需要用户自己将数据拷贝到用户缓冲区。
所谓异步,步骤1,2 用户都不关心,只要发起IO请求,后面得到IO结果即可。
所以,前4种IO模型都是同步的!!!
- Netty学习之三--Java I/O模型
- java之I/O模型!!!
- Netty的由来之阻塞I/O模型BIO
- java学习之i/o
- java I/O模型
- 学习笔记I/O篇之三
- java I/O流学习(三)
- Netty权威指南 第2版学习笔记1——Java的I/O演进之路
- Netty学习笔记<1>--UNIX的5种I/O模型
- 套接字I/O模型之三--WSAEventSelect
- (三)Socket I/O模型之事件选择(WSAEventSelect)
- netty启程之路(一):Linux的五种网络I/O模型
- Netty 权威指南笔记(一):网络 I/O 模型和 Java NIO 入门
- JAVA通信的三种I/O模型
- Netty学习三:线程模型
- Netty学习三:线程模型
- Netty学习之三
- I/O系统之Java学习总结
- 前端必读:浏览器内部工作原理
- WHAT DOES “NEURONS THAT FIRE TOGETHER WIRE TOGETHER” MEAN?
- Swift-使用泛型范围获取数组或区间中随机元素
- Oracle数据库(数据字典、表空间、表的创建、视图)
- base64
- Netty学习之三--Java I/O模型
- 原型模式
- Intent 传递对象 Serializable/Parcelable
- 起步-封装组件
- Codeforces Round #413 Div. 1 + Div. 2 A. Carrot Cakes
- Oracle
- [robot]Quaternions and Rigid Transformations
- 启动活动的最佳写法
- js运动--同时运动框架