概念 (引入原因)
协调进程间的相互制约关系.
临界资源与临界区
一次仅允许一个进程使用的资源称为临界资源 (与共享资源对立, 有些资源如私有资源, 它只能给一个进程使用, 不存在临界问题), 访问临界资源的那段代码称为临界区.
进程间相互制约关系
同步
直接制约关系, 进程 A 通过缓冲区向进程 B 提供数据; 当缓冲区空时, 进程 B 不能获得数据而阻塞, 一旦进程 A 将数据送入缓冲区, 进程 B 被唤醒; 反之, 缓冲区满时, 进程 A 被阻塞, 仅当进程 B 取走数据时, 才唤醒进程 A.
互斥
间接制约关系, 进程 A 进入临界区访问临界资源, 此时进程 B 必须等待, 当进程 A 退出临界区, 进程 B 才能进入临界区访问临界资源.
信号量
概念
用来解决进程同步的一种机制, 像是一把钥匙, 进程要运行, 需要先拿到这把钥匙, 通俗点来讲就是在允许的信号量下, 进程才能够执行
允许的两个操作
down 操作 (P 操作): 将信号量的值值减 1; 当信号量等于 0 时, 再次 down 操作会让之后的进程进入等待 (阻塞态)
- void wait(semaphore S)
- {
- --S.value;
- if (S.value<0)
- {
- add this process to S.L;// 进程链表 L, 记录所有等待该资源的进程
- block(S.L);
- }
- }
up 操作 (V 操作): 将信号量的值加 1; 特别的, 对一个有进程在其上等待的信号量执行一次 up 操作后, 唤醒在其上等待的其中一个进程进入就绪态
- void signal(semaphore S)
- {
- ++S.value;
- if (S.value<=0)
- {
- remove a process P to S.L;// 进程链表 L, 记录所有等待该资源的进程
- wakeup(P);
- }
- }
信号值所代表的含义
当信号量 S 大于 0 时表示可用的临界资源数, 当等于 0 时, 表示刚好用完;
当信号量 S 小于 0 时, 其绝对值表示系统中因请求该类资源而被阻塞的进程数目;
举例: 有两个某类资源, 四个进程 A,B,C,D 要用该类资源;
最开始 S=2, 当 A 进入, S=1, 当 B 进入, S=0, 表明该类资源刚好用完;
当 C 进入时 S=-1, 表明有一个进程被阻塞了, D 进入, S=-2, 表明有两个进程被阻塞了;
当 A 用完该类资源时, 进行 V 操作, S=-1, 释放该类资源, 因为 S<=0, 表明有进程阻塞在该类资源上, 于是唤醒 C,C 进入就绪态, C 发现有一个资源可以用, 然后直接转换到运行态, 使用该资源;
当 B 用完该类资源时, 进行 V 操作, S=-0, 释放该类资源, 因为 S<=0, 表明有进程阻塞在该类资源上, 于是唤醒 D,D 进入就绪态, D 发现有一个资源可以用, 然后直接转换到运行态, 使用该资源;
信号量初值与其作用
1. 如果初值为 0, 用来实现同步
2. 如果初值为 1, 用来实现互斥访问
3. 如果初值为 N(N 一般大于 1), 用来限制并发数目
进程同步
来源: http://www.bubuko.com/infodetail-2799676.html