[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 设计的类实在太 ...
随机推荐
- hdu 4908(思路题)
BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 牛客网 牛客小白月赛2 G.文
G.文 链接:https://www.nowcoder.com/acm/contest/86/G 这个题wa了一发,有点智障,浮点数,式子里面要*1.0,忘了,然后wa了,改了就过了(脑子有坑) 代码 ...
- (18) python 爬虫实战
一切从最简单开始 峰绘网 :http://www.ifenghui.com/ 一个比较好爬的漫画网,之所以选择这个网站,因为查看源代码能直接获得漫画的jpg连接,而且每一话所有的jpg一次性的都展示出 ...
- Codeforces 371C Hamburgers (二分答案)
题目链接 Hamburgers 二分答案,贪心判断即可. #include <bits/stdc++.h> using namespace std; #define REP(i,n) fo ...
- Java线程池ThreadPoolExecutor类源码分析
前面我们在java线程池ThreadPoolExecutor类使用详解中对ThreadPoolExector线程池类的使用进行了详细阐述,这篇文章我们对其具体的源码进行一下分析和总结: 首先我们看下T ...
- 笔记-迎难而上之Java基础进阶8
函数式接口 函数式接口:有且只有一个抽象方法的接口,(可以包含其他默认,静态,私有方法) //函数式接口的使用,创建一个函数式接口 public interface FunctionalInterfa ...
- Java NIO.2 使用Path接口来监听文件、文件夹变化
Java7对NIO进行了大的改进,新增了许多功能: 对文件系统的访问提供了全面的支持 提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的Ja ...
- IOS7开发~API变化
1.弃用 MKOverlayView 及其子类,使用类 MKOverlayRenderer: 2.弃用 Audio Toolbox framework 中的 AudioSession API,使用AV ...
- 苹果开发者:Siri未开放API 有些让人失望
北京时间6月12日消息,据国外媒体报道,苹果公司在WWDC大会上展示了新版iOS和OS X系统,但由于未开放Siri API,一些苹果开发者还是有些失望. Siri API可以让开发者在自己的应用中整 ...
- Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储
Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...