进程和线程
进程是指在系统中正在运行的一个应用程序, 每个进程之间是独立的, 每个进程均运行在其专用且受保护的内存空间内; 比如同时打开QQ、Xcode,系统就会分别启动2个进程, 通过“活动监视器”可以查看Mac系统中所开启的进程;
一个进程要想执行任务, 必须得有线程(每一个进程至少要有一条线程), 线程是进程的基本执行单元, 一个进程(程序)的所有任务都在线程中执行, 比如使用酷狗播放音乐, 使用迅雷下载电影, 都需要在线程中执行;
GCD
Grand Central Dispatch 简称GCD, 简单来说是Apple基于C语言开发的,用于多核并行运算的解决方案,主要用于以支持多核处理器以及其他对称多处理系统来优化应用程序, 会自动合理地利用更多的CPU内核(比如双核、四核),最重要的是它会自动管理线程的生命周期(创建线程、调度任务、销毁线程),完全不需要我们管理,我们只需要专注于干什么就行了。
GCD虽然使用的是C语言, 不过由于使用了Block(Swift里叫做闭包), 使得使用起来更加方便而且灵活。
任务和队列
在 GCD 中, 加入了两个非常重要的概念: 任务 和 队列。
任务: 即操作, 你想要干什么, 说白了就是一段代码, 在 GCD 中就是一个 Block,所以添加任务十分方便。
队列: 用于存放任务, 一共有两种队列, 串行队列 和 并行队列。
串行队列: 会根据队列的定义 FIFO(先进先出) 地取出来一个,执行一个,然后取下一个,这样一个一个的执行。
并行队列: GCD 也会 FIFO(先进先出) 的取出来, 但不同的是, 它取出来一个就会放到别的线程执行, 然后再取出来下一个又放到另一个的线程。这样由于取的动作很快, 忽略不计, 看起来所有的任务都是一起执行的。
需要注意的是, GCD 会根据系统资源控制并行的数量, 所以如果任务很多, 它并不会让所有任务同时执行。
同步异步
同步(sync): 会阻塞当前线程并等待 Block 中的任务执行完毕,然后当前线程才会继续往下运行。
异步(async): 开启新线程, 不会阻塞当前线程。
如图: