1.一些概念
进程就是相互隔离的、独立运行的程序。一个进程就是一个执行中的程序,而每个进程都有自己独立的一块内存空间和一组系统资源。
线程是轻量级的进程,就像进程一样,线程在程序中是独立的、并发执行的,每个线程都有它自己的局部变量。同一个进程中的多个线程之间共享相同的内存地址空间,这就意味着它们可以访问相同的变量和常量。
每个程序都至少有一个线程,这个线程就是主线程。当一个程序启动时,主线程被创建,主线程控制程序的主要流程,负责显示和更新UI,所有的UI元素的更新必须在主线程中进行。
2.选择NSTherad、NSOperation还是GCD
(1)NSTherad是传统的线程类,需要自己管理线程的生命周期、线程同步、加锁、睡眠及唤醒等。
(2)NSOperation是面向对象的高级别线程类,不需要自己管理线程。
(3)GCD是基于C语句级别的API,他提供了C函数。不需要自己管理线程,支持多核CPU处理。GCD是苹果重点推荐的并发技术,唯一的缺陷是它基于C语言的API。
3.GCD
在GCD中,有一个重要的概念,那就是派发队列(dispatch queue)。派发队列是一个对象,他可以接受任务,并将任务以先到先执行的顺序来执行。派发队列可以是并发的或串行的。并发队列可以执行多任务,串行队列同一时间只能执行单一任务。
三种类型的派发队列
串行队列 串行队列通常用于同步访问一个特定的资源,每次只能执行一个任务。使用函数dispatch_queue_create,可以创建串行队列。
并发队列 也称为全局派发队列,可以并发的执行一个或多个任务。当并发地执行多个任务时,必然涉及哪些任务先执行,哪些任务后执行的问题。在macOS 10.10 和IOS 8之前,是通过并发队列优先级决定的,而在macOS 10.10和IOS 8之后,则通过QoS(Quality of service)技术管理。使用dispatch_get_global_queue函数,可以创建并发队列。
主队列 它在应用程序的主线程中,用于更新UI。其他两个队列不能更新UI。使用dispatch_get_main_queue函数,可以获得主队列。
QoS技术
我们通过 QoS告诉操作系统并发队列如何工作,然后操作系统会通过合理的资源控制,从而以最高效的方式执行并发队列。这其中主要涉及CPU调度、IO操作优先级、任务执行在哪个线程以及执行的顺序等内容。
我们通过一个抽象的Quality of Service参数来表明任务的意图以及类别。
QsO提供NSQualityOfService(Swift版是QualityOfService)枚举类型,它有如下5个成员。
NSQualityOfServiceUserInteractive 与用户交互的任务,这些任务通常跟UI刷新有关,例如动画,它会在一瞬间完成。
NSQualityOfServiceUserInitiated 由用户发起的并且可以立即得到结果的任务。例如,翻动表视图时加载数据,然后显示单元格,这些任务通常跟后续的用户交互相关,会在几秒或者更短的时间完成。
NSQualityOfServiceUtility 一些耗时的任务,这些任务不会马上返回结果。例如下载任务,它可能花费几秒或者几分钟的时间。
NSQualityOfServiceBackground 这些任务对用户不可见,可以长时间在后台运行。
NSQualityOfServiceDefault 优先级介于NSQualityOfServiceUserInteractive 和NSQualityOfServiceUtility 之间。这个值是系统默认的。
网友评论