阅读:1238回复:3
在驱动中如果占cpu比率比较大,应该如何把cpu利用率降下来呢
我的ip校验和不知为何占用cpu比率比较大,如何在能降低cpu占用率,使用系统工作线程行吗?
|
|
|
沙发#
发布于:2005-07-02 10:04
代码贴出来看看
|
|
板凳#
发布于:2005-07-02 22:27
对,一个checksum不应该占用太大的CPU
估计是你的代码问题 |
|
|
地板#
发布于:2005-07-06 10:32
USHORT
checksum( IN USHORT *buffer, IN int size ) { register unsigned long cksum = 0; register int sizeL = size; while(sizeL > 1) { cksum += *buffer++; sizeL -= 2; } if(sizeL ) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } NDIS_STATUS CheckTcpipSendPacket(IN OUT PNDIS_PACKET packet) { PNDIS_BUFFER FirstBuffer = NULL; PNDIS_BUFFER Buffer = NULL; int Length = 0; PETHERNET_FRAME pEthernetFrame = 0; WORD ethernetFrameType = 0; PIP_HEADER pIpHeader = 0; int ipHeaderLen = 0; UINT TotalPacketLength; #ifdef NDIS51 NdisGetFirstBufferFromPacketSafe( packet, &FirstBuffer, &pEthernetFrame, &Length, &TotalPacketLength, NormalPagePriority); if (pEthernetFrame == NULL) { Length = 0; } #else NdisGetFirstBufferFromPacket( packet, &FirstBuffer, &pEthernetFrame, &Length, &TotalPacketLength); #endif if (Length >= ETHERNET_FRAME_LENGTH) { int frameLen = ETHERNET_FRAME_LENGTH; ethernetFrameType = pEthernetFrame -> FrameType; if(ethernetFrameType == ETHERNET_8021P_TAG_TYPE) { ethernetFrameType =(WORD UNALIGNED)*((UCHAR*)&pEthernetFrame -> FrameType + 4); frameLen += 4; } // PrintEthernetFrame(pEthernetFrame, Length); if(ETHERNET_FRAME_TYPE_TCPIP != ethernetFrameType) return XF_SUCCESS; if((Length - frameLen) >= IP_HEADER_LENGTH) { pIpHeader = (PIP_HEADER)((BYTE*)pEthernetFrame + frameLen); Length = Length - frameLen; } else { NdisGetNextBuffer(FirstBuffer, &FirstBuffer); if(FirstBuffer == NULL) return XF_SUCCESS; NdisQueryBufferSafe(FirstBuffer, &pIpHeader, &Length, HighPagePriority); if(pIpHeader == NULL || Length < IP_HEADER_LENGTH) return XF_SUCCESS; } // PrintIp(pIpHeader, Length); { pIpHeader->CheckSum = 0; pIpHeader->CheckSum = checksum((USHORT*)pIpHeader,GET_IP_HEADER_LENGTH(pIpHeader->VersionAndHeaderLength)); } } else dprintf(("CheckTcpipSend: invalid ether packet \n\n")); return XF_SUCCESS; } 去掉checksum就没有问题了.加上checksum就会占用cpu 10%左右,有的达40%. 而且不是所有计算机都是这样占cpu的.大部分还是好的. |
|
|