当前位置:七道奇文章资讯系统安全Linux安全
日期:2011-01-23 03:26:00  来源:本站整理

Linux系统中的信号量机制[Linux安全]

赞助商链接



  本文“Linux系统中的信号量机制[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

1、信号量的定义:

struct semaphore {

spinlock_t lock;

unsigned int count;

struct list_head wait_list;

};

linux中,信号量用上述构造体表示,我们可以通过该构造体定义一个信号量.

2、信号量的初始化:

可用void sema_init(struct semaphore *sem, int val);直接成立,此中val为信号量初值.

也可以用两个宏来定义和初始化信号量的值为1或0:

DECLARE_MUTEX(name) : 定义信号量name并初始化为1

DECLARE_MUTEX_LOCKED(name) : 定义信号量name并初始化为0

还可以用下面的函数初始化:

void init_MUTEX(struct semaphore *sem); //初始化信号量的值为1

void init_MUTEX_LOCKED(struct semaphore *sem); //初始化信号量的值为0

3、信号量的原子操作:

p操作:

* void down(struct semaphore *sem); //用来获得信号量,假如信号量值大于或等于0,获得

信号量,不然进入就寝状况,就寝状况不可唤醒

* void down_interruptible(struct semephore *sem); //用来获得信号量,假如信号量大于或

等于0,获得信号量,不然进入就寝状

态,等候信号量被释放后,激该死程.

* void down_trylock(struct semaphore *sem); //试图获得信号量,假如信号量已被其他进程

获得,则立即返回非零值,调用者不会就寝

v操作:

* void up(struct semaphore *sem); //释放信号量,并唤醒等候该资源进程行列的第一个进程

4、经典同步问题的办理筹划:

* 生产者和消费者问题:

a、单缓冲区问题描写:生产者向消费者供应产品,它们同享一个有界缓冲区,生产者向此中投放产品,消费者从中获得产品.同时,每个进程都互斥的占用CPU.假定生产者和消费者是彼此等效的,只要缓冲区未满,生产者便可以把产品送入缓冲区,近似的,只要缓冲区未空,消费者便可以从缓冲区中取走产品并消费它.生产者—消费者的同步关系将禁止生产者向已满的缓冲区中放入产品,也禁止消费者从空的缓冲区中获得产品

问题解析:需求定义两个信号量,一个用于互斥拜候缓冲区,另一个用于生产者与消费者之间的同步.s1=1; s2=0;

伪代码:

生产者进程 消费者进程

while(1) while(1)

{ {

printf(“I'm producing!\n”); down_interruptible(&s2);

down_interruptible(&s1); down_interruptible(&s1);

printf(“I'm putting a product into the buffer\n”); printf(“I'm getting a product\n”);

up(&s1); up(&s1);

up(&s2); printf(“I'm consuming a product\n”);

} }

b、多生产者、多消费者、n个缓冲区问题描写:有一群生产者进程在生产产品,并将这些产品供应应消费者进程去消费.为使生产者进程与消费者进程并发履行,在二者之间设置了n个缓冲区,生产者将产品放入一个缓冲区中,消费者可以从一个缓冲区中取走产品去消费.要求生产者进程与消费者进程必须保持同步,即不答应生产者进程向一个满的缓冲区放产品,也不答应消费者从一个空的缓冲区取产品.

问题解析:该问题貌似比a问题复杂的多,首先我们定义一个数组buffer[n],来表示n个缓冲区,还需求定义两个变量:in 表示要存入的缓冲区的下标,out表示要取产品的缓冲区的下标.定义三个信号量:s1用于实现对缓冲池的互斥操作,empty表示空缓冲区的个数,full表示满缓冲区的个数.初值:in=out=0; s1=1; full=0; empty=n;

伪代码以下:

生产者进程 消费者进程

while(1) while(1)

{ {

printf(“I'm producing!\n”); down_interruptible(&full);

down_interruptible(&empty); down_interruptible(&s1);

down_interruptible(&s1); printf(“I'm getting a product

printf(“I'm putting a product into the buffer[in]\n”); from buffer[out]\n”);

out = (out+1)%n;

in = (in+1)%n; up(&s1);

up(&s1); up(&empty);

up(&full); printf(“I'm consuming a product\n”);

} }

* 哲学家进餐问题:

问题描写:五个哲学家共用一个圆桌,辨别坐在四周的五张椅子上,在圆桌上有五只碗和五只筷子,他们交替举行考虑和进餐.哲学家饥饿时便试图取最接近他的两只筷子,当同时得到两只筷子时便可用餐,用餐完毕后放下筷子.

问题解析: 五只筷子为临界资源,定义包含五个元素的信号量数组来实现对筷子的互斥利用.chopstick[5],五个信号量的初值都为1.

伪代码:

第i(i=0,1,2,3,4)个哲学家进程:

while(1)

{

down_interruptible(&chopstick[i]);

down_interruptible(&chopstick[(i+1)%5]);

printf(“I'm eating!\n”);

up(&chopstick[i]);

up(&chopstick[(i+1)%5);

}

* 读者写者问题:

问题描写:一个文件可被多个进程同享,reader进程读取该文件,而writer进程负责写文件,允很多个reader进程同时读取文件,但不答应一个writer进程和其他reader进程或writer进程同时拜候文件.

问题解析:进程对文件互斥拜候的实现可借助一个信号量便可以搞定,但是我们需求引入一个count变量来记录reader进程的个数,对这个变量的拜候也是互斥的,所以也需求引入一个信号量.定义信号量rs实现对count的互斥拜候,定义ws实现对文件的互斥拜候.两信号量初值都为1

伪代码:

reader进程 writer进程

{ {

down_interruptible(&rs); down_interruptible(&ws); if (count == 0){ printf(“I'm writing!\n”);

down_interruptible(&ws); up(&ws);

} }

count++;

up(&rs);

printf(“I'm reading!\n”);

down_interruptible(&rs);

count--;

if(count == 0){

up(&ws);

}

up(&rs);   以上是“Linux系统中的信号量机制[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • windows下的近似linux下的grep号令--findstr
  • linux下mysql链接被防火墙禁止的办理办法
  • Linux下mysql新建账号及权限设置办法
  • SUSE Linux下搭建Web服务器
  • Windows/Linux MySQL忘掉密码重置密码教程
  • Linux下Apache自动监测重启脚本(智能化程度较高)
  • linux备份 linux克隆 linux clone
  • <b>为什么 Linux不需求碎片整理</b>
  • CentOS6 yum搭建Linux+Nginx+PHP+MYSQL(LNMP)
  • Linux系统有效防备ARP攻击
  • Linux下 Memcache的安装和简单管理
  • 笔记本预装linux重装成windows系统
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .