美文网首页
并发编程01

并发编程01

作者: 秋水天的练功房 | 来源:发表于2017-12-03 15:45 被阅读0次
  • 并发就是各种事情同时发生。随着多核CPU的扩散,软件开发需要新的方式使用。

  • 过去,引入并发需要创建传统的线程。不幸的是,写线程代码非常麻烦。线程是低层次的工具,需要自己手动管理。给一个应用理想的线程。虽然可以并发运行多个程序,但是大部分程序是后台运行的,需要很少的处理器资源。如果前台只保持一个核线程在跑,其他不管,那么很浪费。

  • iOS提供了更多更多方式执行并发任务,比传统的基于线程的方式。并不是直接创建线程。程序只要创建他们,让系统执行他们。让系统管理线程。应用达到一个可伸缩性的级别,而不是原始的线程。应用开发者也有简单有效的开发模式。自己直接用线程的话,很难匹配器恰当的算法有效利用CPU资源,另外,太多的线程也是不好管的。

  • 并发和程序设计:介绍基本的异步程序设计。
    Opreation Queue:介绍怎样使用OC封装和执行任务
    Dispatch Queue:介绍怎么样执行并发基于C的任务。
    Dispatch Source:介绍怎样异步处理系统事件
    从线程中迁移出来:线程迁移出来。

  • 线程用了很多年,而且将继续用下去。但没有解决一个问题:执行多任务的可伸缩性。程序员要自己管伸缩性。根据不同情况决定开多少个线程。另一个问题是,你的程序假设你的大部分开销是创建和维护任意线程。

  • iOS采用异步设计方式(asynchronous design approach)解决并发问题。异步函数在操作系统中存在很多年了。用在要花费很多时间的异步任务上。异步处理就是在后台执行,先返回。等任务真正完成了再回调。异步函数如果没有你满足的功能的话,通常要自己写这个过程。

  • 一个开始异步启动任务的技术是GCD,把通常在应用程序中你要写的线程管理的代码下放到系统底层。应用层就只需要关心自己的任务并且放到恰当的queue中。GCD创建恰当的线程,并且放到线程中执行。因为线程管理是系统的一部分,GCD对任务的执行和管理提供了整体的方法,比传统的线程有更高的效率。

  • Operation queue是个OC对象,和dispatch queue很类似。也帮你处理所有的线程管理。保证在系统上快速高效地完成任务。

  • Dispatch Queue 是C机制执行任务。或者是线性执行或者是并行执行。经常是先进先出顺序(队列)。线性队列一次就执行一个任务,任务结束后,才启动下一任务。并行队列一次尽可能启动多的任务。不等待已启动的任务完成。

  • dispatch queue还有其他的好处。
    提供了直接简单的程序接口
    提供了自动的,全局的线程池管理
    提供了速度优化
    内存利用率更高。线程栈不在Application的内存空间中。
    加载的时候,不会陷入内核
    向一个dispatch queue分发任务不会导致死锁。
    根据条件的可伸缩性非常优雅。
    线性的dispatch queue提供了更好的方法来锁和同步源。

  • 你要派发的任务必须包含在函数或者block块中,block也是C语言特性,类似函数指针的东西。还有其他的好处。在block的语法块内,可以访问环境变量,还可以从他的作用域移动到全局范围(堆上)。所有的语法让他非常容易用很少的代码实现动态任务。

  • Dispatch source 也是基于C的机制。处理特殊类型的系统事件。dispatch source包含了特殊系统事件的信息,当系统事件发生的时候,提交特殊的block对象或函数到一个dispatch queue.可以用dispatch source监控以下的系统事件。
    时间
    信号处理
    描述符相关的事件
    进度相关的事件
    Match port事件
    自定义和触发的事件

  • Operation queue 是Cocoas层相关的处理并发的。用NSOpreationQueue实现。dispatch queue是先进先出的队列方式,Operation queue考虑其他因素决定执行的顺序。这些因素主要是任务是否依赖于其他任务。在定义的时候配置依赖,可以得到一个复杂的执行顺序图。

  • 提交到Operation Queue的必须是NSOpreation的实例。NSOperation类是抽象类,需要定义自己的子类从而定义自己的任务。系统也定义一些已经子类化的类。

  • Operation定义好了KVO的通知,是一个非常有用的方式监控任务进程。虽然Opreation Queue经常是并发执行。你也可以利用依赖来定义成顺序执行。

  • 异步设计技术。当你准备重构你的并发部分时,先问问这么做是否有必要。并发能改善你的代码的响应能力,保证主线程能自由的响应用户事件。甚至能改善你的代码效率。当然也增加复杂度。很难调试。

  • 正是因为增加了复杂度,并发并不是你能在应用的生命周期末期增加的特性。做好它,需要小心考虑你的程序要执行的任务以及完成任务的数据结构。做错了就会发现你的程序会比以前运行的更慢了。因此,在一开始设计的时候花时间好好考虑是非常有必要的。设计一些目标,考虑一些你要采取的方法。每个程序有每个程序的特点,没有统一标准,但是有一些建议

  • 定义好你期待的的程序的行为。定义期待的行为,让你有方式校验你的设计。也会给你一些期待的在引入并发后,性能收益的想法。

相关文章

网友评论

      本文标题:并发编程01

      本文链接:https://www.haomeiwen.com/subject/apbabxtx.html