BSD中为什么用了mbuf,而不是直接用应用层的buf

myjesky 2005-04-20 01:07:19
内存复制占用很多时间的,为什么还要搞个mbuf出来。听说winsock的实现是没有这种从应用程序到socket的数据复制的,是不是这样?
...全文
309 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qrlvls 2005-06-30
  • 打赏
  • 举报
回复
在Windows系统内核中也会有类似的数据处理,用户获取的数据是纯粹的数据,而真实协议涉及到不同协议层次间的处理,而不能仅仅因为效率失去系统的合理性
从效率上来讲,处理数据收发和各协议层次之间的传递、保持协议单元的独立性,mbuf无疑是一个折衷的最好办法
myjesky 2005-06-30
  • 打赏
  • 举报
回复
在使用mbuf的bsd系统里,用户数据的复制有两次,一次是从用户buffer转移到mbuf,另一次是从mbuf转移到设备传输buffer。
herryhuang认为使用mbuf的原因,我认为原因一不是很好:tcp、ip头完全可以另外开辟一些内存出来存。
所以我总结为
“BSD和linux内核只信任内核本身。”使用mbuf增强了系统和应用程序的可靠性
“某些链路的速度是很慢的”使用mbuf可以减少应用程序等待网络传输的情况并且降低了由并行性带来的代码复杂度
付出的代价就是两次内存拷贝
herryhuang 2005-06-18
  • 打赏
  • 举报
回复
对了,mbuf在层与层之间,就是传递指针的,至于为什么不直接使用应用层buf,有几个原因:

1. 应用层buf不一定能够满足需要,比方说,我需要在前面加上IP头,可是前面没有空间了。
2. 发送过程是一直延伸到物理层的,也就是说,假如直接使用应用层buf,那么直到驱动的芯片发送完报文之前,系统必须锁定这块内存,你的应用层能接受这种等待么,要知道某些链路的速度是很慢的,而CPU快得多,所有比较合理的方法是,将数据复制到mbuf中,然后后面的发送过程使用mbuf,程序则可以快速返回。
herryhuang 2005-06-18
  • 打赏
  • 举报
回复
mbuf也没有复制内存阿,这个本来就是为了减少内存复制而搞的

bsp中的mbuf唯一的缺点就是太小,不能应付现在越来越大的报文,这个和当初机器内存较小有关,因为内存很贵,所有尽量节省着使用。
lamputa_lito 2005-06-16
  • 打赏
  • 举报
回复
谁说用mbuf就一定要数据复制而不是传指针,应该没有这样的意思吧。mbuf的设计本来就是为了较少内存的复制的,里面也有用到引用计数以减少复制的地方(如m_copy函数)。
在层与层之间,mbuf很多时候也是传递指针的吧。
mbuf本身就是缓冲区,而且是一个努力提高效率和易用性的缓冲区。
xiaohaiyan 2005-04-21
  • 打赏
  • 举报
回复
简单的说,如果传指针,那么上层用户如果无意之中释放了某块内存,那么整个协议栈就可能会崩溃,而导致内核的崩溃(协议栈中保持着大量的mbuf链表。BSD和linux内核只信任内核本身。
myjesky 2005-04-20
  • 打赏
  • 举报
回复
如果只是为了保持各层之间的透明性,那完全可以只传递指针啊
xiaohaiyan 2005-04-20
  • 打赏
  • 举报
回复
保持各层之间的透明性
oyljerry 2005-04-20
  • 打赏
  • 举报
回复
Winsock中一般用缓冲区

4,359

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧