进程和线程
-
什么是进程
进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
-
什么是线程
1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)
线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行
比如使用酷狗播放音乐、使用迅雷下载电影,都需要在线程中执行
多线程
1.什么是多线程
1个进程中可以开启多条线程,每条线程可以并行(同时)执行不同的任务
进程 ->车间,线程->车间工人
多线程技术可以提高程序的执行效率
比如同时开启3条线程分别下载3个文件(分别是文件A、文件B、文件C)
2.多线程的原理
同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
思考:如果线程非常非常多,会发生什么情况?
CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源
每条线程被调度执行的频次会降低(线程的执行效率降低)
3.多线程的优缺点
多线程的优点
能适当提高程序的执行效率
能适当提高资源利用率(CPU、内存利用率)
多线程的缺点
开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能
线程越多,CPU在调度线程上的开销就越大
程序设计更加复杂:比如线程之间的通信、多线程的数据共享
任务与队列
- 任务:指的就是需要执行的代码;GCD中提供block回调;执行的方式有两种:同步与异步;两者之间的区别就是会不会创建新的线程。
- 队列:用于存放任务。一共有两种队列, 串行队列 和 并行队列。
队列是存放任务的地方,可以理解为存放的是一段一段将要执行的代码。而线程是执行任务的流程,指的是执行完 A 接着执行 B, 然后再执行 C, 这样 A.B.C.看起来就是一条执行路线,就称其为线程。
任务的执行过程是这样的:我们把要执行的任务添加到队列,接下来系统会从队列中取出任务执行;系统根据队列的类型(串行队列、并行队列)执行不同的操作,如果是串行队列:系统会把这个队列中的任务取出来在某一个线程中执行。如果是并行队列:系统会把队列中的任务取出来放到很多个线程中同时执行。
所以,队列是不可能阻塞的。比如:并行队列中有很多任务,其中一个非常耗时,但是这个耗时任务执行的时候,其他的任务会在其他线程无忧无虑的执行,不受影响,说明系统在继续把队列中的任务取出来,所以队列没有阻塞。在串行队列中,因为一个队列对应一个线程,所以如果线程被耗时任务阻塞了,系统这时也就无法再往这个线程上放任务,所以容易混淆,使你以为是队列阻塞了。其实,队列是没有阻塞的概念,只要有空线程,系统就可以把任务放上去。
串行队列 中的任务会根据队列的定义 FIFO(先进先出) 的执行,一个接一个的先进先出的进行执行。
并行队列 GCD 也会 FIFO的取出来,但不同的是,它取出来一个就会放到别的线程,然后再取出来一个又放到另一个的线程。这样由于取的动作很快,忽略不计,看起来,所有的任务都是一起执行的。不过需要注意,GCD 会根据系统资源控制并行的数量,所以如果任务很多,它并不会让所有任务同时执行。
同步执行 | 异步执行 | |
---|---|---|
串行队列 | 当前线程,一个一个执行 | 其他线程,一个一个执行 |
并行队列 | 当前线程,一个一个执行 | 开很多线程,一起执行 |