Linux线程概念

news2025/8/6 16:11:07

重新认识一下进程

在之前写过的与进程相关的博文中,都把进程看作是只有一个PCB的进程。如图:

而实际上,在Linux中,进程不止一个执行流,而是可能会有几个或很多个。同一个进程中,每一个执行流都指向同一个虚拟地址空间,由操作系统创建。即在完整的进程中,进程包括:若干个执行流,虚拟地址空间,页表,以及存在物理内存中属于该进程的数据和代码。

我们透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流。当CPU调度进程的时候,只看执行流PCB。

 

通过上述对进程的重新认识,我们可以知道了一个进程内可以有1个执行流,也可以有多个。

线程的概念

首先我们得知道一件事:在Linux中,没有专门为线程设计的TCB,而是使用进程的PCB来模拟线程。

在教科书上面,对线程的概念是:在进程内部运行的一个执行流,属于进程的一部分,粒度要比进程更加细和轻量化。

我们可以对这句话进行解析:在进程内部运行,即线程在地址空间中运行。所谓执行流,即对于CPU来说,它只看PCB,而在进程中的每一个PCB都被分配了若干资源,CPU可以直接调度它们,按照一定的序列去调度。

因此,我们可以理解线程是"一个进程内部的控制序列"。

了解了什么是线程后,我们来看看在Linux中进程和线程的关系。

 

进程和线程

因为Linux中的线程是进程的PCB模拟出来的,因此不用维护线程和进程的复杂关系,不用单独为线程设计任何算法,而是直接使用进程的的一套相关的方法即可。OS只需聚焦在线程的资源分配上就可以了。

从内核视角看进程和线程的关系:

进程是承担分配系统资源的基本实体。线程是CPU调度的基本单位,承担进程资源的一部分的基本实体。也就是说,线程是向进程要资源,进程向OS要资源,CPU调度进程中的执行流,即线程。

看待Linux线程和接口:

Linux进程是轻量级的进程,在进程中,OS创建线程,CPU调度线程。Linux没有给一般用户提供直接操作线程的接口,而是提供了在同一个地址空间内创建PCB的方法和分配资源给指定PCB的接口。

进程和线程的共享和私有:

其实在Linux中没有线程这个东西,我的意思是没有真正独特设计出来的线程。因此在Linux中,所谓的线程,是轻量级的进程。所有的轻量级进程(可能是“线程”)都是在进程内部运行的(地址空间)。

对于进程,它大部分是具有独立性的,而有部分是共享资源(管道,ipc资源)。

对于线程,大部分资源都是共享的,有部分资源是“私有”的(线程ID、一组寄存器、栈、errno、信号屏蔽字、调度优先级等等)。

进程的多个线程共享 同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:文件描述符表、每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)、当前工作目录、用户id和组id。

线程的优点:

①创建一个新线程的代价要比创建一个新进程小得多
②与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
③线程占用的资源要比进程少很多
④能充分利用多处理器的可并行数量
⑤在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
⑥计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
⑦I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作

线程的缺点:

①性能损失:一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
②健壮性降低:编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
③缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
④编程难度提高:编写与调试一个多线程程序比单线程程序困难得多

线程异常:

①单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
②线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出

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

Linux下线程和进程的关系图:

可以看到,线程是进程的每一个执行流,一个进程中可以包含多个线程,也可以只有一个线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394107.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】3天速刷C语言(初识)

【声明】本篇博客只用于对与刚学习C语言的同学的一个初始了解,具体内容请继续关注本专栏后续内容。什么是C语言C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及…

模仿评论样式

主要用到了padding-left把左侧的空白给留出来,然后把头像定位到留出的空白位置。行内对齐样式,使用了display:inline-flex;align-items:center;图标本来要用字体比较方便,暂时用的从icon font下载的svg样式写的一塌糊涂,一点也没考…

说说转义字符 “\”

转义字符-escape character character 表示字符,包含两层含义, 1.字母 2.符号 转义: 改变含义 字符: 字母、符号 转义字符: 把 字母、符号 的含义改变了注意:这里有 2 个常常被忽视、忽略、轻视的转义规则&…

Java类加载器原理与实践

文章目录一、Java程序启动并运行的过程二、类加载器三、Java8内置的类加载器1. AppClassLoader2. ExtClassLoader3. BootStrap ClassLoader4. 3个类加载器之间的关系四、双亲委派模型五、关键类java.lang.ClassLoader1. loadClass(..)2. denfineClass(..)3. findClass(..)4. fi…

k8s client-go源码解析之informer 一

Informer(一) 注意:本文内容为学习笔记,内容为个人见解,不保证准确性,但欢迎大家讨论何指教。 本篇为先导篇, 介绍informer的入口工厂函数。 informer目录结构 (仅展示部分目录,省略的目录相似) clien…

项目实战典型案例27——对生产环境以及生产数据的敬畏之心

对生产环境以及生产数据的敬畏之心一:背景介绍总结升华一:背景介绍 本篇博客是对项目开发中出现的对生产环境以及生产数据的敬畏之心行的总结并进行的改进。目的是将经历转变为自己的经验。通过博客的方式分享给大家,大家一起共同进步和提高…

SpringCloud之 Gateway路由网关

文章目录Gateway 路由网关一、部署网关🍍①添加依赖🍍②设置配置文件🍍③创建启动类🍍④路由功能配置🍍⑤路由访问服务二、路由过滤器2.1 单个过滤器: 配置文件2.2 全局过滤器: 自定义类提示:以下是本篇文章…

【数据结构初阶】详解链表OJ题

目录一.删除链表中等于给定值的节点二.合并有序链表并返回三.链表的回文结构1.反转单链表2.返回非空链表的中间节点四.输出链表倒数第K个节点五.基于给定值x分割单链表六.返回两个链表的第一个中间节点一.删除链表中等于给定值的节点 我们先来看第一题(题目链接): 因为我们需…

王道《操作系统》学习(二)—— 进程管理(一)

2.1 进程的概念、组成、特征、组织 2.1.1 进程的概念 这里像QQ这个程序执行了多次,虽然名字一样,但是它们的PID不同。 2.1.2 进程的组成 (1)PCB (2)程序段 和 数据段 小例子:程序是如何执行的&…

Nacos实现配置中心

文章目录配置中心提供的基础功能Nacos实现配置中心1、在配置文件增加配置(application.yml)2、使用Value来引用配置使用配置中心,怎样的配置方式呢一、安装nacos二、启动服务发现1、引入依赖2、配置文件3、开启服务注册发现功能4、启动服务三…

quarkus 生产环境与k8s集成总结

quarkus 生产环境与k8s集成总结 大纲 基础准备quarkus2.13.7脚手架工程配置GraalVM-java11 安装配置配置maven3.8.7linux环境下云原生二进制文件打包环境搭建编译运行quarkus二进制文件quarkus二进制文件制作为docker镜像并运行使用k8s部署quarkus二进制文件 基础准备 生产…

手把手交叉编译mysql

1.下载mysql(注意下载boost版本,这样会少一步编译) 下载mysql的时候一定要看好交叉编译工具链的版本。因为mysql 8.0需要的工具链版本较高,所以有可能不支持 查看链接如下: MySQL :: MySQL 8.0 Reference Manual :: …

InstructGPT方法简读

InstructGPT方法简读 引言 仅仅通过增大模型规模和数据规模来训练更大的模型并不能使得大模型更好地理解用户意图。由于数据的噪声极大,并且现在的大多数大型语言模型均为基于深度学习的“黑箱模型”,几乎不具有可解释性和可控性,因此&…

「SAP ABAP」OPEN SQL(四)【FROM语句】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

CIMCAI port ai shipping ai artificial intelligence smart port

上海人工智能独角兽中集集团高科技中集飞瞳,是全球应用落地最广,规模最大,最先进的的港航人工智能高科技企业,工业级成熟港航人工智能产品全球规模化落地应用,全球前三大船公司及港口码头应用落地。上海人工智能独角兽…

3.4 按键控制LED灯光敏传感器控制蜂鸣器

按键控制LED灯1.1 按键连接示意图1.2 代码设计1.21 设计思路我们要实现按键控制led,我们需要完成LED和按键驱动代码,但如果把这两部分代码都混在主函数里面,那么代码显得过于杂乱,不容易管理和移植,所以对于这种驱动代…

记一次反射型XSS

记一次反射型XSS1.反射型XSS1.1.前言1.2.测试过程1.3.实战演示1.3.1.输入框1.3.2.插入代码1.3.3.跳转链接2.总结1.反射型XSS 1.1.前言 关于这个反射型XSS,利用的方式除了钓鱼,可能更多的就是自娱自乐,那都说是自娱自乐了,并且对系…

Maxscale读写分离实施文档

Maxscale介绍 MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换。 使用Maxscale无需对业务代码进行修改,其自带的读写分离模块,能够解析SQL语句&…

DD-1/40 10-40mA型【接地继电器】

系列型号: DD-1/40接地继电器 DD-1/50接地继电器 DD-1/60接地继电器 一、 用途及工作原理 DD-1型接地继电器为瞬时动作的过电流继电器,用作小电流接地电力系统高电压三相交流发电机和电动机的接地零序过电流保护。继电器线圈接零序电流互感器(电缆式、母…

Vue动态粒子特效插件(背景线条吸附动画)

目录 效果图: 一、安装: 二、引入 main.js 文件: 三、使用: 四、属性说明: 效果图: 一、安装: npm install vue-particles --save 二、引入 main.js 文件: import VueParticles…