linux_线程概念

线程特征:是进程内的执行分支,线程的执行粒度,要比进程要细。

1.理解Linux线程

线程<=执行流<=进程 

线程实际上是复用进程的数据结构和管理算法,进程的task struct,实际上是模拟线程,部分书中说Linux没有真正意义上的线程是不太准确的的,因为用进程模拟的线程,实际上复用了进程的内核的数据结构,从功能角度,Linux 的轻量级进程完全能实现线程的核心功能(如共享地址空间、并发执行),且用户态通过 pthread 库可屏蔽内核实现细节,对开发者而言与“真正的线程”无实质区别。因此,不能说 Linux“没有线程”,只是实现方式特殊。

在以往我们所谈到的进程中,操作系统其实是以进程为单位给我们分配资源,我们当前的进程的内部只有一个执行流。

在Linux的实现方案中,线程在进程内部执行,线程在进程的地址空间内运行。其原因是任何执行流要执行都要有资源,而地址空间是进程的资源窗口同时线程的执行力度要比进程更细,其本质原因是线程执行进程的代码的一部分

2.线程和进程的定义

 线程:线程操作系统调度的基本单位

进程:内核观点进程是承担分配系统资源的基本实体,进程=内核数据结构+代码和数据

执行流: 执行流也是资源,因为线程是进程内部的执行力资源

3.重谈地址空间

X86的特点便是起始地址+类型=起始地址+偏移量 

如int类型对该变量取地址,实际上拿到的是他的第1字节个地址

4.Linux线程的周边概念

以下从 缓存(cache)相关过程 和 线程切换效率更高的原因 两方面展开,结合图中 Linux 线程、进程的架构逻辑来讲:
 
一、缓存(cache)相关过程
 
图里的 “cache(缓存)”,核心是 CPU 缓存与进程/线程数据的关联 :
 
- 程序运行时,CPU 会把高频访问的内存数据(比如进程/线程的指令、常用变量等)暂存到 CPU 缓存里 。这样做是为了 减少 CPU 直接访问物理内存的次数(内存读写速度远低于 CPU 运算速度,缓存能当 “高速中转站”)。
- 对进程/线程来说,这些缓存里的 “热数据” 是它们高效运行的基础 。比如线程执行时,常用的  task_struct  部分信息、虚拟内存映射的关键数据,可能就存在缓存里,CPU 直接从缓存取数据,能大幅加快执行效率。
 
简单说,缓存就是给 CPU 快速 “存取常用数据” 开的 “绿色通道” ,让进程/线程跑起来更流畅,少等内存读写的 “延迟”。
 
、线程切换效率更高的原因
 
从图中 Linux 进程、线程的架构(共享虚拟地址空间、 task_struct  等)来看,线程切换比进程切换 “更轻量”,核心原因在这两点:
 
1. 地址空间 & 资源共享层面
 
- 进程切换:
进程有独立的虚拟地址空间( mm_struct  管理),切换时,CPU 缓存里的旧进程地址、数据会被 “清空/替换” ,还要重新加载新进程的页表、地址空间等一大堆资源(相当于换了一套全新的 “运行环境”),这一步特别耗时 。
- 线程切换:
同一进程里的线程 共享虚拟地址空间( mm_struct  是共用的)!切换时,不需要动页表、地址空间这些 “大块头”,缓存里的热数据(比如进程内共享的代码、全局变量缓存)大概率还能用 ,省去了重新加载地址空间的巨大开销。
 
2. PCB( task_struct )切换层面
 
- 进程切换:
除了地址空间,进程的  task_struct  里还得处理一大堆独立资源(文件描述符、信号量等),切换时要把这些状态全部 “保存 - 恢复”,流程复杂、耗时多。
- 线程切换:
线程的  task_struct  虽然也有自己的执行上下文(比如寄存器状态、程序计数器),但 共享了进程级的大部分资源(文件、信号等)。切换时,主要就是改改寄存器、程序计数器这些 “小状态”,比起进程切换要简单得多,自然更快 。
 
总结一下:
 
- 缓存过程 是 CPU 为了加速程序运行,把常用数据临时存在 “高速缓存” 里;
- 线程切换更快 ,是因为线程共享了进程的地址空间、大部分资源,切换时不用像进程那样 “大动干戈” 换地址空间、重新加载大量资源,所以效率更高 。
需要注意的是线程有属于自己的上下文和栈

5.线程的优缺点:一把双刃剑
 
(一)线程的优点
 
1. 创建与切换成本低:创建新线程比创建新进程划算多了。打个比方,创建进程就像在电脑里“新建”一个独立的软件环境,要分配很多资源;而线程就像是在同一个软件里开个“小分支”,资源共享,所以轻松不少。线程切换时,操作系统要做的工作也少,就像在同一个房间里换个角落干活,比跑到另一个房间方便。

2. 资源占用少:线程占的资源比进程少很多,这样就能同时运行更多线程,充分利用 CPU 的多核能力,让程序跑得更快。

3. 提升程序效率:要是程序需要等待慢速的 I/O 操作(比如读写文件、网络请求),线程可以在等待的时候去做别的任务,不浪费时间。对于计算密集型任务,把计算拆分成多个线程,能让多核 CPU 一起发力;对于 I/O 密集型任务,多个线程同时等待不同的 I/O 操作,也能提高整体性能 。
 
(二)线程的缺点
 
1. 性能损失:如果有很多计算密集型线程,处理器忙不过来,线程之间切换和同步会增加额外开销,就像好几个人挤在一个小房间干活,互相干扰,效率反而变低。

2. 健壮性降低:写多线程程序得特别小心。线程之间时间分配的小偏差,或者不小心共享了不该共享的变量,都可能出问题。而且线程之间缺乏保护,一个线程出问题,可能连累整个程序。

3. 缺乏访问控制:进程是访问控制的基本单位,线程里调用一些操作系统函数,可能影响整个进程,就像一个线程在“大团队”里搞破坏,会牵连所有人。

4. 编程难度高:多线程程序又难写又难调试。要考虑线程同步、竞争条件这些问题,稍微不注意就出错,比单线程程序复杂多了 。

6.样例代码

内核中没有明确的线程概念,只有轻量化进程概念,因此他不会给我们直接提供线程的系统调用,只会给我们提供轻量化进程系统调用。

Pthread的线程库是从应用层对轻量级进程接口进行包装,为用户提供直接线程的接口,几乎所有的Linux平台都是默认自带这个库的。Linux中编写多进程代码需要使用第三方Pthread库。

pthread_create  是 Linux 系统中用于创建新线程的函数,属于 POSIX 线程库(pthread)的核心接口。
 
函数原型
 

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine) (void *), void *arg);


参数说明
 
- thread:输出参数,指向  pthread_t  类型的变量,用于存储新创建线程的 ID。
- attr:线程属性设置,通常为  NULL  表示使用默认属性(如优先级、栈大小等)。
- start_routine:函数指针,指向线程启动后要执行的函数,该函数返回值和参数均为  void* 。
- arg:传递给  start_routine  函数的参数,若无需参数可设为  NULL 。

 
返回值
 
- 成功返回  0 ;
- 失败返回非  0  错误码(需通过  perror  或  strerror  查看具体错误信息)。

 
编译时需链接 pthread 库: gcc -o thread_demo thread_demo.c -lpthread 
 
注意点
 
- 线程创建后执行顺序不确定,取决于系统调度。
- 若主线程先于子线程结束,可能导致子线程未执行完就被终止,需用  pthread_join  等待子线程。
- 避免在多线程中共享非线程安全的资源(如全局变量),必要时使用互斥锁( pthread_mutex )同步。

多线程调度中任意一线程出错都会引起多线程的崩溃

一定要链接库 gcc -o thread_demo thread_demo.c -lpthread 

代码 

现象 

两个执行流同时执行

 这两个执行流他们的pid是相同的

通过指令ps -aL

 

kill-9命令删除任意一线程都会使进程终止因为线程属于轻量化进程,它本身就是进程的一部分,我们发送的指令实际上是发送给了进程 

数据集介绍:新鲜与腐烂水果多类别目标检测数据集一、基础信息数据集名称:新鲜与腐烂水果多类别目标检测数据集图片数量:- 训练集:4,489张图片- 验证集:1,224张图片- 测试集:298张图片分类类别:- freshapple(新鲜苹果)- freshbanana(新鲜香蕉)- freshmango(新鲜芒果)- freshorange(新鲜橙子)- freshstawberry(新鲜草莓)- rottenapple(腐烂苹果)- rottenbanana(腐烂香蕉)- rottenmango(腐烂芒果)- rottenorange(腐烂橙子)- rottenstawberry(腐烂草莓)标注格式:YOLO格式,包含边界框和类别标签,支持目标检测任务。数据特性:采集场景覆盖多种光照条件和水果摆放形态,适用于农业及食品加工场景。二、适用场景农业自动化分拣系统:支持开发水果品质检测机器人,实现新鲜度自动分级和腐烂果实时剔除。零售智能管理系统:集成至自助结账设备或货架监控系统,自动识别商品状态并更新库存数据。食品加工质量检测:用于罐头/果汁生产线,检测原料新鲜度以符合食品安全标准。教育科研领域:为农业工程、食品科学、计算机视觉等学科提供跨领域研究数据支撑。三、数据集优势精细分类体系:覆盖5种常见水果的新鲜与腐烂双状态检测,支持10类细粒度识别。场景适配性强:包含单果特写与多果堆叠场景,适配分拣机、货架、生产线等多种应用环境。标注专业规范:严格遵循YOLO标注标准,边界框精准匹配水果轮廓,支持即插即用模型训练。时效性突出:特别包含易腐水果的变质状态数据,为食品保鲜期预测模型提供关键训练素材。跨行业价值:同时满足农业自动化、智能零售、食品加工等多领域对水果品质检测的需求。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值