2012-08-10 70 views
1

在多个进程之间协调侦听套接字接受的最佳方式是什么?在多个进程之间协调对共享侦听套接字的接受

我想到的两种方法之一:

  • 有了“主人”的过程,将消息发送给每一个过程,当它是轮到它开始接受连接。

    这样的顺序将是:

    主过程使令牌工人A.工人A接受连接,使令牌回到主流程。主进程向工人B提供令牌。

  • 每个进程都有一个接受线程,它将围绕共享互斥体旋转。锁定互斥锁,接受连接,释放锁。

有没有更好的办法?

  • 当连接进来时,所有进程都会被唤醒。在接受连接之前,他们尝试锁定共享互斥体。首先锁定互斥锁的一个可以接受连接。
+1

如果我是你,我会用主人的方法。 – 2012-08-10 17:47:11

+0

感谢您的建议。我目前已经实现了这个(主进程发送消息作为令牌),但我认为它太慢了。对于每个接受,我进行以下“额外”系统调用。工人调用“send()”发回令牌。主睡眠是“select()”调用“recv()”来获取令牌。然后调用“send()”将令牌发送给工作者B,并返回到“select()”的睡眠状态。工人B调用“recv()”来接受令牌。所以我觉得它可能太慢了...... – 2012-08-10 18:15:59

回答

1

我还认为高手的解决方案是不错的选择:

/* Process struct */ 
typedef struct _process_t { 
    unsigned long process_id; 
    struct _process_t *next; /* next process */ 
    struct _process_t *prev; /* previous process */ 
    struct _process_master *master_process; /* Master process */ 
    int (*accepting_socket) (struct _process_t *); /* process accepet function */ 
    char *received_data_buffer;  /* the data received over the socket */ 
} process_t; 

/* List of process */ 
typedef struct _process_list { 
    process_t *head; 
    process_t *tail; 
    int count; 
} process_list; 

/* The master process */ 
typedef struct _process_master { 
    process_list socket_listners; /* All the process listening */ 
    process_list ready_listners; /* Process ready to listen and receive*/ 

    ..... /* Complete this struct */ 
} process_master; 

如果发现与过程的解决方案是缓慢的,你可以使用threads代替(它们共享相同的内存),但代码可能会增加复杂性并且跟踪错误可能很难。

第二个解决方案不会比第一个解决方案快,因为获取互斥锁的成本以及所有进程之间的上下文切换成本。

+0

谢谢!关于互斥量获取和上下文切换;以及即使在主 - 工作场景中情境切换也将发生。我只是想,或许获得互斥体的速度可能比主人工游戏中需要的所有系统调用要快。感谢您的建议! – 2012-08-10 19:00:31

1

1)我不确定为什么你不想要多个“线程”而不是“进程”。

但如果您需要的工作进程(相对于“工作线程”)池,那么我会建议:

2)主进程结合,听...并接受所有传入连接

3)使用“Unix套接字”将接受的连接从主进程传递给工作进程。

4)至于“同步” - 容易。工作人员只是阻止读取Unix套接字,直到有一个新的文件描述符开始使用。

5)您可以为工作人员设置一个共享内存块,以向主设备传送“忙/闲”状态。

下面是一个使用 “Unix域套接字” 的讨论:

史蒂文斯 “网络编程” 也是一个很好的资源:

+0

谢谢!我宁愿为工作人员使用进程而不是线程。将套接字从一个进程发送到另一个进程听起来很有趣。即让一个进程完成所有接受并将其发送给工作进程以供进一步处理。会放弃它!谢谢。 – 2012-08-10 19:03:22

0

只是,我终于用(3)去更新:当一个连接进来的所有进程被叫醒。在接受连接之前,他们尝试锁定共享互斥体。首先锁定互斥锁的一个可以接受连接。

它比来回传递令牌要快得多。

谢谢大家!

相关问题