繁体   English   中英

动态流程池

[英]Dynamic pool of processes

我正在Unix系统上用C编写一个客户端-服务器(TCP)程序。 客户端发送一些信息,服务器回答。 每个子进程只有一个连接。 新的连接使用池中的预运行进程,并且池的大小是动态的,因此,如果空闲进程(不为客户端提供服务的进程)的数量减少得太少,则它应该创建新的进程,如果它变得过高,则同样会创建额外的进程进程应终止。

这是我的服务器代码。 每个连接都使用fork()创建一个新的子进程。 每个连接都在新进程中运行。 我如何像上面解释的那样建立一个动态池?

int main(int argc, char * argv[])
{
        int cfd;
        int listener = socket(AF_INET, SOCK_STREAM, 0); //create listener socket 
        if(listener < 0){
            perror("socket error");
            return 1;
        }
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(PORT);
        addr.sin_addr.s_addr = htonl(INADDR_ANY);
        int binding = bind(listener, (struct sockaddr *)&addr, sizeof(addr));
        if(binding < 0){
            perror("binding error");
            return 1;
        }
        listen(listener, 1); //listen for new clients
        signal(SIGCHLD,handler);
        int pid;

        for(;;) // infinity loop on server
        {
            cfd = accept(listener, NULL, NULL); //client socket descriptor
            pid = fork(); //make child proc
            if(pid == 0) //in child proc...
            {
                close(listener); //close listener socket descriptor
                ... //some server actions that I do.(receive or send) 
                close(cfd); // close client fd
                return 0;
            }
            close(cfd);

}

如果您在同一个侦听套接字上阻止了多个进程accept ,则进入的新连接将传递给其中一个。 (取决于,可能会唤醒几个,但实际上只有一个会连接)。 因此,您需要在listen之后但accept之前分叉几个孩子。 处理完请求后,孩子返回accept而不是exit 处理(1)和(2)。

(3)比较难。 您需要某种形式的IPC。 通常,您将拥有一个父进程,该进程仅负责管理正确数量的子进程。 您的子进程需要使用IPC来告诉父进程他们有多忙。 然后,父母可以分叉更多的孩子(进入上面的accept循环),也可以向孩子发送信号以告诉他们完成并退出。 它还应处理对孩子的wait ,处理意外死亡等。

您要使用的IPC可能是共享内存。 您的两个选项是SysV( shmget) and POSIX ( shm_open`)共享内存。 如果可能,您可能需要后者。 您将不得不处理同步访问(POSIX和SysV提供信号量来帮助解决此问题,再次偏爱POSIX)或仅使用原子访问。

(您实际上可能不希望有一个超过X个免费子级的进程立即退出,这会导致反复收获和生成它们,这很昂贵。相反,您可能想要某种程度的度量,以了解它们在整个过程中的利用率如何。最后一秒...因此,您的数据比正在使用/免费的位图更复杂。)

有许多这样的守护程序,因此您可以轻松地找到代码示例。 当然,如果您查看Apache,您可能会发现它更加复杂,从而获得良好的性能并可以随处移植。

暂无
暂无

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

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