阅读:1913回复:19
自旋锁和队列在通讯效率方面的讨论
在高频通讯的情况下,NDIS的效率就显得很重要了,
希望大家讨论一下: 自旋锁和队列两种处理方式哪一种会效率更高, 如果哪位哥们做过机顶盒,拿出来和大家交流一下 |
|
|
沙发#
发布于:2002-12-06 22:02
自旋锁和队列是两个东西吖,怎么比较?
|
|
|
板凳#
发布于:2002-12-07 10:02
自旋锁和队列是两个东西吖,怎么比较? 对啊。 我现在想用自旋锁来同步链表的操作(LIST_ENTRY)(比如说遍历操作),可是只在数据被改变的时候加锁我觉得还是会出问题,但如果把整个遍历和 Update 操作都加锁的话,锁内耗时会不会太长了?因为看书上说这个时间不能太长! |
|
地板#
发布于:2002-12-07 10:13
你把这些操作分别写函数,在函数内部加锁,在其他的地方调用这些函数来操作链表
|
|
|
地下室#
发布于:2002-12-07 10:21
写进函数里它的遍历耗时也不会缩短啊
|
|
5楼#
发布于:2002-12-07 10:33
你都要怎么样操作?这看你怎么设计你的遍历方式了,遍历以后还要怎么处理,还有,你为什么要遍历一次??
|
|
|
6楼#
发布于:2002-12-07 11:25
在 NAT 中,每个地址映射都是有生存期的,时间一到,它就得让出它占用的资源(地址、端口),所以要定期遍历映射数据结构对影射生存期进行“减寿”操作。
|
|
7楼#
发布于:2002-12-07 11:37
你这个遍历没有什么影响吧?链表多大?
|
|
|
8楼#
发布于:2002-12-07 12:00
256 x 16,是个数组,但每个元素都可以是一个链表头。
不过我使用了一种提速方法,所以空表项不会被搜索。 |
|
9楼#
发布于:2002-12-07 12:16
你在哪里查的链表??不在收发包的过程中遍历不会影响你的收发包的效率的,
|
|
|
10楼#
发布于:2002-12-07 12:22
哦,呵呵我可能把两个问题放在一起说了:)
遍历那个我是问锁内耗时的,发包效率那个我是问是该当时就处理包(比如加密)呢还是先缓冲起来压后处理。 |
|
11楼#
发布于:2002-12-07 12:25
自旋锁是为了避免争用资源的问题的,如果这个数组的访问不会有这种情况,你完全可以不加的
发包的过程比较简单,所以我就来一个处理一个,收包要考虑很多问题,我是用的一个队列,我觉得用那种方式要根据你的情况来定,都差不多的, |
|
|
12楼#
发布于:2002-12-08 10:53
可能我的意思没有完全表达清楚,
我是说在处理数据时的两种方式, 1. 在接收到数据时,直接用自旋锁对数据加锁,对数据处理过后再释放锁, 对数据的处理是在系统调用的进程内部,我称之为自旋锁方式, 2. 在接收到数据时,将数据加入到一个队列中,在驱动中设一个全局量, 计算队列中的包数,另外建立一个线程对数据处理,我称之为队列方式 这两种方式必然会有差别,我觉得2应该是效率比较高,但内存危险比较高? 所以希望大家讨论一下!!!!!!!!!! |
|
|
13楼#
发布于:2002-12-08 19:29
直接用自旋锁对数据加锁 数据不在队列里面不会有同时访问的问题为什么要加锁?: |
|
|
14楼#
发布于:2002-12-09 09:13
可能是我的概念有问题:
我说的队列方式就是你所采用的方式。 发包的过程比较简单,所以我就来一个处理一个,收包要考虑很多问题,我是用的一个队列,我觉得用那种方式要根据你的情况来定,都差不多的, 我说的自旋锁,是指在驱动接口函数中,例如PASSTHRU中的PrReceive, 在该函数内部直接处理数据,这时对处理的数据加锁, 可能是多余的? |
|
|
15楼#
发布于:2002-12-09 09:18
ptreceive有可能会被重入的,若你在该函数里没有使用全局变量(包括全局结构里的变量)和静态变量,也没有访问全局的资源,则不需要加锁,否则就必须要加锁。
|
|
16楼#
发布于:2002-12-09 09:25
对于那些你在receive里面分配的packet、buffer这些数据加锁没有任何意义,
|
|
|
17楼#
发布于:2002-12-09 09:28
可能我的意思没有完全表达清楚, 在你的第二种情况下才应该加锁!!!!!!!!!!!!!!!!! |
|
|
18楼#
发布于:2002-12-09 09:30
看一下ddk里面关于自旋锁的内容
|
|
|
19楼#
发布于:2002-12-09 09:34
看来得再仔细看看DDK了。
谢谢!!!!!! 给分------------------------------------------ |
|
|