1、POSIX标准多线程

发送给进程下一组线程的信号将被共享,被其中任意一个线程处理。同一进程创建的线程同生死,如果收到一个kill信号,这一组task_struce都会退出。

2、NPTL模型

内核采用线程组的概念,task_struct增加了tgid,发送信号时能够发送到同一进程下的所有线程,getid会为同一进程下的所有线程返回相同的进程ID。

如上图所示,所有线程虽然都有自己的pid,但是getpid返回值都为一个pid,称为tgid,在TOP命令中显示的就是TGid,如下图所示:

上面一个进程创建了两个线程,打印出来的pid都为6875,在top中显示出来的也是6875.

3、信号量

POSIX中对信号量的操作有下面几个函数

Sem_wait 减一操作,阻塞

Sem_trywait 减一操作,非阻塞模式

Sem_post 加一操作

信号量中经典的生产消费者问题

互斥锁为shard.mutex,拿到该锁才能对仓库进程操作,生产者增加库存,消费者减少库存。

线程中对互斥锁的操作函数如下
pthread_mutex_lock(&mutex)锁定互斥锁

Pthread_mutex_unlock(&mutex)打开互斥锁

可以通过gdb调试两个线程共享互斥锁,通过bt查看每个线程堆栈,再通过l function, p mutex_i判断互斥锁的当前拥有者。

上图中两个线程互相拥有对方的互斥锁。执行时会产生死锁,

通常处理rmw问题,确保读写不同时发生。

4、helgrind

在gcc 4.9之后,可以通过helgrind扫描线程故障,例如对同一变量写冲突不加锁。

这样在gcc 4.9之后不仅加入了内存检测,也加入了线程故障检测。

5、可重入与线程安全

可重入函数满足两个条件:第一是线程安全,第二是函数可软中断,执行完中断处理函数后再回头执行函数,结果仍然正确。

线程安全就是不会出现死锁情况,执行过程中不可能会崩溃。但是不满足可重入条件,如果被异步信号打断后执行结果可能会出错。要使线程安全函数变成可重入函数,需要将线程中全局变量等去掉,让线程只能访问临时变量。

目前linux中存在线程不安全函数,在单线程执行时没有问题,但是多线程执行时需要注意保护。

6、线程栈保护

在线程栈中插入保护页,如果指针落在保护页上,则进程崩溃,保护正常栈,防止越界。

Pthread_getschedualparam

7、优先级反转

优先级反转为高优先级进程被中等优先级进程抢占。

常见的情况是,低优先级先进入了临界区,高优先级到了想用临界区,需要等到低优先级执行完,此时来了中等优先级,中等优先级先执行,然后低优先级执行,还回锁,高优先级最后执行。

可以将低优先级继承高优先级属性,确保不会被中等优先级打断,在低优先级还回锁后再将优先级降低,这样确保高优先级可以立刻执行。

8、多线程编程

I/O原则,大量运算原则,确保CPU和I/O能够同时执行,不要互相等待。

工作组模型,常用于多核同时编译 make –j 4 4个核同时编译

线程池,一开始创建很多线程,将其睡眠,来一个任务唤醒一个线程,执行完后睡眠,减少了创建撤销线程的大量时间开销。

9、IO编程

采用AIO异步读取I/O数据,这样不需要CPU进行干预。实现CPU I/O并行。

10、系统调试

Top命令,按1后能看到每个核的运行情况

在top中需要关注load average,分别对应系统1分钟,5分钟,15分钟负载,正常1分钟负载大于5分钟大于15分钟,如果时间越长负载越高,那证明系统确实性能不行。CPU负载不等于CPU利用率。虚拟化技术能够将CPU和I/O资源利用率提高,因为多个虚拟机能够将任务尽可能乱序,增加并发可能性。

Cpu0和cpu1后面参数差不多表明两个核负载差不多,这是理想情况。

Htop工具,直观显示

Oprofile 可以显示程序落在库和可执行库的时间比例

Perf主推,可以图显示进程执行过程

宋宝华Linux培训笔记-Linux多线程相关推荐

  1. 宋宝华Linux培训笔记-Linux进程管理

    1.cpu进程状态 linux中进程状态如下图: 浅度睡眠为进程等待资源或中断响应,即使资源没有拿到也可以被唤醒:深度睡眠为进程等待资源,拿到资源后进入就绪状态. 僵死状态为进程死亡,但还没有被父进程 ...

  2. 宋宝华:评Linux 5.13内核

    目录 Misc cgroup Landlock安全模块 系统调用的堆栈随机化 printk无锁ringbuffer的进一步优化 BPF可调用内核函数 公共的IO PAGE Fault支持 Linux ...

  3. linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  4. 宋宝华_2010年11-12月Linux驱动和内核讲座PPT下载

        12月29日,宋宝华老师在线讲座(按键和LCD驱动) cloudquan 2010-12-20 2/146 heyan0208 3 天前 00:37     宋宝华_2010年12月11日_& ...

  5. 宋宝华:LEP(Linux易用剖析器) 是什么,为什么以及怎么办(2)

    LEP(LINUX EASY PROFILING) 是Linuxer之LEP项目组(Barry Song,Mac Xu,陈松等以及陈莉君教授/西邮Linux 3+1实验室)正在致力于打造的一个开源项目 ...

  6. linux pdf 宋宝华,51CTO博客-专业IT技术博客创作平台-技术成就梦想

    原创 宋宝华 Linux阅码场 2018-04-10 前言 网上关于BIO和块设备读写流程的文章何止千万,但是能够让你彻底读懂读明白的文章实在难找,可以说是越读越糊涂! 我曾经跨过山和大海 也穿过人山 ...

  7. 宋宝华: 用off-cpu火焰图进行Linux性能分析

    在<宋宝华:火焰图:全局视野的Linux性能剖析>一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析.但是,很多时候,单纯地看on-cpu的情况(什么代码在耗费CPU) ...

  8. 宋宝华:论一切都是文件之匿名inode

    01 唯有文件得人心 当一个女生让你替她抓100只萤火虫,她一定不是为了折磨你,而是因为她爱上了你.当你们之间经历了无数的恩恩怨怨和彼此伤害,她再次让你替她抓100只萤火虫,那一定是因为她还爱着你. ...

  9. 宋宝华: 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清

    原创 宋宝华 Linux阅码场 2018-01-22 作者简介 宋宝华,他有10几年的Linux开发经验.他长期在大型企业担任一线工程师和系统架构师,编写大量的Linux代码,并负责在gerrit上r ...

最新文章

  1. 实战 Spring Cloud Gateway 之限流篇
  2. 去水印--《On the Effectiveness of Visible Watermarks》
  3. Django之中间件
  4. 剑指 offer 编程题 C++ 版总结(中)
  5. CTF-杂项题-伪加密
  6. 点击类选择器,获取索引
  7. ios虚拟机安装(二)
  8. 显著性分析-秩和检验与校正
  9. ZZULIOJ/python1006: 求等差数列的和
  10. 【Homography Estimation】《Deep Image Homography Estimation》
  11. 疫情当头,宅家看剧!微信公众号图文应该这样排版
  12. 砥砺前行 智领未来 | 美格智能2022年半年度经营管理会议顺利召开
  13. 基于Java的实验室预约管理系统
  14. C/C++编写Windows窗口应用程序(Win32程序),非黑漆漆的控制台窗口
  15. 51单片机教程(从原理开始基于汇编)
  16. 植物图像识别python_python实现图像识别功能
  17. honor荣耀为什么要研发高端?
  18. lepus(天兔数据库监控系统)部署和使用
  19. Vero praesentium odio suscipit dolor.Eos accusamus rem tempore.
  20. 【MATLAB】将raw转为视频(avi格式、mp4格式)并输出(代码分享)

热门文章

  1. discuz接入七牛sdk
  2. win10装sql2000卡在选择配置_Win10系统安装Sql Server 2000可能会碰到的问题【解决方法】...
  3. 【Android 仿微信通讯录 导航分组列表-下】自定义View为RecyclerView打造右侧索引导航栏IndexBar
  4. 打印设置自定义表尾_教大家Excel2013表格中如何打印固定的表头和表尾
  5. 中枢神经系统解剖结构图,神经系统的解剖结构
  6. 春节假期收官小记|抢红包黄金时间分析
  7. Unity官方案例噩梦射手开发总结<一> 角色的攻击功能实现
  8. 小南说 Promise(是什么,有什么,怎么用,为什么)
  9. 地图开发技术报告(百度地图)
  10. appuim+python+MUMU模拟器连接方法