社区
通信技术
帖子详情
BSD中为什么用了mbuf,而不是直接用应用层的buf
myjesky
2005-04-20 01:07:19
内存复制占用很多时间的,为什么还要搞个mbuf出来。听说winsock的实现是没有这种从应用程序到socket的数据复制的,是不是这样?
...全文
309
9
打赏
收藏
BSD中为什么用了mbuf,而不是直接用应用层的buf
内存复制占用很多时间的,为什么还要搞个mbuf出来。听说winsock的实现是没有这种从应用程序到socket的数据复制的,是不是这样?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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中一般用缓冲区
Unix/Linux编程:四种
m
buf
这些要求包括能方便的可变长缓存,能在缓存头部和尾部添加数据(封装时需要添加首部),能从缓存
中
移除数据(解封装时要移除首部),并能尽量减少为这些操作所做的数据复制。内核
中
的存储器管理调度
直接
关系到联网协议的...
F-Stack发送零拷贝介绍
本文主要介绍F-Stack发包方向上当前的零拷贝处理方案、效果和应用场景的选择,发包方向上的数据拷贝目前主要为两个阶段,一是协议栈数据拷贝到DPDK的rte_
m
buf
中
,二是
应用层
调用socket发送接口时会将数据从
应用层
...
skb_
buf
f封装
可以说sk_
buf
f结构体是Linux网络协议栈的核心
中
的核心,几乎所有的操作都是围绕sk_
buf
f这个结构体进行的,它的重要性和
BSD
的
m
buf
类似(看过《TCP/IP详解 卷2》的都知道),那么sk_
buf
f是什么呢? sk_
buf
f就是网络...
Socket通信原理学习
1TCP/IP 与UDP TCP/IP(Transmission Control Protocol /Internet protocol) ,传输控制协议与网间协议,是一个工业标准的协议集,是为广域网(WANs)...Socket是
应用层
与TCP/IP协议族通信的
中
间软件抽象层,是一组...
muduo 网络
buf
fer--为什么 non-blocking 网络编程
中
应用层
buf
fer 是必须的(★firecat推荐★)
对于非阻塞IO的网络库来说,
buf
fer几乎是必须...event loop 是 non-blocking 网络编程的核心,在现实生活
中
,non-blocking 几乎总是和 IO-multiplexing 一起使用,原因有两点: 没有人真的会用轮询 (busy-pool...
通信技术
4,359
社区成员
28,927
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章