iOS GCD见解之系列一
最近在回顾多线程,现将最近整理的关于GCD的笔记整理出来,然后加上个人的见解。发布如下,如有错误,望指出!
线程:线程就是一个需要管理执行代码的内核级和应用级数据结构组合。内核级结构协助调度线程事件,并抢占式调度一个线程到可用的内核之上。应用级结构包括用于存储函数调用的调用堆栈和应用程序需要管理和操作线程属性和状态的结构。
多线程:多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径。(多线程的底层实现机制是Mach的线程)
多线程的优点:
- 多个线程可以提高应用程序的感知响应。
- 多个线程可以提高应用程序在多核系统上的实时性能。
多线程的缺点:
- 应用程序内拥有多个可执行路径,会给你的代码增加更多的复杂性。
- 每个线程需要和其他线程协调其行为,以防止它破坏应用程序的状态信息。因为应用程序内的多个线程共享内存空间,它们访问相同的数据结构。如果两个线程试图同时处理相同的数据结构,一个线程有可能覆盖另外线程的改动导致破坏该数据结构。
线程状态:
截图.png.jpeg
相关术语:
同步(synchronous):不具备开启线程的功能,只能在当前线程中执行任务。同时具有阻塞当前线程的作用,直到当前任务执行完毕。
备注1:dispatch_sync 派发的block的执行线程和 dispatch_sync 上下文线程是同一个线程;
备注2:由于dispatch_sync需要等待block被执行,这就非常容易发生死锁。如果一个串行队列,使用dispatch_sync提交block到自己队列中,就会发生死锁
异步(asynchronous):具备开启线程的功能,不用等待当前任务执行完毕,就可执行下个任务。
备注:dispatch_async 派发的block的执行线程和 dispatch_async 上下文线程不是同一个线程,主队列 下异步任务还是在主队列下执行;
并行队列(Concurrent Dispatch Queue):可以让多个任务并行(同时)执行(自动开启多个线程同时执行任务)并行功能只有在异步(dispatch_async)函数下才有效.
备注:并行队列可以同时执行多个任务,系统会维护一个线程池来保证并行队列的执行。线程池会根据当前任务量自行安排线程的数量,以确保任务尽快执行。
串行队列(Serial Dispatch Queue):让任务一个接着一个地执行(一个任务执行完毕后,再执行下一个任务)