2020 操作系统 实验一 并发程序设计

实验一、并发程序设计

一、实验名称

并发程序设计

二、实验目的

掌握在程序中创建新进程的方法, 观察并理解多道程序并发执行的现象。

三、实验原理

fork():建立子进程。子进程得到父进程地址空间的一个复制。

返回值:成功时,该函数被调用一次,但返回两次,fork()对子进程返回0,对父进程返回子进程标识符(非0值)。不成功时对父进程返回-1,没有子进程。

img

四、实验内容

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. 实验实际结果

img

通过在 Linux 中运行程序输出的结果可以发现,实际结果是与预计结果一致的。

尝试运行多次,发现每次的结果都是相同的

img

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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值