`
javaG
  • 浏览: 555026 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

IoServer源代码阅读笔记

    博客分类:
  • java
 
阅读更多

NIO:写事件要尽量早的被注销.

1,IOServer用一个主线程来处理Accept事件,然后把得到的key封装到IOSession中,再分配到一个读写处理器管理器(IoReadWriteMachineManager是一个数组,如果当前服务器有N个cpu则里面就有n个IoReadWriteMachine对象,相当于每个cpu绑定一个IoReadWriteMachine进行读写的io操作)中处理.
2,Selector中wakeup的作用,每次接受到一个Accept时间,就把对应的IOSession加入到一个IoReadWriteMachine中去,同时会调用这个IoReadWriteMachine中的Selector的wakeup()方法.看了这个方法的解释,发现它会让阻塞的select或者select(long)方法理解返回,同时在这两个方法返回的过程中不论你调用多少次wakeup方法,效果都一样,这个说明很有用.所以代码里面只要注册一个时间到IoReadWriteMachine都会调用一次wakeup,因为平凡调用不会损失效率.
3,SelectionKey是一个把Channel,Channel感兴趣的事件类型绑定的一个对象,当我们通过select方法返回的一组就绪事件队列实际上是一个SelectionKey队列,按照正常的情况我们是取得这个key后就把这个key从这个队列里面删除(不删除反正是有问题,具体为什么会有问题,目前还不太清楚).但是这里有个地方要注意,就是虽然被删除了,但是在NIO内部,这个key对象并没有被删除,你可以通过设置这个这个key的interestOps(int)函数来改变当前这个key对应的Channel感兴趣的事件 ,而不一定非要用channel的register方法.
4,IOServer的读事件,写事件,发起连接的事件,都是以IoSession为载体,通过把IoSession放入注册队列,控制队列,等待连接队列,然后再从这写队列取出IoSession来改变他们的key的interestOps来达到读写的目的.可以这样来描述一个IoSession的生命周期:accept后->加入注册队列->通过registerIoSessionsNow从注册队列取出把它绑定到一个IoReadWriteMachine的selector上,并绑定为可读态->读完后如果需要写数据则把IoSession丢入控制队列->通过changeControls方法把设置IoSession对应的SelectionKey的interestOps为可写态
5,在处理写操作时,每次调用IoSession的write方法时,把要写的数据封装到一个WriteFuture(实现了IoFuture接口)的对象内,然后把这个WriteFuture对象放入Sessoin的writeQueue队列,并把当前的IoSession加入到控制队列,就如4里面提到的,然后在IoReadWriteMachine中出理这个写事件,处理写事件的时候,是从把IoSession里取出writeQueue队列,每次取一个WriteFuture对象处理,处理完便推出,再等到下一次写时间过来,直到writeQueue里面的数据被输出完毕.输出完毕后则关闭这个通道的写事件.
分享到:
评论

相关推荐

    panzg123.github.io:blog,学习笔记

    convert_utf_2_gbk 源代码的格式转换 use_hiredis_for_windows windows平台hiredis的编译 stl_skill STL中技能掌握 combine_and_permutation全排列和组合 dp_string字符串中的动态规划问题 tsp_code旅行商问题的求解...

    java学习笔记JDK6.0课件和代码

    通过这个JDK 6.0的学习笔记和源代码,你不仅可以学习到Java的基础知识,还能通过实际案例理解如何在项目中运用这些知识。随着Java技术的不断发展,虽然JDK 6.0已经过时,但它仍然是初学者理解和掌握Java编程思想的...

    JSP笔记,JSP笔记

    - `<%@ include file="..." %>`:这是静态包含,会在编译阶段将被包含文件的源代码合并到主JSP文件中。这种方式适用于包含那些需要在编译时就合并的代码或静态内容。 - `<jsp:include page="..." />`:动态包含,...

    net学习笔记及其他代码应用

    (中间语言,源数据,资源,装配清单) 22.常用的调用WebService的方法有哪些? 答:1.使用WSDL.exe命令行工具。 2.使用VS.NET中的Add Web Reference菜单选项 23..net Remoting 的工作原理是什么? 答:服务器...

    vod.rar_java vod_jsp_ovodbofangqixiazai_vodplayer co_播放器

    【标题】"vod.rar" 是一个与Java VOD(Video On Demand)相关的压缩包,它包含了一组用于构建VOD播放器的源代码。VOD(视频点播)是一种允许用户在任何时间选择并观看他们想要的视频内容的技术。在这个项目中,...

    Redis笔记.doc

    2. 解压缩源代码,并进入目录。 3. Redis 的配置过程相对简单,一般无需执行 configure,直接进行编译。 4. 使用 `make` 进行编译,如果在32位机器上,可以使用 `make 32bit`。 5. 如果遇到时间错误,可能是因为源码...

    称重系统,过磅软件,地磅程序,c#源码

    压缩包中的“称重系统过磅软件地磅程序.html”可能是系统的使用说明或者设计文档,“称重系统过磅软件地磅程序源码.txt”则可能包含了部分源代码或者开发笔记,“sorce”可能是源代码文件夹,包含完整的项目源代码。...

    51CTO下载-韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)

    2. **编译源文件为类文件 (.class)**:使用 JDK 提供的 `javac` 命令将源代码编译成字节码文件。 3. **在虚拟机上运行**:通过 Java 虚拟机 (JVM) 执行编译后的 `.class` 文件。 ### Java 注释 Java 支持三种类型...

    dwr3 学习笔记<一>

    【标签】"源码"表明博主可能深入解析了DWR3的源代码,分析其实现原理,这对于开发者来说是理解框架内部工作方式的重要途径。"工具"标签则提示DWR3作为一个开发工具,可能会讨论如何在开发流程中有效地利用它来提高...

    docker-code-server

    - 查看我们所有存储库的源代码。 - 请考虑通过捐赠或贡献我们的预算来帮助我们 Code-server是运行在远程服务器上的 VS Code,可通过浏览器访问。 在具有一致开发环境的 Chromebook、平板电脑和笔记本电脑上...

    2662419405.github.io:学习vuepress,笔记和面试题整理https

    这个项目中,2662419405.github.io-master 文件夹很可能包含了项目的源代码,包括 Markdown 文件、配置文件、主题文件等,读者可以通过研究这些文件来深入学习 VuePress 的实际应用和配置。同时,也可以通过阅读笔记...

    java从入门到精通(韩顺平视频)笔记整理

    源代码编译后生成字节码,由Java解释器在Java虚拟机(JVM)上执行。 Java的数据类型分为基本数据类型和引用数据类型。基本数据类型包括整数类型(byte、short、int、long)、浮点类型(float、double)、布尔类型...

    20120723_流媒体技术笔记(DarwinStreamingServer相关)1

    DSS 是一个开放源代码的、基于标准的流媒体服务器,可以运行在 Windows NT 和 Windows 2000,以及几个 UNIX 实现上,包括 Mac OS X、Linux、FreeBSD 和 Solaris 操作系统上。 DSS 支持 MP4、3GPP 等文件格式;支持 ...

    spring-boot学习笔记

    ### Spring Boot 学习笔记知识点总结 #### 一、Spring发展史 - **Spring1.x时代**:在Spring1.x的时代,主要通过XML文件来配置Bean。随着项目的规模扩大,XML配置文件的数量也随之增加,这导致开发人员需要频繁地...

    java学习笔记整理

    - `javac`: Java编译器,用于将源代码编译为字节码。 - `java`: Java解释器,用于执行编译后的字节码文件。 ##### 1.4 集成开发环境 集成开发环境(IDE)是集成了代码编辑、编译、调试等功能于一体的开发工具,...

    java,mysql,JSP笔记

    5.IO流:Java的IO流处理允许程序读取和写入各种输入/输出源,如文件、网络连接等。 【MySQL知识点】 MySQL是一款关系型数据库管理系统,被广泛应用于Web应用中。它的特点是性能高、成本低、易用性强。 1. 数据库...

    jonathanpberger.github.io

    7. **javascripts**或**js**目录:存放JavaScript源代码,可能包括模块化代码、库和插件。 8. **stylesheets**或**css**目录:存放样式表文件,用于定义网页的外观。 9. **images**目录:存放项目所需的图片资源。 ...

    java进程间通讯笔记

    Java中,管道主要通过`java.io.PipedInputStream`和`java.io.PipedOutputStream`类实现。 2. **命名管道(Named Pipe)**: 名称管道扩展了普通管道的功能,允许无亲缘关系的进程之间通信,并且具有文件名。在Java...

Global site tag (gtag.js) - Google Analytics