线程
线程介绍
我们知道进程就是运行起来的程序, 那线程又是什么呢?
一个线程就是一个 “执行流”. 每个线程之间都可以按照顺序执行自己的代码. 多个线程之间 “同时” 执行着多份代码. 进程包含线程.
举个例子:
我们可以认为一个进程就是一个工厂, 线程就是里面的流水线, 一个工厂里不止一个流水线, 这取决于你要处理的任务, 这样多个流水线共同完成任务的方式就叫做多线程.
而多进程就可以理解为为了完成任务而多开了几个工厂, 每个工厂就只有一个流水线, 显然这样消耗资源是更多的, 效率更低了.
像我们看电影, 这就是一个进程, 这个进程的任务就是把电影完美播放出来, 而放电影这个大任务可以划分为很多小任务, 比如音效处理, 图形渲染, 网络连接等等, 每个线程完成一个小任务, 这样整个进程就可以完成整个任务了, 要注意多线程并不影响进程的并发, 它们的同时存在的, 并不矛盾.
注意:
进程具有的属性比如: 进程的优先级, 进程状态, 进程的上下文, 进程的记账信息等, 这些线程都有(上面进程改为线程即可).
为什么要有线程呢?
其实进程有个重大的缺点, 那就是"比较重量", 主要体现在资源的分配上, 比如: 系统要给进程分配一块内存, 系统就要遍历自己的空闲内存表, 来找到一块大小差不多的内存来分配. 当多个进程向系统申请资源时, 系统得一个一个来分配, 这就导致:
- 创建一个进程, 成本比较高.
- 销毁一个进程, 成本也比较高.
- 调度一个进程, 成本还是高.
所以进程比较 “重量” 速度慢, 消耗资源多.
而线程则是更轻量的进程(轻量级进程), 对于线程而言, 系统资源是已经分配好的, 这为创建线程省下分配资源的开销.
线程与进程的区别于联系(重点)
- 进程包含线程.
- 进程有自己独立的空间和文件描述符表, 同一个进程的多个线程之间, 共享同一份地址空间和文件描述符表.
- 进程是操作系统资源分配的基本单位, 线程是操作系统调度执行的基本单位.
- 进程之间具有独立性, 一个进程挂了, 不会影响另一个进程; 同一个进程的多个线程之间, 一个线程挂了, 可能会影响到其他线程, 进而把整个进程带走.