Linux系统编程37 进程控制 - 进程分配之交叉分配法

本文介绍了一种改进的质数查找算法,通过父进程fork创建三个子进程,将计算任务交叉分配,提高效率,尤其适用于处理大规模自然数。通过实例展示了如何使用进程交叉分配法实现高效质数检测,并讨论了进程调度对结果的影响。

前面用 N 个进程 计算N个自然数 是否为质数,这种方法是存在缺陷的,如果N数值很大,那么就不是很现实。

所以可以考虑 进程的交叉分配法 实现计算,如下,父进程 fork() 3个子进程,用3个子进程 分别计算N个自然数

进程的交叉分配法 实现 查找质数

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

#define LEFT 200
#define RIGHT 250
#define N 3


int main(void)
{
	int i,j,mark,n;
	pid_t pid;
	
	for(n = 0; n < N; n++)
	{
		pid = fork();
		if(pid < 0)
		{
			fprintf(stderr,"fork() failed!\n");
			exit(1);
		}
		else if(pid == 0)//child
		{
			
			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);//!!!
		}
		
	}

	for(n = 0;n < N; n++)
		wait(NULL);

	exit(0);
}




mhr@ubuntu:~/Desktop/xitongbiancheng/test$ gcc test.c 
mhr@ubuntu:~/Desktop/xitongbiancheng/test$ 
mhr@ubuntu:~/Desktop/xitongbiancheng/test$ ./a.out 
[2]211 is a primer
[2]223 is a primer
[2]229 is a primer
[2]241 is a primer
[0]227 is a primer
[0]233 is a primer
[0]239 is a primer
mhr@ubuntu:~/Desktop/xitongbiancheng/test$ 

结果可知 0号进程和 2号进程 分别拿到了几个质数, 乱序是因为进程调度问题

父进程连续fork() 三个子进程,后等待子进程终止释放资源。3个子进程从各自被fork()出来的位置继续执行,计算后终止进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值