一.概述

二.核心

2.1 同步机制的概念.为什么叫同步(掌握)?

信号量是一种同步机制, 之所以叫做同步机制, 是因为把进程互斥看成一种特殊的同步.它即解决同步问题, 又解决互斥问题

2.2 信号量和P, V操作

信号量定义: 由一个值和一个对列组成.

strut semaphore {

int count; // 信号量的值

queueType queue; // 挂载在这个信号量上的进程, 用对列保存这些进程

}

解说(掌握):

所谓的信号量就是一个特殊的变量, 用于进程间传递信息的一个整数值.上面的定义并没错, 因为其也包好了信号量是个整数值这层定义.

对信号量可以实行的操作: 初始化, P(test, 测试操作), V(increment, 增加操作).在实际编程中, P又称为down, semWait. V又称为up, semSignal.

P的定义如下, s代表信号量变量, 为了方便iOS中的学习, P统一换成semWait. V换成semSignal.

P(s) {

s.count = s.count - 1;

if (s.count < 0) {

  该进程状态置为阻塞态.

  将该进程插入相应的等待对列s.queue末尾.

  CPU重新调度;

​ }

}

P操作主要做两件事(掌握):

  1. 将信号量的值减1.
  2. 判断信号量的值是否小于0, 是则阻塞当前进程, 否则当前进程扔可继续运行.(具体的阻塞细节: 2.1 该进程状态设置为阻塞态. 2.2 将该进程插入相应的等待对列s.queue末尾. 2.3CPU重新调度)

P的总结(掌握):

所以P操作, 即semWait具有阻塞进程的能力.P操作之后的代码"具备"阻塞能力.

V(s) {

s.count ++;

if (s.count < = 0)

{

  唤醒相应等待队列s.queue中等待的一个进程;

   改变其状态为就绪态,并将其插入就绪队列;

}

}

V(掌握):

主要做的也是两件事件: 1.将信号量加1. 2.判断信号量的值是否是<= 0, 是的话则表示当前进程已经出了临界区.唤醒等待对列s.queue中的等待的一个进程, 改变其状态为就绪态,并将其添加到就绪对列, 等待CPU调度.

V的总结(掌握):

V操作也只有在出临界区后才调用. 所以V操作之后, 其之前的代码对于该进程就不具备阻塞能力.让当前进程不会再独占临界区.

一些概念(掌握)

critical resource(临界资源): 系统中的某些资源只允许一个进程使用, 这样的资源称为临界资源.或互斥资源, 或共享变量.

critical section/region(临界区): 各个进程中对某个临界资源(共享变量)实施操作的代码段.

2.3 iOS中的买卖票例子(掌握)

//
// ViewController.m
// 02-线程安全01-购票例子
//
// Created by sixleaves on 15/10/18.
// Copyright © 2015年 sixleaves. All rights reserved.
// #import "ViewController.h" @interface ViewController () @property (nonatomic, strong) NSThread * thread01;
@property (nonatomic, strong) NSThread * thread02;
@property (nonatomic, strong) NSThread * thread03; @property (nonatomic, assign) NSInteger ticketCount; @property (nonatomic, strong) dispatch_semaphore_t sema;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; self.thread01 = [[NSThread alloc] initWithTarget:self selector:@selector(buy:) object:nil];
self.thread02 = [[NSThread alloc] initWithTarget:self selector:@selector(buy:) object:nil];
self.thread03 = [[NSThread alloc] initWithTarget:self selector:@selector(buy:) object:nil]; self.ticketCount = 1000; // 初始化
self.sema = dispatch_semaphore_create(1); } - (void)buy:(NSInteger)number { // 多线程同时操作票数, 造成的数据错乱问题.
// 解决方式: 1.加锁 2.用信号量
while (1) { // P操作
dispatch_semaphore_wait(self.sema, DISPATCH_TIME_FOREVER); // 1.拿到票数
NSUInteger resetTicket = self.ticketCount; // 2.判断票是否买完
if (resetTicket > 0) { // 没卖完, 则继续卖. // 逗号表达式, 从左向右算, 取最后一个的值为表达式值
NSLog(@"还剩下%ld张 ,买出一张票, 还剩下%ld张.", resetTicket--, resetTicket);
self.ticketCount = resetTicket; } else { NSLog(@"票买完了");
break;
} // V操作
dispatch_semaphore_signal(self.sema); }
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { if (!([self.thread01 isExecuting] || [self.thread02 isExecuting] || [self.thread03 isExecuting])) { [self.thread01 start];
[self.thread02 start];
[self.thread03 start];
}
} @end

C5-信号量与PV操作(iOS篇-细说信号量)的更多相关文章

  1. Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)

    本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ...

  2. 信号量与PV操作

    在计算机操作系统中,PV操作是进程管理中的难点.首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:    P(S):①将信号量S的 ...

  3. Pintos修改优先级捐赠、嵌套捐赠、锁的获得与释放、信号量及PV操作

    Pintos修改优先级捐赠.嵌套捐赠.锁的获得与释放.信号量及PV操作 原有的优先级更改的情况下面没有考虑到捐赠的情况,仅仅只是改变更改了当前线程的优先级,更别说恢复原本优先级了,所以不能通过任何有关 ...

  4. 信号量和PV操作写出Bakery算法的同步程序

    面包店烹制面包及蛋糕,由n个销售员卖出.当有顾客进店购买面包或蛋糕时,应先在取号机上取号,然后等待叫号,若有销售员空闲时便叫下一号,试用信号量和PV操作写出Bakery算法的同步程序. 设计要求 1) ...

  5. 转 信号量与PV操作

    在计算机操作系统中,PV操作是进程管理中的难点.首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:    P(S):①将信号量S的 ...

  6. 用信号量及其PV操作处理实际问题

    43.现有3个生产者P1.P2.P3,他们都要生产橘子汁,每个生产者都已分别购得两种不同的原料,待购齐第三种原料后就可配制成橘子汁装瓶出售.有一供应商能源源不断的供应糖.水.橘子精,但每次只拿出一种原 ...

  7. Operating System-进程/线程内部通信-信号量和PV操作

    本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能 ...

  8. 整型信号量和PV操作(计算机操作系统)

    在整型信号量机制中,信号量被定义为一个整形变量.除初始化外,仅能通过两个标准的原子操作Wait(S)和Signal(S)来访问.其通常分别被称为P.V操作. 描述如下: P操作:S=S-1:如果S小于 ...

  9. 【转】进程同步之信号量机制(pv操作)及三个经典同步问题

    原文地址:http://blog.csdn.net/speedme/article/details/17597373 上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源 ...

随机推荐

  1. euctb

  2. POJ 1322 Chocolate

    Chocolate Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8245   Accepted: 2186   Speci ...

  3. UVA 10198 Counting

    Counting The Problem Gustavo knows how to count, but he is now learning how write numbers. As he is ...

  4. Qt 图形特效(Graphics Effect)介绍

    原文链接:Qt 图形特效(Graphics Effect)介绍 QGraphicsEffect也是Qt-4.6引入的一个新功能.它让给图形元素QGraphicsItem增加更佳视觉效果的编程变得非常简 ...

  5. 网络测试工具netperf

    Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求 ...

  6. Hadoop集群运行JNI程序

    要在Hadoop集群运行上运行JNI程序,首先要在单机上调试程序直到可以正确运行JNI程序,之后移植到Hadoop集群就是水到渠成的事情. Hadoop运行程序的方式是通过jar包,所以我们需要将所有 ...

  7. 深入解析MySQL replication协议

    Why 最开始的时候,go-mysql只是简单的抽象mixer的代码,提供一个基本的mysql driver以及proxy framework,但做到后面,笔者突然觉得,既然研究了这么久mysql c ...

  8. 第一次用IIS发布网站时遇到的两个问题

    1.  配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的属性“targetFramework”.请注意属性 ...

  9. edmx文件

    MethodBase 提供有关方法的信息 在System.Reflector命名空间之下 edmx edmx:Runtime节点下包含与EF有关的定义与映射信息 edmx:ConceptualMode ...

  10. poj1094 topsort

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32275   Accepted: 11 ...