河南大学计算机操作系统实验报告三

应好友邀请,现加更操作系统实验报告,喜欢的朋友点赞收藏加关注!有支持才有下一期!

姓名:

学号:

专业年级: 

班级: 

分组:

实验室:

指导教师:

实验日期:

实验的准备阶段

(指导教师填写)

课程名称

计算机操作系统

实验名称

进程同步

实验目的

  1. 理解信号量的概念和信号量的应用。
  2. 掌握semget()、semctl()函数、semop()函数的使用。
  3. 使用信号量解决生产者-消费者问题中进程同步问题。

实验内容

编写生产者和消费者程序,要求:

  1. 生产者和消费者两个程序,共用一个仓库,仓库是一个普通文件(/tmp/store),容量为100个字节;
  2. 生产者生产资源放进仓库,消费者则从仓库中消费资源;资源为数字字符“1、2、3、4、5、6、7、8、9、0”,一个资源就是一个数字,10个数字循环生成;
  3. 生产者创建仓库(/tmp/store),间隔1s生产一个资源,当仓库满了(资源数量达到100个)的时候,生产者不能继续生产;消费者间隔2s消费一个资源,当仓库为空的时候,消费者不能继续消费;
  4. 消费者每次消费1个资源,首先打印出消耗之前仓库中的资源数量和空位的数量,然后打印出消耗之后仓库中的资源数量和空位的数量,并打印出所消耗的资源内容;
  5. 生产者每次生产1个资源,先打印出生产之前仓库中的资源数量和空位的数量,然后打印出生产之后仓库中的资源数量和空位的数量,并打印出所生产的资源内容。
  6. 消费者消费资源后需要把已经消费的资源从仓库里删除;
  7. 用信号量实现进程的同步和互斥。

【提示】题目有多种解决方案,可以用1个或多个信号量,或者使用其他合适的方法。

实验类型

(打R)

☑验证性    □演示性     ☑设计性      □综合性

实验的重点、难点

1、semget()、semctl()函数、semctl()函数的使用

2、使用信号量解决生产者-消费者中存在的同步关系

实验环境

VMWare、RedHat Linux

实验的实施阶段

实验步骤及实验结果

头文件

#ifndef PRODUCER_CONSUMER_H

#define PRODUCER_CONSUMER_H

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <unistd.h>

#include <sys/stat.h>

#include <semaphore.h>

#define STORE_PATH "/tmp/store"

#define STORE_SIZE 100

#define SEMAPHORE_NAME "/semaphore"

typedef struct {

    char resources[STORE_SIZE];

    int count;

} Store;

void create_store();

void delete_store();

void produce();

void consume();

void print_store();

#endif //PRODUCER_CONSUMER_H

源文件:

#include "producer_consumer.h"

sem_t *semaphore;

void create_store() {

    FILE *file = fopen(STORE_PATH, "w+");

    Store store = {{0}, 0};

    fwrite(&store, sizeof(Store), 1, file);

    fclose(file);

}

void delete_store() {

    remove(STORE_PATH);

}

void produce() {

    FILE *file = fopen(STORE_PATH, "r+");

    Store store;

    fread(&store, sizeof(Store), 1, file);

    while (1) {

        sem_wait(semaphore);

        if (store.count < STORE_SIZE) {

            store.resources[store.count++] = '1' + (store.count % 10);

            fseek(file, 0, SEEK_SET);

            fwrite(&store, sizeof(Store), 1, file);

            printf("Produced resource, count: %d\n", store.count);

        }

        sem_post(semaphore);

        sleep(1);

    }

    fclose(file);

}

void consume() {

    FILE *file = fopen(STORE_PATH, "r+");

    Store store;

    fread(&store, sizeof(Store), 1, file);

    while (1) {

        sem_wait(semaphore);

        if (store.count > 0) {

            printf("Consumed resource %c, count: %d\n", store.resources[--store.count], store.count);

            fseek(file, 0, SEEK_SET);

            fwrite(&store, sizeof(Store), 1, file);

        }

        sem_post(semaphore);

        sleep(2);

    }

    fclose(file);

}

void print_store() {

    FILE *file = fopen(STORE_PATH, "r");

    Store store;

    fread(&store, sizeof(Store), 1, file);

    printf("Store count: %d\n", store.count);

    fclose(file);

}

int main() {

    semaphore = sem_open(SEMAPHORE_NAME, O_CREAT, 0644, 1);

    create_store();

    pid_t pid = fork();

    if (pid == 0) {

        consume();

    } else {

        produce();

    }

    delete_store();

    sem_close(semaphore);

    sem_unlink(SEMAPHORE_NAME);

    return 0;

}

效果如图

实验结果的处理阶段

实验结果的分析与总结

通过这个项目,我学会了以下知识点:

  1. 多线程编程:这个项目涉及到使用多个线程来实现生产者和消费者模型。我学会了如何创建和管理线程,以及如何在多个线程之间进行通信和同步。
  2. 互斥锁和条件变量:为了确保线程之间的互斥和同步,我使用了互斥锁和条件变量。互斥锁用于保护共享资源,条件变量用于线程之间的等待和通知机制。我学会了如何使用互斥锁和条件变量来避免竞态条件和死锁。
  3. 缓冲区管理:在这个项目中,我需要实现一个缓冲区来存储生产者生产的产品,并由消费者消费。我学会了如何设计和管理缓冲区,以确保生产者和消费者之间的正确通信和数据传递。
  4. POSIX信号量:为了实现线程之间的同步和互斥,我使用了POSIX信号量。我学会了如何使用信号量来控制线程的访问和操作,以避免竞态条件和其他线程相关的问题。
  5. 项目组织和编译:这个项目让我学会了如何组织和编译一个多文件的项目。我学会了如何将代码分割成多个文件,并使用头文件来声明函数和结构体。我也学会了如何使用编译器来编译和链接多个源文件,以生成可执行文件。

总的来说,通过这个项目,我获得了多线程编程、互斥锁和条件变量、缓冲区管理、信号量和项目组织等方面的知识和经验。这些知识将对我在开发并发和多线程应用程序时非常有用。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值