当前位置: 首页 > news >正文

iOS高级开发工程师面试——多线程

iOS高级开发工程师面试——多线程

  • 一、什么是进程?什么是线程?进程和线程的关系?什么是多进程?什么是多线程?
  • 二、iOS开发中有多少类型的线程?分别对比?
  • 三、GCD有哪些队列,默认提供哪些队列?
  • 四、GCD有哪些方法 api?
  • 五、GCD主线程 & 主队列的关系?
  • 六、如何实现同步?有多少方式就说多少
  • 七、dispatch_once 实现原理 ?
  • 八、什么情况下会死锁?死锁的应对策略有哪些?怎么避免死锁?
  • 九、有哪些类型的线程锁?分别介绍下作用和使用场景?
  • 十、iOS各种锁的性能,琐是毫秒级别还是微妙级别?
  • 十一、NSOperationQueue 中的 maxConcurrentOperationCount 默认值
  • 十二、NSTimer、CADisplayLink、dispatch_source_t 的优劣?
  • 十三、多线程可以访问同一个对象吗 ?多进程呢?

一、什么是进程?什么是线程?进程和线程的关系?什么是多进程?什么是多线程?

1. 进程:

  • 进程是一个具有独立功能的程序关于某次数据集合的一次运行活动,他是操作系统分配资源的基本单位

  • 进程是指系统正在运行中的一个应用程序,就是一段程序执行的过程。我们可以理解为手机上的一个app。

  • 每个进程之间是独立的。每个进程均运行在起专用且受保护的内存空间内,拥有独立运行所需的全部资源。

  • 进程是操作系统进行资源分配的单位

2. 线程:

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

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

3. 进程和线程的关系:

  • 线程是进程的执行单元,进程的所有任务都在线程中执行。

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

  • 一个程序可对应多个进程(多进程);一个进程中可对应多个线程,但至少要有一条线程。

  • 同个进程内的线程共享进程资源。

4. 多进程:

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

  • 进程可以分为系统进程和用户进程。

    系统进程:凡是用于完成操作系统的各种功能的进程就是系统进程,他们就是出于运行状态下的操作系统本身

    用户进程:运行用户程序时创建的运行在用户态下的进程。

  • 进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。

  • 在同一个时间里,同一个操作系统中如果允许两个或两个以上的进程处于运行状态,这便是多进程

5. 多线程:

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

  • 如果线程非常至多(N条),CPU会在这些(N条)线程之间调度,消耗大量的CPU资源,每条线程被调用执行的频率会降低(线程的执行效率降低)。

  • 多线程的优点:

    • 能适当提高程序的执行效率

    • 能适当提高资源的利用率(CPU、内存利用率)

  • 多线程的缺点:

    • 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512kb),如若开启大量线程,会占用大量的内存空间,就会降低程序的性能

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

    • 程序设计更加复杂:如线程之间的通信、多线程之间的数据共享等

二、iOS开发中有多少类型的线程?分别对比?

  • NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程)。是对pthread(其是POSIX线程的API,是C语言的技术,当然它可以直接操作线程)的抽象。
  • NSOperation/NSOperationQueue 面向对象的线程技术,是对GCD的抽象,容易理解和使用。
  • GCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术

对比:

线程类型优点缺点
NSThread1. 跨平台C语言标准库中的多线程框架 2. 使用简单1.过于底层使用很麻烦,需要封装使用。2.需要自己来管理线程的生命周期线程同步加锁睡眠和唤醒。过程不可避免的有一定的系统“开销”
NSOperation / NSOperationQueue1. 更加面向对象,可以设置并发数量,可以设置优先级 可以设置依赖,可以任务执行状态控制:isReady(是否准备好执行),isExecuting(是否正在执行),isFinished(是否执行完毕),isCancelled(是否被取消) 2. 不用关心线程的管理和数据的同步,把精力放在自己需要执行的任务或操作上就行了 3. GCD 的封装用于相对复杂的场景,相对简单的官方推荐 GCD
GCD(Grand Central Dispatch) 1. iOS5后苹果推出的双核CPU优化的多线程框架,iOS 4.0 才能使用,是代替上面两个技术的高效而且强大的技术2.它基于block的特性导致它能极为简单的在不同代码作用域之间传递上下文,效率高 3. GCD自动根据系统负载来增减线程数量,这就减少了上下文的切换和提高了计算效率 4. 安全,无需加锁或其他同步机制5.它是基于C语言的1. 不能设置并发数,需要写一些代码曲线方式实现并发 2. 不能设置优先级

三、GCD有哪些队列,默认提供哪些队列?

3中队列:主线程队列并发队列串行队列

在GCD中有两种队列:串行队列并发队列。两者都符合 FIFO 的原则,二者的主要区别是:执行的顺序不同和开启的线程数不同

1.主线程队列:

main queue可以调用dispatch_get_main_queue()来获得。因为main queue是与主线程相关的,所以这是一个串行队列。和其它串行队列一样,这个队列中的任务一次只能执行一个。它能保证所有的任务都在主线程执行,而主线程是唯一可用于更新 UI 的线程

2. 串行队列(Serial Dispatch Queue):

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

3. 并行队列(Concurrent Dispatch Queue):

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

四、GCD有哪些方法 api?

1. Dispatch Queue :
开发者要做的只是定义想执行的任务并追加到适当的 Dispatch Queue 中。

   dispatch_async { queue,  ^{//想执行的任务});

通过 dispatch_async 函数“追加”赋值在变量 queue 的“Dispatch Queue中”。
Dispatch Queue 的种类:
有两种Dispatch Queue,一种是等待现在执行中处理的 Serial Dispatch Queue,另一种是不等待现在执行中处理的 Concurrent Dispatch Queue

2. dispatch_queue_create :
创建队列

3. Main Dispatch Queue 和 Global Dispatch Queue :
系统提供的两种队列

4. dispatch_set_target_queue :
变更队列执行的优先级

5. dispatch_after :
延时执行。

注意的是dispatch_after函数并不是在指定时间后执行处理,而只是在指定时间追加处理到 Dispatch Queue

6. dispatch_group :
调度任务组。

  • dispatch_group_notify:最后任务执行完的通知,比如:
- (void)dispatch_group {dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);dispatch_group_t group = dispatch_group_create();dispatch_group_async(group, queue, ^{NSLog(@"thread1:%@", [NSThread 

文章转载自:
http://acceptable.dmyyro.cn
http://cacique.dmyyro.cn
http://ambiance.dmyyro.cn
http://biometry.dmyyro.cn
http://aphonic.dmyyro.cn
http://argand.dmyyro.cn
http://annoy.dmyyro.cn
http://beaut.dmyyro.cn
http://bargainee.dmyyro.cn
http://announceable.dmyyro.cn
http://bonze.dmyyro.cn
http://chiv.dmyyro.cn
http://boff.dmyyro.cn
http://argument.dmyyro.cn
http://arfvedsonite.dmyyro.cn
http://cheery.dmyyro.cn
http://aswandam.dmyyro.cn
http://aristotelean.dmyyro.cn
http://adrenalin.dmyyro.cn
http://anklebone.dmyyro.cn
http://athena.dmyyro.cn
http://bouquetin.dmyyro.cn
http://backflow.dmyyro.cn
http://acathisia.dmyyro.cn
http://achene.dmyyro.cn
http://candescent.dmyyro.cn
http://bbc.dmyyro.cn
http://bessarabia.dmyyro.cn
http://antiestablishment.dmyyro.cn
http://cardiogram.dmyyro.cn
http://www.dtcms.com/a/280722.html

相关文章:

  • LVS三种模式实战
  • Unity沉浸式/360View/全景渲染
  • 新手向:Python数据处理Excel报表自动化生成与分析
  • Zookeeper入门安装与使用详解
  • Java行为型模式---迭代器模式
  • Linux、Ubuntu和CentOS的关系与区别
  • 设计模式笔记_结构型_适配器模式
  • 3.正则化——新闻分类
  • 生产问题排查-数据库连接池耗尽
  • 牛客:HJ23 删除字符串中出现次数最少的字符[华为机考][字符串]
  • Linux 环境下安装 Node.js v16.13.0 完整指南
  • MongoDB 数据库 启用访问控制
  • Volta现代化的 Node.js 版本管理工具
  • CSRF 攻击原理与实验测试(附可运行测试案例)
  • NineData 社区版 V4.3.0 正式发布!新增 5 条迁移对比链路,全面支持 MariaDB、GaussDB 等数据库
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+vue实现的酒店预订管理系统,推荐!
  • Gitlab跑CICD的时候,maven镜像和pom.xml使用的maven版本冲突导致没办法build成功的解决方法
  • [附源码+数据库+毕业论文+开题报告]基于Spring+MyBatis+MySQL+Maven+jsp实现的车辆运输管理系统,推荐!
  • 2025-7-15-C++ 学习 排序(4)
  • langchain教程10:LCEL
  • 【c++】c++11新特性(右值引用和移动语义)
  • PySpark 常用算子详解
  • 【BUG处理】构建APK时遇到错误:‘flutter‘ 命令未被识别。这通常表示您的系统中未安装Flutter SDK或环境变量配置不正确。
  • 牛客:HJ20 密码验证合格程序[华为机考][字符串]
  • 【源力觉醒 创作者计划】文心4.5 vs DeepSeek vs Qwen 3.0:三大能力硬核实测!谁才是王者?
  • 纸板加工制造学习1
  • CF37E Trial for Chief 题解
  • 青年科学基金项目答辩PPT模板 | 杰青优青ppt设计制作美化 | WordinPPT
  • uni-app 学习笔记:Vuex 持久化数据
  • 【C++】神奇的AVL树