一、实验准备
1.什么是进程
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础
简单来说,进程是正在运行的程序的实例。 一个程序在运行时,被分为一个或多个进程,这些进程共同作用,完成这个程序。
2.并发
并发是指,在某个时间段内,两个或两个以上的事件轮流交替使用某一资源,这个时间段我们称之为“时间片”。
3.进程并发
进程的并发是指一组进程的执行在时间上是重叠的,好比是一个进程执行的第一条指令是在另一个进程执行的最后一条指令完成之前开始的
并发举例:
有两个同时运行的进程 A 和 B,进程 A 执行操作a1、a2、a3,进程 B 执行操作b1、b2、b3
在某一时间片内,某单处理器上,进程 A 和 B 交替执行,它们交替执行的操作次序可能为:a1、b1、b2、a2、a3、b3
4.同步
同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系,简单来说,同步就是协同步调,按预定的先后次序进行运行,比如:你说完,我再说
5.进程同步
进程同步,可以理解为进程 A 和 B一块配合,A执行到一定程度时要依靠 B 的某个结果,于是暂停等待,示意 B 执行,B 执行完成后,将结果传递给 A,A 再继续操作
二、实验过程
1.在同一程序内创建两个进程,每个进程固定循环次数输出特定语句。
如:创建父子两个进程,父进程输出三次 I am Father,子进程输出三次 I am child
#include<sys/types.h>
#include<unistd.h>
#include<stdio.h>
int main()
{
pid_t child_pid;
child_pid = fork();
int i = 0;
if(child_pid==0){
for(;i<3;i++){
printf("I am child\n");
sleep(1);
}
}
else{
for(;i<3;i++){
printf("I am Fathehr\n");
printf("My child's pid is %d\n", child_pid);
sleep(1);
}
}
return 0;
}
根据进程并发,我们可以得到,输出的结果是 I am Father 和 I am child 交替出现,共六条语句
2.编写两个程序,在程序2中加入死循环伪造程序2发生死锁,程序1要等待程序2的结束后才能继续运行
程序1:命名为 wait.c
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
int main(){
int pid;
printf("father progress\n");
if(0==fork())
{
printf("Son progress\n");
for(;;);
}
else{
pid = wait(NULL);
printf("wait() return child progress PID is %d\n", pid);
}
}
程序2:命名为 wait_stop.c
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
int pid;
int status = 3;
printf("father progress, and father progress pid is %d\n", getpid());
if(0==fork())
{
printf("child progress, and child progress pid is %d\n", getpid());
exit(status);
}
else{
if (0==fork()){
printf("second child progress, and pid is %d\n", getpid());
for(;;);
}
pid = wait(&status);
printf("wait() return child progress PID is %d\n", pid);
}
}
同时运行两个程序,我们会发现,在终端上程序1发生等待
此时,我们开启另一个终端,查看系统运行的所有进程(查看进程的指令是 ps aux),将程序2的进程结束,这样程序1就可以继续运行