iOS--面试题:多线程

1a61ef6370470bf9b7e511605e304b28.webp

目录:

iOS--面试题:多线程(2)
iOS--面试题:多线程(结尾篇)web

1、进程、线程
1、 进程:面试

• 1.进程是一个具备必定独立功能的程序关于某次数据集合的一次运行活动,它是操做系统分配资源的基本单元.数据结构

• 2.进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,咱们能够理解为手机上的一个 app.多线程

• 3.每一个进程之间是独立的,每一个进程均运行在其专用且受保护的内存空间内,拥有独立运行所需的所有资源并发

2、 线程app

• 1.程序执行流的最小单元,线程是进程中的一个实体.异步

• 2.一个进程要想执行任务,必须至少有一条线程.应用程序启动的时候,系统会默认开启一条线程,async

也就是主线程ide

3、 进程和线程的关系函数

• 1.线程是进程的执行单元,进程的全部任务都在线程中执行

• 2.线程是 CPU 分配资源和调度的最小单位

• 3.一个程序能够对应多个进程(多进程),一个进程中可有多个线程,但至少要有一条线程

• 4.同一个进程内的线程共享进程资源

2、多进程、多线程多进程

打开 mac 的活动监视器,能够看到不少个进程同时运行

• 进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。

• 进程能够分为系统进程和用户进程。凡是用于完成操做系统的各类功能的进程就是系统进程,它们就是处于运行状态下的操做系统自己;全部由用户启动的进程都是用户进程。进程是操做系统进行资源分配的单位。

• 进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。在同一个时间里,同一个计算机系统中若是容许两个或两个以上的进程处于运行状态,这即是多进程。

多线程

• 同一时间,CPU只能处理 1条线程,只有 1条线程在执行。多线程并发执行,实际上是 CPU 快速地在多条线程之间调度(切换)。若是 CPU 调度线程的时间足够快,就形成了多线程并发执行的假象

• 若是线程很是很是多,CPU会在 N多线程之间调度,消耗大量的 CPU 资源,每条线程被调度执行的频次会下降(线程的执行效率下降)

• 多线程的优势:

能适当提升程序的执行效率

能适当提升资源利用率(CPU、内存利用率)

• 多线程的缺点:

开启线程须要占用必定的内存空间(默认状况下,主线程占用 1M,子线程占用 512KB),若是开启大量的线程,会占用大量的内存空间,下降程序的性能

线程越多,CPU 在调度线程上的开销就越大

程序设计更加复杂:好比线程之间的通讯、多线程的数据共享

做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个个人点击加入群聊iOS交流群:642 363 427,无论你是小白仍是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 你们一块儿交流学习成长!

3、任务、队列****任务

就是执行操做的意思,也就是在线程中执行的那段代码。在 GCD中是放在 block 中的。执行任务有两种方式:同步执行(sync)和异步执行(async)

同步(Sync):同步添加任务到指定的队列中,在添加的任务执行结束以前,会一直等待,直到队列里面的任务完成以后再继续执行,即会阻塞线程。只能在当前线程中执行任务(是当前线程,不必定是主线程), 不具有开启新线程的能力。

异步(Async):线程会当即返回,无需等待就会继续执行下面的任务,不阻塞当前线程。能够在新的线程中执行任务,具有开启新线程的能力(并不必定开启新线程)。若是不是添加到主队列上,异步会在子线程中执行任务

队列

队列(Dispatch Queue):这里的队列指执行任务的等待队列,即用来存听任务的队列。队列是一种特殊的线性表,采用 FIFO(先进先出)的原则,即新任务老是被插入到队列的末尾,而读取任务的时候老是从队列的头部开始读取。每读取一个任务,则从队列中释放一个任务

在 GCD中有两种队列:串行队列和并发队列。二者都符合 FIFO(先进先出)的原则。二者的主要区别是: 执行顺序不一样,以及开启线程数不一样。

• 串行队列(Serial Dispatch Queue):

同一时间内,队列中只能执行一个任务,只有当前的任务执行完成以后,才能执行下一个任务。(只开启一个线程,一个任务执行完毕后,再执行下一个任务)。主队列是主线程上的一个串行队列,是系统自动为咱们建立的

• 并发队列(Concurrent Dispatch Queue):

同时容许多个任务并发执行。(能够开启多个线程,而且同时执行任务)。并发队列的并发功能只有在异步(dispatch_async)函数下才有效

4、iOS**** 中的多线程

主要有三种:NSThread、NSoperationQueue、GCD

1.****NSThread:轻量级别的多线程技术

是咱们本身手动开辟的子线程,若是使用的是初始化方式就须要咱们本身启动,若是使用的是构造器方式它就会自动启动。只要是咱们手动开辟的线程,都须要咱们本身管理该线程,不仅是启动,还有该线程使用完毕后的资源回收

ccd4a3469f3c33898f18aa9d5e8b10e1.webp

performSelector...只要是 NSObject 的子类或者对象均可以经过调用方法进入子线程和主线程,其实这些方法所开辟的子线程也是 NSThread 的另外一种体现方式。

在编译阶段并不会去检查方法是否有效存在,若是不存在只会给出警告

ffc7967c9b79a9201d839df7ca31fae5.webp

须要注意的是:若是是带 afterDelay的延时函数,会在内部建立一个 NSTimer,而后添加到当前线程的Runloop中。也就是若是当前线程没有开启 runloop,该方法会失效。在子线程中,须要启动 runloop(注意调用顺序)

540da0330511e46b3f599a4daa89e785.webp

而 performSelector:withObject:只是一个单纯的消息发送,和时间没有一点关系。因此不须要添加到子线程的 Runloop 中也能执行

二、GCD****对比 NSOprationQueue

咱们要明确 NSOperationQueue与 GCD 之间的关系

GCD是面向底层的 C语言的 API,NSOpertaionQueue用 GCD构建封装的,是 GCD 的高级抽象。

一、GCD执行效率更高,并且因为队列中执行的是由 block 构成的任务,这是一个轻量级的数据结构,写起来更方便

二、GCD 只支持FIFO的队列,而 NSOperationQueue 能够经过设置最大并发数,设置优先级,添加依赖关系等调整执行顺序

三、NSOperationQueue甚至能够跨队列设置依赖关系,可是 GCD 只能经过设置串行队列,或者在队列内添加 barrier(dispatch_barrier_async)任务,才能控制执行顺序,较为复杂

四、NSOperationQueue由于面向对象,因此支持 KVO,能够监测 operation 是否正在执行(isExecuted)、是否结束(isFinished)、是否取消(isCanceld)

• 实际项目开发中,不少时候只是会用到异步操做,不会有特别复杂的线程关系管理,因此苹果推崇的且优化完善、运行快速的 GCD 是首选

• 若是考虑异步操做之间的事务性,顺序行,依赖关系,好比多线程并发下载,GCD 须要本身写更多的代码来实现,而 NSOperationQueue 已经内建了这些支持

• 不管是 GCD 仍是 NSOperationQueue,咱们接触的都是任务和队列,都没有直接接触到线程,事实上线程管理也的确不须要咱们操心,系统对于线程的建立,调度管理和释放都作得很好。而 NSThread 须要咱们本身去管理线程的生命周期,还要考虑线程同步、加锁问题,形成一些性能上的开销

5、GCD---队列

iOS 中,有 GCD、NSOperation、NSThread 等几种多线程技术方案。而 GCD 共有三种队列类型:

main queue:经过 dispatch_get_main_queue()得到,这是一个与主线程相关的串行队列。

global queue:全局队列是并发队列,由整个进程共享。存在着高、中、低三种优先级的全局队列。调用dispath_get_global_queue 并传入优先级来访问队列。

查看下文

自定义队列:经过函数 dispatch_queue_create 建立的队列

推荐

相关文章
相关标签/搜索