Linux多线程

ops/2024/10/20 5:36:03/

目录

背景知识

重谈地址空间​编辑

理解代码划分数据的本质

线程的概念和Linux中线程的实现

什么是线程

线程的优点

线程的缺点 

线程异常 

线程用途 

澄清并统一进程线程

见见线程


背景知识

重谈地址空间

理解代码划分数据的本质

虚拟地址本质是一种资源!

线程的概念和Linux中线程的实现

什么是线程

线程:在进程内部进行,是CPU调度的基本单位!

 

1.  在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”

2.  一切进程至少都有一个执行线程

3.  线程进程内部运行,本质是在进程地址空间内运行

4.  在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化

5.  透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流

线程的优点

1.  创建一个新线程的代价要比创建一个新进程小得多

2.  与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多

3.  线程占用的资源要比进程少很多

4.  能充分利用多处理器的可并行数量

5.  在等待慢速I/O操作结束的同时,程序可执行其他的计算任务

6.  计算密集型应用(加密解密或文件压缩以算法为主消耗cpu资源居多的),为了能在多处理器系统上运行,将计算分解到多个线程中实现

7.  I/O密集型应用(读取文件,上传下载等),为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。  

线程的缺点 

性能损失

一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型 线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的 同步和调度开销,而可用的资源不变。

健壮性降低

编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了 不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。

缺乏访问控制

进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
万一某个数据是a线程定好的,但是b贸然修改这个数据会影响其他线程

编程难度提高

编写与调试一个多线程程序比单线程程序困难得多;

线程异常 

1.  单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃

2.  线程进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程进程终止,该进程内的所有线程也就随即退出

线程用途 

1.  合理的使用多线程,能提高CPU密集型程序的执行效率

2.  合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)

澄清并统一进程线程

进程线程

1.  进程是资源分配的基本单位

2.  线程是调度的基本单位

3.  线程共享进程数据但也拥有自己的一部分数据:

线程ID

一组寄存器

errno

信号屏蔽字

调度优先级

进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:

文件描述符表

每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)

当前工作目录

用户id和组id

见见线程

为什么两个执行流却只能查到一个进程呢? 因为这两个线程同属于一个进程内部

那么已经有多进程了为什么还要有多线程? 

进程创建的成本非常高(时间调度,空间开辟等);

创建线程成本非常低(只需要创建pcb即可);在运行期间线程调度成本低(线程切换的时候上下文保护只需切换pcb就行,页表等不用动);删除一个线程成本低;

 不同系统对于进程线程的时间效率不一样,那为什么os课本就只有一本?

遵守的原则就是线程是CPU调度的基本单位!就线程而言Linux和Windows的做法完全只是最终达到的目标必须得是完全一样的(必须让线程进程内部运行,是CPU调度的基本单位)

 


http://www.ppmy.cn/ops/121915.html

相关文章

八、特殊类型异常机制

特殊类型&异常机制 数据类型枚举类型匿名类、单例类和伴生对象匿名类单例类伴生对象 委托模式密封类型异常机制异常的使用异常的处理 数据类型 对于那些只需要保存数据的类型,我们常常需要为其重写toString、equals等函数,针对于这种情况下&#xf…

【自定义网络协议】Java基于Vert.x的自定义TCP协议实现

在现代的软件开发中,TCP协议广泛应用于需要高效、低延迟数据传输的场景。相较于HTTP协议,TCP提供了更底层的控制和更高的性能,适用于嵌入式设备、实时数据传输等应用。Vert.x是一个基于事件驱动、异步和多线程的高效开发框架,特别…

【Linux网络】详解TCP协议(3)

🎉博主首页: 有趣的中国人 🎉专栏首页: Linux网络 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解 TCP的流量控制和滑动窗口 的相关内容。 如果看到最后您觉得这篇…

Linux和指令初识

前言 Linux是我们在服务器中常用的操作系统,我们有必要对这个操作系统有足够的认识,并且能够使相关的指令操作。今天我们就来简单的认识一下这个操作的前世今生,并且介绍一些基础的指令操作 Linux的前世今生 要说Linux,还得从U…

深度学习基础—卷积神经网络示例

1.卷积神经网络的结构 在之前的博客《深度学习—简单的卷积神经网络》,仅由卷积层构成网络的全部,这还不是标准的网络结构,本文将继续介绍标准的卷积神经网络结构有哪些? 深度学习基础—简单的卷积神经网络https://blog.csdn.net…

qemu-system-aarch64开启user用户模式网络连接

一、问题 在使用qemu构建arm64的虚拟机时,虚拟机没有网络,桥接方式相对麻烦,我只是需要联网更新即可。与宿主机的通信我使用共享文件夹即可满足要求。 使用指令启动虚拟机时,网络部分的参数为 -net user,hostfwdtcp::10022-:22 …

【目标检测】桥梁表面缺陷检测数据集6710张7类缺陷VOC+YOLO格式

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6718 标注数量(xml文件个数):6718 标注数量(txt文件个数):6718 标注…

vue出现Component name “Politic“ should always be multi-word错误

效果 原因 组件名不能为单个单词,怕和html标签混淆 解决方法 1.选择多个单词区分 2.修改package.json里的rules规则,忽略文件命名校验