当前位置: 首页 > news >正文

Linux软件编程:进程与线程(线程)

一、线程的本质

      1. 线程是操作系统调度的最小执行单元,共享进程的资源(内存、文件等),但拥有独立的栈空间(存储局部变量)、寄存器状态(程序计数器等)、线程ID和优先级

       2.Linux线程实现原理:Linux通过轻量级进程(LWP)实现线程,关键系统调用

二、为什么需要多线程?

       场景类型优势体现嵌入式案例响应优化分离阻塞操作串口通信+UI响应分离性能提升多核CPU并行计算图像处理流水线资源复用共享内存减少拷贝开销多传感器数据融合模块解耦功能隔离降低复杂度网络协议栈分层实现

三、多线程进阶:线程池的诞生

       线程池核心原理:线程池就是提前创建好一堆线程,所有线程阻塞等待一个队列,当用户提交一个任务,就唤醒一个线程执行任务。往复循环。

四、线程管理机制

       1.动态扩缩容:根据负载自动增减线程数

       2.保活机制:空闲线程超时自动回收

       3.异常处理:线程崩溃后自动重启

五、面试常见问题

       1.进程 vs 线程的区别?

       进程:资源分配的最小单位,有独立地址空间(代码、数据、堆栈),切换开销大。

       线程:CPU调度的最小单位,共享进程资源(内存、文件描述符),切换开销小,通信高效。

关键点:线程更轻量,适合嵌入式资源受限场景。

       2.互斥锁(mutex)与信号量(semaphore)的区别?

       特性互斥锁 (mutex)信号量 (semaphore)用途保护共享资源控制并发访问数量所有权锁的持有者必须释放任意线程可释放初始值1(锁定/未锁定)可设为N(资源数量)嵌入式注意需避免优先级反转适合生产者-消费者模型

      3.什么是优先级反转?如何解决?

       优先级继承(Linux默认):持有锁的线程临时继承等待线程的最高优先级。

       优先级天花板:锁绑定一个优先级,持有锁的线程自动提升到该优先级。

       现象:低优先级线程持有锁,中优先级线程抢占,高优先级线程因等待锁被阻塞。

      4.如何避免死锁?

       锁顺序:所有线程按固定顺序获取锁(如锁A→锁B)。

       超时机制:pthread_mutex_timedlock() 避免无限等待。

       死锁检测:工具如Valgrind的Helgrind插件。

      5.自旋锁(spinlock) vs 互斥锁的适用场景?

      自旋锁:忙等待,适用于临界区执行时间极短(如<2个时间片)且多核环境。

      互斥锁:睡眠等待,适用于临界区较长或单核系统。

      注意:嵌入式实时系统(RTOS)中慎用自旋锁,可能破坏实时性。

     6.pthread_create() 失败的可能原因?

     资源耗尽(线程数超过ulimit -u限制)

     内存不足(无法分配线程栈,默认约8MB)

     权限问题(嵌入式系统可能限制线程创建)

     7.如何设置线程栈大小?

     pthread_attr_t attr;

     pthread_attr_init(&attr);

     pthread_attr_setstacksize(&attr, 1024*128); // 设为128KB

     pthread_create(&tid, &attr, thread_func, NULL);

     8.如何设置线程优先级?

     struct sched_param param;

     param.sched_priority = 90; // 优先级值(1~99,越高越优先)

     pthread_attr_setschedpolicy(&attr, SCHED_FIFO); // 实时调度策略

     pthread_attr_setschedparam(&attr, &param);

     注意:需要root权限或CAP_SYS_NICE能力。

     9.如何定位多线程问题?

     gdb:thread apply all bt 查看所有线程堆栈。

     strace -f:跟踪线程系统调用。

     Valgrind:检测内存竞争(--tool=helgrind)。

     日志追踪:添加线程ID打印(pthread_self())。

     10.共享内存访问的优化方法?

     无锁编程:使用原子操作(atomic_inc())。

     线程局部存储:__thread关键字避免竞争。

     减少锁粒度:分段锁(如哈希桶锁)。

http://www.dtcms.com/a/336003.html

相关文章:

  • 最新技术论坛技术动态综述
  • 【论文阅读】美 MBSE 方法发展分析及启示(2024)
  • 多维视角下离子的特性、应用与前沿探索
  • RabbitMQ面试精讲 Day 24:消费者限流与批量处理
  • 从0实现系统设计
  • Python 类元编程(类作为对象)
  • Makefile介绍(Makefile教程)(C/C++编译构建、自动化构建工具)
  • 为什么神经网络在长时间训练过程中会存在稠密特征图退化的问题
  • LangGraph 的官网的一个最简单的聊天机器人
  • 数据与模型融合波士顿房价回归建模预测
  • SQL Server 2019安装教程(超详细图文)
  • [辩论] TDD(测试驱动开发)
  • 物联网软件开发过程中,数据流图(DFD),用例图,类图,活动图,序列图,状态图,实体关系图(ERD),BPMN(业务流程建模)详解分析
  • 豆包 Java的23种设计模式
  • OpenAI 发布了 GPT-5,有哪些新特性值得关注?国内怎么使用GPT5?
  • 内网后渗透攻击--隐藏通信隧道技术(应用层隧道技术)
  • 『搞笑名称生成器』c++小游戏
  • Nightingale源码Linux进行跨平台编译
  • 7.Ansible自动化之-实施任务控制
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘imageio’问题
  • maxwell安装部署
  • 数据结构:二叉树的高度 (Height)和节点总数 (Count of Nodes)
  • SpringCloud 07 微服务网关
  • C4 架构模型
  • 说一下事件委托
  • Qt——主窗口 mainWindow
  • Django3 - 建站基础知识点总结
  • 【JAVA 核心编程】面向对象中级:封装与访问控制
  • 获取IPv6地址的三种方式
  • 【Git系列】如何从 Git 中删除 .idea 目录