第3章 进程
3.5 下面设计的优点和缺点分别是什么? 分别从操作系统层面和用户层面来阐述。
• 同步和异步通信
• 自动和显式缓冲
• 复制传送和引用传送
• 固定大小和可变大小消息
答:
同步和异步通信: 同步,对于发送进程阻塞,直到消息被接收进程或邮箱所接收;对于接收进程阻塞,直到有消息可用。而异步通信不存在阻塞问题。使用同步通信设计者则无需关心生产者—消费者问题。相比较使用异步通信,可以提高通信系统的效率。
自动或显式缓冲: 自动缓冲提供了一个无限长度的队列,从而保证了发送者在发送消息时不会遇到阻塞。如何提供自动缓存机制因系统而异。当保证有足够大内存的时候,也会有许多内存被浪费。而在缓存大小明确的情况下,发送者仅当临时队列溢出的时候才会被阻塞。此策略下内存很少会被浪费。
复制发送和引用发送: 复制发送不允许接收者改变参数的状态,引用发送是允许的。引用发送允许的优点之一是它允许程序员写一个分布式版本的一个集中的应用程序。如,Java’s RMI公司提供两种发送,但引用传递一个参数需要声明这个参数是一个远程对象。
固定大小和可变大小消息: 如果只能发送定长消息,那么系统级的实现十分简单,但是却使编程任务变得更加困难;相反的是,可变大小消息要求更复杂的系统级实现,但是编程任务变得较为简单。
3.6 Fibonacci 序列是一组数: 0 , 1, 1, 2, 3, 5, 8,…
使用系统调用 fork() 编写一个 C 程序,使其在子程序中生成 Fibonacci 序列,序列的号码将在命令行中提供。例如,如果提供的是 5,Fibonacci 序列中的前 5 个数将由子进程输出。退出程序前,父进程调用 wait() 调用来等待子进程结束。执行必要的错误检查以保证不会接受命令行传递来的负数号码。
答:
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc,char* argv[])
{
pid_t pid;
int input;
scanf("%d", &input);
int f0,f1,f2;
f0=0;
f1=1;
pid=fork();
if(pid<0){
//error fork
printf("error fork!!!\n");
exit(-1);
}
else if(pid == 0)
{
//children process
printf("Children process begin!\n");
printf("the number We input is %d\n",input);
printf("0 1 ");
for(int i=2;i<input;i++){
f2=f0+f1;
f0=f1;
f1=f2;
printf("%d ",f2);
}
printf("\n");
printf("Children process end!\n");
}
else{
//parent process
wait(NULL);
printf("Parent process end\n");
}
return 0;
}
Ubuntu vscode运行结果:input = 5