zoukankan      html  css  js  c++  java
  • [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事实上是能够扩展到多线程的,此部分功能尚在规划中。只是线程池相关的功能会非常快提供。

  • 相关阅读:
    洛谷P1661 扩散
    Vijos1056 图形面积
    Python爬取猪肉价格网并获取Json数据
    C#中巧用Lambda表达式实现对象list进行截取
    Winform中在ZedGraph中最多可以添加多少条曲线
    Nginx配置实例-动静分离实例:搭建静态资源服务器
    解决pip使用异常No module named 'pip'
    C#在循环中使用Random时生成的随机数相同的解决办法
    Winform中自定义ZedGraph右键复制成功后的提示
    C#中巧用Lambda进行数据的筛选查询等处理
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6783386.html
Copyright © 2011-2022 走看看