美文网首页
wwdc2017/706-GCD 的现代化应用

wwdc2017/706-GCD 的现代化应用

作者: 陈_振 | 来源:发表于2018-11-19 21:27 被阅读0次

    总结自:

    字节跳动-GCD 的现代化应用

    收获一

    并行(Parallelism)和并发(concurrency)
    概念
    并行是 CPU 的多核心同时执行多个任务,并发是 CPU 的单核心交替执行两个任务。 并行永远指的一个以上的处理器同时处理多个事情。

    以 iPhone7 处理器 A10 为例, A10 处理器是双核单 CPU,却不是双核双 CPU,

    Why?

    多个单核 CPU,那么每一个 CPU 都需要有较为独立的电路支持,有自己的 Cache,而他们之间通过板上的总线进行通信。假如在这样的架构上,我们要跑一个多线程的程序(常见典型情况),不考虑超线程,那么每一个线程就要跑在一个独立的 CPU 上,线程间的所有协作都要走总线,而共享的数据更是有可能要在好几个 Cache 里同时存在。这样的话,总线开销相比较而言是很大的,怎么办?那么多 Cache,即使我们不心疼存储能力的浪费,一致性怎么保证?如果真正做出来,还要在主板上占多块地盘,给布局布线带来更大的挑战,怎么搞定?

    如果我们选择多核单 CPU,那么我们只需要一套芯片组,一套存储,多核之间通过芯片内部总线进行通信,共享使用内存。在这样的架构上,如果我们跑一个多线程的程序,那么线程间通信将比上一种情形更快。如果最终实现出来,对板上空间的占用较小,布局布线的压力也较小。

    这也解释了 iPhone 上的处理器都是多核单 CPU 的。

    并行的任务通常是一组紧密相关又彼此独立的的计算任务,考虑下面的场景,图片实现一个碎片后向四周发散的效果,那么每2个图片直接的移动是彼此独立的,但所有的图片加起来又为了实现一个共同的动画效果, 这就可以充分利用多核并行进行。

    收获二:

    各种锁:

    • NSLock 最基本的互斥锁
    • NSRecursiveLock 递归锁,可以被一个线程多次获得,而不会引起死锁。
    • NSCondition 条件,包含一个锁和一个线程检查器。
    • NSConditionLock 条件锁, 不需要检查器,条件锁自带一个探测条件,是否满足
    • pthread_mutex POSIX 互斥锁是一种超级易用的互斥锁,比较熟悉用的较多。
    • pthread_rwlock 读写锁,在对文件进行操作的时候,写操作是排他的,一旦有多个线程对同一个文件进行写操作,后果不可估量,但读是可以的,多个线程读取时没有问题的
    • OSSpinLock 自旋锁,和互斥锁类似,都是为了保证线程安全的锁。但二者的区别是不一样的,对于互斥锁,当一个线程获得这个锁之后,其他想要获得此锁的线程将会被阻塞,直到该锁被释放。但自旋锁不一样,当一个线程获得锁之后,其他线程将会一直循环在哪里查看是否该锁被释放。
    • osunfairlock apple为了解决优先级反转提供的锁,下面会单独讲一下。
      dispatch_semaphore 信号量机制实现锁. 用的也是比较多的。
    • @synchronized 一个便捷的创建互斥锁的方式,它做了其他互斥锁所做的所有的事情。性能堪忧。

    锁的拥有者: 像 pthreadmutex,osunfairlock,锁住的资源同时只能被一个线程拥有,其他都需等待。而像信号量(dispatchsemaphore),条件(nscondition)锁住的资源并不归属某个线程拥有,满足了条件的线程会被允许通过,read 或 write 资源。而像 pthread_rwlock,可能有多个线程同时拥有这个共享资源的读权限。

    收获三:

    SerialQueue的特点:

    • 互斥(Mutual exclusion), 队列内不存在2个任务同时执行
    • 队列存储(FIFO ordered),先进先出(执行)
    • 入队是原子操作级别(Concurrent atomic enqueue) 避免乱序
    • 逐个出队执行(Single dequeuer)

    收获四:

    慎用 global queue
    我们在开发中经常的一种做法是把任务交给 global queue,譬如数据下载任务和数据存储任务都放在 global queue 里。有时候优先级也是一样的, 但有一个任务 block 的时候,更多的线程被创建,甚至导致线程爆炸。其实更好的做法是 One Queue Hierarchy per Subsystem。 即每一类任务有一个串行队列。
    例如:

    • User Interface -- Main Queue
    • Networking -- Serial Queue
    • Database -- Serial Queue

    相关文章

      网友评论

          本文标题:wwdc2017/706-GCD 的现代化应用

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