Linux操作系统编程
信号量集
操作系统中任务资源共享情况
◼临界资源:在一段时间 Task1
内只允许一个任务访问 临界资源
的资源。诸任务间应采 Task2
取互斥方式,实现对资
源的共享。 Task1
◼共享资源:允许多个任 共享资源实例1
务同时访问同一种资源 Task2 ……
…… 共享资源实例n
的多个实例
Task m
2
信号量
◼信号量一般分为三种类型:
⚫互斥信号量:任务之间互斥访问临界资源
⚫计数信号量:任务之间竞争访问共享资源
⚫二值信号量:任务之间的同步机制
◼信号量是操作系统提供的管理资源共享的有效手段
◼信号量作为操作系统核心代码执行,其地位高于任务
,任务调度不能终止其运行
3
信号量的实现
◼信号量s一般包含以下成员:
⚫整数值s.count (实现资源计数)
⚫任务阻塞队列s.queue
◼信号量操作:初始化、P操作、V操作
⚫在进程初始化信号量将s.count指定为一个非负整数值,表
示可用的共享资源实例总数
◼运行中s.count可为负值(其绝对值表示当前等待访问
该共享资源的进程数)
4
信号量的实现
--s.count;//表示申请一个资源;
if (s.count <0)//表示没有空闲资源;
P操作 {
wait(s) 调用进程进入阻塞队列s.queue;
阻塞调用进程;
}
++s.count;//表示释放一个资源;
if (s.count <= 0)//表示有进程处于阻塞状态;
V操作
{
signal(s) 从等待队列s.queue中取出一个进程P;
进程P进入就绪队列;
5
}
互斥信号量
申请并获得
值减1等于0
初始化 可获得 不可获得
值为1
释放
值为1
互斥信号量状态图