操作系统试验信号量方法题稿.docx

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验姓名:***学号:*****班级:*******实验一Linux信号量机制1 需求说明1.1 基本需求目标:本次实验的目标是在Linux环境下实现一个多线程对临界资源的互斥操作,利用信号量实现对临界资源的保护,支持Linux下文件输入输出,提高对Linux环境下多进程、多线程、信号量机制和文件操作等知识的理解。问题描述:设有进程A、B、C,分别调用过程get、copy、put对缓冲区S和T进行操作。其中get负责从文件F_in中把数据块读入并输出缓冲区S,copy负责从S中提取数据块并复制到缓冲区T中,put负责从缓冲区T中取出信息存入到本地文件F_out中。实现get、copy、put的操作过程。功能需求:提供与用户交互的界面,用户可指定输入、输出文件以及缓冲区大小利用信号量(互斥量和条件变量)实现互斥同时产生多个get、copy和put线程,利用信号量实现多个相同功能的线程间的通信,避免临界资源的非法访问,可参考读写者问题解决方案支持文件输入、输出非功能需求:程序应有较好的容错性(即能对用户输入的命令进行判断,并对错误的命令进行错误处理)过程需求:使用vi进行代码的编写使用make工具建立工程将实现不同类别功能的函数写到不同的.c文件中,并使用makefile链接编设计说明2.1函数的设计主函数的功能:线程的关闭,信号量的初始化与销毁,缓冲区创建与释放;显示函数的功能:提示错误的操作,完成正常操作的显示;线程函数的功能:保护缓存区,调用函数;功能函数:实现get()、copy()、put()的功能,并显示线程号;2.2 设计思路2.2.1 主程序设置一些全局变量定义,用户参数处理与检错,所有线程的创建与关闭。缓存区的创建与释放,信号量的初始化与销毁。2.2.2 线程函数程序的主要功能:1.实现文件拷贝内容以及顺序一致,防止缓冲区覆盖; 2.防止对空的缓冲区进行读操作; 3.实现缓冲区的互斥访问。2.2.3 为了完成上述功能,我们使用两种方法: (1)一种方法信号量:我这里为S和T两个缓存区,设置了3个信号量。实现上述3个功能,具体过程见程序清单线程函数的注释; (2)第二种方法条件变量和互斥锁。利用两个互斥锁和一个条件变量完成上述功能。具体过程见程序清单注释。 2.2.4 功能函数程序主要完成文件内容与缓冲区的读写,还有缓冲区之间的拷贝。具体见程序功能函数部分。2.2.5 显示程序:用于提示程序的使用说明,通过检测用户输入参数,提示错误的用户输入,以及正常完成的显示,保证用户操作的容错性和良好的交互性。3.程序测试及截图3.1 使用说明 ./sem fromfile(要拷贝的源文件要先创建) tofile(目标文件) bufsize(缓冲区的大学) 注:拷贝未创建的文件,或者输入格式不对会有提示。如果只输入./sem会有使用说明。bufsize 默认为 4096byte 。 3.2截图 1.说明提示: 2.正确操作结果: 3.错误提示: 试图拷贝一个不存在的文件 mw.txt 出现的错误提示 缓冲区溢出的错误提示 非法缓冲区溢出的错误提示4.程序清单(1)main.c#include stdlib.h#include fcntl.h#include sys/stat.h#include semaphore.h#include pthread.h#include threads.h#include display.hsem_t s,t,s_o,t_o,s_r,t_r;//o代表缓冲区内容是否已读,r代表缓存区是否可以读取,s与t是对应两个缓存区的读写操作 char * S = NULL;char * T = NULL;char * S = NULL;char * T = NULL;int BUFSIZE = 4096;int in,out;void init_sem()//信号量初始化{sem_init(s,0,1);sem_init(t,0,1);sem_init(s_o,0,1);sem_init(t_o,0,1);sem_init(s_r,0,0);//刚开始缓冲区没有内容初始为零sem_init(t_r,0,0);}void delete_sem()//信号量销毁{sem_destroy(s);sem_destroy(t);sem_destroy(s_o);sem_destroy(t_o);sem_destroy(s_r);sem_destroy(t_r);}int main (int argc,char ** argv){pthread_t pt[9];int i;if (argc 3 || argc 4)//判断用户输入参数个数提

您可能关注的文档

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档