这篇,就讲点这个吧
1.进程
2.线程
3.iOS中3种多线程的比较
4.APP的内存分区及在运行时的内存分配
- 听着《阴天》,写着总结,感觉有点气氛不对。
1.基本概念
进程:
进程是指在系统中正在运行的一个应用程序,负责程序运行的内存分配,进程之间是相互独立的
线程:
线程是进程的基本执行单元,一个进程的所有任务都在线程中执行,一个进程中至少包含一条线
程即主线程
队列:
在iOS开发中,队列和线程是两个相互穿插的概念,所有的线程是应该有个线程队列的,线程的
创建和回收不需要程序员操作,有队列负责。
2.iOS中3种多线程技术
NSThread----- GCD(Grand Center Dispatch) ----- NSOperation
1.NSThread
优点:量级比较轻 使用简单
缺点:不能控制线程的执行顺序,自己管理线程的生命周期,线程的同步,加锁,睡眠等。
2.GCD
优点:线程的生命周期由系统和自己分配,采用block代码块使程序更加便于阅读和修改
缺点:除全局队列以外任何由GCD创建的队列无法设置优先级
3.NSOperation
优点:iOS4在GCD推出以后对GCD的封装,更加方便的管理并发和线程之间的优先级
缺点:更加高级抽象
GCD与NSOperation的区别
GCD是将任务添加到队列中(并行/串行),并且制定任务执行的函数(同步/异步),GCD中只有全局队列有4中优先级,要想为自己创建的队列添加优先级只有通过将我们手动创建的队列作为全局队列的子队列才可以设置优先级
如何设置子队列:dispatch_set_target_queue,通过他可以设置调整目标队列,比如可以设置目标队列为全局队列那么这个全局队列可以设置优先级
GCD的高级功能有一次执行dispatch_once、延迟执行 dispatch_after、调度组
GCD中队列的选择:
日常开发中建议选择全局队列
1.全局队列是一个并行队列
2.系统框架中已经创建好了,直接拿过来用就行了既然系统已经写好了一个并行队列了是不是在以后的开发中需要用到的并行队列的时候都用全局队列
在出错的情况下全局队列无法定位到具体的任务,所以在这种情况下要用到自己定义并发队列,容易找出哪个队列发生了错误NSOperation把操作添加到队列中,是对GCD的封装,可以随时取消已经设定准备好要执行的任务,可以设置队列中每一个操作的优先级,也可以设置最大操作的并发数(setMaxConcurrentOperationCount:)可以设置队列的依赖关系(addDependency)
3.队列
队列又可以分为:
串行队列 dispatch_queue_creat(… , …)
并行队列
全局队列 dispatch_get_global_queue
主队列 dispatch_get_main_queue
感觉没和多线程挂上钩呀
那么队列是用来干什么的?
队列是用来调度任务的
任务是指什么呢?
任务就是添加在队列中的线程
任务的调度
任务:
1.同步
一个一个的执行 单线程
2.异步
不用等当前代码执行完就可以执行下一条 多线程的代名词
任务的调度:
串行队列-同步任务
串行队列-异步任务
并行队列-同步任务
并行队列-异步任务
1.串行队列-同步任务 不开线程
不开线程,在当前的线程执行,当前代码不执行完不会执行后面的代码
2.串行队列-异步任务 开线程
开一条线程
3.并行队列-同步任务 不开线程
不会创建新的线程,所有任务会在同一线程中执行
4.并行队列-异步任务 开线程
会创建多个线程
结论:
开不开线程和执行任务的函数有关
同步 – 不开
异步 – 开
开几条线程和执行任务的队列有关
串行队列 开一条
并行队列 开n条
输出结果是---1111 33333 22222
输出结果是-- 死锁了
死锁
主队列和主线程的关系:
主队列里必须有一个主线程,主队列里还可以再加线程
主队列的特点:主线程有任务就暂时不调度任务—相互等待等死了
这句代码将这个同步任务加入主线程队列里,等待主线程完成才返回block里面的内容,但是当程序运行到这行代码,由于主线程没有完成,block不会有返回,并且也不会跳过这行代码所以就造成了死锁现象。
友情链接初光夫