iOS 底层 多线程的基本概念 - AlvinSunny/OC-TheUnderlying GitHub Wiki

首先对一些基本的概念做一些了解!

什么是进程?

  • 一个正在运行的程序可以看做一个进程。
  • Process 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

iOS进程生命周期

什么是线程 ?

  • 线程是进程中的实际执行单元,进程中的任务执行依赖线程来实现。
  • thread 是操作系统能够进行运算调度的最小单位。被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

线程的生命周期@2x.png

线程各个状态下线程所处的位置:

新建状态:在内存中,但不在可调度池

就绪状态:在可调度池中,可以执行任务

运行状态:在可调度池中,正在执行任务

阻塞状态:被移出可调度池,在内存中,不能执行任务

死亡状态:被释放

什么是主线程?

当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread),因为它是程序开始时就执行的。主线程是负责执行main函数的线程;主线程中几乎所有的事情都是交给runloop去做,比如UI界面刷新、点击事件的处理、performSelector等需要Runloop,但是像简单的普通代码:NSLog输出、变量定义等是不需要Runloop参与的;

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

什么是多线程 ?

  • multithreading , 是指从软件或者硬件上实现多个线程并发执行的技术。
  • 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。
  • 多线程的调度原理可以认为是:时间片轮转调度算法,每个线程都会分配一个时间片然后大家轮着做任务,多线程执行时会快速切换时间片来完成多线程任务的执行;其实操作系统对进程、线程都是按照这种调度逻辑实现的。

iOS中常见的多线程方案

多线程方案@2x.png

  • mach pthread: 极少用来开启多线程,但在高精度的定时会用到 mach_wait_until()

  • pthread:一套通用跨平台API,开发中几乎不怎么使用开启多线程,但线程同步技术中会用到pthread_mutex、读写安全方案会用到pthread_rwlock; pthread是POSIX的线程标准,定义了创建和操纵线程的一套API。pthread支持跨平台,在unix,linux,windows,ios等系统下都支持。 注:POSIX指可移植操作系统接口(Portable Operating System Interface),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。😄😄 🎉 pthread源码地址

  • NSThread: 是对pthread的OC封装, 是一个OC对象,简单易用,可直接操作线程对象

  • GCD: 旨在替代NSThread等多线程技术,充分利用设备的多核效率高,且可以保证线程安全。是一套C语言的API

  • NSOperation: 基于GCD的OC封装,比GCD多了些实用功能,比如:添加依赖