繁体   English   中英

分支与多线程

[英]branching vs multi-threading

代码中有一条快速路径,如下所示:

while(1){

   select(fd_set...);

   if (fd_isUserspace) {
       process_user_packet(fd);    // RPC involved
   } else { // kernel 
       process_kernel_packet(fd);  // RPC invovled
   }
} // while(1)

基本上从一组fds中读取一个活动的fd并对其进行处理。 当前,它是在if-else分支中完成的,仅在处理完成时返回。 我认为我可以通过在if-else中使用线程池(poolSize> = 2)来改善此情况,以便处理func立即返回,并可以为以后的fds重新开始while循环。

大概process _ * _ packet要做一些RPC工作以进行处理。

我知道将处理作业分派到一个线程可能会有一些开销(thread_cond_signal / locking等),但是感觉由于process _ * _ packet可能花费较大的时间(由于RPC),也许值得。

想得到一些想法(也许是更好的主意),我认为这可能是一个关于如何设计才能获得更好性能的非常普遍的问题。

-谢谢

我最近用Java写了一个线程池(这是我的并行计算类所必需的,我知道它是内置的),如果编写得当,它实际上非常快。

如果您使用多个线程,那么这里的一大优势是:您不再有阻塞请求。 因为您可以同时处理多个请求,所以您将获得更好的响应时间。

如果一个人花费相当长的时间来处理,发送或接收,则您不需要该数据包就一定会阻塞您的电子管。

使用一些线程池,您只需执行以下操作:

while(1){

   select(fd_set...);

   if (fd_isUserspace) {
       submit_job(process_user_packet, fd);
   } else { // kernel 
       submit_job(process_kernel_packet, fd);
   }
} // while(1)

我们假设Submit_job具有签名

 void submit_job(void (*func)(void *), void *args);

这样,线程池中的每个线程都可以简单地获取需要处理的函数和参数,然后调用func(args);。

我完全不用担心派遣工作的成本。 如果处理花费的时间超过1毫秒(在真正好的实现中可能甚至更少),那么您将大放异彩。

只是一个想法,但是如果您丢掉select并且每个文件描述符仅使用一个线程,该怎么办? 唯一的主要缺点是,如果一次出现太多请求,则上下文切换开销会增加,但是总之,它比等待时间更好。 优点是在非重载情况下上下文切换较少:内核在解除阻塞后立即直接唤醒线程以等待文件描述符,而不是先唤醒选择线程,后者必须先唤醒线程才能处理请求。 当然,简单性本身就是一种优势……

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM