课程设计

(操作系统)

题目:Linux进程同步

班级:计算机科学与技术

姓名:

指导教师:

系主任:

2017年03月02日

目 录

1题目分析2 2数据结构4 3流程图7 4实现技术8 5设计结论和心得 10

1题目分析

编写读者一写者同步程序,要求:

(1)在Linux下用C语言编程,利用信号量实现进程同步;

(2)读写要求随机产生,如按键盘输入 R或W,动态显示当前状态,有多少个读者、写者在等待访问;每个读者写者的时间可预先设定;

(3) 读者写者共享一个数据区,用数组表示,如可初始化为 1、2、3、4、5、6、7、8、9、10、;写者随即对其修改。

Li nux环境下相关技术:

线程定义:pthread.h

信号量:sem.h

读写锁与互斥量相似,不过读写锁允许更高的并行性。互斥量要么是锁住状态,要不 是不加锁状态,而且一次只有一个线程可以对其进行加锁。

读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者 只对共享资源进行读访问,写者则需要对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统 中,它允许同时有多个读者来访问共享资源,最 大可能的读者数为实际的逻辑CPL数。写者是排他性的,一个读写锁同时只能有一个写者 或多个读者(与CPL数相关),但不能同时既有读者又有写者。

读写锁有三种状态:读模式加锁,写模式加锁,不加锁。

当读写锁是写加锁时,在这个锁被解索之前所有企图对它加锁的线程都将要阻塞。

当读写锁是读加锁时,在这个锁被解索之前所有企图以读模式对它加锁的线程都可 以获得访问权;以写模式加锁的线程将堵塞,并且堵塞随后的读模式加锁。这样可以避免 读模式锁长期占用,导致等待的写模式锁请求一直得不到满足。

信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线 程)所拥有。

0,信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,内核信号量类似于自旋锁,因为当锁关闭着时,它不允许内核控制路径继续进行。

然而,当内核控制路径试图获取内核信号量锁保护的忙资源时,相应的进程就被挂起。只 有在资源被释放时,进程才再次变为可运行。

只有可以睡眠的函数才能获取内核信号量;中断处理程序和可延迟函数都不能使用 内核信号量。

内核信号量是struct semaphore 类型的对象,它在^定义:

struct semaphore {
atomic_t count;
int sleepers;
wait_queue_head_t wait;
}

count :相当于信号量的值,大于0,资源空闲;等于0,资源忙,但没有进程等待这 个保护的资源;小于0,资源不可用,并至少有一个进程等待资源。

wait :存放等待队列链表的地址,当前等待资源的所有睡眠进程都会放在这个链表中。 sleepers :存放一个标志,表示是否有一些进程在信号量上睡眠。

通过对读写锁以及信号量的理解,以及对题目的分析,我们需要用信号量来实现进程 间的同步,通过读写锁来访问临界资源。

2数据结构

读者一一写者问题中涉及的数据结构包括读者、写者共用的缓冲区,读写锁,以及同

主要应用头文件以及主要变量定义和初始化如下:

#in clude
#i nclude
sem_t my_sem;
int a[10]={1,2,3,4,5,6,7,8,9,10};
pthread_rwlock_t rwlock;
sem」nit(&m y_sem,0,3);
pthread_rwlock_i nit(&rwlock,NULL);
读线程的工作如下:
void * pthread_read(void *arg)
{
int id;
while(flag){
if(sem_wait(&m y_sem)==0)
pthread_rwlock_rdlock(&rwlock);
//prin tf("l'm %d read\n",(i nt)arg);
sran d(time(0));
id=ra nd()%10;
prin tf("I'm %d readthread! I'm readi ng the %d shu: %d\n",(i nt)arg,id,a[id]);
sleep (3);
if(flag2){
coun t_read++;}
pthread_rwlock_ un lock(&rwlock);
sem_post(&m y_sem);
}
sleep(2);
}
prin tf("I'm the %d read_thread,exit!!!\n",(i nt)arg);
p