没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
理论课实验
数据科学与计算机学院
软件工程3班
米家龙
18342075
目录
理论课实验
目录
实验题目
实验环境
2. WSL
1. 进程的创建实验
实验目的
实验内容
1. 编译运行程序,解释现象(对应代码1.1.cpp)
2. 通过实验完成习题3.4 (对应代码1.2.c)
3. 编程练习(对应代码1.3.cpp)
2. 进程间的通信
实验目的
实验内容
3. 命令解释器(对应代码3.1.c)
实验内容
4. 线程实验(对应代码4.1.c)
5. 同步互斥问题
生产者消费者问题(对应代码5.1.1.c)
1. 互斥锁/互斥量(mutex)
2. 信号量
具体实现
读者写者问题
1. 读者优先(对应代码5.2.1.c)
2. 写者优先(对应代码5.2.3.c)
实验题目
1. 进程的创建实验
2. 进程间通信
3. 命令解释器
4. 线程实验——用线程生成 Fibonacci 数列
5. 同步互斥问题
生产者消费者问题
读者写者问题
实验环境
使用老师提供的 mooc-os-2015.vdi ,在虚拟机中创建 64 位的 Ubuntu 虚拟机并加载该 vdi ,获得了版
本为:
的虚拟机操作系统
并且使用 vscode 配合 Remote SSH 插件,实现通过远程终端在 windows 环境的对文件的编辑和运行
2. WSL
WSL 配置如下:
其中 gcc 和 g++ 版本如下图
1. 进程的创建实验
实验目的
1. 加深对进程概念的理解,明确进程和程序的区别。进一步认识并发执行的实质。
2. 认识进程生成的过程,学会使用fork生成子进程,并知道如何使子进程完成与父进程不同的工
作。
实验内容
1. 编译运行程序,解释现象(对应代码1.1.cpp)
代码如下
Linux moocos-VirtualBox 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC
2014 x86_64 x86_64 x86_64 GNU/Linux
1
Linux LAPTOP-QTCGESHO 4.4.0-19041-Microsoft #1-Microsoft Fri Dec 06 14:06:00 PST
2019 x86_64 x86_64 x86_64 GNU/Linux
1
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
1
2
3
4
5
6
分别在 WSL 和虚拟机中编译运行,运行结果如下
根据 fork() 函数的定义,了解到当执行fork()函数后,会生成一个子进程,子进程的执行从 fork()
的返回值开始且代码继续往下执行。 fork() 执行一次后会有两次返回值:第一次为原来的进程,即
父进程会有一次返回值,表示新生成的子进程的进程ID;第二次为子进程的起始执行,返回值为0。
查看 WSL 输出顺序,推导出代码执行过程如下:
1.
主
进
程
创建
子
进
程
1
2.
主
进
程
和
子
进
程
1
输出 **1**\n
3.
主
进
程
创建
子
进
程
2
,
子
进
程
1
创建
子
进
程
12
4.
主
进
程
和
子
进
程
1
和
子
进
程
2
和
子
进
程
12
输出 **2**\n
5. 各个进程判断自己的 pid1 是否为0,其中
主
进
程
和
子
进
程
2
的 pid1 存在且相同
6.
主
进
程
和
子
进
程
2
输出 **4**\n ,
子
进
程
1
和
子
进
程
12
创建
子
进
程
13
和
子
进
程
123
7.
子
进
程
1
和
子
进
程
12
和
子
进
程
13
和
子
进
程
123
输出 **3**\n
发现 WSL 和虚拟机中编译运行的结果不同,在虚拟机上多次运行,输出结果也不完全相同,是因为线程
的执行的顺序不同导致的,但对于单个线程来说,执行的步骤没有区别
int pid1 = fork();
printf("**1**\n");
int pid2 = fork();
printf("**2**\n");
if (pid1 == 0)
{
int pid3 = fork();
printf("**3**\n");
}
else
printf("**4**\n");
return 0;
}
7
8
9
10
11
12
13
14
15
16
17
18
19
代码 主进程 子进程1 子进程2 子进程12 子进程13 子进程123
int pid1 = fork()
创建
子
进
程
1,
pid1 != 0
创建成
功, pid1
= 0
\ \ \ \
printf("**1**\n")
输出
**1**\n
输出
**1**\n
\ \ \ \
int pid2 = fork()
创建
子
进
程
2
,
pid2 != 0
创建
子
进
程
12
,
pid2 != 0
创建成功
pid1 !=
0, pid2 =
0
创建成
功, pid1
= 0, pid2
= 0
\ \
printf("**2**\n")
输出
**2**\n
输出
**2**\n
输出
**2**\n
输出
**2**\n
\ \
if (pid1 == 0)
判断 -> 不
进入
判断 -> 进
入
判断 -> 不
进入
判断 -> 进
入
\ \
int pid3 = fork() \
创建
子
进
程
13
,
pid3 != 0
\
创建
子
进
程
123
,
pid3 != 0
创建成功,
pid1 = 0, pid2
!= 0, pid3 = 0
创建成
功,pid1 =
pid2 = pid3
= 0
printf("**3**\n") \
输出
**3**\n
\
输出
**3**\n
输出
**3**\n
输出
**3**\n
printf("**4**\n")
输出
**4**\n
\
输出
**4**\n
\ \
2. 通过实验完成习题3.4 (对应代码1.2.c)
习题3.4的代码如下
尝试在 WSL 中运行,发现会报错,报错原因是缺少 wait() 和 exit() 函数,于是在虚拟机中运行,
虽然会 Warning 提示 exit() 函数的问题,但是可以运行,运行结果如下
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int value = 5;
int main()
{
pid_t pid;
pid = fork();
if (pid == 0)
value += 15;
else if (pid > 0)
{
wait(NULL);
printf("PAREMT: value = %d", value);
exit(0);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
剩余25页未读,继续阅读
湯姆漢克
- 粉丝: 21
- 资源: 304
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0