Linux进程同步 设计报告.doc

Linux进程同步 设计报告.doc

ID:56098802

大小:320.50 KB

页数:12页

时间:2020-06-19

Linux进程同步 设计报告.doc_第1页
Linux进程同步 设计报告.doc_第2页
Linux进程同步 设计报告.doc_第3页
Linux进程同步 设计报告.doc_第4页
Linux进程同步 设计报告.doc_第5页
资源描述:

《Linux进程同步 设计报告.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、课 程 设 计(操作系统)题  目: Linux进程同步班  级:计算机科学与技术姓  名:   指导教师:      系主任:2017年03月02日目录1题目分析22数据结构43流程图64实现技术75设计结论和心得91题目分析编写读者—写者同步程序,要求:(1)在Linux下用C语言编程,利用信号量实现进程同步;(2)读写要求随机产生,如按键盘输入R或W,动态显示当前状态,有多少个读者、写者在等待访问;每个读者写者的时间可预先设定;(3)读者写者共享一个数据区,用数组表示,如可初始化为1、2、3、4、5、6、7、8、9、10、;写者随即对其

2、修改。Linux环境下相关技术:线程定义:pthread.h信号量:sem.h读写锁与互斥量相似,不过读写锁允许更高的并行性。互斥量要么是锁住状态,要不是不加锁状态,而且一次只有一个线程可以对其进行加锁。读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时有多个读者来访问共享资源,最大可能的读者数为实际的逻辑CPU数。写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能

3、同时既有读者又有写者。读写锁有三种状态:读模式加锁,写模式加锁,不加锁。1.当读写锁是写加锁时,在这个锁被解索之前所有企图对它加锁的线程都将要阻塞。2.当读写锁是读加锁时,在这个锁被解索之前所有企图以读模式对它加锁的线程都可以获得访问权;以写模式加锁的线程将堵塞,并且堵塞随后的读模式加锁。这样可以避免读模式锁长期占用,导致等待的写模式锁请求一直得不到满足。信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队

4、列中,等待被唤醒。内核信号量类似于自旋锁,因为当锁关闭着时,它不允许内核控制路径继续进行。然而,当内核控制路径试图获取内核信号量锁保护的忙资源时,相应的进程就被挂起。只有在资源被释放时,进程才再次变为可运行。只有可以睡眠的函数才能获取内核信号量;中断处理程序和可延迟函数都不能使用内核信号量。内核信号量是structsemaphore类型的对象,它在中定义:structsemaphore{  atomic_tcount;  intsleepers;  wait_queue_head_twait;  }count

5、:相当于信号量的值,大于0,资源空闲;等于0,资源忙,但没有进程等待这个保护的资源;小于0,资源不可用,并至少有一个进程等待资源。wait:存放等待队列链表的地址,当前等待资源的所有睡眠进程都会放在这个链表中。sleepers:存放一个标志,表示是否有一些进程在信号量上睡眠。通过对读写锁以及信号量的理解,以及对题目的分析,我们需要用信号量来实现进程间的同步,通过读写锁来访问临界资源。2数据结构读者——写者问题中涉及的数据结构包括读者、写者共用的缓冲区,读写锁,以及同步需要的信号量集。主要应用头文件以及主要变量定义和初始化如下:#include

6、#includesem_tmy_sem;inta[10]={1,2,3,4,5,6,7,8,9,10};pthread_rwlock_trwlock;sem_init(&my_sem,0,3);pthread_rwlock_init(&rwlock,NULL);读线程的工作如下:void*pthread_read(void*arg){intid;while(flag){if(sem_wait(&my_sem)==0){pthread_rwlock_rdlock(&rwlock);//printf

7、("I'm%dread",(int)arg);srand(time(0));id=rand()%10;printf("I'm%dreadthread!I'mreadingthe%dshu:%d",(int)arg,id,a[id]);sleep(3);if(flag2){count_read++;}pthread_rwlock_unlock(&rwlock);sem_post(&my_sem);}sleep(2);}printf("I'mthe%dread_thread,exit!!!",(int)arg);pthread_exi

8、t((void*)1);}写线程的工作如下:void*pthread_write(void*arg){intid;intnum;while(flag){if(sem

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。