前言

iOS的面试中多线程是经常被问到的,多线程也是一个难点,很多面试者平时用的不多,因此很难回答到点子上,那么本篇博客就对多线程进行探索和分析。

1. 进程和线程

什么是进程

  • 进程是指在系统中正在运⾏的⼀个应⽤程序,它是程序执行时的一个实例。
  • 程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
  • 每个进程之间是独立的,每个进程运行在其专有的且受保护的内存空间内
  • 在 MAC电脑上,可以通过“活动监视器”查看所开启的进程

iOS 开发是单进程,安卓是可以多进程

什么是线程

  • 线程是进程的基本执行单元,一个进程中的所有任务都是在线程中执行的
  • 进程想要执行任务必须得有线程,一个进程至少有一条线程
  • 程序启动是会默认开启一条线程,这条线程被称为主线程或者 UI线程

进程和线程的区别

  • 进程是资源分配的最小单位,线程是程序执行的最小单位。
  • 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
  • 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

2.多线程的意义

一个进程的任务都是多个的,单线程执行效率肯定是低下的,在开发中都是多线程编程,为什么要使用多线程呢?

举例

  • 测试代码
 NSLog(@"开始");NSInteger count = 1000 * 100;for (NSInteger i = 0; i < count; i++) {// 栈区NSInteger num = i;// 常量区NSString *name = @"RENO";// 堆区NSString *myName = [NSString stringWithFormat:@"%@ - %zd", name, num];NSLog(@"%@", myName);}NSLog(@"结束");
  • 测试结果
2021-08-08 21:42:15.517924+0800 001----多线程的作用[35508:936771] 开始
2021-08-08 21:42:15.518147+0800 001----多线程的作用[35508:936771] RENO - 0
2021-08-08 21:42:15.518314+0800 001----多线程的作用[35508:936771] RENO - 1
2021-08-08 21:42:15.518468+0800 001----多线程的作用[35508:936771] RENO - 2
。。。。。。。。。。。。。
021-08-08 21:43:03.151830+0800 001----多线程的作用[35508:936771] RENO - 99998
2021-08-08 21:43:03.152314+0800 001----多线程的作用[35508:936771] RENO - 99999
2021-08-08 21:43:03.152691+0800 001----多线程的作用[35508:936771] 结束

在上面的案例中,循环执行十万次的循环,在循中进行还进行局部变量的创建,此过程执行完成共耗时接近一分钟,如果此流程放在主线程,会造成主线程卡顿,极大的影响用户体验。

所以通常情况下,我们都会进行异步处理,开启新的线程对这些事务进行处理,而如果一个事务很复杂,比较耗时,可以将一个大的事务拆分成多个小的事务进行并发处理,这样可以节省时间,并且不会影响用户的体验。

多线程的优缺点

优点

  • 能适当提⾼程序的执⾏效率
  • 能适当提⾼资源的利⽤率(如CPU,内存
  • 线程上的任务执⾏完成后,线程会⾃动销毁

缺点

  • 开启线程需要占⽤⼀定的内存空间(默认情况下,每⼀个线程都占512KB)
  • 如果开启⼤量的线程,会占⽤⼤量的内存空间,降低程序的性能
  • 线程越多,CPU在调⽤线程上的开销就越⼤,程序设计更加复杂,⽐如线程间的通信、多线程的数据共享

3. 时间片

时间片(timeslice)又称为“量子(quantum)”或“处理器片(processor slice)”是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是:从进程开始运行直到被抢占的时间)。

简单来说就是:CPU时间片即CPU分配给多个程序的时间,每个线程被分配一个时间段,称作它的时间片

  • 宏观上,我们可以同时打开多个应用程序,每个程序并行不悖,同时运行;

  • 微观上,由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行

  • 多线程的执行:是CPU快速的在多个线程之间进行切换。线程数过多,CPU会在多个线程之间切换,销毁大量的CPU资源,反而导致执行效率的下降。

  • 多线程同时执⾏:是CPU快速的在多个线程之间的切换,CPU调度线程的时间⾜够快,就造成了多线程的同时执⾏的效果。

  • 如果线程数⾮常多CPU会在N个线程之间切换,消耗⼤量的CPU资源,每个线程被调度的次数会降低,线程的执⾏效率降低。

iOS底层探索之多线程(二)—线程和锁

更多内容持续更新

iOS底层探索之多线程(一)—进程和线程相关推荐

  1. iOS底层探索(二) - 写给小白看的Clang编译过程原理

    iOS底层探索(一) - 从零开始认识Clang与LLVM 写在前面 编译器是属于底层知识,在日常开发中少有涉及,但在我的印象中,越接近底层是越需要编程基本功,也是越复杂的.但要想提升技术却始终绕不开 ...

  2. iOS 底层探索篇 —— KVC 底层原理

    iOS 底层探索篇 -- KVC 底层原理 1. Method Swizzling的坑与应用 1.1 method-swizzling 是什么? 1.2 坑点 坑点1:method-swizzling ...

  3. iOS 底层探索 - 消息转发

    一.动态方法解析流程分析 我们在上一章<消息查找>分析到了动态方法解析,为了更好的掌握具体的流程,我们接下来直接进行源码追踪. 我们先来到 _class_resolveMethod 方法, ...

  4. iOS底层探索二(OC 中 alloc 方法 初探)

    前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...

  5. 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别

    当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位. 3.一个进程可以包括多个线程. 4.在单CPU计算 ...

  6. 线程和进程(1)——多线程,进程与线程

    一.为什么要用多线程 1.让计算机"同时"做多件事情,节约时间. 2.后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况. 3.多线程可以让一个程序"同时& ...

  7. python线程池并发_python 并发编程多线程之进程池/线程池

    一.验证GIL锁的存在 Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可以"运行"多个线程,但在任意时刻只有一个线程在解释器中运行 ...

  8. c++ 模板类实现堆栈实验报告_5分钟学会C/C++多线程编程进程和线程

    前言 对线程有基本的理解 简单的C++面向过程编程能力 创造一个简单的线程. 创造单个带参数的线程. 如何等待线程结束. 创造多个线程,并使用互斥量来防止资源抢占. 会使用之后,直接跳到"汇 ...

  9. 实现多线程、进程、线程、设置和获取线程名称、线程调度、线程控制、线程生命周期、同步代码块、线程安全的类、Lock锁、生产者消费者模式

    实现多线程:

  10. 移动开发在路上-- IOS移动开发系列 多线程二

    最近太忙没太多的时间,忙碌的码农生活空下来一点时间,都会挤出来看一些技术或者咨询的文章,废话不多说,直奔主题. 接着上一次的继续说. 定时器在多线程的使用 NSRunLoop 是线程相关的基础框架的一 ...

最新文章

  1. 你必须知道如何回答的五大计算机安全问题!
  2. android 的命令行工具(dos命令)
  3. CentOS6.5 gcc升级到4.8.2
  4. 11.27 如何选择具有某一角色的当事人?
  5. 第一百三十七期:一个简单的小案例带你理解MySQL中的事务
  6. unet作为服务器不显示画面,UNet:无法生成服务器对象(不使用NetworkManager)
  7. Loadrunner的基本概念
  8. 【C#编程基础学习笔记】4---Convert类型转换
  9. linux shell中获取mongodb最大连接数、内存使用情况等
  10. 力扣-1557. 可以到达所有点的最少点数目
  11. 电影图标:杀死比尔(Kil Bill)
  12. 程序人生-Hello’s P2P
  13. 提示“8080端口号被占用
  14. apache连接mysql配置_Apache+PHP配置及连接mysql数据库
  15. Linux系统中dmesg命令使用详解
  16. 如何发布个人网站(入门全套,小白专用,Linux服务器)
  17. php文章下一页,php获取文章上一页与下一页的方法_php技巧
  18. html5 堆栈不足,超简单!不用PS也能玩堆栈摄影
  19. 深圳大学数学文化赏析MOOC答案
  20. 医院分诊排队叫号系统源码

热门文章

  1. shardedJedisPool工具类
  2. 安装.net Framework 3.5 SP1非常慢的解决方案
  3. ONVIF流媒体播放流程
  4. WEB UI基础八:链接跳转到标准的工单界面
  5. TCP粘包拆包基本解决方案
  6. AutoLayout 的一些坑
  7. python学习笔记第三节
  8. 单例设计模式全局缓存accessToken
  9. IOS开发之----四舍五入问题
  10. SSAS: Display measures in Rows