实验一、并发程序设计
一、实验名称
并发程序设计
二、实验目的
掌握在程序中创建新进程的方法, 观察并理解多道程序并发执行的现象。
三、实验原理
fork():建立子进程。子进程得到父进程地址空间的一个复制。
返回值:成功时,该函数被调用一次,但返回两次,fork()对子进程返回0,对父进程返回子进程标识符(非0值)。不成功时对父进程返回-1,没有子进程。
四、实验内容
1.关键代码分析
void main(void)
{
int x = 5;
if (fork())
{
x += 30;
printf("% d\n", x);
}
else
printf("% d\n", x);
printf(("%d\n",x);
}
fork():父进程返回子进程的 pid,子进程返回 0,出错返回 -1。
第一次执行 if(fork()) 语句时,没有子进程,此时父进程会创建一个子进程。if 语句成立,输出 35,35。子进程复制父进程的所有代码。子进程的 fork 语句返回 0,进入 else 分支,输出 5,5。
所以预计程序输出的结果:35\n35\n5\n5\n
2. 实验实际结果
通过在 Linux 中运行程序输出的结果可以发现,实际结果是与预计结果一致的。
尝试运行多次,发现每次的结果都是相同的
3.实验结果分析
1.不会交替输出 35 和 5
因为在并发执行每个进程前会为当前进程分配时间片,当轮到改时间片时进程才会执行。当时间片用完或者在一个时间片内该进程执行完,就会轮到下一个时间片的进程执行。而本次实验的代码非常短,运行速度非常快,在一个时间片内肯定能运行完成。所以都是父进程运行完再到子进程运行。
2.不会创建子进程失败
因为本次实验代码非常简单,不可能出现资源不够分配的情况,所以创建进程基本不会失败。
五、执行程序源代码
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
void main(void)
{
int x = 5;
if (fork())
{
x += 30;
printf("%d\n", x);
}
else
printf("%d\n", x);
printf("%d\n", x);
}