一.概述

二.核心

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. bzoj1047-理想的正方形(二维单调队列)

    题意: 给一个矩阵,给出行列和每个数,再给出一个N,求出所有N*N的子矩阵中最大值最小值之差的最小值解析: 暴力枚举肯定不行,这题可以用二维单调队列做,把同一行的连续N个点缩成一个点保存最大最小值预处 ...

  2. android图标设计事宜

    1.Launcher图标 图标的最佳宽高是48x48 dp. ldpi:36*36px,0.75倍密度,一般不用提供,系统会从hdpi取图缩小1倍. mdpi:48*48px, 1倍密度 hdpi:7 ...

  3. 论 <%@taglib prefix="s" uri="/struts-tags" %> 的重要性

    前段时间在做项目的时候,碰到这个问题 结果是相应的内容显示不出来,原来是忘了这句很关键的引入:<%@taglib prefix="s" uri="/struts-t ...

  4. poj 3692 Kindergarten (最大独立集之逆匹配)

    Description In a kindergarten, there are a lot of kids. All girls of the kids know each other and al ...

  5. AVR32开发环境搭建

    下面是搭建AVR32开发环境的过程记录: 1.AVR32的编译环境下载  (到这里下载  as5installer-stable-5.1.208-full.exe) 如果你在安装的过程中碰到如下问题: ...

  6. HDU 1027 Ignatius and the Princess II 选择序列题解

    直接选择序列的方法解本题,可是最坏时间效率是O(n*n),故此不能达到0MS. 使用删除优化,那么就能够达到0MS了. 删除优化就是当须要删除数组中的元素为第一个元素的时候,那么就直接移动数组的头指针 ...

  7. Java清洁:终结处理和垃圾回收

    一般情况:Java有垃圾回收机制负责回收无用对象占据的内存资源. 特殊情况:假定你的对象(并非使用new)获得一块特殊的内存区域,由于垃圾回收器只知道释放那些经由new分配的内存,所以它不知道如何释放 ...

  8. Tomcat 原理篇

    TOMCAT 原理篇一.Tomcat 组成(Tomcat 由以下组件组成) 1.server a) Server是一个Catalina Servlet容器: b) Server 可以包含一个或多个se ...

  9. ASP.NET MVC4 + Highcharts生成报表

    //后端 public ActionResult TighteningReport(BReportTighteningReportModel model, string rate, string we ...

  10. Hadoop高可用平台搭建

    文章概览: 1.机器规划和预配置 2.软件安装 3.集群文件配置 4.启动集群 5.HA验证 6.注意事项 7.小结   机器规划和预配置 主机/进程 NN DN RM NM ZK(QP) ZKFC ...