fuq_dddd
驱动老牛
驱动老牛
  • 注册日期2002-10-15
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分331分
  • 威望57点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
阅读:1884回复:19

自旋锁和队列在通讯效率方面的讨论

楼主#
更多 发布于:2002-12-06 18:37
在高频通讯的情况下,NDIS的效率就显得很重要了,
希望大家讨论一下:
自旋锁和队列两种处理方式哪一种会效率更高,
如果哪位哥们做过机顶盒,拿出来和大家交流一下
星星之火 可以燎原 每一个光亮 都可能是黎明 [img]http://joke.tom.com/img/assets/1/gaoxiao_80_910.gif[/img]
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-06 22:02
自旋锁和队列是两个东西吖,怎么比较?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-07 10:02
 
自旋锁和队列是两个东西吖,怎么比较?


对啊。

我现在想用自旋锁来同步链表的操作(LIST_ENTRY)(比如说遍历操作),可是只在数据被改变的时候加锁我觉得还是会出问题,但如果把整个遍历和 Update 操作都加锁的话,锁内耗时会不会太长了?因为看书上说这个时间不能太长!
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-07 10:13
你把这些操作分别写函数,在函数内部加锁,在其他的地方调用这些函数来操作链表
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-07 10:21
写进函数里它的遍历耗时也不会缩短啊
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-07 10:33
你都要怎么样操作?这看你怎么设计你的遍历方式了,遍历以后还要怎么处理,还有,你为什么要遍历一次??
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-07 11:25
在 NAT 中,每个地址映射都是有生存期的,时间一到,它就得让出它占用的资源(地址、端口),所以要定期遍历映射数据结构对影射生存期进行“减寿”操作。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-07 11:37
你这个遍历没有什么影响吧?链表多大?
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-12-07 12:00
256 x 16,是个数组,但每个元素都可以是一个链表头。

不过我使用了一种提速方法,所以空表项不会被搜索。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-07 12:16
你在哪里查的链表??不在收发包的过程中遍历不会影响你的收发包的效率的,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-12-07 12:22
哦,呵呵我可能把两个问题放在一起说了:)

遍历那个我是问锁内耗时的,发包效率那个我是问是该当时就处理包(比如加密)呢还是先缓冲起来压后处理。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-12-07 12:25
自旋锁是为了避免争用资源的问题的,如果这个数组的访问不会有这种情况,你完全可以不加的

发包的过程比较简单,所以我就来一个处理一个,收包要考虑很多问题,我是用的一个队列,我觉得用那种方式要根据你的情况来定,都差不多的,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
fuq_dddd
驱动老牛
驱动老牛
  • 注册日期2002-10-15
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分331分
  • 威望57点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-12-08 10:53
可能我的意思没有完全表达清楚,
我是说在处理数据时的两种方式,
1. 在接收到数据时,直接用自旋锁对数据加锁,对数据处理过后再释放锁,
对数据的处理是在系统调用的进程内部,我称之为自旋锁方式,
2. 在接收到数据时,将数据加入到一个队列中,在驱动中设一个全局量,
计算队列中的包数,另外建立一个线程对数据处理,我称之为队列方式

这两种方式必然会有差别,我觉得2应该是效率比较高,但内存危险比较高?
所以希望大家讨论一下!!!!!!!!!!
星星之火 可以燎原 每一个光亮 都可能是黎明 [img]http://joke.tom.com/img/assets/1/gaoxiao_80_910.gif[/img]
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-12-08 19:29
 
直接用自旋锁对数据加锁

数据不在队列里面不会有同时访问的问题为什么要加锁?:
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
fuq_dddd
驱动老牛
驱动老牛
  • 注册日期2002-10-15
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分331分
  • 威望57点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-12-09 09:13
可能是我的概念有问题:
我说的队列方式就是你所采用的方式。
 
发包的过程比较简单,所以我就来一个处理一个,收包要考虑很多问题,我是用的一个队列,我觉得用那种方式要根据你的情况来定,都差不多的,

我说的自旋锁,是指在驱动接口函数中,例如PASSTHRU中的PrReceive,
在该函数内部直接处理数据,这时对处理的数据加锁,
可能是多余的?
星星之火 可以燎原 每一个光亮 都可能是黎明 [img]http://joke.tom.com/img/assets/1/gaoxiao_80_910.gif[/img]
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-12-09 09:18
ptreceive有可能会被重入的,若你在该函数里没有使用全局变量(包括全局结构里的变量)和静态变量,也没有访问全局的资源,则不需要加锁,否则就必须要加锁。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-12-09 09:25
对于那些你在receive里面分配的packet、buffer这些数据加锁没有任何意义,
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-12-09 09:28
可能我的意思没有完全表达清楚,
我是说在处理数据时的两种方式,
1. 在接收到数据时,直接用自旋锁对数据加锁,对数据处理过后再释放锁,
对数据的处理是在系统调用的进程内部,我称之为自旋锁方式,
2. 在接收到数据时,将数据加入到一个队列中,在驱动中设一个全局量,
计算队列中的包数,另外建立一个线程对数据处理,我称之为队列方式

这两种方式必然会有差别,我觉得2应该是效率比较高,但内存危险比较高?
所以希望大家讨论一下!!!!!!!!!!


在你的第二种情况下才应该加锁!!!!!!!!!!!!!!!!!
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-12-09 09:30
看一下ddk里面关于自旋锁的内容
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
fuq_dddd
驱动老牛
驱动老牛
  • 注册日期2002-10-15
  • 最后登录2009-10-09
  • 粉丝0
  • 关注0
  • 积分331分
  • 威望57点
  • 贡献值0点
  • 好评度28点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-12-09 09:34
看来得再仔细看看DDK了。

谢谢!!!!!!

给分------------------------------------------
星星之火 可以燎原 每一个光亮 都可能是黎明 [img]http://joke.tom.com/img/assets/1/gaoxiao_80_910.gif[/img]
游客

返回顶部