多线程
进程
进程存在的意义就是让操作系统可以同时执行多个任务,从而实现“并发编程”的效果。可以达到充分利用到多核CPU资源的目的。
进程创建步骤
1.创建PCB
2.把进程分配资源(内存/文件),赋值到PCB中。
3.把PCB插入链表
其中分配资源这个事情,对操作系统来说是比较消耗时间的。
进程销毁的步骤
1.把PCB从链表中删除
2.把PCB中持有的资源释放
3.销毁PCB
线程
虽然多进程已经实现了并发编程,但是存在重要的问题,如果频繁的创建和销毁进程,这个操作就会比较低效。
为了减少不必要的开销,就诞生了线程(Thread)
- 线程是被包含在进程中的,一个进程默认会有一个线程,也可能有多个。
- 每个线程都是一个“执行流”,可以单独的在CPU上进行调度。
- 同一个进程中的这些线程,共用一分系统资源(内存+文件)
"线程"也被成为轻量级进程:
创建和销毁线程的开销比都比进程小
使用多线程的优点
1.能够充分利用上多核CPU
2.创建第一个线程的时候,需要申请资源,后续再创建新的线程,都是共用一份资源(节省了申请资源的开销)。销毁线程的时候,也只是小会到最后一个的时候,才真正释放资源。前面的线程销毁,都不必真释放资源。
如果把进程比作工厂,线程就是工厂中的流水线
方案一:多进程

如图所以,多一个进程就相当于多租一块地方,再额外搭建一个工厂,里面建成流水线。
方案二:多线程

如图所以,不用额外租一块地方,但是是生成线多了,生产效率也提高了,成本也大大降低了。
在操作系统内核中是用一组PCB描述一个进程,每个PCB对应于一个线程,一个进程至少有一个线程,也可以有多个,这组PCB上的内存指针和文件描述符表,其实是同一份东西。而状态,上下文,优先级,记账信息,则是每个PCB(每个线程)自己有一份。
线程和进程的区别
1.进程包含线程。
2.线程毕进程更轻量,创建更快,销毁毕业更快。
3.同一个进程的多个线程之间共用用一份内存/文件资源。进程和进程之间,则是独立的内存/文件资源。
4.进程是资源调度的基本单位,线程是调度执行的基本单位。
举个“栗子”
做100套试卷
一:多进程

优点是互不影响
缺点多占了位置
二:多线程

优点是少占了位置
缺点是容易互相影响(学霸做了15套,学渣做了5套,心态爆炸)
三:多线程(继续增加,效率能否进一步提升)

人少的时候,可以继续增加。

但是如果人多了,没位置了,旁边的人窃窃私语,玩手机打游戏,就会影响做题。
对应到线程上也是,线程数目不是越多越好。CPU的核心数是有限的,当线程数目达到一定程度的时候,CPU核心数就已经被吃满了。此时继续增加线程,也无法再提高效率,反而会因为线程太多,线程调度开销太大,影响了效率。
如果CPU是8核,8个线程就吃满了吗?
不一定,一个线程,可能在占用CPU也可能在阻塞等待状态。
此外,现代的CPU基本上都有“超线程技术”,比如一个核心能跑两个线程(如:8核16线程,12核24线程)
四:线程之间可能会相互影响
如果两个学生都想做简单的试卷,抢起来了就会产生问题。
如果两个线程同时修改同一个变量,也容易产生所谓的“线程不安全”问题。
五:进程异常
某个学生突然崩溃大喊:“喵的为什么我要做25套试卷!!!”然后愤然掀桌(╯°Д°)╯︵┻━┻
再去撕其他三个人的试卷,“老子不做啦,劳资free啦,你们也别做了!!!!”
如果某个线程执行过程中出现异常,并且异常没有处理好整个进程都会随之崩溃,这个时候后续其他线程自然难以运行。
文章对比了多线程和多进程在资源利用、创建销毁效率及并发编程中的作用。线程作为轻量级进程,创建销毁成本低,适合多核CPU资源利用,但线程过多会导致调度开销增大。线程间共享内存可能导致线程不安全问题,而进程异常可能影响整个进程的稳定性。
1534

被折叠的 条评论
为什么被折叠?



