如何保证物理内存的内容不被覆盖
最近在思考这么一个问题.任何一款芯片(比如网卡)一般都有自己的内存,这款芯片一旦整合到系统中,会被分配一个固定大小的空间,比如2k,或者512Byte(一般不会大于芯片自己的内存)
我的疑问是这么小的内存空间,如何保证数据包的及时接收而不导致覆盖掉前一帧的数据. 有没有特别的控制机制.比如算法之类的.
忘赐教. 所谓"及时"是系统内部相互协调的,如果数据处理不过来.而有新的数据要接受,通常就是丢弃以前的包,从信息角度看,后面的包比前面的可能具有更大的信息量.
比如2k,或者512Byte,一般网卡内存不会这么小,一个数据包就占1500以上的字节...而且保证和系统协同工作必定能存储多个数据包,还考虑到双向收发肯定远远大于这个,难道你的是配置空间?
[ 本帖最后由 epegasus 于 2009-9-4 09:18 编辑 ]
回复 #2 epegasus 的帖子
我只是举了这么例子,2k是网卡而言,确实太少了.呵呵.我想了解的是你提到的"系统内部相互协调",这种协调是不是有software(某种算法)来实现的.
另外在问一个和本帖子不大相关的问题.
常听到说,这款硬件不支持某种功能.个人觉得是硬件少了什么芯片.而不是说有芯片而没有想对应的软件.比如MMU的功能. 大侠能不能在给稍微说下.不胜感激. 一般来说,硬件只完成接收过程,剩下的过程都由软件去处理,软件可以采取以下策略:
1.硬件接收完之后停止,等待软件去处理。软件处理完之后硬件重新启动,接收后续的数据。
2.硬件一直接收数据,软件有空闲的时候再去处理数据。
无论采取何种策略,都有可能导致数据丢失。
必须保证软件处理速度大于硬件接收速度,才能保证接收-处理流程可以正常运行。
为了应付某些突发事件,软件可以设置若干级的缓冲;当某一段时间内CPU忙于处理其它更高优先级的任务时,可以先将硬件接收的数据缓存下来;当CPU空闲下来的时候再对数据进行软件处理。 “常听到说,这款硬件不支持某种功能.个人觉得是硬件少了什么芯片.而不是说有芯片而没有想对应的软件.比如MMU的功能. 大侠能不能在给稍微说下.不胜感激.”
这个问题我觉得没啥意义。其实INTEL CPU最早出32BIT的时候,还没有软件(OS)真正用它,只是后来才开始用的。另外,X86 的 RING 1, RING2 也是硬件提供了,但是基本没有软件在用的。 原帖由 怪怪虎 于 2009-9-4 16:24 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
我只是举了这么例子,2k是网卡而言,确实太少了.呵呵.
我想了解的是你提到的"系统内部相互协调",这种协调是不是有software(某种算法)来实现的.
另外在问一个和本帖子不大相关的问题.
常听到说,这款硬件不支持 ...
打个比方,芯片收到数据了,就中断一下处理器,处理器接收到中断,就去读一下芯片里的数据. 对于网卡芯片来说,卡内的内存都是分页的,每个页可以用来存可以数据包。其实就是一个小小的缓冲了。当收到数据包的时候会产生一个中断调用中断处理程序来取这个包。一般来说,中断处理程序会把数据包拷贝到系统内存中去,然后一级一级的往上传,直到用户程序。
当页面用完的时候,可以丢弃缓存中最老的数据,压入新的数据。弹出的数据当然也就丢弃掉了。也可以将新数据直接丢弃。但是,后者其实并不好。
所以,内部在硬件即便并不保证丢失的。要想不丢失只能在软件级别实现。这也是为什么需要有TCP协议来进行可靠传输的原因。当然,数据丢失的情况很多,这只是其中的一种而已。
页:
[1]