linux高编进程------进程分配

筛质数进阶

之前筛质数程序创建了201个子进程,由于进程号有限,所以可以采用以下三种方法

1、分块法:将201个子进程分成N等份。eg:N=3,那么201个子进程平均分成3份

2.交叉分配法:将201个子进程依次分配给N个进程

 

3.进程池:用一个进程取质数,并将其丢给下边的线程或者进程处理质数

=====================================================================

交叉分配法:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

#define LEFT    30000000
#define RIGHT   30000200
#define N       3

int main(void)
{
    int i , j , mark , n;
    pid_t pid ;

    for(n = 0 ; n < N ; n++)
    {
        //1.父进程创建3个子进程
        pid = fork();
        //2.失败判断(并不完善)
        if(pid < 0)
        {
            perror("fork()");//需要将之前fork的释放
            exit(1);
        }
        //3.子进程
        if(pid == 0)
        {
            for(i = LEFT+n ; i <= RIGHT ; i+=N)
            {
                mark = 1 ;
                for(j = 2 ;j < i/2 ; j++)
                {
                    if(i % j == 0)
                    {
                        mark = 0 ;
                        break;
                    }
                }
                if(mark)
                    printf("[%d]%d is a primer\n",n,i);
            }
            exit(0);
        }
    }
    //4.收尸
    for(n = 0 ; n < N ; n++)
        wait(NULL);
    exit(0);
}

结果:

[1]30000001 is a primer
[2]30000023 is a primer
[1]30000037 is a primer
[2]30000041 is a primer
[2]30000059 is a primer
[1]30000049 is a primer
[1]30000079 is a primer
[2]30000071 is a primer
[1]30000109 is a primer
[2]30000083 is a primer
[1]30000133 is a primer
[2]30000137 is a primer
[1]30000163 is a primer
[2]30000149 is a primer
[1]30000169 is a primer
[2]30000167 is a primer
[1]30000193 is a primer
[1]30000199 is a primer

============================================================================

 

posted @ 2016-03-17 10:43  muzihuan  阅读(778)  评论(0编辑  收藏  举报