ios底层探索之多线程—进程和线程(代码片段)

卡卡西Sensei 卡卡西Sensei     2022-12-19     161

关键词:

前言

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底层探索之多线程—gcd源码分析(栅栏函数)(代码片段)

...顾在上篇博客已经对GCD函数的同步性/异步性还有单例的底层源码,作了详细的分析,那么本篇博客将对栅栏函数,调度组等底层源码进行探索分析!iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)... 查看详情

ios底层探索之多线程—初识gcd(代码片段)

...用最多的还是GCD,那么从本篇开始讲陆续介绍GCD。iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)—线程和锁1.什么是GCDGCD定义GrandCenterDispatch简称GCD,是苹果公司开发的技 查看详情

ios底层探索之多线程(十四)—关于@synchronized锁你了解多少?(代码片段)

...f;对于锁你又了解多少?锁的原理你又知道吗?iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)—线程和锁iOS底层探索之多线程(三)—初识GCDiOS底层探索之多线程(四)—GCD的队列iOS底层探索之多线程(五)—GCD... 查看详情

ios底层探索之多线程—gcd不同队列源码分析(代码片段)

...,那么本篇博客将继续介绍GCD的队列和源码分析。iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)—线程和锁iOS底层探索之多线程(三)—初识GCDiOS底层探索之多线程(四)—GCD的队列1.主队列分析查看主队列的api如... 查看详情

ios底层探索之多线程(十三)—锁的种类你知多少?(代码片段)

...#xff1f;从本篇博客开始将对锁的相关内容进行分析!iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)—线程和锁iOS底层探索之多线程(三)—初识GCDiOS底层探索之多线程(四)—GCD的队列iOS底层探索之多线程(五)—GCD... 查看详情

ios底层探索之多线程—gcd的队列(代码片段)

...的认识,那么本篇博客将继续介绍GCD的相关知识。iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)—线程和锁iOS底层探索之多线程(三)—初识GCD1.不同队列举例主队列添加同步任务看看下面这个例子🌰//主队... 查看详情

ios底层探索之多线程—gcd源码分析(函数的同步性异步性单例)(代码片段)

...博客已经对GCD的sync同步函数产生死锁的情况,进行了底层的源码探索分析,那么本篇博客继续源码的探索分析!iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)—线程和锁iOS底层探索之多线程(三)—初... 查看详情

ios底层探索之多线程—gcd源码分析(事件源dispatch_source)(代码片段)

...博客已经对GCD的调度组做了介绍和举例应用,还有对底层源码的分析,那么本篇博客将对事件源dispatch_source进行分析!iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)—线程和锁iOS底层探索之多线程(三)... 查看详情

ios底层探索之多线程—gcd源码分析(调度组)(代码片段)

...已经对GCD的信号量做了一个介绍和举例应用,还有对底层源码的分析,那么本篇博客看苹果工程师,如何巧妙封装调度组,看完底层源码直呼好家伙,真是妙啊!!!iOS底层探索之多线程(一)—进程... 查看详情

ios底层探索之多线程—gcd源码分析(信号量dispatch_semaphore_t)(代码片段)

...栅栏函数做了一个基本介绍,还有应用的举例并且对底层源码进行了分析,本篇博客将对信号量进行探索分析!iOS底层探索之多线程(一)—进程和线程iOS底层探索之多线程(二)—线程和锁iOS底层探索之多线程(三)—初识... 查看详情

ios开发底层之多线程探索-19(代码片段)

文章目录前言一、进程与线程?1.进程2.线程3.进程与线程的关系二、多线程1.多线程优点2.多线程缺点3.线程的生命周期4.线程池的饱和策略RejectedExecutionHandler接口5.优先级翻转(IOvccpu优先级提升)6.优先级的影响因素三.多线程下... 查看详情

ios开发底层之多线程探索-19(代码片段)

文章目录前言一、进程与线程?1.进程2.线程3.进程与线程的关系二、多线程1.多线程优点2.多线程缺点3.线程的生命周期4.线程池的饱和策略RejectedExecutionHandler接口5.优先级翻转(IOvccpu优先级提升)6.优先级的影响因素三.多线程下... 查看详情

ios底层探索之多线程—线程和锁(代码片段)

回顾在上一篇博客中,我们已经对进程和线程有了一定的了解了,那么本次博客将继续讲解!1.线程的生命周期在程序开发中有个名词——生命周期,我们都知道APP有生命周期,那么线程的生命周期是什么样子... 查看详情

ios底层探索之多线程(十七)——通过swift的foundation源码分析锁(nslocknsconditionnsrecursivelock)(代码片段)

...篇博客就继续分析锁,从Foundation源码分析锁!iOS底层探索之多线程(一)—进程和线程 查看详情

ios开发底层之多线程探索-19(代码片段)

文章目录前言一、进程与线程?1.进程2.线程3.进程与线程的关系二、多线程1.多线程优点2.多线程缺点3.线程的生命周期4.线程池的饱和策略RejectedExecutionHandler接口5.优先级翻转(IOvccpu优先级提升)6.优先级的影响因素三.多线程下... 查看详情

ios底层探索之多线程(十八)——锁篇章的完结篇(手把手两种方式带你实现一个读写锁!)(代码片段)

...,那么本篇博将手把手带你实现一个读写锁!iOS底层探索之多线程(一)—进程和线程iOS 查看详情

ios底层探索之多线程—gcd源码分析(死锁的原因)(代码片段)

回顾在上篇博客已经对GCD的sync同步函数、async异步函数进行了源码的分析,那么本篇博客继续源码的探索分析!1.补充sync和async的区别是否可以开启新的线程执行任务任务的回调是否具有异步行、同步性是否产生死锁问题... 查看详情

ios底层探索之多线程(十六)——锁分析(nslocknscondtionnsrecursivelocknscondition)(代码片段)

...绍,那么本篇博客就分析一下其他的一些锁!iOS底层探索之多线程(一)— 查看详情