在我们做网络编程的时候,无论你使用多进程、多线程还是select/poll(epoll),只有一个进程/线程来处理接受同一个端口的连接。如果你想利用多核,你需要创建工作进程/线程。但是边界处理网络连接呢?在处理网络连接时,有没有办法利用多核?
我找到了一些材料。这似乎很难完成。三向握手将由内核隐式完成。并且在smp结构中操作系统会被划分为几个临界区。同一个临界区不能同时在多个核心上运行。
在我们做网络编程的时候,无论你使用多进程、多线程还是select/poll(epoll),只有一个进程/线程来处理接受同一个端口的连接。如果你想利用多核,你需要创建工作进程/线程。但是边界处理网络连接呢?在处理网络连接时,有没有办法利用多核?
我找到了一些材料。这似乎很难完成。三向握手将由内核隐式完成。并且在smp结构中操作系统会被划分为几个临界区。同一个临界区不能同时在多个核心上运行。
所有在 PC 硬件上运行的现代操作系统都已经针对多核 CPU 进行了高度优化的网络堆栈。例如,将数据推入和传出网卡的数据包处理代码将独立于 TCP/IP 堆栈代码,因此硬件中断可以在不干扰 TCP 代码的情况下运行完成。
然而,对于大多数现实世界的应用程序来说,大部分工作都在数据包之间。进来的数据要经过处理,出去的数据要生成。这取决于应用程序代码,并且该代码可以通过使用多个线程或多个进程来利用多个内核。您如何做到最好取决于应用程序和操作系统。例如,Windows 具有I/O 完成端口,它将作业发现与多线程作业调度相结合。Linux 有epoll。
只有网络流量,这几乎是由网卡(即不是计算机的 CPU)完成的。与网卡的通信通常是单线程的(由操作系统排队,因此您可以在多个线程上发送/接收),因为 NIC 只能一次一个地从堆栈中推送/弹出内容。
响应接收到的数据取决于您的流程。这可以在一个线程上完成,您可以在该主线程上接收到数据时生成其他线程并以这种方式划分工作。如果您有一种支持异步通信的语言,我会尝试让它完成大部分工作以使用多个线程。