免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4278 | 回复: 2
打印 上一主题 下一主题

[函数] malloc是否会导致优先级翻转现象,线程安全,不可重入概念 [复制链接]

论坛徽章:
2
射手座
日期:2014-09-03 00:18:022015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-28 12:46 |只看该作者 |倒序浏览
没有看glibc的malloc源代码,只是看了一点网上的介绍,谈谈自己的理解,不知道是否正确;请大牛们指点

malloc是从进程的heap里面申请的,heap对于进程里面的线程来说是共享的,可以理解为malloc管理的内存是一个全局变量,那么malloc在对这个全局变量操作的时候,势必要加锁保护吧,加了锁以后就可以保证同进程下的线程可以安全的操作这个heap了,也就能保证malloc被多个线程同时调用,所以从这个概念上说它是线程安全的;

为什么说是malloc是不可重入的,比如线程A正在调用malloc,拿到锁以后,被Signal处理函数中断,Signal处理函数里面再调用malloc的话,也会去拿锁,这样就会发生死锁,所以从这个概念上来看它是不可重入

什么时候会产生重入现象呢?
1,递归,自己调用自己;
2,Signal,在signal里面调用的函数,都有可能;

malloc操作的是进程下的heap,不同进程对应的heap也不同,不同进程里的malloc操作的是2块不同的内存,不存在任何竞争问题,所以进程间malloc可以放心大胆的用;

因为是线程安全,所以对于多线程编程来说不会有大的问题,但是想到一个问题:
malloc里面加锁,某些场景会导致任务优先级翻转现象

比如线程A、B、C;优先级A>B>C;
1,C调用malloc,拿到锁,分配内存;
2,C被B抢占;B运行;
3,A资源满足;A抢占B;A运行;
4,A调用malloc,拿不到锁;被pending;B运行;
5,需要等B运行结束之后,C运行,然后C释放malloc的锁;
6,A等C释放锁以后,运行;
看到现象就是A优先级比B高,但是B却先运行;

优先级翻转对于调度策略为Schedue_Normal的任务还无所谓,因为这种调度算法本来就不保证优先级高的任务一定先运行,但是对于严格基于优先级的调度策略比如Schedue_FIFO,需要看自己程序是否允许这种现象发生,优先级翻转是否会带来灾难;如果不能容忍这种现象的话,就需要仔细考虑任务优先级的设置;


PS:Glibc的代码怎么看,用si搜了一下malloc,发现有好几个实现,都不知道该看哪个?

论坛徽章:
0
2 [报告]
发表于 2014-08-28 13:29 |只看该作者
没看过这方面权威的资料,冥冥之中感觉malloc函数不可重入是因为没有锁,不过听某些人说有线程安全的malloc函数应该是带锁的
关于优先级翻转的问题,我觉得在基于优先级抢占的嵌入式操作系统上体现才明显,而基于优先级抢占的嵌入式系统我觉得一般都应该是单进程的,像linux这种多进程的操作系统来说我实现是想象不出优先级抢占的优点(用户进程的优先级抢占)。
本人只嵌入式操作系统有一点了解,如有说错请喷!

论坛徽章:
0
3 [报告]
发表于 2014-08-28 15:51 |只看该作者
现在malloc的大多情况都是不存在锁竞争的,很多实现都有thread local的内存池的。

如果有锁同步就不要谈什么优先级了吧,你自己的锁依赖还怪人家系统。 就算这样,我觉得这种锁竞争导致的整个时间片影响有限吧,如果这都影响的到那就不是优先级的问题了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP