我正在 linux 内核中编写客户端/服务器(是的。在内核内部。它的设计决定已经完成并最终确定。它不会改变)
服务器从原始套接字读取传入的数据包。这些数据包(原始套接字正在侦听)的传输协议是自定义的,类似于 UDP。简而言之,我不必监听传入的连接,然后派生一个线程来处理该连接。
我只需要处理该原始套接字上的任何 IP 数据报。我将继续在原始套接字上无限循环地读取数据包。在用户级等效程序中,我会创建一个单独的线程并继续侦听传入的数据包。
现在对于内核级服务器,我怀疑是否应该在单独的线程中运行它,因为:
我认为 read() 是一个 I/O 操作。所以在 read() 的某个地方,内核必须调用 schedule() 函数来放弃对处理器的控制。因此,在原始套接字上调用 read() 后,当前内核活动上下文将被搁置(可能放入睡眠队列?),直到数据包可用。当数据包到达时,内核中断上下文将发出信号,表明在队列中休眠的读取上下文再次准备好运行。我在这里故意使用“上下文”而不是“线程”。因此我不应该需要一个单独的内核线程。
另一方面,如果 read() 没有放弃控制,那么整个内核将被阻塞。
谁能提供有关如何设计服务器的提示?第 1 点提出的论点的谬误是什么?