实验目的
- 系统调用的进一步理解。
- 进程上下文切换。
- 同步与通信方法。
实验题目
一
通过fork的方式,产生4个进程P1,P2,P3,P4,每个进程打印输出自己的名字,例如P1输出“I am the process P1”。要求P1最先执行,P2、P3互斥执行,P4最后执行。通过多次测试验证实现是否正确。
- 以下为fock.c代码
//fock.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
#include<fcntl.h>
int main()
{
sem_t *P1_signal,*P2_signal,*P3_signal,*P23_signal;
//主函数中的进程是P1
pid_t p2,p3,p4;
//创建信号量
P1_signal=sem_open("P1_signal",O_CREAT,0666,1);
P2_signal=sem_open("P2_signal",O_CREAT,0666,0);
P3_signal=sem_open("P3_signal",O_CREAT,0666,0);
sem_wait(P1_signal);
p2=fork();//创建进程P2
if(p2==0)
{
sem_wait(P1_signal); //等待p1
printf("I am the process P2!\n");
sem_post(P2_signal);
sem_post(P1_signal);
}
if(p2>0)
{
p3=fork();
if(p3==0)
{
sem_wait(P1_signal);
printf("I am the process P3!\n");
sem_post(P3_signal);
sem_post(P1_signal);
}
if(p3>0)
{
printf("I am the process P1!\n");
sem_post(P1_signal);
p4=fork();
if(p4==0)
{
sem_wait(P2_signal);
sem_wait(P3_signal);
sem_wait(P1_signal);
printf("I am the process P4!\n");
sem_post(P2_signal);
sem_post(P3_signal);
sem_post(P1_signal);
}
}
}
sem_close(P1_signal);
sem_close(P23_signal);
sem_close(P2_signal);
sem_close(P3_signal);
sem_unlink("P1_signal");
sem_unlink("P23_signal");
sem_unlink("P2_signal");
sem_unlink("P3_signal");
sleep(0.5);
return 0;
}
- 由以下截图可证明:进程p2和p3互斥。
多次试验满足:P1最先执行,P2、P3互斥执行,P4最后执行。
二
火车票余票数ticketCount 初始值为1000,有一个售票线程,一个退票线程,各循环执行多次。添加同步机制,使得结果始终正确。要求多次测试添加同步机制前后的实验效果。
- 添加同步机制前代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
volatile int ticketCount=1000;
void *SaleThread(void *arg)
{
int num,temp;
num=1000;
for(int i=0;i<num;i++)
{
if(i % 200 ==0)
printf("卖%d张票,剩余%d张票\n",i,ticketCount);
temp=ticketCount;
//放弃CPU,强制切换到另外一个进程
pthread_yield();
temp=temp-1;
ticketCount-=1;
pthread_yield();
ticketCount=temp;
}
return NULL;
}
void *RefundThread(void *arg)
{
int num