sk_wmem_queued 与sk_wmem_alloc区别,测距设备如今比较常用的测距设备是激光扫描仪。它们的优点是精度高,高效,输出数据的处理不需要耗费大量时间,但缺点是他们很贵,一个SICK扫描仪需要花费5000美金。激光扫描仪的问题在于在观察如玻璃这种特定表面时输出数据会很糟糕。
函数__sk_mem_schedule的封装函数有两个sk_wmem_schedule和sk_rmem_schedule,对应于发送SK_MEM_SEND和接收SK_MEM_RECV两个类别的缓存使用。对于sk_wmem_schedule函数,如果请求的大小在预分配额度内,进行正常分配,否则,由__sk_mem_schedule函数分配新的额度。 staticinlineboolsk_wmem_schedule(structsock *sk,ints...
//这个为发送队列(包括克隆的)分配的实际空间,sk_forward_alloc是提前预分配的,实际上并没有分片空间,只是说先确定下来可以用这么多空间,就是后面分片空间的时候最多可以分片这么多空间。 atomic_t sk_wmem_alloc;//这个只针对发送数据,接收数据对应的是sk_rmem_alloc, /* * 分配辅助缓冲区的上限,辅助数据包括...
注意和上面的sk_wmem_alloc的区别intsk_forward_alloc;//skb_entail中的sk_mem_charge里面会对新分配的SKB空间做一次减法,表示预分配缓存空间少了 在真正分配空间之前需要比较这个值,看内存空间释放使用达到限度//在应用层send_msg的时候,会在函数__sk_mem_schedule中开辟空间,为sk_forward_alloc增加amt * SK_ME...
sk_wmem_alloc发送队列已使用空间。在STREAM类型协议中由sk_wmem_queued成员所替代。 sk_omem_alloc目前尚不明。 sk_sndbuf:发送缓冲区大小。最大不超过sock写队列内存限额的最大值。 sk_rcvbuf:接收缓冲区大小。最大不超过sock读队列内存限额的最大值。
* 大部分功能是为TCP准备的 */ struct sock { struct options *opt;//IP选项缓冲于此处 volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证...
int sk_msg_alloc(struct sock *sk, struct sk_msg *msg, int len, int elem_first_coalesce) { struct page_frag *pfrag = sk_page_frag(sk); u32 osize = msg->sg.size; int ret = 0; len -= msg->sg.size; while (len > 0) { ...
atomic_sub(skb->truesize,&sk->sk_wmem_alloc/sk_rmem_alloc); sock_queue_rcv_skb,sock_queue_err_skb在把收到的或者错误的skb放入队列中时会对 socket接收缓存,skb->truesize及当前已经占用的读内存进行判断: if(atomic_read(&sk->sk_rmem_alloc)+skb->truesize>= ...
volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */
atomic_add(skb->truesize, &sk->sk_wmem_alloc); } 在释放这样的一个SKB的时候,需要调用sock_free() void sock_wfree(struct sk_buff *skb) { struct sock *sk = skb->sk; /* In case it might be waiting for more memory. */ atomic_sub(skb->truesize, &sk->sk_wmem_alloc); if (!so...