通过下面这篇文章可以了解到五种IO模型和select poll和epoll的区别。
关注以下方法参数,socket调用方法结束后可以让就绪的连接的内核态数据写入到用户进程的buff中。
int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);
int select(int maxfdp1,fd_set *readset,fd_set *writeset, fd_set *exceptset, const struct timeval *timeout)
第一个参数:maxfdp1最大文件描述符的个数+1 处理的时候只处理0,maxfdp1-1
第二个参数:readset 其实是一个整数数组,它是值,结果参数。一开始每个数字的每一位都是1,代表需要关闭文件描述符的编号,返回的时候代表的是该文件描述符的状态。
例如:开始传入[5,7]第一个数字表示0,31的文件描述符表示对第1个和第3个进程check (5=2^0 + 2^2),第二个7表示32,63的文件描述符表示内核需要check 32,33,34的文件描述符。如果返回结果是第一个就绪了第三个没有就绪则数组的第一个数字变为1,没有就绪的文件标识符都置为0。看到资料说select只能支持1024个文件标识符,那么应该是这里规定了数组的长度为32。
最后一个参数:timeout是设置select的超时时间。
int poll(struct pollfd *dfarray, unsigned long nfds, int timeout)
其中第一个参数是数组的起始指针,所以有人说是链表也是可以理解的。
struct pollfd {
int fd ; // 文件标示符的标志
short events; // 感兴趣的事件
short revents; //就绪的事件
}
第二个参数是文件描述符的个数,就是数组的长度可以达到2^64次方个数!
第三个参数是超时时间。
其实poll和select的操作是一样的只是支持的文件描述符的个数不一样。
至于epoll后面再分析吧。
通过下面文章我们可以了解到java NIO的基本概念,Buffer,Channel,selector
思考几个问题:
1.NIO到底解决的是什么问题,是为了避免更多的socket连接,还是为了更多的并发线程?
这个我理解是后者,因为客户端连接不可避免,客户端连接进来肯定要创建连接。但是并发的线程数则可以控制,一方面selector可以管理注册在上面的多个channel来处理数据,这样就好比一个线程可以处理多个socketChannel。
2.一个server只能有一个selector还是可以有多个selector?
我理解是多个,如果一个channel处理消息0.01s,能够接受selector的处理channel时间是1s一次轮询,那么极限就是最多100个channel注册在一个selector上面。
3.一个socketChannel和普通的一个socket连接区别是什么?
查阅资料说channel是双向的,类似于流,那是否就类似一个socket连接呢。server能够支持多少个socket连接呢。发现一个资料可以参考下,不过还是有点疑惑,希望有小伙伴可以解答下。
相关推荐
**NIO(Non-blocking Input/Output)**是Java在1.4版本引入的一种新的I/O模型,它提供了与...然而,NIO的学习曲线相对较陡峭,需要对操作系统级别的I/O模型有一定了解,但一旦掌握,将极大地提升系统的性能和可扩展性。
### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...
ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。ByteBuffer是一个字节缓冲区,可以存储字节序列。在NIO中,所有的数据读写都通过缓冲区进行,ByteBuffer与其他类型的Buffer...
java学习笔记1(java io/nio)设计模式
Java NIO(New Input/Output)是Java标准库在JDK 1.4引入的一组新的I/O API,它提供了一种不同于传统IO的高效、非阻塞的I/O操作方式。NIO的核心概念包括Channel、Buffer和Selector,它们共同构建了一个与操作系统...
《NIO学习笔记》 在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型,与传统的BIO(Blocking I/O)相对应。NIO提供了一种新的方式来处理I/O操作,特别是在处理大量并发连接时,它的...
Java NIO,全称Non-Blocking Input/Output,是非阻塞式输入输出,它是Java从1.4版本开始引入的一种新的I/O模型,为Java程序员提供了处理I/O操作的新方式。NIO的主要特点是其能够使Java程序以更有效的方式处理I/O流,...
Java NIO(New Input/Output)是Java标准库在JDK 1.4版本中引入的一个新特性,它提供了一种不同于传统IO流的高效I/O处理方式。NIO的核心概念包括通道(Channel)和缓冲区(Buffer),这两个组件使得数据以块的形式...
这份“非常详细JavaSE学习笔记.rar”压缩包显然是一份全面的Java SE学习资源,包含了从基础知识到高级特性的全方位讲解。下面,我们将详细探讨这份笔记可能涵盖的关键知识点。 1. **Java起源与环境搭建**:笔记可能...
《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...
这个PDF学习笔记是开发者深入理解JDK 7特性和功能的重要参考资料。以下是对Java JDK 7的一些核心知识点的详细阐述: 1. **泛型改进**:在JDK 7中,泛型的使用更加灵活,引入了类型推断(Type Inference)特性,通过...
自己总结的java中NIO的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合java的爱好者和学习者
《良葛格JAVA 学习笔记》是由知名IT专家林信良,网名“良葛格”,在台湾大学电机工程学系的深厚学术背景基础上,结合其作为SUN教育训练中心讲师的丰富教学经验编写的。他的著作还包括《Spring 技术手册》,并且他...
Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及核心特性。这份PPT简体版旨在帮助读者快速掌握Java开发的基本技能,逐步成为一名合格的Java程序员。 Java JDK...
本篇将围绕“Java+JDK6学习笔记”展开,探讨在JDK6环境下Java编程的核心知识点。 1. **JDK6概述**:JDK6是Oracle公司于2006年发布的Java平台标准版(Java SE)的一个重要版本,它的全称是Java SE 6,带来了许多新...
这个压缩包“Java JDK 6学习笔记.zip”显然是一个包含有关Java JDK 6深入学习资源的集合,可能是PDF文档、笔记或者其他形式的教学材料。 在Java JDK 6中,有几个关键的特性值得我们关注: 1. **改进的性能**:JDK ...
《良葛格Java学习笔记(完整版)》是一份全面且深入的Java编程教程,适合不同层次的Java学习者,无论你是初学者还是有经验的开发者,都能从中受益。这份笔记详细介绍了Java语言的核心概念、语法特性以及实际开发中的...
Java学习笔记源代码是针对清华大学出版的《Java学习笔记》一书,配套的 JDK1.5 版本的源码。这些源代码旨在帮助读者深入理解Java编程语言,通过实践来加强理论学习,提高编程技能。Java作为一种广泛使用的高级编程...