一.概念
1.进程
进程:在系统正在运行的一个应用程序,比如同事打开微信和Xcode,系统会分别启动2个进程
每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
2.线程
一个进程要想执行任务,必须得有线程(每一个进程至少要有一个线程),是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位。
其实应用程序启动的时候我们的系统就会默认帮我的应用程序开启一条线程,这条线程就叫做“主线程”或者“UI线程”
3.进程和线程的关系
1.线程是进程的执行单元,进程的所含有任务都在线程中执行。
2.线程是CPU调用的最小单位
3.进程中CPU分配资源和调用的单位
4.一个程序可以对用多个进程,一个进程中可有多个线程,但至少有一个线程
5.同一个进程内的线程共享进程资源
4.多线程
概念:一个进程中可以开启多线程,每一个线程可以并行(同时)执行不同的任务
原理:同一时间,CPU只能处理一个线程,只有一条线程在工作,多线程并发(同时)执行,其实是CPU快速的在多条线程之间调度(切换),如果CPU会在N调度线程的时间足够快,就造成了多线程并发执行的假象。
注意:如果多线程很多,CPU会在N线程之间调度,会消耗大量CPU资源,每条线程被调度执行的频次会降低(线程的执行效率会降低);
5.主线程
一个iOS程序运行后,默认会开启1条线程。称为“主线程”或“UI线程”
作用:显示/刷新UI界面,处理UI事件(点击事件,滚动事件,拖拽事件)
使用注意:不要将耗时的操作放到主线程中,耗时操作应该放在子线程(后台线程,非主线程)凡是和UI相关的操作应放在主线程中操作。
6.同步
只能在当前线程按先后顺序依次执行,不开启新线程。
7.异步
可以再当前线程开启多个新线程执行,可不按顺序执行
同步和异步关注的是消息通信机制。具体说来,同事发出一个调用后,在没有得到结果之前,该调用不返回;而异步是发出一个调用后,直接返回,并不立刻得到结果。
例:
1.同步就是叫你去吃饭,你听到了不去,我一直等着,不停叫你去吃饭,知道你和我一起去吃饭。
2.异步就是叫你去吃饭了,我叫了你之后我去吃饭了,你该干什么干什么,可能好久之后才去吃饭。
8.多线程的优缺点
优点:能适当的提高程序的执行效率以及资源利用率(CPU、内存利用率)
缺点:创建线程是有开销的,iOS下主要成本包括:内核数据结构(1kb)、栈空间(子线程512kb,主线程1MB)、创建线程大约需要90毫秒的创建时间,如果开启大量的线程,会降低程序的性能(一般最多3到5个);线程越多,CPU在调用线程上的开销就越大;程序设计更加复杂(比如线程之间的通信、多线程的数据共享)
9.队列
装载线程任务的队形结构
10.并发
线程执行可以同时一起进行执行
11.串行
线程执行职能一次逐一先后有序的执行
二、iOS多线程对比
1.NSThread
每个NSThread对象对应一个线程,真正最原始的线程。
1.优点:NSThread轻量级最低,相对简单
2.缺点:手动管理所有的线程活动,如生命周期、线程同步、睡眠等。
2.NSOperation
自带线程管理的抽象类
1.优点:自带线程周期管理,操作上可更注重自己逻辑
2.缺点:面向对象的抽象类,只能实现它或者使用它定义好的两个子类:NSInvocationOperation 和 NSBlockOperation。
3.GCD
Grand Central Dispatch(GCD)是Apple开发的一个多核编程的解决方法。
1.优点:最高效,避开并发陷阱
2.缺点:基于C实现
4.选择小结
1.简单而安全的选择NSOperation实现多线程即可
2.处理大量并发数据,又追求性能效率的选择GCD
3.NSThread本人选择基本是在做小测试上使用。
网友评论