线程的定义
- 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行。
- 进程要想执行任务,必须得有线程,进程至少要有一条线程。
进程的定义
- 进程是指在系统中正在运行的一个应用程序
- 每个进程之间是独立的,每个进程均在其专用的且受保护的内存中运行。
进程与线程的区别
- 地址空间:同一进程的线程共享本进程的地址空间,而进程之间是独立的地址空间
- 资源拥有:同一进程内的线程共享共享本进程的资源的,如 内存、I/O、cpu等,进程之间的资源地独立的。
多线程原理
- (单核CPU)同一时间,CPU只能处理一个线程,就是同一时间只有一个线程在执行
- (多线程运行)CPU快速的在多个线程之间切换,CPU调度线程的时间足够快,造成了多线程“同时”执行的效果。
- 如果线程非常多,CPU会在多个线程之间切换,小号大量的CPU资源,每个线程被调度的次数会降低,线程的执行效率降低
优点
- 能适当提高程序的执行效率
- 能适当提高的资源的利用率(CPU、内存)
- 线程上的任务执行完毕后,线程会自动销毁
缺点
- 开启线程需要占用一定的内存空间(默认情况每个线程512KB)
- 如果开启大量的线程,会占用大量的内存空间,降低程序性能
- 线程越多,CPU在调用线程上的开销就越大
- 程序设计更加复杂,比如线程之间的通信、多线程的数据共享
多线程技术方案
关于多线程的选型:常用的用该是 NSThread 、GCD、NSOperation 这三种, GCD使用的最多,因为直接是block形式,使用简单。 NSOperation 易于控制 常用于多操作功能。
线程生命周期
线程的生命周期分为 新建、就绪、运行 、阻塞、死亡, 这么五种状态。下边聊一下它的这个五个阶段:
1.创建一个线程,start 线程进入就绪状态,即将开始运行。
2.CPU调度线程开始运行,Running执行分为两种状态,阻塞和死亡
阻塞:
- 子线程执行会形成一系列 I/O流 堵塞,当堵塞执行完毕之后会执行Runnable, 此时它会有一个短暂停留期,如果超过这个短暂停留期,那么这条线程会被销毁。
- 如果这条线程正在销毁,此时CPU正好要调度,发现处于正在销毁中, 那么此时会开辟其他新线程 (线程2、线程3、线程4)等。
- 如果线程已经销毁,此时CPU正好去调度,也有可能优先调度此线程(重新创建一个相同的线程【内存地址相同】),这取决于CPU的处理(因为通过控制台可以看出有时候一直在使用同一个线程)
死亡: 任务执行完毕或者执行了 exit、cancel 、等, 线程会走向死亡,
线程池调度原理
线程不安全
线程不安全主要讲的是资源抢夺。同步锁 @synchronized(资源)