多线程介绍

文章对比了多线程和多进程在资源利用、创建销毁效率及并发编程中的作用。线程作为轻量级进程,创建销毁成本低,适合多核CPU资源利用,但线程过多会导致调度开销增大。线程间共享内存可能导致线程不安全问题,而进程异常可能影响整个进程的稳定性。

多线程

进程

进程存在的意义就是让操作系统可以同时执行多个任务,从而实现“并发编程”的效果。可以达到充分利用到多核CPU资源的目的。

进程创建步骤

1.创建PCB
2.把进程分配资源(内存/文件),赋值到PCB中。
3.把PCB插入链表

其中分配资源这个事情,对操作系统来说是比较消耗时间的。

进程销毁的步骤

1.把PCB从链表中删除
2.把PCB中持有的资源释放
3.销毁PCB

线程

虽然多进程已经实现了并发编程,但是存在重要的问题,如果频繁的创建和销毁进程,这个操作就会比较低效。

为了减少不必要的开销,就诞生了线程(Thread)

  1. 线程是被包含在进程中的,一个进程默认会有一个线程,也可能有多个。
  2. 每个线程都是一个“执行流”,可以单独的在CPU上进行调度。
  3. 同一个进程中的这些线程,共用一分系统资源(内存+文件)

"线程"也被成为轻量级进程:

创建和销毁线程的开销比都比进程小

使用多线程的优点

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啦,你们也别做了!!!!”

如果某个线程执行过程中出现异常,并且异常没有处理好整个进程都会随之崩溃,这个时候后续其他线程自然难以运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值