Linux多线程概念

线程的概念:在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更细更轻量化

现在出现了很多新的问题,什么叫做进程内部?什么是执行分支?为什么属于进程的一部分?

下面通过画图理解的方式来解决上述的问题


目录

一、多线程理解

二、Linux线程的特点

1、创建过程

2、CPU调度

3、资源承担的实体

4、从图的角度理解进程和线程

三、线程的优缺点

1、线程的优点

2、线程的缺点


一、多线程理解

当一个进程被CPU调度的时候,其实就是进程的PCB被CPU调度了

在运行的时候,发现要处理一下其他东西,但是又不能妨碍到当前进程,按照我们以前的思路,或许就直接fork一个子进程,但是创建一个子进程的成本太高了,除了要创建一个task_struct,还要创建虚拟地址空间、页表等等。

现在我们换个方式,我们只创建一个task_struct,也就是进程控制块(PCB),然后让这个PCB指向原来的虚拟地址空间,每个区分出一小块给这个PCB使用,因为指向的是同一块虚拟地址,大部分内容是共享的(也有私有的),所以新创建出来的PCB就能看到所有的代码,现在OS只要告诉这个PCB执行哪一段代码就行

只能创建一个吗?并不,你可以创建多个,每有一根线指向虚拟内存(每存在一个PCB),这根线就代表一条执行分支(执行流),每一条执行分支我们称之为线程!因为有多个执行分支,所以我们称之为多线程

二、Linux线程的特点

1、创建过程

一个线程只是进程的一个执行分支,即一个PCB代表一个线程,所以创建一个线程只需要新增一个PCB

一个进程 = PCB(至少一个) + 虚拟内存 + 页表 + 代码和数据,所以进程在被创建的时候,先要创建PCB、虚拟内存、页表,然后通过页表建立虚拟内存和物理内存之间的映射关系。

2、CPU调度

以前常说,把xx进程加入到运行队列中,这种说法是错误的!!CPU调度的不是进程,线程才是CPU调度的基本单位!加入到运行队列的是PCB;进程是系统资源分配的基本单位

3、资源承担的实体

进程和线程都是资源承担的实体,区别在于,进程是承担系统资源的基本实体,一个进程在被创建的时候OS要创建虚拟地址、页表,这些系统资源是由OS分配的。

线程是承担进程资源的基本实体!因为是进程把一部分资源拿出来分给新增的PCB,才有了新的线程。

4、从图的角度理解进程和线程

进程是一个大家庭,线程只是这个大家庭里的一个成员,大家各司其职

—》每个成员有共享的资源,比如电视机、洗衣机,换到OS里就是全局变量和代码;

—》当然,大家也有自己的私有资源,比如自己的衣柜、放在冰箱里的蛋糕,换到OS里就是线程ID、栈、信号屏蔽字、调度优先级、上下文数据

三、线程的优缺点

既然谈到多线程,那么线程有哪些优点?同时又有哪些缺点?线程异常时会造成什么后果?

1、线程的优点

第一点,创建一个新线程的代价要比创建一个进程的代价要小得多。上面在说明线程创建的特点时已经说明过了。

第二点,线程之间的切换要比进程之间的切换要简单很多。同一个进程中线程的切换只需要切换PCB和上下文就行,但是进程的切换需要切换用户地址空间、用户级页表同时更新缓冲区等等。

第三点,线程占用的资源比进程更小。线程不会向OS申请资源,线程分担的是进程资源,进程的资源是一开始就分配好的。

第四点,在计算密集型应用中,将计算分解到多个线程中实现。计算密集型应用主要使用的是CPU资源,通常是做一些加密运算、大数据运算等,最典型的就是我们的压缩软件。

第五点,在I/O密集型应用,将I/O操作重叠,线程可以同时等待不同的IO操作。IO密集型应用主要使用的是内存和外设的IO资源,比较常见的就是网络下载、云盘、在线直播或看电影等。

2、线程的缺点

第一点,性能损失。线程太多,并非好事,就像上面的计算密集型、IO密集型,CPU就要频繁去切换线程,虽然切换的成本相对较小,但会导致线程被过度调度和切换。

第二点,健壮性降低。进程之间是相互独立的,一个进程的崩溃不会影响到其他进程,比如QQ崩溃不会影响到微信,但是一个线程的崩溃或者异常,比如线程出现除0操作、使用野指针,这个时候OS就会给进程发送信号!注意是进程!这将直接让其他线程以及整个进程崩溃。

第三点,缺乏访问控制。进程之间是相互独立的,资源是无法相互访问的(除非进行通信),但是线程使用的是同一个地址空间,所以一个线程可以修改其他线程创建的变量,容易引起数据错乱问题。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值