您好、欢迎来到现金彩票网!
当前位置:秒速牛牛开奖 > 同步通信量 >

进程间通信(三)—信号量

发布时间:2019-07-01 00:55 来源:未知 编辑:admin

  我会用几篇博客总结一下在Linux中进程之间通信的几种方法,我会把这个开头的摘要部分在这个系列的每篇博客中都打出来

  这次记下信号量的相关操作函数和方法,和以前一样会在博文的最后把测试代码贴出来!

  学过操作系统这本书的话应该对信号量这个名词不会感到陌生,同时信号和信号量是不同的!

  同步:处理竞争就是同步,安排进程执行的先后顺序就是同步,每个进程都有一定的个先后执行顺序

  互斥:互斥访问不可共享的临界资源,同时会引发两个新的控制问题(互斥可以说是特殊的同步)

  简单说一下信号量的工作机制(因为真的很简单),可以直接理解成计数器(当然其实加锁的时候肯定不能这么简单,不只只是信号量了),信号量会有初值(0),每当有进程申请使用信号量,通过一个P操作来对信号量进行-1操作,当计数器减到0的时候就说明没有资源了,其他进程要想访问就必须等待(具体怎么等还有说法,比如忙等待或者睡眠),当该进程执行完这段工作(我们称之为临界区)之后,就会执行V操作来对信号量进行+1操作。

  我们可以说信号量也是进程间通信的一种方式,比如互斥锁的简单实现就是信号量,一个进程使用互斥锁,并通知(通信)其他想要该互斥锁的进程,阻止他们的访问和使用(老子正在用!@_@!)

  这说明信号量的初始化和创建是分开操作的,为什么是分开的,因为创建的时候没有给信号量的大小的参数,信号量是可以设置大的(不是只可以设置为1),当然设置为1就是互斥访问了,比如典型的生产者和消费者问题,但是如果像是读者写者中的读者信号量可不一样(因为可以有多个读者同时读),这里就不解释这个模型问题了。

  缺点就是,一旦初始化和创建分开之后,就会有线程安全的问题,进程A刚创建一信号量还没有初始化,进程B便已经开始对该信号量进程P操作(哥哥!我还没赋值初始化!)根本无法进行-1操作,会阻塞的,我都不知道咋回事(亲身体验该错误)。。。

  当SETVAL被设置之后,可变参数列表的第四个参数就可以用上了,这里传入一个神奇的联合体(我在手册里找到了,但是死活用不了它,还是自己写了一个)

  就是它!就是它!就看第一个吧,其他我也没用了(英语我也看不太懂),val就是设置的初值啦,传入的时候直接传入就行了,参数就是一个变量(不用传指针)

  这个函数一会删除我们还会遇到它,ctl就是control控制的简写,很多操作都有它

  一开始就写了操作的两种方式,一种叫P操作,一种叫V操作,都是通过一个函数实现的,这个函数还关联一个结构体

  sem_num就是index of信号量,你想操作的信号量的下标,sem_op是个短整型,这里给1或者-1分别表示V和P操作,而最后一个semflg手册中提到了两个

  IPC_NOWAIT:一看就是IPC通用的,非等待,不让忙等待只好去休眠(或者别的,反正不能循环等待)

  SEM_UNDO:这个一看就是信号量独有的,看英文也能看出来UNDO是取消之前做过的,什么意思呢,不得不提到,当进程在临界区工作(持有锁)的时候,是不允许挂(挂掉更不好啦)起的!!!这很重要(又要加篇幅啦!@_@),因为一旦挂起或者休眠,有可能就醒不了啦!(挂起有可能等待事件)这样不好,会让等待的其他进程饥饿,尤其是挂掉的时候,肯定就更糟糕了,根本就无法执行V操作,等待的进程就会无限的等待下去,递归申请信号量也是不好的,尤其是互斥信号量的时候会造成死锁。这时候UNDO就出来把之前做过的东西都取消掉,P操作就当没执行过,信号量又从0变回了1,皆大欢喜。

  我的程序分为comm.h(公共头文件) comm.c(封装基本函数) server.c(采用fork完成父子进程间使用信号量) 一共3个文件

  基本功能:模拟线程安全(简单版本),父进程会打印AA子进程会打印BB,因为执行顺序的原因可能会交叉打印,但我不要这样,我要让AA和BB分别连着!完成这个功能

http://4kci.com/tongbutongxinliang/338.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有