如何使用信号量来限制服务器的连接数,OS第6次实验报告:使用信号量解决进程互斥访问...

计算1812

江雄鹏

201821121043

目录

一、实验目的

通过编程进一步了解信号量。

二、实验内容

在服务器上用Vim编写一个程序:使用信号量解决任一个经典PV问题,测试给出结果,并对解释运行结果。

生产者-消费者问题

读者-写者问题

哲学家进餐问题

三、实验报告

1. 选择哪一个问题

选择读者-写者问题

(1)情况:对象在多个线程之间共享,一些线程只读数据,一些线程只写数据。为保证写入和读取的正确性,操作限制:

写-写互斥和读-写互斥,即不能有两个写者同时进行写操作和不能同时有一个线程在读,而另一个线程在写。

读-读允许,即可以有一个或多个读者在读。

(2)解决方案:读者优先或写者优先。

2. 给出伪代码

(1)读者优先

void* writer(void* arg)

17 {

18 int i = *(int*)arg;

19 printf("the process%dwant to write\n",i);

20 sem_wait(&mutex2);

21 writecount++;

22 if(writecount==1) //若第一个为写者,阻止后续的读者

23 sem_wait(&r);

24 sem_post(&mutex2);

25 sem_wait(&w);//写者互斥

26 printf("the process%dis writing\n",i);

27 sleep(4);

28 printf("the process%dhas written\n",i);

29 sem_post(&w);

30 sem_wait(&mutex2);

31 writecount--;

32 if(writecount==0) sem_post(&r);//所有的写者写完才能让P(r)的读者readcount增加

33 sem_post(&mutex2);

34 }

35

(2)写者优先

void* reader(void* arg){

37 int i = *(int*)arg;

38 printf("the process%dwant to read\n",i);

39 sem_wait(&mutex3);

40 sem_wait(&r);

41 sem_wait(&mutex1);

42 readcount++;

43 if(readcount==1)//若第一个为读者,互斥写者

44 sem_wait(&w);

45 sem_post(&mutex1);

46 sem_post(&r);

47 sem_post(&mutex3);

48 printf("the process%dis reading\n",i);

49 sleep(2);

50 printf("the process%dhas read\n",i);

51 sem_wait(&mutex1);

52 readcount--;

53 if(readcount==0)//读者运行完释放写者,读写互斥

54 sem_post(&w);

55 sem_post(&mutex1);

56

57 }

3. 完整代码

ed3bdad192615585835e8568ce3a542b.png

36a657ea9cb9689b569a0c4384b4d000.png

4. 运行结果并解释

111e5a88f7314f293d868ae075ed2cf7.png

解释:0~7一共8个进程,进程1等待进程0完成写入后进行读取;当进程2想要读取时,此时进程1还在读取,所以进程2能够实现与进程1同时读取;进程3想要写入,得等进程1和2读取完毕才能开始写入;当进程4、5、6想要读取时,只有当进程3完成写入才能读取;当进程7想要写入时,因为写入与读写的操作不能同时进行,所以只有等待进程4,5,6读取完毕后,进程7才能写入。

标签:读取,写者,信号量,互斥,进程,sem,OS,post,wait

来源: https://www.cnblogs.com/0606jxp/p/12988867.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值