免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6218 | 回复: 7

信号量大家谈!---关于信号量集合 [复制链接]

论坛徽章:
0
发表于 2005-01-17 11:25 |显示全部楼层
信号量是为了多进程对共享数据的存取,信号量并不是一个单独的非负值,其实信号量定义为一个或者多个信号量值的集合:
        struct semid_ds{
                struct ipc_perm                sem_perm        /*许可权控制结构*/
                struct sem                *sem_base        /*指向集合中第一个信号量的地址*/
                ushort                        sem_nsems        /*信号量集合中的信号量数目*/
                time_t                        sem_otime;
                time_t                        sem_ctime;
        }
        其中,struct sem的结构定义如下:
        struct sem{
                ushort                        semval;                /*具体的信号量的值*/
                pid_t                        sempid;                /*上次操作该信号量的进程号*/
                ushort                        semncnt;        /*processes awaiting semval>;currcal*/
                ushort                        semzcnt;        /*processes awaiting semval=0*/
        }
        请教:
                1。信号量定义成集合的结构,就是说:semget函数获得一个信号量ID后,得到的是一个信号量集合,
                如果函数semget的参数nsems 大于1,集合中的信号量有多个,一般对一段共享内存进行同步访问,一个信号量
                不就够了吗?对nsems大于1个的情况,具体的应用是什么呢?
                (个人猜测:申请一个信号量,对多个共享内存进行同步控制;在调用semctl函数的时候,
                参数semnum指向集合中的具体某个信号量)
       
                2。具体到信号量的集合结构内部,如果semget(key-t key,int 5,int flag)申请到了5个信号量,
                函数semop(int semid,struct sembuf semoparray[],size_t nops)中的参数semoparray是个信号量操作数组
                struct sembuf{
                        ushort sem_num                /*具体到信号量集合中的某个信号量*/
                        short  sem_op                /*对该信号量的操作(负数,0,正数)*/
                        short  sem_flg                /*ipc_nowait,sem_undo*/
                }
        在unix高级编程一书中,这么定义的,但是我没有遇到过申请一个信号量集合中信号数大于1的,
        有实际经验的朋友,大家来讨论!
        还有就是:结构struct sem 中的semncnt 和 semzcnt变量做何解释?

论坛徽章:
0
发表于 2005-01-17 11:41 |显示全部楼层

信号量大家谈!---关于信号量集合

Request a semaphore set which has more than one semaphore inside is very important
while you use more than one resources (each of them needs mutex) and each process uses more than one resource.

In simple words:
"(s1)(s2)" is not equal to "(s1,s2)".
because P(s1)(s2) is not atomical.

论坛徽章:
0
发表于 2005-01-17 11:41 |显示全部楼层

信号量大家谈!---关于信号量集合

一个程序与其它多个程序分别操作几块共享内存,就可以使用信号量集合。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2005-01-17 11:42 |显示全部楼层

信号量大家谈!---关于信号量集合

semncnt的含义是等待此信号量值增长的进程个数。
semzcnt的含义是等待此信号量值变为0的进程个数。

多个信号量的情况,你可以参考一个《操作系统原理》这方面的书,
时间久了,我也想不起来。
还有参考《unix网络编程:卷二》,对这些概念理解的会更深刻。

论坛徽章:
0
发表于 2005-01-17 11:45 |显示全部楼层

信号量大家谈!---关于信号量集合

感谢大家!
这个的应用是不是很多?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2005-01-17 13:50 |显示全部楼层

信号量大家谈!---关于信号量集合

信号量一般用于描述信号个数,共享内存的互斥访问只是一种应用
我用它来实现进程池
  1. #define TRANS 0  //用于控制进程的产生
  2. #define TOTAL 1  //记录当前进程个数
  3. semget(semkey, 2, IPC_CREAT|IPC_EXCL|0666);
  4. semctl(semid, TRANS, SETVAL, 默认进程个数);
  5. semctl(semid, TOTAL, SETVAL, 0);
  6. while(1) {
  7.     对TRANS信号量减1;
  8.     if(进程个数达到上限) continue;
  9.     if(fork() == 0) {
  10.         TOTAL信号量加1;
  11.         业务处理...
  12.         if(资源不够) TRANS信号量加1; //父进程产生一个新的进程
  13.         ......
  14.         if(当前进程空闲 && 进程个数过多) {
  15.             TOTAL信号量减1;
  16.             exit(0);
  17.         }
  18.     }
复制代码

论坛徽章:
0
发表于 2005-01-17 16:59 |显示全部楼层

信号量大家谈!---关于信号量集合

先Mark一下,看这段时候没看懂。

论坛徽章:
0
发表于 2005-01-18 02:10 |显示全部楼层

信号量大家谈!---关于信号量集合

实际上很简单,比如2个进程使用2个资源(s1,s2),
进程1:

  1. P(s1);
  2. //******
  3. P(s2);
  4. 操作s1,s2.....;
  5. V(s2);
  6. V(s1);
复制代码

进程2:

  1. P(s2);
  2. //******
  3. P(s1);
  4. 操作s1,s2.....;
  5. V(s1);
  6. V(s2);
复制代码


在//******那里就有可能发生死锁.
但是如果两个程序都改成

  1. P(s1,s2);
  2. 操作s1,s2.....;
  3. V(s1,s2);
复制代码

就没有问题了.

多信号量的信号量集经常用来实现进程/线程的"栅栏同步".
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP