mina 学习3-mina线程模型

Apache Mina 中关于线程模型的关键源代码:

在创建 NioSocketAcceptor acceptor = new NioSocketAcceptor(); 时刻,

创建一个SimpleIoProcessorPool 线程池,该线程池最小数量为1个,

默认数量为

/** The default pool size, when no size is provided. */

private static final int DEFAULT_SIZE = Runtime.getRuntime().availableProcessors() + 1;

在Acceptor 绑定端口时 acceptor.bind(new InetSocketAddress(PORT));

Set<SocketAddress> addresses = bindInternal(localAddressesCopy);//绑定本地端口

//在线程池中创建了一个Acceptor线程NioSocketAcceptor-1 用来接收链接事件

//该AbstractPollingIoAcceptor 的一个内部线程类Acceptor

protected final void executeWorker(Runnable worker, String suffix)

{

String actualThreadName = threadName;

if (suffix != null) {

actualThreadName = actualThreadName + ‘-‘ + suffix;

}

executor.execute(new NamePreservingRunnable(worker, actualThreadName));

}

Acceptor 线程只接受isAcceptable 事件

protected NioSession accept(IoProcessor<NioSession> processor, ServerSocketChannel handle) throws Exception

{

//当Acceptor接收新链接时,创建新NioSocketSession

SelectionKey key = null;

if (handle != null)

{

key = handle.keyFor(selector);

}

if ((key == null) || (!key.isValid()) || (!key.isAcceptable()))

{

return null;

}

// accept the connection from the client

//接受新链接

SocketChannel ch = handle.accept();

if (ch == null)

{

return null;

}

return new NioSocketSession(this, processor, ch);

}

public abstract class NioSession extends AbstractIoSession

{

/** The NioSession processor */

protected final IoProcessor<NioSession> processor;

/** The communication channel */

protected final Channel channel;

/** The SelectionKey used for this session */

protected SelectionKey key;

/** The FilterChain created for this session */

private final IoFilterChain filterChain;

protected NioSession(IoProcessor<NioSession> processor, IoService service, Channel channel)

{

super(service);

this.channel = channel;

this.processor = processor;

filterChain = new DefaultIoFilterChain(this);

}

}

/**

* Find the processor associated to a session. If it hasen‘t be stored into

* the session‘s attributes, pick a new processor and stores it.

*/

private IoProcessor<S> getProcessor(S session)

{

IoProcessor<S> processor = (IoProcessor<S>) session.getAttribute(PROCESSOR);

//把IoSession和线程池中的线程关联在一起

if (processor == null) {

if (disposed || disposing) {

throw new IllegalStateException("A disposed processor cannot be accessed.");

}

//通过IoSession和线程关联

processor = pool[Math.abs((int) session.getId()) % pool.length];

if (processor == null) {

throw new IllegalStateException("A disposed processor cannot be accessed.");

}

//在NioSession中管理着自己的线程

session.setAttributeIfAbsent(PROCESSOR, processor);

}

return processor;

}

//此时把Acceptor 线程接收到的NioSocket链接通过并发队列加入到AbstractPollingIoProcessor 中Processor 内部线程中.

//以后都由该线程NioProcessor-X处理I/O的输入输出流.至此,Acceptor工作线程流程到此处结束.

public abstract class AbstractPollingIoProcessor<S extends AbstractIoSession> implements IoProcessor<S>

{

/** A Session queue containing the newly created sessions */

private final Queue<S> newSessions = new ConcurrentLinkedQueue<S>();

}

NioProcessor 线程仅仅处理数据的输入和输出

/**

* Deal with session ready for the read or write operations, or both.

*/

private void process(S session)

{

// Process Reads

if (isReadable(session) && !session.isReadSuspended()) {

read(session);

}

// Process writes

if (isWritable(session) && !session.isWriteSuspended()) {

// add the session to the queue, if it‘s not already there

if (session.setScheduledForFlush(true)) {

flushingSessions.add(session);

}

}

}

//NioProcessor 线程读取数据主要流程.读取过程中,所有操作会在该线程中完成

//至此,NioProcessor线程流程完成了.

private void read(S session)

{

if (readBytes > 0) {

IoFilterChain filterChain = session.getFilterChain();

filterChain.fireMessageReceived(buf);

buf = null;

if (hasFragmentation) {

if (readBytes << 1 < config.getReadBufferSize()) {

session.decreaseReadBufferSize();

} else if (readBytes == config.getReadBufferSize()) {

session.increaseReadBufferSize();

}

}

}

}

小结:

至此Apache Mina 的线程模型解析完成.Apache Mina 是一个典型的Reactor Pattern 模式的实现.

在IoProcessor线程中,每一个IoSession和固定的线程关联,这样就避免的对IoSession的读写操作的加锁处理.

并且,IoSession的读写操作是在同一个线程中完成,这样不设计多线程处理.

但是每一个IoSession 都在不同的线程中,也就是说当多个IoSession需要访问共享资源时,需要对共享资源进行加锁处理.

Acceptor 线程和IoProcessor线程之间对于共享资源时通过

private final Queue<S> newSessions = new ConcurrentLinkedQueue<S>();

这个JavaSE中提供的并发队列完成的.

如果要处理在逻辑层的单线程可以通过所有IoSession来共享同一个并发队列,所有入口都是通过并发队列,这样可以保证逻辑层单线程.

这样可以屏蔽IO操作的发杂行和逻辑线程的单一性,容易调试.

与IOCP模型比较:

我们公司游戏服务器才有IOCP模型,对应输入输出流的处理是通过工作线程(IOCP可以指定最大工作线程数量),这样就避免不了多线程的处理.

用Competition Key参数来关联SocketWrap.SocketWrap 里面含有封装的临界区.在window操作系统中的一个轻量级快速锁.每次对应SocketWrap的读写操作都进行加锁操作.

当时锁在SocketWrap内部,这样SocketWrap 就会与多个工作线程关联,形成并发操作.但是操作系统会对工作线程调度.

当SocketWrap 数据读取完成后,把数据放入到一个并发队列中,所有数据的入口都是通过该并发队列.

只不过,IOCP是C++直接调用Window API和系统调用工作线程,而Apache Mina是通过java语言 JNI接口和JavaSE提供的线程池.效率必然比c++低.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 01:26:51

mina 学习3-mina线程模型的相关文章

操作系统学习笔记----进程/线程模型----Coursera课程笔记

操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进程创建.撤销.阻塞.唤醒.... 0.2 线程模型 为什么引入线程 线程的组成 线程机制的实现 用户级线程.核心级线程.混合方式 1. 进程的基本概念 1.1 多道程序设计 允许多个程序同时进入内存运行,目的是为了提高CPU系统效率 1.2 并发环境与并发程序 并发环境: 一段时间间隔内,单处理器上

Dubbo -- 系统学习 笔记 -- 示例 -- 线程模型

Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 线程模型 事件处理线程说明 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度. 但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求. 如果用IO线程处理事件,又在事件处理过程中发起新的IO请求,比如在连接事件中发起登录请

Netty 线程模型

关于Java NIO Reactor模式http://my.oschina.net/xinxingegeya/blog/339027 下面是线程模型的演进 Thread per Connection Thread per Connection: 在没有nio之前,这是传统的java网络编程方案所采用的线程模型.即有一个主循环,socket.accept阻塞等待,当建立连接后,创建新的线程/从线程池中取一个,把该socket连接交由新线程全权处理.这种方案优缺点都很明显,优点即实现简单,缺点则是方

Mina的线程模型

在Mina的NIO模式中有三种I/O工作线程(这三种线程模型只在NIOSocket中有效,在NIO数据包和虚拟管道中没有,也不需要配置): IoAcceptor/IoConnector线程 IoProcessor线程 IoHandler线程 一.Acceptor  thread 该线程的作用是接收客户端的连接,并将客户端的连接导入到I/O processor线程模型中.所谓的I/O processor线程模型就是Mina的I/O processor thread.Acceptor thread在

Mina、Netty、Twisted一起学(十):线程模型

要想开发一个高性能的TCPserver,熟悉所使用框架的线程模型非常重要.MINA.Netty.Twisted本身都是高性能的网络框架,假设再搭配上高效率的代码.才干实现一个高大上的server. 可是假设不了解它们的线程模型.就非常难写出高性能的代码.框架本身效率再高.程序写的太差,那么server总体的性能也不会太高.就像一个电脑,CPU再好.内存小硬盘慢散热差,总体的性能也不会太高. 玩过Android开发的同学会知道,在Android应用中有一个非常重要线程:UI线程(即主线程). UI

Mina、Netty线程模型

Reactor线程模型 ???????Reactor是反应堆的意思,Reactor模式即Dispatcher模式,服务器程序处理传入的多路请求,将他们同步分派给各请求对应的处理线程. ???????Reactor有两个关键角色: ??????? Reactor Reactor在一个单独线程中运行,负责监听和分发事件,将请求事件分发给处理线程来对IO事件作出反应. ??????? Handlers 处理程序执行IO事件完成响应的事件操作. 根据Reactor和Handler数量的不同,Reacto

MINA学习汇总

MINA学习汇总 Apache Mina Server 是一个网络通信应用框架,用于开发高性能和高可用性的网络应用程序.它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务.虚拟机管道通信服务等),Mina 提供了事件驱动.异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型. Apache Mina简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架! Mina在整个网通通信结构中位置: Mina处于中间

Netty IO线程模型学习总结

Netty框架的 主要线程是IO线程,线程模型的好坏直接决定了系统的吞吐量.并发性和安全性. Netty的线程模型遵循了Reactor的基础线程模型.下面我们先一起看下该模型 Reactor线程模型 Reactor 单线程模型 单线程模型中所有的IO操作都在一个NIO线程上操作: 包含接受客户端的请求,读取客户端的消息和应答.由于使用的是异步非阻塞的IO,所有的IO操作不会阻塞,理论上一个线程就可以处理所有的IO操作. 单线程模型适用小容量的应用.因为在高并发应用 可导致以下问题 一个线程同时处

Netty系列之Netty线程模型

1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比较流行的是单线程编程,对于CPU密集型的应用程序而言,频繁的通过多线程进行协作和抢占时间片反而会降低性能. 1.1.2. 多线程 随着硬件性能的提升,CPU的核数越来越越多,很多服务器标配已经达到32或64核.通过多线程并发编程,可以充分利用多核CPU的处理能力,提升系统的处理效率和并发性能. 相关