进程:也就是一个正在运行的应用程序。
线程:进程中的某一条完整的执行路径。一个进程可以有多个线程,至少有一个线程,即主线程。在iOS开发中,所有涉及UI界面的,必须在主线程中更新。(我个人理解线程就是一个可以独立运行的代码块)
线程,是执行程序最基本的单元,它有自己栈和寄存器。说得再具体一些,线程就是“一个CPU执行的一条无分叉的命令列”。
苹果官方给出的解释:GCD是异步执行任务的技术之一
为什么使用多线程:新开一个线程,能提高速度,避免阻塞主线程
同步与异步
同步方法就是我们平时调用的哪些方法。因为任何有编程经验的人都知道,比如在第一行调用foo()方法,那么程序运行到第二行的时候,foo方法肯定是执行完了。
所谓的异步,就是允许在执行某一个任务时,函数立刻返回,但是真正要执行的任务稍后完成。
比如我们在点击保存按钮之后,要先把数据写到磁盘,然后更新UI。同步方法就是等到数据保存完再更新UI,而异步则是立刻从保存数据的方法返回并向后执行代码,同时真正用来保存数据的指令将在稍后执行。
对于同步执行的三个任务来说,系统倾向于在同一个线程里执行它们。因为即使开了三个线程,也得等他们分别在各自的线程中完成。并不能减少总的处理时间,反而徒增了线程切换(
对于异步执行的三个任务来说,系统倾向于在多个新的线程里执行他们。因为这样可以最大程度的利用CPU性能,提升程序运行效率。
GCD简介
GCD以block为基本单位,一个block中的代码可以为一个任务。下文中提到任务,可以理解为执行某个block
同时,GCD中有两大最重要的概念,分别是“队列”和“执行方式”。
使用block的过程,概括来说就是把block放进合适的队列,并选择合适的执行方式去执行block的过程。
队列总的来说可以分为三种:
串行队列(先进入队列的任务先出队列,每次只执行一个任务)串行(Serial)
并发队列(依然是“先入先出”,不过可以形成多个任务并发)并发(Concurrent)
主队列(这是一个特殊的串行队列,而且队列中的任务一定会在主线程中执行)
两种基本的执行方式
同步(Synchronous)与 异步 (Asynchronous)
同步执行只能在当前线程中执行任务,不具备开启新线程的能力,任务立刻马上执行block,会阻塞当前线程并等待 Block中的任务执行完毕,然后当前线程才会继续往下运行
异步执行可以在新的线程中执行任务,具备开启新线程的能力,但不一定会开新线程,当前线程会直接返回往下一条指令执行,只有在调用block的地方才执行block(block的调用时机由系统决定),不会阻塞当前线程
GCD常见的一种简单使用
队列
串型队列 前面的线程执行完毕才会执行后面的线程 并行队列 前面加入的线程和后面加入的线程同时执行
常见的GCD类型
栏栅作用 dispatch_barrier_async
代码在一段时间后执行
代码只执行一次(单利模式也是用的这个)
多次执行相同的代码
GCD的死锁
参考文献:iOS开发:深入理解GCD 第一篇 - 紫忆 - 博客园