一:进程
正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间
线程
线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行
优势
充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入“并行运算”状态 将耗时的任务分配到其他线程执行,由主线程负责统一更新界面会使应用程序更加流畅,用户体验更好 当硬件处理器的数量增加,程序会运行更快,而程序无需做任何调整
弊端 新建线程会消耗内存空间和CPU时间,线程太多会降低系统的运行性能
误区 多线程技术是为了并发执行多项任务,不会提高单个算法本身的执行效率
注:多线程实现的几种方式,在之前随笔中
二:GCD基本思想
1)GCD的基本思想是就将操作s放在队列s中去执行 操作使用Blocks定义 队列负责调度任务执行所在的线程以及具体的执行时间 队列的特点是先进先出(FIFO)的,新添加至对列的操作都会排在队尾
2)提示 GCD的函数都是以dispatch(分派、调度)开头的 队列 dispatch_queue_t 串行队列,队列中的任务只会顺序执行 并行队列,队列中的任务通常会并发执行
3)操作 dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序 dispatch_sync 同步操作,会依次顺序执行,能够决定任务的执行顺序
三:GCD内部怎么实现的(简述)
1> iOS和OS X的核心是XNU内核,GCD是基于XNU内核实现的
2> GCD的API全部在libdispatch库中
3> GCD的底层实现主要有Dispatch Queue和Dispatch Source
Dispatch Queue :管理block(操作)
Dispatch Source :处理事件
四:操作
不同队列中嵌套dispatch_sync的结果
// 全局队列,都在主线程上执行,不会死锁 dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 并行队列,都在主线程上执行,不会死锁 dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", DISPATCH_QUEUE_CONCURRENT);
// 串行队列,会死锁,但是会执行嵌套同步操作之前的代码
dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", DISPATCH_QUEUE_SERIAL);
// 直接死锁
dispatch_queue_t q = dispatch_get_main_queue();
dispatch_sync(q, ^{
NSLog(@"同步任务 %@", [NSThread currentThread]);
dispatch_sync(q, ^{ NSLog(@"同步任务 %@", [NSThread currentThread]);
});
});
五:GCD队列示意图
总结:
- 串行队列,同步任务,不需要新建线程
- 串行队列,异步任务,需要一个子线程,线程的创建和回收不需要程序员参与! “是最安全的一个选择”串行队列只能创建!
- 并行队列,同步任务,不需要创建线程
- 并行队列,异步任务,有多少个任务,就开N个线程执行
- 无论什么队列和什么任务,线程的创建和回收不需要程序员参与。 线程的创建回收工作是由队列负责的
- “并发”编程,为了让程序员从负责的线程控制中解脱出来!只需要面对队列和任务!
-
GCD在后端管理着一个线程池,GCD不仅决定着代码块将在哪个线程被执行,它还根据可用的系统资源对这些线程进行管理。通过集中的管理线程,缓解大量线程被创建的问题
-
使用GCD,开发者可以将工作考虑为一个队列,而不是一堆线程,这种并行的抽象模型更容易掌握和使用
提示:不建议使用不同优先级的队列,因为如果设计不当,可能会出现优先级反转,即低优先级的操作阻塞高优先级的操作