Concurrency之Introduce

并发也就是为了达到在同一时间点有两个任务在执行。现在的操作系统都有并发能力,即使它只有一个cup。cup通过给每个任务一个确定的轮轴时间片来实现这种能力。
然而,现在的科技能让我们有两个cup,这也就意味着我们能真正做到两个任务同时执行。简单来说,操作系统就会把任务分给cup,直到它处理完成。
大中央调度(Grand Central Dispatch),简称GCD,它是使用C语言实现的,里面有很多的回调对象。使用GCD给操作系统的多核分配任务,在编程中你不需要了解是哪一个内核在执行哪一个任务。
GCD的核心是调度队列。在当下流行的操作系统中,调度队列就是被GCD管理的线程池,无论是ios还是MAC操作系统。你不会直接接触到这些线程的工作,你只需要对这些调度队列进行操作,分配任务到这些队列,并要求队列调用你分配的这些任务。GCD提供了一些操作用来处理正在运行的任务:synchronously,asynchronously,after a certin delay,等等……
你如果要在你的app中使用GCD,你不需要导入任何特殊的第三方库。苹果已经在不同的框架中引入了GCD,包括Core Foundation 、Cocoa/Cocoa Touch.所有GCD中的方法和数据类型都以“dispatch_”关键字开始,例如dispatch_async是用来分配一个任务到异步队列中;dispatch_after是用来运行一个回调实现一个延时。
有三种调度队列:

Main queue:主队列
这种队列是把其队列中的所有任务都放在主线程中去执行,它和Cocoa和Cocoa Touch要求所有的UI操作都需要在主线程上操作有关联。用dispatch_get_main_queue 函数来获取主队列。
Concurrent queues:并行队列
你可以从GCD申请这些队列来执行同步或异步任务。多个并发队列可以不费吹灰之力的并行执行多个任务。它不需要更多的线程管理。用dispatch_get_global_queue 函数来获取一个并发队列。
Serial queues:串行队列
这些队列是,无论你提交了多少同步或异步的任务给它,它都会按照FIFO的顺序来执行这些任务,也就是你在一个时刻只能执行一个任务。但是这些任务不是运行在主线程上,而是运行在费主线程上,并且按照严格的执行顺序来执行。用dispatch_queue_create 函数来创建一个串行队列。

有两种方法来提交任务给队列:
1. Block objects
2. C founctions
Block对象是利用GCD巨大能量的最好方式。有一些GCD的函数曾经被利用C语言代理block对象进行扩展。所以仅仅只是少数的GCD函数允许使用C函数来实现。

Cocoa提供了三种不同类型的操作:
Block operations:它方便执行单个对象,或多个block对象。
Invocation operations:它可以让你在一个方法中调用另一个方法和当前存在的对象。
Plain operations:普通操作,这些都是需要进行简单的子类化操作的类。要执行的代码将被写入操作对象的主方法内。

Operations,正如前面提到的,可以被operation queues管理,其数据类型是NSOperationQueue. 实例化任何刚刚提到过的operation(Block operations、Invocation operations、Plan operations)后,你就可以添加它们到一个operation queue中,并让这个queue来管理这些操作。
一个operation object可以依赖其它的operation objects并且可以在执行与它相关联的operation之前等待完成一个或多个operations.。除非你自己手动添加依赖,你对这些operations的执行顺序没有控制权。举例来说,即使你以一个确定的顺序添加这些operations,但是在执行的时候也不一定按照你添加的顺序,执行顺序完全取决于它们的queue。

在操作operation queues和operations时,有以下几点一定要记住:

  • Operations(多任务),默认情况下,运行在一个线程上启动它们,利用它开始初始化方法。如果你想让这些operations异步工作,你必须使用operations queue或者是NSOperations的子类来创建一个新的线程在一个主要的实例化操作上。
  • 一个operation可以等待另一个operation执行完成后启动,但是一定要注意不要创建一个相互依赖的死锁错误。
  • operations是可以被取消的,如果你有NSOperation子类来创建自定义操作对象,你必须确保使用isCancelled实例方法检查是否执行与操作相关的任务之前的操作已经被取消。
  • operation objects是KVO兼容不同操作路径,例如isFinished、isReady、isExecuting.
  • 如果你计划使用NSOperation的子类并来实现一个operation,你必须创建一个你自己的autorelease pool在operation的开始方法中。
  • 一定要保持reference在你创建的operation objects. Theconcurrentnature of operation queues might make it impossible for you to retrieve a reference to an operation after it has been added to the queue. 


你可能感兴趣的:(并发,操作系统,C语言)