操作系统第三次实验 16281134

该博客详细记录了操作系统实验的过程,包括通过fork创建进程、实现进程互斥执行、同步机制在火车票售票和退票系统中的应用、生产者消费者问题、进程通信(共享内存、管道、消息队列)以及Pintos操作系统的进程上下文切换。实验旨在深入理解系统调用、进程上下文切换和同步机制。
摘要由CSDN通过智能技术生成

实验目的

  1. 系统调用的进一步理解。
  2. 进程上下文切换。
  3. 同步与通信方法。

实验题目

通过fork的方式,产生4个进程P1,P2,P3,P4,每个进程打印输出自己的名字,例如P1输出“I am the process P1”。要求P1最先执行,P2、P3互斥执行,P4最后执行。通过多次测试验证实现是否正确。

  1. 以下为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;


}
  1. 由以下截图可证明:进程p2和p3互斥。
    多次试验满足:P1最先执行,P2、P3互斥执行,P4最后执行。
    在这里插入图片描述

火车票余票数ticketCount 初始值为1000,有一个售票线程,一个退票线程,各循环执行多次。添加同步机制,使得结果始终正确。要求多次测试添加同步机制前后的实验效果。

  1. 添加同步机制前代码如下:
#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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值