iOS详解多线程(概念篇——进程、线程以及多线程原理)

多线程之概念.png

多线程在我们的开发中占据重要位置,为了系统的总结多线程,我们在这一节中详细的剖析多线程,由浅入深,全面理解多线程。
拒绝搬砖,源码亲测,git上有源码。

本节知识点:

相关概念

  1. 进程
  2. 线程
  3. 多线程
    3.1 单核CPU和多核CPU
    3.2 为什么需要多线程?
    3.3 多线程原理
  4. 主线程
  5. 并发、并行、串行、同步、异步、队列
1.进程

什么是进程?
在手机系统中,每一个应用程序就是一个进程。进程之间互相隔离,运行在自己的受保护的内存中。

2. 线程

每一个进程如果想要正常运行,至少要有一个线程,必须要有的这个线程我们一般称为『主线程』。
一个进程可以有很多个线程。线程之间也是可以互相通信的。


image.png
3. 多线程
3.1 单核CPU和多核CPU

我们都知道计算机最重要的部件CPU,就像人类的大脑一样,控制着计算机的各种工作。计算机的五大部件还记得吗?运算器、控制器、存储器、输入和输出。CPU就是把运算器和控制器组合到一起,再加上寄存器和CPU总线构成的。

图片来源于网络,侵删.png

我们现在使用的CPU大部分都是单个多核CPU,CPU的核与我们今天研究的线程有什么关系呢?
单核CPU
一个CPU只有一个核心 。
多核CPU
一个CPU有多个核心。

一个核心同时只能处理一个线程。
3.2 为什么需要多线程?

我们知道,一个线程中,任务是顺序执行的。一个任务结束了,才能执行下一个任务。我们的CPU有多个核心,而且一个核心同一时间只能处理一个线程。那么就有问题了,如果只有一个线程,就需要一个核心就可以了,其他核心就不需要了,这不是资源的浪费吗?

只有单个线程的情况:


单线程简单示意图.png

有了多线程以后:


多线程简单示意图.png

因为我们的CPU有了多个核心这个前提,我们的多线程才能够提高效率。如果我们的CPU只有一个核心,这个核心在不同的线程之间切换,不但不会提高效率还会因为切换线程的开销而降低效率。

3.3 多线程原理

同一时间,CPU的一个内核只能处理一个线程,也就是说,CPU同一时间能够处理的线程数是由CPU的内核决定的。
那么,我们开启了多个线程,CPU是如何工作的呢?
多条线程的并发执行,其实是CPU快速的在多条线程之间调度,造成多线程并行的假象。

通俗一点讲,我们的计算机只有一个CPU,假如这个CPU有4个内核,我们现在有3个正在运行的线程,那么就可能有一个内核闲置,其他三个线程是真正的并发。
如果我们开启了10个线程,那么我们的内核就不够了,难道要等其他线程执行完了再执行等待的线程吗?万一这个线程很着急,或者前面未执行的线程很耗时,岂不是很影响体验。就像,我们的手机卡死了,我们点啊,点啊,手指头都痛了,它依然没反应,是不是很生气?
这个时候,我们的CPU会把内核的使用权限分成一个个的时间片,10个线程就像10个小朋友一样排排坐,然后轮流使用cpu,不至于大家有意见。当然,这只是大致描述,真实的CPU调度还是要复杂的多。
我们的系统只有一个CPU,但是我们却又很多的应用程序,同一时间我们也会开启很多应用,比如我一边听歌,一边和朋友聊天,就有可能开启音乐和聊天两个应用,CPU不可能只为某一个应用服务,所以真实的CPU使用情况会更加的复杂。

4. 主线程

一个进程中最重要的线程,也是不可或缺的线程。当程序启动的时候,自动创建了主线程。主线程在整个APP生命周期内一直存在,且一直运行。主线程用来更新UI,处理点击、滑动等触发事件。


image.png
5. 并发、并行、串行、同步、异步、队列
5.1 并发

在一个时间段内,几个线程同时执行,其实是CPU在线程之间快速切换,几个线程轮流使用CPU的结果。

5.2 并行

在一个时间点,注意,是时间点,几个线程同时进行。比如,CPU有8个内核,目前有3个线程分别在3个内核中执行,这三个线程就是并行。

5.3 串行

线程一个接一个的执行。比如有ABC三个线程,A执行完执行B,B执行完执行C,ABC就是串行。

5.4 同步

在当前线程中执行任务,不具备开启新线程的能力。

5.5 异步

在新的线程中执行任务,具备开启新线程的能力。

5.6 队列

队列是对线程进行管理的。有串行队列,主队列,并发队列等。

本章小结

本节中,对于多线程中涉及到的概念进行了全面的理解,这些理解也是参考了很多网友的成果总结而来的。如果有什么偏差,还请指教。
下一节,一起学习多线程的实现方案吧。在iOS中,我们常用的有:

  1. NSThread(OC)
  2. GCD(C语言)
  3. NSOperation(OC)

还有一个 C语言的pthread(C语言)也可以实现多线程。

有什么问题,欢迎留言讨论。

下一节:详解多线程(实现篇)

你可能感兴趣的:(iOS详解多线程(概念篇——进程、线程以及多线程原理))