iOS与多线程(八) —— 多线程技术概览与总结(一)
版本记录
版本号 | 时间 |
---|---|
V1.0 | 2019.06.24 星期一 |
前言
信号量机制是多线程通信中的比较重要的一部分,对于
NSOperation
可以设置并发数,但是对于GCD
就不能设置并发数了,那么就只能靠信号量机制了。接下来这几篇就会详细的说一下并发机制。感兴趣的可以看这几篇文章。
1. iOS与多线程(一) —— GCD中的信号量及几个重要函数
2. iOS与多线程(二) —— NSOperation实现多并发之创建任务
3. iOS与多线程(三) —— NSOperation实现多并发之创建队列和开启线程
4. iOS与多线程(四) —— NSOperation的串并行和操作依赖
5. iOS与多线程(五) —— GCD之一个简单应用示例(一)
6. iOS与多线程(六) —— GCD之一个简单应用示例(二)
7. iOS与多线程(七) —— GCD之一个简单应用示例源码(三)
线程和进程
1. 进程
进程是指在系统中正在运行的一个应用程序。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。
2. 线程
1个进程要想执行任务,必须得有线程,每1个进程至少要有1条线程,称为主线程。一个进程(程序)的所有任务都在线程中执行。
也可以这么理解:线程是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。
一个程序至少一个进程,一个进程至少一个线程。
线程的串行:1个线程中任务的执行是串行的。如果要在1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务。也就是说,在同一时间内,1个线程只能执行1个任务。
3. 线程和进程的区别
- 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
- 资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、CPU等,但是进程之间的资源是独立的。一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
- 执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 线程是CPU调用(执行任务)的最小单位,但是进程不是。
- 进程是CPU分配资源的最小单位,一个进程中至少要有一个线程。
- 两者均可并发执行。
4. 优缺点
线程执行开销小,但是不利于资源的管理和保护。线程适合在SMP机器(双CPU系统)上运行。
进程执行开销大,但是能够很好的进行资源管理和保护。进程可以跨机器前移。
何时使用多进程,何时使用多线程?
- 对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
- 要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。
多线程
1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务,多线程技术可以提高程序的执行效率。
1. 原理
同一时间,CPU只能处理1条线程,只有1条线程在工作(执行),多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换),如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。
那么如果线程非常非常多,会发生什么情况?
CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源,同时每条线程被调度执行的频次也会会降低(线程的执行效率降低)。
2. 优缺点
优点
- 能适当提高程序的执行效率
- 能适当提高资源利用率(CPU、内存利用率)
缺点
- 创建线程是有开销的,iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可以使用
-setStackSize:
设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间。 - 如果开启大量的线程,会降低程序的性能,线程越多,CPU在调度线程上的开销就越大。
- 程序设计更加复杂:比如线程之间的通信、多线程的数据共享等问题。
总结图表
首先看一下总结的一个图表,来自于这里,盗的图,感觉这个总结的很好。
所以我也引用收藏下,方便学习和查看。
实现方案
下面看下多线程的实现方案
后记
本篇主要讲述了多线程概览和总结,感兴趣的给个赞或者关注~~~