1

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

我正在考虑以下两种方法之一:

  • 有一个“主”进程,当轮到它开始接受连接时,它将向每个进程发送一条消息。

    所以顺序将是:

    Master 进程将令牌交给 Worker A。Worker A 接受连接,将令牌返回给 Master 进程。主进程向工人 B 提供令牌等。

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

有更好的想法吗?

  • 当连接进入时,所有进程都会被唤醒。在接受连接之前,他们尝试锁定共享互斥锁。锁定互斥锁的人首先接受连接。
4

3 回答 3

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改用(它们共享相同的内存),但代码可能会增加复杂性并且很难跟踪错误。

由于获取互斥体的成本和所有进程之间的上下文切换,第二种解决方案并不比第一种快。

于 2012-08-10T18:38:01.253 回答
1

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

但是如果您需要一个工作进程池(与“工作线程”相比),那么我建议:

2)主进程绑定、监听……并接受所有传入的连接

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

4)就“同步”而言 - 很容易。worker 只是阻止读取 Unix 套接字,直到有一个新的文件描述符可供它开始使用。

5)您可以为worker设置一个共享内存块,以将“忙/闲”状态传达给master。

这是使用“Unix域套接字”的讨论:

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

于 2012-08-10T18:45:30.290 回答
0

只是我最终使用的更新(3):当连接进入时,所有进程都会被唤醒。在接受连接之前,他们尝试锁定共享互斥锁。锁定互斥锁的人首先接受连接。

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

谢谢大家!

于 2012-08-10T21:08:13.487 回答