iOS面试相关part1--多线程网络

1. 进程和线程

概念

  • 线程是CPU调用(执行任务)的最小单位。
  • 进程是CPU分配资源和调度的单位。

关系

  • 一个程序可以对应多个进程,一个进程中可以有多个线程,但至少要有一个线程。(程序>进程>线程)
  • 同一个进程内的线程共享进程的资源。
  • 例如:工厂->程序、 车间->进程 、 工人->线程

联系

  • 线程是进程的基本单位
  • 线程和进程是程序运行的基本的单位,由OS(操作系统)产生,实现系统对应用程序的并发性

区别

  • 有不同的操作系统管理方式
    • 进程:独立的地址空间;若一进程崩溃不会影响其他进程(保护模式)
    • 线程:无独立的地址空间;拥有自己的堆栈和局部变量;若一线程崩溃会影响所在进程崩溃(非保护模式)
    • 小结:
      • 多进程比多线程更具健壮性,但是多进程在快速切换进程时更耗费资源 效率低
      • 多线程优点:
        ①能适当提高程序的执行效率
        ②能适当提高资源利用率(CPU、内存利用率)
      • 多线程缺点:
        ①开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能。
        ②线程越多,CPU在调度线程上的开销就越大。
        ③程序设计更加复杂:比如线程之间的通信、多线程的数据共享

2. 多线程

iOS中的多线程

  • 主线程(UI线程、编号为1的线程)
  • 作用
    • 刷新界面、显示界面
    • 处理UI事件
  • 注意:禁止耗时操作

多线程原理

  • 同一时间 单CPU只能1条线程工作
  • 线程不是越多越好,CPU需要上下文存储线程的信息,才能便于切换
  • 开发中,最多3~5条线程
  • eg:加载图片的时候,一定要在子线程完成(异步并行,推荐框架SDWebImage)

3. 多线程的实现

pthread

  • 特点
    (1)一套通用的多线程API
    (2)适用于Unix\Linux\Windows等系统
    (3)跨平台\可移植
    (4)使用难度大
    (5)语言:C语言
    (6)使用频率:几乎不用
    (7)生命周期:由程序员管理

NSThread

  • 特点
    (1)使用更加面向对象
    (2)简单易用,可直接操作线程对象
    (3)语言:OC语言
    (4)使用频率:偶尔
    (5)生命周期:由程序员管理

GCD

  • 特点
    (1)旨在替代NSThread等线程技术
    (2)充分利用设备的多核(自动)
    (3)语言:C语言
    (4)使用频率:经常使用
    (5)生命周期:自动管理

NSOperation

  • 特点
    (1)基于GCD(底层是GCD)
    (2)充分利用设备的多核(自动)
    (3)语言:C语言
    (4)使用频率:经常使用
    (5)生命周期:自动管理

4. NSThread线程的状态

  • 新建-就绪-运行-阻塞-死亡
  • 切换条件:
    • ①线程创建后([NSThread alloc]initwithTarget....),便处于新建状态,内存会给该线程对象分配资源
    • ②开启线程([thread start]),线程被放入可调度池,处于就绪状态 --- 新建->就绪
    • ③CPU调度线程时,线程变成运行状态,当该线程的时间片过完(执行其他线程),线程又会变成就绪状态 --- 就绪<->运行
    • ④等待同步锁的线程或执行了[thread sleep],线程会移出可调度池,变成阻塞状态,无法工作 --- 运行->阻塞
    • ⑤获得同步锁的线程或执行完sleep方法时,线程对象又会被移动到可调度池,变成就绪状态 --- 阻塞->就绪
    • ⑥任务完成或者异常退出时,线程的资源会被回收,进入死亡状态,不能再变成其他状态,为终结态

5. 线程安全

  • 产生原因(加锁条件):多条线程访问同一个资源。eg:卖票系统
  • 解决方法:加互斥锁(术语:线程同步)
  • 代码:@synchronized (需加锁对象): 给代码加一个同步锁
原子属性 非原子属性
atomic (默认) nonatomic
会为属性setter方法加锁 不会为属性setter方法加锁
安全 不安全
消耗性能,适合内存大的设备 适合内存小的设备
  • 推荐
    • 1.属性都设为非原子属性 -- 需要加锁的地方很少
    • 2.客户端负责UI和数据,尽量避免安全问题

6. 线程通信

NSThread

    第一种方式
  //    [self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];

    第二种方式
  //    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

    第三种方式
        [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
  • 子线程下载,主线程显示 -- 实现通信 -- 第三个参数,是否等待这个方法结束才继续执行后面代码
  • performSelectorOnMainThread
  • performSelectorOnThread -- 可以直接作用在NSObject上 -- 方法直接用对象的setter方法
  • Q1:网络图片处理问题中怎么解决一个相同的网络地址重复请求问题?
    • 利用字典(图片地址(url)为 key,下载操作(download)为 value)

7. GCD

1)GCD的全称是Grand Central Dispatch,是iOS开发中一门用来实现多线程编程的技术
2)GCD本身是纯C语言的,但内部提供了非常多强大的函数
3)GCD是苹果公司为多核的并行运算提出的解决方案,并且自动利用更多的CPU内核(比如双核、四核)
4)GCD会自动管理线程的生命周期(比如创建线程、调度任务、销毁线程等等都不需要程序员关系)
5)使用GCD实现多线程编程只需要两个步骤,先封装好要执行的任务(代码块),然后把任务添加到对应的队列中即可
  • GCD基本知识
    1) 两个核心概念-队列和任务
    2) 同步函数和异步函数

  • GCD基本使用【重点】

    • 1 异步函数+并发队列:开启多条线程,并发执行任务
    • 2 异步函数+串行队列:开启一条线程,串行执行任务
    • 3 同步函数+并发队列:不开线程,串行执行任务
    • 4 同步函数+串行队列:不开线程,串行执行任务
    • 5 异步函数+主队列:不开线程,在主线程中串行执行任务
    • 6 同步函数+主队列:不开线程,串行执行任务(注意死锁发生)
    • 7 注意同步函数sync和异步函数async在执行顺序上面的差异

你可能感兴趣的:(iOS面试相关part1--多线程网络)