《iOS总结》线程和进程的问题总结

来源:互联网 发布:蜘蛛源码 编辑:程序博客网 时间:2024/06/07 21:53

通常我们会对技术点有所了解 但不知如何叙述 因此总结了有关线程和进程的知识点 大家随意看看= =


1.线程与进程的概念

进程:就是正在进行的应用程序,是资源分配的基本单位;

线程:就是进程中的一个独立的执行路径,是CPU独立运行和独立调度的基本单位。


2.进程与线程的区别

主线程:对UI的操作,代码只能顺序执行,只有一个主线程

子线程:处理繁重的数据操作任务

多线程组成进程

进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差些对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。


3.线程的优点和缺点:

优点:

(1)节省时间,可以把程序中占据时间长的任务放到线程中去处理,如图片、视频的下载;
(2)利用多核处理优势,并发执行程序,让系统运行的更快、更流畅,用户体验更好。

缺点:

(1)大量的线程降低代码的可读性;
(2)更多的线程需要更多的内存空间;
(3)当多个线程对同一个资源出现争夺的时候要注意线程安全的问题


4.实现多线程的方法(重点是中央调度GCD)

抽象程度从低到高,抽象程度越高的使用越简单。

(1)NSObject

优点:写法简单;

缺点:不能处理线程安全问题。

(2)NSThread

优点:相比其他两个轻量级来说,需要自己管理线程的生命周期,线程同步;

缺点:默认不处理线程安全问题;线程同步会对数据的加锁会有一定的系统开销,线程设置非常繁琐。

(3)NSOperationQueue

优点:能合理安排线程重用,处理线程安全问题,并且使用简单;

缺点:效率略低。

(4)GCD (Grand Central Dispatch)中央调度

GCD是基于C语言和Block语法的一个多线程解决方案 (C语言效率高)

GCD是Apple开发的一个多核编程的解决方法。

GCD是一个替代诸如NSThread, NSOperationQueue,NSInvocationOperation等技术的很高效和强大的技术。

优点:程序不会失去响应,多线程容易使用,无需专门进行线程管理。



知识点:


实现同步: 加锁

NSLock互斥锁, NSConditionLock条件锁, NSRecursiveLock循环锁


同步: 在当前线程中执行任务, 不具备开启线程的能力,顺序执行
异步: 在新的线程中执行任务, 具备开启线程的能力,并发执行
并发: 多个任务并发(同时)执行
串行: 一个任务执行完毕后, 再执行下一个任务


a.创建一个队列

   dispatch_queue_t myQueue = dispatch_queue_create("my", DISPATCH_QUEUE_SERIAL);// 串行

参数1:队列名(C语言写法)

参数2:队列类型(串行/并行)

DISPATCH_QUEUE_SERIAL串行

DISPATCH_QUEUE_CONCURRENT并行

b.执行一个队列

dispatch_async(myQueue, ^{

        [self textThread];

    });

参数1:给哪个队列安排任务

参数2:要执行的任务 

如果不需要保留要运行的队列的引用则可以两步连写,即声明并执行一个队列

   dispatch_async(dispatch_queue_create("my", DISPATCH_QUEUE_SERIAL), ^{

        [self textThread];

    });

c.暂停一个队列

   dispatch_suspend(myQueue);

暂停一个队列会阻止和该队列相关的所有代码运行 

d.恢复一个队列

   dispatch_resume(myQueue);

暂停一个队列不要忘记恢复。暂停和恢复的操作内存管理中的retainrelease类似。

调用dispatch_suspend暂停计数增加,调用dispatch_resume暂停计数减少。

队列只有在暂停计数变为零的时候才开始运行。


1个主队列(串行)4个全局队列--》本身就有不同的优先级(并行)都是单例靠函数获取

主队列串行队列,是系统刷新UI和处理UI操作的地方

注意:UI绘图及任何对NSNotificationCenter的调用必须在主线程中进行。

注意:dispatch_suspend dispatch_resume在主线程中不起作用。

    

//获取主队列

dispatch_queue_t mainQueue = dispatch_get_main_queue();//

dispatch_async(mainQueue, ^{

        [self textThread];

});

    

获取全局队列

参数1:选择的是哪个优先级的全局队列

参数2:暂时没用,只能填0

dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(globalQueue, ^{

        [self textThread];

});


0 0
原创粉丝点击