线程化,那么它如何实现并发I / O?

试图掌握Redis的一些基础知识,我遇到了一篇有趣的博客文章。

作者指出:

Redis是单线程的epoll / kqueue,并且在I / O并发性方面无限期地扩展。

我肯定误解了整个线程化的事情,因为我觉得这个说法令人费解。 如果一个程序是单线程的,它是如何同时执行的? 无论如何,如果服务器是单线程的,Redis操作为什么如此伟大?

任何人都可以谈谈这个问题吗?


那么这取决于你如何定义并发。

在服务器端软件中,并发和并行通常被认为是不同的概念。 在服务器中,支持并发I / O意味着服务器能够通过仅用一个计算单元执行对应于这些客户端的多个流来服务多个客户端。 在这种情况下,并行性意味着服务器能够同时执行多个任务(具有多个计算单元),这是不同的。

例如,酒保可以照顾几个顾客,而他一次只能准备一种饮料。 所以他可以提供没有并行性的并发。

这个问题在这里进行了讨论:并发vs并行 - 有什么区别?

另请参阅Rob Pike的演示文稿。

单线程程序可以通过使用I / O(de)多路复用机制和事件循环(这就是Redis所做的)来明确提供I / O级别的并发性。

并行性具有成本:在现代硬件上可以找到多个插槽/多个内核,线程之间的同步非常昂贵。 另一方面,像Redis这样的高效存储引擎的瓶颈通常是网络,远远早于CPU。 独立的事件循环(不需要同步)因此被视为构建高效,可扩展的服务器的良好设计。

Redis操作是原子的事实仅仅是单线程事件循环的结果。 有趣的一点是原子性是在没有额外成本的情况下提供的(它不需要同步)。 它可以被用户利用来实现乐观锁定和其他模式,而无需支付同步开销。


好的,Redis在用户级OTOH中是单线程的,所有异步I / O都由内核线程池和/或分级驱动程序支持。

对一些人来说,“ 并发 ”包括将网络事件分发给套接字状态机。 它是单线程的,运行在一个核心上(用户级别),所以我不会将其称为并发。 其他不同..

I / O并发性无限期地扩展 ”对于事实来说是经济的。 如果他们说'可以比单线程每客户更好地扩展,提供客户不需要太多'的信息,他们可能会得到更多的信任,尽管他们可能会觉得有必要增加'被其他异步解决方案在用户级别使用所有核心“。

链接地址: http://www.djcxy.com/p/13915.html

上一篇: threaded, then how does it do concurrent I/O?

下一篇: How the single threaded non blocking IO model works in Node.js