1.dawn是单线程的:

为什么单线程?现实中非常多程序都是单线程的。比方redis,memcache,nodejs。mmorpgserver。。。。。

。

採用单线程有两大优点,首先,不须要使用锁,逻辑更easy理解,不易出错,其次,降低了切换线程时的调度成本。

2.什么是Task

dawn中使用了Task,这事实上是kilim中的协程,协程最主要的功能是挂起和恢复,这点和线程是一致的。

全部的Task都是执行在同一个线程中的,所以,从内存的可见性和一致性的角度来讲,Task之间是不须要同步的。这里有个例外。那就是IO,假设多个Task读写同一个IO设备(比方socket),那潜在是不安全的。由于数据比較大时。可能须要多次read write,此时。多个Task的数据会混在一起发送,导致接收方收到混乱的数据。所以,IO操作必须是原子的,dawn已经考虑到这一点。并在底层封装IO操作。保证了IO操作的原子性。

Task的一般性使用方法,比方做定时任务,启动一个Task。sleep一定时间。睡醒后,运行一段代码。然后再sleep,循环。。

。。

再比方server端网络连接的处理,接收到一个连接后。就能够启动一个独立的Task来专门处理这个连接,收包、解包、处理、封包、发送,一个循环搞定,就和用一个独立的线程来处理一个单个的连接一样。

那你可能会有疑问了。连接数多的话,Task岂不是过多了?没关系。和使用线程不一样,我们能够启动大量的Task。在我的机器上,使用jvm的默认配置。就能启动10万个Task。Task之间每秒能够进行200多万次切换。这么多的Task。大多数场景都能够应付了。

3.什么是NonpausableTask

从字面上看。就是不可暂停的任务,的确如此,这是一种定时任务。不能挂起、唤醒,仅仅能一次性运行完。NonpausableTask因为不涉及到挂起、恢复。所以效率更高,假设仅仅从Task切换的角度上讲。NonpausableTask的切换效率是Task的两倍左右。假设大量使用NonpausableTask的话,就等于是在进行传统的回调式的异步编程,程序复杂度会升高,假设是高频率运行的简单任务,能够考虑用NonpausableTask来替换Task,可能会提升系统吞吐量。

可是一般来讲,我们应该优先优化程序的架构、逻辑,最后再考虑NonpausableTask。

4.什么是Scheduler?

就像线程是由内核调度的一样,Task是由Scheduler调度的。比方在Task里运行sleep(2000)。就是告诉调度器,我要挂起了,两秒后你唤醒我。此时,Scheduler就会在内部做一个2秒的定时,两秒后恢复此Task的运行。

此外,Scheduler也包含了IO事件的检測以、线程间事件的派发(开发中)。比方Task正在TcpChannel.read上等待数据到来,此时Scheduler检測到了socket处于可读状态,则会唤醒Task,让Task继续运行,以读取数据。

每一个Scheduler都是一个独立的线程,所以,仅仅有在同一个Scheduler上执行的Task,才干安全的分享内存、socket等资源。

所以说。dawn事实上是能够扩展到多线程的,此部分功能尚在规划中。只是线程池相关的功能会非常快提供。

[nio]dawn的基本概念的更多相关文章

  1. Java 的NIO 3个主要概念 Channel、Buffer、Selector

    Java 的NIO 3个主要概念 Channel.Buffer.Selector,为何提高了性能

  2. [NIO]dawn之Task具体解释

    在上篇文章中,我们设置好了开发环境,接下来.我们将在了解了Task以及Buffer之后,再開始了解网络编程.我们首先来看看Task task简单介绍 package zhmt.dawn; import ...

  3. (转)也谈BIO | NIO | AIO (Java版)

    原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...

  4. 也谈BIO | NIO | AIO (Java版--转)

    关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  5. Java NIO 核心组件学习笔记

    背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ...

  6. Nio经典工作方式

    public void selector() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); Selector ...

  7. 【netty】(1)---BIO NIO AIO演变

    BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...

  8. java BIO/NIO/AIO 学习

    一.了解Unix网络编程5种I/O模型 1.1.阻塞式I/O模型 阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误 ...

  9. Java NIO 入门

    本文主要记录 Java 中  NIO 相关的基础知识点,以及基本的使用方式. 一.回顾传统的 I/O 刚接触 Java 中的 I/O 时,使用的传统的 BIO 的 API.由于 BIO 设计的类实在太 ...

随机推荐

  1. Spring Boot学习——Controller的使用

    本文主要记录几个注释的使用方法. 1. @Controller : 处理http请求 2. @RequestMapping : 配置URL映射 3. @RestController : 组合注解,sp ...

  2. 使用企业微信的API给指定用户发送消息

    上个月比较忙,等不忙了继续写点基础教程(五一还在高铁上写项目在).因为公司的原因,自己学习了点JavaWeb的知识,重新写了一个简单的后台管理,用于记录用户注册信息的.其中有这样的一个要求,就是在用户 ...

  3. PHP amqp扩展安装

    1.安装 rabbitmq-c下载地址:https://github.com/alanxz/rabbitmq-c> mkdir build > cd build> cmake -DO ...

  4. 【python】redis基本命令和基本用法详解

    [python]redis基本命令和基本用法详解 来自http://www.cnblogs.com/wangtp/p/5636872.html 1.redis连接 redis-py提供两个类Redis ...

  5. hdu254 DFS+BFS

    这个题目需要注意以下几点: 1)注意界线问题,箱子和人不可以越界. 2)需要判断人是否可以到达人推箱子的指定位置. 3)不可以用箱子作为标记,因为箱子可以走原来走过的地方,我们用箱子和人推箱子的方向来 ...

  6. EasyMvc入门教程-基本控件说明(2)定时器

    我们有时候希望系统能自动刷新后台数据或者做某个动作,那么定时器的作用就体现出来了. EasyMvc默认提供的服务器可以定时调前端方法与定时调后端方法,先看例子: 定时调客户端事件 实现代码: @Htm ...

  7. Linux内核裁剪的具体步骤

    在menuconfig中配置: 详细介绍内核配置选项及删改情况 第一部分:全部删除 Code maturity level options ---> 代码成熟等级选项 []Prompt for  ...

  8. 关于文本处理sort-cut-wc详解

    sort sort命令对File参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序.   sort语法 [ ...

  9. 「工具」Dubbo可视化测试工具的设计和实现

    「工具」Dubbo可视化测试工具的设计和实现 学习了:https://blog.csdn.net/qq355667166/article/details/78914453

  10. Linux:和任务执行相关的 【批命令执行 runparts 】命令

    run-parts:执行目录下的 命令或脚本 工具,其他非可执行文件和子目录下的文件不会被执行.目录下的命令,是以基本的词汇(字符)顺序执行的,除非你指定了--reverse 逆序选项!这是个老牌的G ...