1 / 50
文档名称:

第04讲 经典ipc问题.ppt

格式:ppt   大小:364KB   页数:50页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

第04讲 经典ipc问题.ppt

上传人:287865472 2017/10/26 文件大小:364 KB

下载得到文件列表

第04讲 经典ipc问题.ppt

相关文档

文档介绍

文档介绍:信号量(Semaphore)
1965年由著名的荷兰计算机科学家Dijkstra提出, 其基本思路是用一种新的变量类型(semaphore) 来记录当前可用资源的数量。
有两种实现方式:1)semaphore的取值必须大于 或等于0。0表示当前已没有空闲资源,而正数表 示当前空闲资源的数量;2)semaphore的取值可 正可负,负数的绝对值表示正在等待进入临界区 的进程个数。
信号量是由操作系统来维护的,用户进程只能通 过初始化和两个标准原语(P、V原语)来访问。 初始化可指定一个非负整数,即空闲资源总数。
P、V原语作为操作系统内核代码的一部分,是一 种不可分割的原子操作(atomic action),在其 运行时,不会被时钟中断所打断;
P、V原语包含有进程的阻塞和唤醒机制,因此 在进程等待进入临界区时不会浪费CPU时间;
P原语:P是荷兰语Proberen(测试)的首字母。 申请一个空闲资源(把信号量减1),若成功, 则退出;若失败,则该进程被阻塞;
V原语:V是荷兰语Verhogen(增加)的首字母。 释放一个被占用的资源(把信号量加1),如果 发现有被阻塞的进程,则选择一个唤醒之。
信号量和P、V原语的实现
信号量结构体类型的定义
typedef struct {
int count; // 计数变量 struct PCB *queue; // 进程等待队列 } semaphore;
P原语:申请一个资源
P( semaphore S) {
--; //表示申请一个资源;
if ( < 0) //表示没有空闲资源;
{
;
阻塞该进程;
调用进程调度器;
} }
V原语:释放一个资源
V( semaphore S) {
++; //表示释放一个资源;
if ( <= 0) //表示有进程被阻塞;
{
;
把该进程改为就绪状态,插入就绪队列
} }
Windows 2000
CreateSemaphore(创建信号量)
WaitForSingleObject(P操作)
ReleaseSemaphore(V操作)
COS-II
osSemCreate(创建信号量)
osSemPend (P操作)
osSemPost(V操作)
利用信号量来实现进程互斥
int count; // 共享变量(临界资源)
semaphore mutex;// 互斥信号量,初始化为??
非临界区
P(mutex);
临界区
V(mutex);
非临界区
P1
非临界区
P(mutex);
临界区
V(mutex);
非临界区
P2
非临界区
P(mutex);
临界区
V(mutex);
非临界区
P3
进程的同步
进程间的同步是指多个进程中发生的事件
存在某种时序关系,因此在各个进程之间
必须协同合作,相互配合,使各个进程按
一定的速度执行,以共同完成某一项任务。
同步:合作。 互斥:竞争。
只考虑基于信号量的同步问题。
如何实现A先执行,然后B执行?
A;
V(S);
进程P1
P(S); B;
进程P2
配对
先后
S初始值为0
….
A(先);
….
进程P1
信号量S初始值为??
….
B(后);
….
进程P2
while(1)
{
….
A;
V(S);
….
}
进程P1
S初始值为1
while(1)
{
….
P(S);
B;
….
}
进程P2