[nio]dawn的基本概念
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的基本概念的更多相关文章
- Java 的NIO 3个主要概念 Channel、Buffer、Selector
Java 的NIO 3个主要概念 Channel.Buffer.Selector,为何提高了性能
- [NIO]dawn之Task具体解释
在上篇文章中,我们设置好了开发环境,接下来.我们将在了解了Task以及Buffer之后,再開始了解网络编程.我们首先来看看Task task简单介绍 package zhmt.dawn; import ...
- (转)也谈BIO | NIO | AIO (Java版)
原文地址: https://my.oschina.net/bluesky0leon/blog/132361 关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一 ...
- 也谈BIO | NIO | AIO (Java版--转)
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释: BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
- Java NIO 核心组件学习笔记
背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ...
- Nio经典工作方式
public void selector() throws IOException { ByteBuffer buffer = ByteBuffer.allocate(1024); Selector ...
- 【netty】(1)---BIO NIO AIO演变
BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使用的技术. Net ...
- java BIO/NIO/AIO 学习
一.了解Unix网络编程5种I/O模型 1.1.阻塞式I/O模型 阻塞I/O(blocking I/O)模型,进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误 ...
- Java NIO 入门
本文主要记录 Java 中 NIO 相关的基础知识点,以及基本的使用方式. 一.回顾传统的 I/O 刚接触 Java 中的 I/O 时,使用的传统的 BIO 的 API.由于 BIO 设计的类实在太 ...
随机推荐
- AC日记——[ZJOI2006]物流运输 bzoj 1003
1003 思路: 最短路+dp: 节点在a-b天里不能使用 那么我们准备每一组a-b求一条最短路,如果没有,则用极大值表示: cost[a,b]记录这个最短路: 然后,开始dp: dp[i]=min( ...
- iOS YYYY 和 yyyy的区别
2017年1月31日 转换后变成 2018年1月31日,相差一年.这是为什么呢? 原因:YYYY 是以周为单位计算的,我们平常计算日期时最好用yyyy,yyyy才是标注的年份 如果一月1日是星期一,星 ...
- 块级元素和行内元素的区别 (block vs. inline)
块级元素 (display: block) 独占一行,多个block元素会各自新起一行.默认情况下,block元素的宽度会填满父元素的宽度. 可以设置width, height属性.但是,即使设置了w ...
- 适配iOS7之—UITableView和UISearchBar
iOS7中,如果用UITableViewStyleGrouped的话,里面的cell会比原来的拉长了,这样做应该是为了统一和UITableViewStylePlain风格时cell的大小一致,所以改用 ...
- Oracle Forms Project For Students Free Download
After getting to much requests for a free Oracle Forms and Reports project for students, I am sharin ...
- linux中top命令的用法
收集了两篇关于介绍Linux中监控命令top命令的详细使用方法的文章.总的来说,top命令主要用来查看Linux系统的各个进程和系统资源占用情况,在监控Linux系统性能方面top显得非常有用,下面就 ...
- RR调度(Round-robin scheduling)简单介绍
在RR调度策略下,一个线程会一直运行.直到: 自愿放弃控制权 被更高优先级的线程抢占 时间片用完 例如以下图所看到的,A在用完自己的时间片后,将CPU运行权让给线程B.于是A离开Read队列,而B进入 ...
- Flume 开发人员指南V1.5.2
介绍 概述 Apache Flume是一个用来从非常多不同的源有效地收集.聚集和移动大量的日志数据到一个中心数据仓库的分布式的,可靠的和可用的系统. Apache Flume是Apache软件基金会的 ...
- Php网站如何优化才好?
尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非 ...
- hdu 4372 第一类斯特林数
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...