[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 设计的类实在太 ...
随机推荐
- python 锁 多进程
参考: http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html http://linhs.blog.51cto.com/370259/1 ...
- 转:[小北De编程手记] : Selenium For C# 教程目录
写<Selnium For C#>系列文章的初衷是因为有很多朋友问我应该从哪里开始学习自动化测试,于是就为大家写下了这个系列的文章,希望对你有些帮助吧.而我想表达的是Selenium(同时 ...
- 服务器出现大量close_wait,我们来说说到底是怎么回事?(以tomcat为例)
一.问题描述 最近一直忙得很,好久没写博客.前两天,微信收到个好友申请,说是想问问close_wait的事情. 找他问了些详细信息,大概了解到,他们后端服务是tomcat 7, jdk 7,cento ...
- Jenkins错误“to depth infinity with ignoreexternals:true”问题解决
试下以下解决方法: 1.可能是SVN插件版本过低导致,升级SVN插件. 2.可能是构建时自己手动修改了代码,而SVN检出时无法覆盖导致的错误,可以先删除jenkins检出的代码,然后再检出一次去构建. ...
- Mark S. Rasmussen improve.dk-----knife-for-mdf-files
http://improve.dk/orcamdf-rawdatabase-a-swiss-army-knife-for-mdf-files/ http://www.cnblogs.com/lyhab ...
- EasyMvc入门教程-基本控件说明(5)小图标
我们网页很多时候需要小图标来进行美化,EasyMvc默认提供了100多种常用小图标,您可以根据实际情况选择使用,请看下面的例子: @Html.Q().Ico().Type(EasyMvcHelper. ...
- Apache OFBIZ高速上手(三)--文件夹&&配置文件介绍
1.OFBiz简单介绍,什么是OFBiz OFBiz is an Apache Software Foundation top level project. A ...
- 【温故知新】——BABYLON.js学习之路·前辈经验(二)
前言:在上一篇随笔BABYLON.js学习之路·前辈经验(一)中回顾了组内同事们长时间在Babylon开发实践中的总结出的学习之路和经验,这一篇主要对开发中常见的一些功能点做一个梳理,这里只作为温故知 ...
- UNP学习笔记(第十一章 名字与地址转换)
域名系统 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射. 主机名既可以是一个简单得名字,如solaris,也可以是一个全限定域名,如solaris.un ...
- iOS开发 - "Cast from pointer to smaller type 'int' loses information” 解决的方法
今天要写一个联系人搜索算法. 百度了下, 在code4App中找到相关代码. 可是自己跑了下, 发现报错. 错误内容例如以下: "Cast from pointer to smaller t ...