[nio]dawn的基本概念

1.dawn是单线程的:

为什么单线程?现实中很多程序都是单线程的,比如redis,memcache,nodejs,mmorpg服务器。。。。。。采用单线程有两大好处,首先,不需要使用锁,逻辑更容易理解,不易出错,其次,减少了切换线程时的调度成本。


2.什么是Task

dawn中使用了Task,这其实是kilim中的协程,协程最基本的功能是挂起和恢复,这点和线程是一致的。所有的Task都是运行在同一个线程中的,所以,从内存的可见性和一致性的角度来讲,Task之间是不需要同步的。这里有个例外,那就是IO,如果多个Task读写同一个IO设备(比如socket),那潜在是不安全的,因为数据比较大时,可能需要多次read write,此时,多个Task的数据会混在一起发送,导致接收方收到混乱的数据。所以,IO操作必须是原子的,dawn已经考虑到这一点,并在底层封装IO操作,保证了IO操作的原子性。


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

再比如服务器端网络连接的处理,接收到一个连接后,就可以启动一个独立的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其实是可以扩展到多线程的,此部分功能尚在规划中,不过线程池相关的功能会很快提供。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值