美文网首页优秀技术
iOS-多线程的底层实现

iOS-多线程的底层实现

作者: yycache | 来源:发表于2020-03-24 16:31 被阅读0次

    一:线程与进程的区别

    进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。

    线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。

    一个程序至少一个进程,一个进程至少一个线程。

    1> 一个应用程序对应一个进程,一个进程帮助程序占据一块存储空间。也有多个进程的应用(比如浏览器,多开几个页面)

    2> 要想在进程中执行任务,就必须开启线程,一条线程就代表一个任务

    3> 一个进程中允许开启多条线程,也就是同时执行多个任务

    为什么会有线程?

     每个进程都有自己的地址空间,即进程空间,在网络或多用户换机下,一个服务器通常需要接收大量不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通(系统开销大响应用户请求效率低),因此操作系统中线程概念被引进。

    线程的执行过程是线性的,尽管中间会发生中断或者暂停,但是进程所拥有的资源只为改线状执行过程服务,一旦发生线程切换,这些资源需要被保护起来。

    进程分为单线程进程和多线程进程,单线程进程宏观来看也是线性执行过程,微观上只有单一的执行过程。多线程进程宏观是线性的,微观上多个执行操作。

    线程的改变只代表CPU的执行过程的改变,而没有发生进程所拥有的资源的变化。

    进程线程的区别:

    地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。

    资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。

    一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

    进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程

    执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

    线程是处理器调度的基本单位,但是进程不是。

    两者均可并发执行。

    优缺点:

     线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。

      进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。

    何时使用多进程,何时使用多线程?

    对资源的管理和保护要求高,不限制开销和效率时,使用多进程。

    要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。

    (1)首先回答什么是线程

    1个进程要想执行任务,必须得有线程.线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行

    (2)什么是多线程

    1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务。

    多线程的作用:更新显示UI界面、处理用户触摸事件。

    (3)Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程。

    (4)开发中实现多线程的方案

    1》C语言的POSIX接口:#include

    2》OC的NSThread

    3》 C语言的GCD接口(性能最好,代码更精简)

    4》  OC的NSOperation和NSOperationQueue(基于GCD)

    二.线程的通信

    (1)GCD:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 下载图片

    UIImage *image = nil;

    dispatch_async(dispatch_get_main_queue(), ^{

    // 回到主线程

    });

    (2)NSThread的线程通信

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 下载图片

    UIImage *image = nil;

    [self performSelector:@selector(settingImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES modes:nil];

    }

    这种情况 也适用于子线程之间的通信。

    (3)NSThread的线程通信

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // 下载图片

    UIImage *image = nil;

    [self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:YES];

    }

    三.网络图片处理问题中怎么解决一个相同的网络地址重复请求的问题

         利用字典图片地址为key,下载操作为value

    四.多线程的方案 :列举cocoa中常见对几种多线程的实现,并谈谈多线程安全的几种解决办法及多线程安全怎么控制?

    Mach是第一个以多线程方式处理任务的系统,因此多线程的底层实现机制是基于Mach的线程,开发中很少用Mach级的线程,因为Mach级的线程没有提供多线程的基本特征,线程之间是独立的

    1》开发中实现多线程的方案

    1》C语言的POSIX接口:#include

    2》OC的NSThread

    3》 C语言的GCD接口(性能最好,代码更精简)

    4》  OC的NSOperation和NSOperationQueue(基于GCD)

    2》多线程安全的解决方案

    1》只在主线程刷新访问UI

    2》如果要防止资源抢夺,得用synchronize进行加锁保护。

    3》如果异步操作要保证线程安全等问题,尽量使用GCD。(GCD有些函数默认就是安全的)

    五.GCD内部怎么实现的

    1》 iOS和OSX的核心是XNU内核(苹果电脑发展的操作系统内核),GCD是基于XNU内核实现的。

    2》GCD的API全部在libdispatch库中

    3》GCD的底层实现主要有:Dispatch Queue和Dispatch Source

    Dispatch Queue :管理block操作

    Dispatch Source:处理事件(比如说线程间的通信)

    六.GCD和NSOperationQueue

    1》GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本的封装

    2》GCD只支持FIFO的队列,NSOperationQueue可以很方便的调整执行顺序,可以添加依赖设置最大并发数量。

    3》GCD的执行速度比NSOperationQueue快

    4》NSOperationQueue支持KVO,可以检测Operation是否正在执行,是否结束,是否取消。

    如何进行选择?

    任务之间不太相互依赖,选用GCD;

    任务之间有依赖,或者要监听任务的执行情况:NSOperationQueue

    项目中使用

    NSOperation 的优点是 NSOperation

    是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation

    的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。项目中使用 GCD 的优点是 GCD

    本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而 Block 参数的使用,会是代码更为易读,建议在简单项目中使用。

    用 NSOpertion 和 NSOpertionQueue 处理A,B,C三个线程,要求执行完 A,B后才能执行 C,怎么做?

    // 创建队列

    NSOperationQueue*queue=[[NSOperationQueue alloc] init];

    // 创建3个操作

    NSOperation*a= [NSBlockOperationblockOperationWithBlock:^{

    NSLog(@”operationA---“);

    }];

    NSOperation*b=[NSBlockOperationblockOperationWithBlock:^{

    NSLog(@”operationB---“);

    }];

    NSOperation*c=[NSBlockOperationblockOperationWithBlock:^{

    NSLog(@”operationC---“);

    }];

    // 添加依赖

    [c addDependency:a];

    [c addDependency:b];

    // 执行操作

    [queueaddOperation:a];

    [queueaddOperation:b];

    [queueaddOperation:c];

    七既然提到 GCD,那么问一下在使用 GCD以及block时要注意些什么?它们两是一回事儿么?block在 ARC中和传统的 MRC中的行为和用法有没有什么区别,需要注意些什么?

    Block的使用注意:

    1.block的内存管理

    2.防止循环retian

    · 非ARC(MRC):__block

    · ARC:__weak__unsafe_unretained

    八.在异步线程中下载很多图片,如果失败了,该如何处理?请结合 RunLoop来谈谈解决方案.(提示:在异步线程中启动一个 RunLoop重新发送网络请求,下载图片)

    1. 重新下载图片

    2.下载完毕, 利用RunLoop的输入源回到主线程刷新UIImageVIUew

    九.Socket的实现原理及 Socket之间是如何通信的

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

    TCP协议

    TCP(Transmission

    Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC

    793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。

    在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。

    TCP的优点

    可靠,稳定

    TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

    TCP的缺点

    慢,效率低,占用系统资源高,易被攻击

    TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。

    由于TCP存在确认机制和三次握手机制,这些是导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

    TCP应用场景

    当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。

    在日常生活中,常见使用TCP协议的应用比如:浏览器使用HTTP,Outlook使用POP、SMTP,QQ文件传输等。

    UDP协议

    UDP

    是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System

    Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC

    768是UDP的正式规范。UDP在IP报文的协议号是17。

    UDP的优点

    快,比TCP稍安全

    UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……

    UDP的缺点

    不可靠,不稳定

    因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

    UDP应用场景

    当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。在日常生活中,常见使用UDP协议的应用比如:QQ语音、QQ视频、TFTP等。

    TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。

    TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。

    在网络层有:IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。

    在传输层中有:TCP协议与UDP协议。

    在应用层有:FTP、HTTP、TELNET、SMTP、DNS等协议。

    因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。

    TCP和UDP是FTP,HTTP和SMTP之类使用的传输层协议。虽然TCP和UDP都是用来传输其他协议的,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。

    HTTP协议

    HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。

    HTTP是短连接:客户端发送请求都需要服务器端回送响应.请求结束后,主动释放链接,因此为短连接。通常的做法是,不需要任何数据,也要保持每隔一段时间向服务器发送”保持连接”的请求。这样可以保证客户端在服务器端是”上线”状态。

    HTTP连接使用的是”请求-响应”方式,不仅在请求时建立连接,而且客户端向服务器端请求后,服务器才返回数据。

    Socket协议

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

    建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

    Socket通信原理和实践

    十.什么是 TCP连接的三次握手

    第一次握手:客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认;

    第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;

    第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手。

    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP 连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开 TCP 连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开)

    十一.HTTP协议的组成和特点

    组成:http 请求由三部分组成,分别是:请求行、消息报头、请求正文 特性:HTTP协议的主要特点可概括如下:

    1.支持客户/服务器模式。

    2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有 GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快。

    3.灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由 Content-Type 加以标记。4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

    5.无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

    十二.OC中的协议和 java中的接口概念有何不同?

    OC中的代理有两层含义,官方定义为 formal 和 informal protocol。前者和 Java接口一样。 informal protocol 中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。 其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里 “非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。 这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。这么看,总觉得类别这玩意儿有点像协议的可选协议。" 现在来看,其实 protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用 interface修饰“, 现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。

    相关文章

      网友评论

        本文标题:iOS-多线程的底层实现

        本文链接:https://www.haomeiwen.com/subject/fftayhtx.html