Concurrency and Application Design(并发和程序设计)

在早期的计算中,每个时间单元能做的最大工作的数量取决于CPU时钟的速度。但随着技术进步和处理器设计越来越紧凑,温度和其他物理限制开始限制处理器时钟的速度。因此,芯片制造寻找另外的途径来提高芯片的总体性能。通过增加核的数量,一片芯片不需要提高CPU的速度,改变芯片大小或提高耐温特性等,就可以在每秒执行更多的指令。唯一的问题是如何利用多出的核的优势。

为了利用多核的优势,一台计算机需要在软件能同时做多个事情。现在流行的,如OS X or iOS这样的多任务操作系统,在任意时间都有可能达到一百或更多个进程,因此分配每个进程到不同的核是可能的。然而,大部分进程是守护进程或应用程序的后台进程,他们只消耗很少的时间。因此,我们真正需要的是如何在每个独立的app中让多核运行更加高效。

一个app使用多核的传统方式是创建多线程。然而,随着核数量的增多,这种方案会引起问题。最大的问题是这些线程代码不能很好的根据核的数量来调整。你无法创建跟核数量一样数量的线程数,因此无法期望一个进程工作良好。What you would need to know is the number of cores that can be used efficiently, which is a challenging thing for an application to compute on its own. Even if you manage to get the numbers correct, there is still the challenge of programming for so many threads, of making them run efficiently, and of keeping them from interfering with one another.

因此,总结这个问题,我们需要一种方式能发挥不同核数目的计算机的优势。一个单一的app的工作的数量也需要根据系统条件变化来做调整。解决的方案很简单,不过就是不要增加工作的数目来发挥多核的优势。好消息是Apple的操作系统提供所有问题的解决方案,这个章节对这些技术进行一次浏览。

The Move Away from Threads

虽然线程编程已经有好多年并会持续使用,但他们并没有解决动态调整多任务的这个普遍问题。使用了多线程编程,创建可调整的方案的重任落在你的肩上。你必须决定该创建多少线程,并根据系统条件变化动态调整。另一个问题是你的程序必须考虑创建和维持这些线程的开销。

替代依赖threads,OS X and iOS使用一个asynchronous design approach来解决并发问题。Asynchronous functions已经出现在操作系统上很多年了,它用来初始化那些可能很耗时的任务,如从disk中读取数据。当asynchronous function被调用时,在当前场景背后会开始运行任务,但它会马上返回,并不会等待任务真正结束。典型地,这个工作需要一个后台线程,在该线程中开始任务,并在任务完成时给调用者发送通知。在过去,如果不存在你需要的asynchronous function,你必须自己实现它并创建你的线程。但现在,OS X and iOS提供相应技术,允许你不需要手动创建线程就可以执行异步操作。

其中一种开始异步任务的技术叫Grand Central Dispatch (GCD)。该技术将你之前写的线程管理代码移到操作系统底层。你只需要定义你的任务并把它们添加到合适的dispatch queue中就可以了。GCD小心的创建需要的线程并将你的任务分发到这些线程上。因为线程管理是操作系统的一部分,GCD提供了任务管理的全局方法,比传统线程编程方法更高效。

Operation queues是OC对象,它很像dispatch queues。你定义你想要执行的任务,并将它们添加到一个operation queue中,operation queue会分发并执行这些任务。跟GCD一样,operation queues处理所有的线程管理,确保任务在你的系统上快且高效的执行。

The following sections provide more information about dispatch queues, operation queues, and some other related asynchronous technologies you can use in your applications.

Dispatch Queues

Dispatch queues是基于C语言来执行定制的任务的。一个dispatch queue无论串行还是并行执行任务,它总是按先进先出的顺序执行的。一个串行dispatch queue在一个时间只运行一个任务,直到该任务完成并出队后才开始一个新的任务。相反,一个并行dispatch queue不需要等待已经开始的任务的完成就会执行他能开始的任务。

Dispatch queues还有其他好处:
(1)他们提供一个直观简单的编程接口;
(2)他们提供自动和全面的线程池管理;
(3)他们提供协调装配的速度?
(4)他们更加高效;
(5)他们不陷入内核底层加载;
(6)asynchronous dispatching of tasks不会死锁队列;
(7)他们会根据争夺资源的情况下做很好的调整;
(8)Serial dispatch queues offer a more efficient alternative to locks and other synchronization primitives.

你提交给a dispatch queue的任务必须封装在一个函数或一个block object中。Block objects是在OS X v10.6 and iOS 4.0引入的,它具有C语言特色,在概念上类似函数指针,但有一些额外的优点。你一般不会把blocks定义在他们自己的词法范围内,而是把他们定义在function or method中以便访问function or method中的变量。blocks也可以从他们原来的位置移出兵拷贝到堆中,这发生在你提交他们到一个dispatch queue的时候。所有这些语义让使用相对更少的代码实现动态的任务成为可能。

Dispatch queues are part of the Grand Central Dispatch technology and are part of the C runtime. For more information about using dispatch queues in your applications, see Dispatch Queues.

Dispatch Sources

Dispatch Sources是基于C语言的用来处理系统异步事件的机制。当某个事件发生时,一个dispatch source封装了一个特定的系统事件的信息并提交给定义好的block object or function给一个dispatch queue。You can use dispatch sources to monitor the following types of system events:

  1. Timers
  2. Signal handlers
  3. Descriptor-related events
  4. Process-related events
  5. Mach port events
  6. Custom events that you trigger

Dispatch sources are part of the Grand Central Dispatch technology. For information about using dispatch sources to receive events in your application, see Dispatch Sources.

Operation Queues

一个operation queue在Cocoa框架中等价于concurrent dispatch queue,它通过 NSOperationQueue class来实现。鉴于dispatch queues经常以先进先出顺序执行任务,operation queues在决定执行任务的顺序时考虑了其他因素。主要考虑的因素是一个任务是否依赖其他任务的完成。你在定义你的任务时配置这些依赖性,这样可以对你的任务创建复杂的执行顺序。

你提交给operation queue的任务必须实例化为NSOperation class。一个operation object是一个Objective-C object,它封装你想要执行的工作和任何数据。因为NSOperation class是一个抽象类,你一般需要定义它的子类来执行你的任务。然而,Foundation framework包含了一些具体的子类,你可以创建和使用它们。

Operation objects会生成key-value observing (KVO) notifications,它们是监测你任务的有效方式。虽然operation queues经常并行执行操作,但你可以配置依赖性来让他们串行运行。

For more information about how to use operation queues, and how to define custom operation objects, see Operation Queues.

Asynchronous Design Techniques
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值