面试题

iOS多线程原理

2019-02-24  本文已影响0人  荒漠现甘泉

多线程原理

线程和进程的关系和区别

1、线程定义

2、进程定义

3、进程和线程的区别

对比维度 多进程 多线程 总结
数据共享、同步 数据共享复杂,需要用IPC;数据是分开的,同步简单 因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂 各有优势
内存、CPU 占用内存多,切换复杂,CPU利用率低 占用内存少,切换简单,CPU利用率高 线程占优
创建销毁、切换 创建销毁、切换复杂,速度慢 创建销毁、切换简单,速度很快 线程占优
编程、调试 编程简单,调试简单 编程复杂,调试复杂 进程占优
可靠性 进程间不会互相影响 一个线程挂掉将导致整个进程挂掉 进程占优
分布式 适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单 适应于多核分布式 进程占优

多线程的意义

多线程的原理

CPU在不同的线程之间以一个非常小的时间片不断的进行调度。

多线程技术方案

1、pthread

2、NSThread

3、GCD

4、NSOperation

C与OC的桥接

线程生命周期

线程的生命周期分为5个部分,新建、就绪、运行、阻塞、死亡。

线程生命周期.png

线程的exit、cancel和suspend操作区别。

线程声明周期2

线程池的实现原理

线程池的实现原理如下图所示:


线程池实现原理.png

线程安全与锁

1、什么是线程安全?
    多线程操作共享数据不会出现想不到的结果就是线程安全的,否则,是线程不安全的。比如:多个线程同时访问或读取同一共享数据,每个线程的读到的数据都是一样的,也就不存在线程不安全。如果多个线程对同一资源进行读写操作,那么每个线程读到的结果就是不可预料的,线程是不安全的。

2、多线程锁
    线程安全的解决方法就是加锁 。
    锁是最常用的同步工具。一段代码段在同一个时间只能允许被一个线程访问。
    不要将过多的其他操作代码放到里面,否则一个线程执行的时候另一个线程就一直在等待,就无法发挥多线程的作用了。下图是iOS常用锁的性能表。

锁的性能对比.png
具体各种锁的介绍看文章:
1、iOS多线程-各种线程锁的简单介绍
2、iOS开发中的11种锁整理

3、atomic与nonatomic的区别

建议:

线程和runloop的关系

1、runloop与线程是一一对应的,一个runloop对应一个核心的线程,为什么说是核心的,是因为runloop是可以嵌套的,但是核心的只能有一个,他们的关系保存在一个全局的字典里。

2、runloop是来管理线程的,当线程的runloop被开启后,线程会在执行完任务后进入休眠状态,有了任务就会被唤醒去执行任务。

3、runloop在第一次获取时被创建,在线程结束时被销毁。

4、对于主线程来说,runloop在程序一启动就默认创建好了。

5、对于子线程来说,runloop是懒加载的,只有当我们使用的时候才会去创建,所以在子线程用定时器要注意:确保子线程的runloop被创建,不然定时器不会回调。

参考文章:
1、浅谈多进程多线程的选择
2、多线程原理分析
3、iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用
4、iOS线程通信和进程通信的例子(NSMachPort和NSTask,NSPipe)

上一篇 下一篇

猜你喜欢

热点阅读