这两天研究了一下QNX的分布式性能,测试例子就是计算圆周率,为了好计算,就是使用了BBP算了,下面是我编码过程中遇到的一个问题,总结一下也算是经验,不管是不是你用分布式或许可以用上:
my_sem = sem_open(sem, O_EXCL);//充当互斥作用,多台机子
my_data = sem_open(data, O_EXCL);//充当全局变量,本来想用share memory,但是share memory只能对单机可以,多机无法map到
int n = 2;
//第一次代码
while( 1 )
{
sem_wait(my_sem);//加锁
sem_getval(my_data, &n);//得到全局值
sem_wait(my_data);//充当--操作
sem_post(my_sem);//解锁
Output(n);//计算函数
if( n - 1 < 0 )
{
break;
}
}
有些机子计算进程无法退出,一台机子算完了,另外一台机子还在跑,ps一下该进程还在,只有手工kill了
原因就是所粒度大,而且存在网络延时,有可能就挂在sem_wait()在了,还没有post就有wait了
还有就是sem_wait(my_data)没有办法才这样,他本来就有阻塞功能,如果只是0就挂了
//第二次代码
while( 1 )
{
sem_getval(my_data, &n);//得到全局值
sem_wait(my_sem);//加锁
sem_wait(my_data);//充当--操作
sem_post(my_sem);//解锁
Output(n);//计算函数
if( n - 1 < 0 )
{
break;
}
}
第一种现象还有,只是少,原因就是锁粒度小了,但是sem_wait(my_data)如果阻塞还是无法break,while就只有挂那了
还有就是计算粒度太小
//第三次代码
while( 1 )
{
if( n - 1 < 0 )
{
break;
}
sem_getval(my_data, &n);//得到全局值
sem_wait(my_sem);//加锁
sem_wait(my_data);//充当--操作
sem_post(my_sem);//解锁
for(i = 0; i < 10; i++)//放大计算粒度
{
Output(n--);//计算函数
}
}
问题总算解决了,锁粒度和计算粒度都合适,多台机子都很好的合作干完分到的任务
这个东西中感觉以后再写程序中,用信号量扮演了share memory的角色,我也没有办法啊,还有多台机子之间的互斥貌似只有用信号量了,这不是重点,重点是在类似这种while中,判断还是放在前面,处理放在后面
当然了,网络的延时在分布式中你不能不考虑,不过这个可以用算法保证,还有真正分布式不可能全用C来写程序,比如流行的ErLang等,但这是一种意识,可供参考!
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
新型高电压精密放大器--业界最精确的SPICE模型
Nios系统基础上的UItra DMA数据传输模式
MIC2951和PNP型晶体管组成的扩流电路
Anthropic年化营收破 140 亿,完成 300 亿新融资
一种改进型UML在嵌入式系统中的应用
IP多路广播
如何构建eCos嵌入式系统
设计指南-热功率器件设计中的几点思考
AdvancedPCB在硅谷扩充HDI能力,引入先进真空填孔技术
提高MIC2950的输入电压范围的稳压器电路
ROHM推出UCR10C分流电阻系列,提升电流检测密度
以芯片设计提升计算效率:每次查询的最低能耗
安世半导体调查启动 闻泰科技唯有苦等
MIC29302构成的输出电压为3.3V/5V可选择的稳压器电路
设计指南-空间限定的集成FET的DC - DC转换器
MIC2951构成的具有输入欠压关断功能的稳压器电路
由MIC2951和PNP型晶体管组成的扩流电路
硬金,硬功夫:设计经久耐用的PCB边缘连接器
设计指南-低功耗压力传感器
3376万台!2025中国平板市场双位数增长,背后是“国补”与换机的双重推力
书评《人月神话》
测量射频电路
装饰彩灯控制专用集成电路大观(二)
射频在无人机中的应用
UCIe 核心技术细节悉数落地
【专访】比尔·盖茨:竞争对手是IBM和索尼
vxwork for arm 下载,快快快
基于Windows CE的嵌入式电子邮件系统设计
应用材料公司发布2026财年第一季度财务报告
微软公司软件开发模式简介