Chinaunix首页 | 论坛 | 博客
  • 博客访问: 281068
  • 博文数量: 53
  • 博客积分: 1293
  • 博客等级: 中尉
  • 技术积分: 506
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-20 22:14
文章分类
文章存档

2014年(1)

2012年(5)

2011年(47)

分类: LINUX

2011-04-12 23:59:30

涉及共享内存的管理就不能不提到访问共享内存对象。谈到访问共享内存对象就要留神“SIGSEGV和SIGBUS”这两个信号。
系统分配内存页来承载内存映射区,由于内存页大小是固定的,所以存在多余的页空间空闲,比如待映射文件大小为5000 bytes,内存映射区大小也为5000 bytes。而一个内存页大小4096,系统势必要分配两页来承载,这时空闲的有效空间为从5000-8191,如果进程访问这段地址空间也不会发生错误。但是要超出8191,就会收到SIGSEGV信号,导致程序停止。
关于SIGBUS信号的来历,这里也举例说明:若待映射文件大小为5000 bytes,我们在mmap时指定内存映射区size = 15000 > 5000,页承载大小16384,而内核真正的共享区承载体大小只有8192(能包容映射文件大小即可),此时在[0,8191]内访问均没问题,但在[8192, 16383]之间会得到SIGBUS信号;超出16384访问时会触发SIGSEGV信号。
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ArchiLife/archive/2009/12/17/5027038.aspx
阅读(2688) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~