欢迎来到天天文库
浏览记录
ID:18611152
大小:242.50 KB
页数:19页
时间:2018-09-19
《操作系统课程设计实验报告new》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、操作系统课程设计实验报告书题目:售票员与乘客(信号量操作)题目编号:2院系:计算机科学与技术软件服务与外包学院班级:11级9班小组成员:组长:杨扬学号:111810059组员:沈菲菲学号:111810060组员:学号:2013-06-30目录一、课程设计任务划分1(一)课程内容2(二)算法2(三)算法基本原理2三、基本思路4(一)变量4(二)所用函数5(三)流程图9四、调试及实验结果14五、个人体会15一、课程设计任务划分组员具体分工沈菲菲网上搜索程序资料程序合并实验报告书书写杨扬程序调试设计项目流程心得体会17二、基本原理(一)课程内容编程序模拟车
2、站售票厅内进程同步问题,售票厅任何时刻最多可容纳20名购票者进入,否则需要在外面等待。每个购票者可看成一个进程。(二)算法信号量与P,V操作(三)算法基本原理生产者-消费者问题是一个经典的线程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个线程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区
3、,那么消费者线程将被阻塞,直到新的物品被生产出来。17多个生产/消费者在有界缓冲上操作。它利用N个字节的共享内存作为有界循环缓冲区,利用写一字符模拟放一个产品,利用读一字符模拟消费一个产品。当缓冲区空时消费者应阻塞睡眠,而当缓冲区满时生产者应当阻塞睡眠。一旦缓冲区中有空单元,生产者线程就向空单元中入写字符,并报告写的内容和位置。一旦缓冲区中有未读过的字符,消费者线程就从该单元中读出字符,并报告读取位置。生产者不能向同一单元中连续写两次以上相同的字符,消费者也不能从同一单元中连续读两次以上相同的字符。因此售票员与乘客也可转化为生产者与消费者的问题,第一
4、步:确定进程间的关系。售票厅是各进程共享的公有资源,当售票厅中多于20名购票者时,厅外的购票者需要在外面等待。所以进程间是互斥的关系。第二步:确定信号量及其值。只有一个公有资源:售票厅,所以设置一个信号量s。售票厅最多容纳20个进程,即可用资源实体数为20,s的初值就设为20。实现:begins:semaphore;s:=20;cobeginprocessPI(I=1,2,……)beginP(s);进入售票厅;购票;退出;17V(s);end;coend当购票者进入售票厅前要执行P(s)操作,执行后若s大于或等于零,说明售票厅的人数还未满可进入。执行
5、后若s小于零,则说明售票厅的人数已满不能进入。这个实现中同时最多允许20个进程进入售票厅购票,其余进程只能等待。三、基本思路(一)变量#defineN2//乘客或售票员的数目#defineM20//售票厅大小intin=0;//售票员售票的位置intout=0;//乘客买票的位置intbuff[M]={0};//售票厅初始化为0,开始时没有售票员sem_tempty_sem;//同步信号量,当满了时阻止售票员售票sem_tfull_sem;//同步信号量,当没售票员时阻止乘客买票pthread_mutex_tmutex;//互斥信号量,一次只有一个线
6、程访问缓冲intconductor_id=0;//售票员idintpassenger_id=0;//乘客id17(二)所用函数1.voidprint()打印售票厅情况2.void*conductor()售票员方法3.void*passenger()乘客方法4.intmain()主方法5.sem_wait()函数原形:intsem_wait(sem_t*sem);参数:sem指向信号灯的指针返回值:若成功则返回0,否则返回-1。我们能用sem_wait来申请共享资源,sem_wait函数能测试所指定信号灯的值,如果该值大于0,那就将他减1并即时返回。我
7、们就能使用申请来的共享资源了。如果该值等于0,调用线程就被进入睡眠状态,直到该值变为大于0,这时再将他减1,函数随后返回。sem_wait操作必须是原子的。176.sem_post()挂出共享资源函数原形:intsem_post(sem_t*sem);参数:sem指向信号灯的指针返回值:若成功则返回0,否则返回-1。当一个线程使用完某个信号灯时,他应该调用sem_post来告诉系统申请的资源已用完。本函数和sem_wait函数的功能正好相反,他把所指定的信号灯的值加1,然后唤醒正在等待该信号灯值变为正数的任意线程。7.sem_init()初始化信号等
8、函数原形:intsem_init(sem_t*sem,intshared,unsignedintvalue)
此文档下载收益归作者所有