Linux进程与线程的比较

STK传感器约束设置保姆级教程:从方位角到传播延迟,手把手教你避开新手常见坑 本文详细解析了STK传感器约束设置的关键技巧,涵盖方位角、仰角、高度及传播延迟等核心参数。通过实战案例和代码示例,指导用户避开常见误区,优化卫星通信和航天任务仿真精度,特别适合STK新手和需要提升传感器配置效率的工程师。 阅读详情

进程与线程的关系

在Linux 2.6以后,系统使用了一种新的pthread线程库NPTL(Native POSIX Threading Library),但其实系统底层依旧使用轻量级进程(LWP)来实现线程这一机制,所以线程与进程的关系颇为繁杂。
首先要明确的是,某一进程中的所有线程共用同一“进程id”(pid)。但为了管理不同线程对系统资源的使用,这里引入了一个“线程组编号”(tgid)的概念。其中,“主线程”的tgid即为该进程的pid。
举个例子,系统中运行着一个由两个线程组成的进程sockcli3,首先使用ps指令查看其pid:

➜ ~ ps -e | grep sockcli3
2631 pts/19 00:00:00 sockcli3

此处只显示了进程pid。然后,使用ps指令的-L参数进一步查看其线程组id:

➜ ~ ps -L 2631
PID LWP TTY STAT TIME COMMAND
2631 2631 pts/19 Sl+ 0:00 /home/ljy/build-sockcli3-unknown-Debug/sockcli3
2631 2701 pts/19 Sl+ 0:00 /home/ljy/build-sockcli3-unknown-Debug/sockcli3

可以看到,此处两线程tgid(LWP一栏)不同,pid相同,其中主线程的pid与tgid一致。

进程、线程与信号

为了区分“发送给进程的信号”和“发送给线程的信号”, task_struct里面维护了两套signal_pending,一套是线程组共享的, 一套是线程独有的。通过kill发送的信号被放在线程组共享的signal_pending中, 可以由任意一个线程来处理;通过pthread_kill发送的信号,被放在线程独有的signal_pending中,只能由指定线程来处理。

进程、线程的系统接口

进程和线程的系统接口颇为相似,总结如下,摘自《Unix环境高级编程》

进程原语线程原语描述
forkpthread_create创建新的控制流
exitpthread_exit从现有的控制流中退出
waitpidpthrread_join从控制流中得到退出状态
atexitpthrread_cancel_push注册在退出控制时调用的函数
getpidpthrread_self获取控制流的ID
abortpthrread_cancel从控制流中得到退出状态

进程、线程的终止

需要注意的是,不管是子进程/线程的外部使用了abort/pthread_cancel,还是内部使用了exit/pthread_exit/return ,操作系统依旧保留了控制流所占用的内存堆栈。毕竟父进程/主线程还需要异步处理子进程/子线程的返回值。
如果没有在控制流终止后回收其资源,会出现内存泄漏的情况。在程序长时间运行的情况下,整个程序占用的内存会持续增长。
当程序逻辑繁杂时,内存泄漏问题不易排查,毕竟编译器不会对这种问题给出提示。这时可以借助内存检查工具valgrind。
检查内存泄漏的常用语法为:

valgrind –tool=memcheck –leak-check=full ./your_program

若存在线程资源未回收的情况,会有类似如下的提示:

==9129== 288 bytes in 1 blocks are possibly lost in loss record 2 of 4
==9129== at 0x4C2FB55: calloc (vg_replace_malloc.c:711)
==9129== by 0x40138A4: allocate_dtv (dl-tls.c:322)
==9129== by 0x40138A4: _dl_allocate_tls (dl-tls.c:539)
==9129== by 0x4E4226E: allocate_stack (allocatestack.c:588)
==9129== by 0x4E4226E: pthread_create@@GLIBC_2.2.5 (pthread_create.c:539)
==9129== by 0x401DCE: MainThd::MainThd() (mainthd.cpp:16)
==9129== by 0x401B9F: main (main.cpp:5)

valgrind 会提示泄漏内存段在曾由那段代码申请,这有助于排查问题。
若觉得手动回收子控制流颇为繁琐(毕竟这涉及了同步问题),且不关心子控制流的返回值,可将线程/进程从主线程/父进程分离。此时,当子控制流结束时,主控制流不会以阻塞状态等待其完成资源回收,而是交由操作系统全权负责。
对于线程,pthread库中有如下接口:

   #include <pthread.h>
   int pthread_detach(pthread_t thread);
   int pthread_attr_setdetachstate (pthread_attr_t *__attr,
                                    int __detachstate)

至于进程,POSIX.1-2001允许将SIGCHLD的信号处理函数设置为SIG_IGN,这时子进程退出的时候将不会进入僵尸状态,并且它所占用的系统资源将被操作系统自动回收。即在该进程中绑定两信号:

signal(SIGCHLD, SIG_IGN);

参考资料:
http://www.cnblogs.com/ISeeIC/p/3617630.html
http://blog.youkuaiyun.com/u010154760/article/details/45312979
http://blog.chinaunix.net/uid-12274566-id-3043253.html

【Unity动画优化插件】BT - OptiAnimX —— AAA级动画优化框架深度剖析 BT - OptiAnimX 是一款面向 Unity 的高性能动画优化框架,核心目标是解决多角色动画场景中的性能瓶颈问题。该插件对标《战争机器5》和《巫师3》等 AAA 游戏中的动画优化技术,通过一整套自动化与智能化的优化策略,将动画性能提升与视觉质量控制结合在一起。它适用于从移动端、VR 到高端 PC 的多平台项目,尤其在“多人角色 + 高频动画”的场景中表现突出,例如 MMO、开放世界、动作游戏等。BT - OptiAnimX 本质上是一套“动画性能调度系统”,而不仅仅是优化工具。 阅读详情

相关推荐

MobaXterm隧道配置详解:为PyCharm远程开发打通‘最后一公里’

本文详细解析了如何利用MobaXterm配置SSH隧道,实现PyCharm远程开发的高效连接。通过本地端口转发技术,开发者可以安全访问内网服务器,特别适用于需要通过跳板机的复杂网络环境。文章涵盖从基础配置到企业级运维的全套解决方案,包括性能优化、安全加固等实用技巧。

weixin_30566063的博客 504

Linux用户空间线程管理介绍之二:创建线程堆栈

转自:http://www.longene.org/forum/viewtopic.php?f=17&t=429&sid=babec6ba82dd65e29c5fafe03e4d89c0 前面已经介绍过了线程结构pthread,下面就需要来看看在创建线程过程中,如何生成这个结构的。Allocate_stack函数位于nptl/allocatestack.c中: 代码: 全选30

Adam040606的博客 1403

用angr找到strcpy的栈溢出漏洞

这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。 原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find 这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候) 为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s

^_^ 1220

valgrind的memchk和callgrind

valgrind的memchk和callgrind 一、安装valgrind 安装valgrind,正常的三部曲configure/make/make install就行。 二、memchk使用 1、执行命令 [root@10g-host4 tools]# valgrind --track-fds=yes --log-fil...

weixin_30275415的博客 223

【毕业设计参考】基于yolov8+pyqt5自适应界面设计的锂电池表面缺陷检测系统

基于YOLOv8+PyQt5的锂电池表面缺陷检测系统结合了先进的目标检测技术与友好的用户界面设计,为锂电池质量检测提供了一种高效、准确的解决方案。未来,随着深度学习技术的不断发展,我们可以进一步优化模型,提高检测精度和速度,同时拓展系统功能,如实现实时视频流检测、与生产系统的深度集成等,为锂电池产业的发展注入新的活力。希望本文对大家在相关领域的研究和实践有所帮助,欢迎大家在评论区交流讨论。

1182

细节增强卷积DEConv详解及代码复现

这种预训练模型能够捕捉图像的基本特征,为后续的端到端训练提供良好的初始参数。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。

hasakie的博客 1912

valgrind android 内存泄露,valgrind 内存泄漏分析

概述valgrind 是 Linux 业界主流且非常强大的内存泄漏检查工具。在其官网介绍中,内存检查(memcheck)只是其其中一个功能。由于只用过其内存泄漏的检查,就不拓展分享 valgrind 其他功能了。valgrind 这个工具不能用于调试正在运行的程序,因为待分析的程序必须在它特定的环境中运行,它才能分析内存。内存泄漏分类valgrind 将内存泄漏分为 4 类。明确泄漏(defini...

weixin_42144707的博客 763

USB 基础学习:USB 电气信号介绍

USB电气信号技术解析 USB通信的核心是差分信号传输技术,通过D+和D-两根线传输相位相反的电压信号实现数据通信。USB信号系统包含三类关键信号:差分数据信号(抗干扰性强)、单端状态信号(用于设备识别)和电源信号(提供5V供电)。USB2.0采用400mV电压摆幅和NRZI编码,支持低速(1.5Mbps)至高速(480Mbps)传输;USB3.0则新增专用差分对,数据速率可达20Gbps。物理层通过上拉/下拉电阻检测设备连接,高速模式需特殊握手协议。抗干扰设计的关键在于保持差分线等长、阻抗匹配和使用共模扼

浩瀚之水的专栏 1783

pthread_create源码分析

pthread_create源码分析 pthread_attr_t的主要属性的意义如下: __detachstate,表示新线程是否与进程中其他线程脱离同步, 如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用p

conansonic的博客 1万+

VMware ESXi 直通GPU

虚拟机需要独享GPU资源,那么就需要用到DirectPath I/O (直通),ESXi hypervisor 把 GPU 设备直接映射成虚机中的 GPU 设备,供应用使用。注意,内存注意一定要勾选预留,否则开机后报错如下:无法打开虚拟机 win10 的电源。1.ESXi主机,管理,硬件,PCI设备,勾选GPU卡,切换直通,会提示要求重启主机,重启主机之后,该GPU设备直通一栏显示为“活动”。先确认虚拟机是否EFI引导:编辑虚拟机 - 虚拟机选项 - 引导选项 - 固件 - EFI。

liwension的博客 6293

【新版系统架构】系统架构设计师教程全篇知识点提炼

信息系统的5个基本功能:输入、存储、处理、输出和控制信息系统的发展:诺兰模型:初始阶段、传播阶段、控制阶段、集成阶段、数据管理阶段、成熟阶段信息系统的分类:传统的信息系统分为:业务(数据)处理系统、管理信息系统(MIS)、决策支持系统(DSS)、专家系统(ES)、办公自动化系统(OAS)等5类信息系统的生命周期:1、产生阶段2、开发阶段(总体规划、系统分析、系统设计、系统实施、系统验收阶段)3、运行阶段4、消亡阶段信息系统建设原则:1、高层管理人员介入原则。

分享技术干货和灵感、推荐新书和好玩的项目、分享Java面试题 1万+

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

转载请注明出处: https://yakir-yang.github.io/ 栈是什么?栈有什么作用?首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top) 进行 推入 (push) 和 弹出 (pop) 操作。

木易博客专栏 4万+

仿真学习系列(四十二):Sigrity仿真之走线阻抗和耦合检查

在高速电路设计中,走线的阻抗和信号线之间的耦合是影响信号完整性的重要因素。设计中可能会出现多种情况,导致阻抗变化或不匹配,例如线宽的变化、跨层分割等。传统的人工检查方法常常不够高效且易忽视细节。借助仿真软件,可以快速定位问题区域,并进行精确分析,从而有效避免或减少信号反射和串扰带来的影响。

案例文章,高速信号 425

Linux进程和线程的比较

进程与线程 参考:http://www.cnblogs.com/blueclue/archive/2010/07/16/1778855.html 首先比较Linux进程和线程的创建的区别,以此展开: 创建进程:(1)调用fork(),为子进程新建内核栈、pthread_info和task_struct,复制父进程的大部分的参数,采用写时复制(copy-on-write)辅助父进程

hustyangju的足迹 1703

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux 进程与线程:比较与应用

Linux 进程与线程:比较与应用

深耕嵌入式领用多年, 致力于分享嵌入式领域技术! 538

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Linux进程和线程的比較

进程与线程 參考:http://www.cnblogs.com/blueclue/archive/2010/07/16/1778855.html 首先比較Linux进程和线程的创建的差别,以此展开: 创建进程:(1)调用fork(),为子进程新建内核栈、pthread_info和task_struct,复制父进程的大部分的參数,採用写时复制(copy-on-write...

weixin_33724046的博客 128

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux 多线程(线程概念/特点/优缺点/与进程比较)

线程 线程间数据的独有与共享(同组线程) 线程的优点--("轻"+多任务并发/并行处理的优势(对比于进程)) 线程的缺点 多线程与多进程的比较 Linux 多线程(线程控制(创建/终止/等待/分离))

爱上小公举 1899

五、Linux下进程与线程的比较

一、进程与线程启动方式比较 进程 线程 描述 fork() pthread_creat() 创建新的控制流 return/exit()/_exit() return/pthread_exit() 从现有的控制流退出 wait() pthread_join() 从控制流得出退出状态 atexit() pthread_clean_push()/pthread_clean_p...

踏着时光去旅行的博客 276

linux系统编程-线程与进程创建效率比较

linux环境中,线程是由系统调用clone()实现的. clone()的复制程度高就相当于fork(),clone()的复制程度低就相当于pthread_create().

weixin_45050132的博客 399

Linux进程与线程 比较、进程与线程标识、信号

进程间通信

编程一时爽爽一时 244

Linux 进程和线程比较

进程是操作系统运行的一个程序,线程是执行单元或者是一条执行路径。 以360安全卫士为例,运行360安全卫士即开启了一个进程,执行垃圾清理、木马查杀等功能时即开启了多个线程。 根本区别:进程是资源分配的最小单位,线程是程序调度和执行的最小单位。 调度:每次创建/撤销进程时,系统都要为它分配/撤销独立的资源,建立数据表来维护代码段、堆栈段和数据段;线程是进程的一个执行流,由CPU独立调度执行,且在每个...

jwqq123的博客 380

Linux的进程和Win32的进程/线程比较

Linux的进程和Win32的进程/线程比较   熟悉WIN32编程的人一定知道,WIN32的进程管理方式与Linux上有着很大区别,在UNIX里,只有进程的概念,但在WIN32里却还有一个"线程"的概念,那么Linux和WIN32在这里究竟有着什么区别呢?   WIN32里的进程/线程是继承自OS/2的。在WIN32里,"进程"是指一个程序,而"线程"是一个"进程"里的一个执行"线索"。从核

sumnuce的专栏 1119

【Linux系统编程】线程与进程的比较

在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体。 为了让进程完成一定的工作,进程必须至少包含一个线程。 进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 1051

linux线程和进程 效率,Python 多进程、多线程效率比较

Python 界有条不成文的准则: 计算密集型任务适合多进程,IO 密集型任务适合多线程。本篇来作个比较。通常来说多线程相对于多进程有优势,因为创建一个进程开销比较大,然而因为在 python 中有 GIL 这把大锁的存在,导致执行计算密集型任务时多线程实际只能是单线程。而且由于线程之间切换的开销导致多线程往往比实际的单线程还要慢,所以在 python 中计算密集型任务通常使用多进程,因为各个进程...

weixin_31582915的博客 498

【linux 多线程并发】多线程模型下的信号通信处理,与多进程处理的比较,属于相同进程的线程信号分发机制

现代的CPU都是多core处理器,而且在intel处理器中每个core又可以多个processor,形成了多任务并行处理的硬件架构,在服务器端的处理器上架构又有一些不同,传统的采用SMP,也就是对称的多任务处理架构,每个任务都可以对等的访问所有内存,外设等,而如今在ARM系列CPU上,多采用NUMA架构,它将CPU核分了几个组,给每个组的CPU core分配了对应的内存和外设,CPU访问对应的内存和外设时速度最优,跨组访问时性能会降底一些。

一个追逐梦想的码农 5607

linux线程和java线程的区别,Linux下 多线程与多进程的优劣比较

一、多线程 VS 多进程和进程相比,线程有很多优势。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护代码段和数据。而运行于一个进程中的多个线程,他们之间使用相同的地址空间。正是这样,同一进程下的线程之间共享数据空间,数据可以相互使用,并且线程间切换也要更快些,可以更有效的利用CPU。二、程序设计[注] 头文件编译时要加载动态库 libpthread.a,使用 ...

weixin_32365777的博客 736
上一篇: Unix网络编程学习日记(四):基于select的单线程半双工socket客户端的实现
下一篇: Unix网络编程学习日记(五):基于epoll与管道的socket客户端
Azure小诶
博客等级 码龄15年 18粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值