赞
踩
应好友邀请,现加更操作系统实验报告,喜欢的朋友点赞收藏加关注!有支持才有下一期!
姓名: | 学号: | 专业年级: | 班级: | |
分组: | 实验室: | 指导教师: | 实验日期: | |
实验的准备阶段 (指导教师填写) | 课程名称 | 计算机操作系统 | ||
实验名称 | 进程同步 | |||
实验目的 |
| |||
实验内容 | 编写生产者和消费者程序,要求:
【提示】题目有多种解决方案,可以用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; } 效果如图 | ||
实验结果的处理阶段 | 实验结果的分析与总结 | 通过这个项目,我学会了以下知识点:
总的来说,通过这个项目,我获得了多线程编程、互斥锁和条件变量、缓冲区管理、信号量和项目组织等方面的知识和经验。这些知识将对我在开发并发和多线程应用程序时非常有用。 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。