kfifo_put是将一个element加入kfifo(_kfifo->data or type buf), 然后将_kfifo->in++ /** * kfifo_put - put data into the fifo * @fifo: address of the fifo to be used * @val: the data to be added * * This macro copies the given value into the fifo. * It returns 0 if the fif...
fifo->size - fifo->in+ fifo->out);78/*9* Ensure that we sample the fifo->out index -before- we10* start putting bytes into the kfifo.11*/1213smp_mb();1415/*first put the data starting from fifo->in to buffer end*/16l = min(len, fifo->size...
二kfifo内存分配和初始化 三kfifo并发无锁奥秘---内存屏障 四kfifo的入队__kfifo_put和出队__kfifo_get操作 五扩展 Reference 学不考儒,务掇精华;文不按古,匠心独运。Linux kernal 鬼斧神工,博大精深,让人叹为观止,拍手叫绝。
这是kfifo的数据结构,kfifo主要提供了两个操作,__kfifo_put(入队操作)和__kfifo_get(出队操作)。 它的各个数据成员如下: buffer, 用于存放数据的缓存 size, buffer空间的大小,在初化时,将它向上扩展成2的幂 lock, 如果使用不能保证任何时间最多只有一个读线程和写线程,需要使用该lock实施同步。
这是kfifo的数据结构,kfifo主要提供了两个操作,__kfifo_put(入队操作)和__kfifo_get(出队操作)。 它的各个数据成员如下: buffer: 用于存放数据的缓存 size: buffer空间的大小,在初化时,将它向上扩展成2的幂 lock: 如果使用不能保证任何时间最多只有一个读线程和写线程,需要使用该lock实施同步。
四kfifo的入队__kfifo_put和出队__kfifo_get操作 五扩展 Reference 眉目传情之匠心独运的kfifo Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:October 8th, 2014 学不考儒,务掇精华;文不按古,匠心独运。Linuxkernal 鬼斧神工,博大精深,让人叹为观止,拍手叫...
__kfifo_put是入队操作,它先将数据放入buffer里面,最后才修改in参数;__kfifo_get是出队操作,它先将数据从buffer中移走,最后才修改out。你会发现in和out两者各司其职。计算机科学家已经证明,当只有一个读经程和一个写线程并发操作时,不需要任何额外的锁,就可以确保是线程安全的,也即kfifo使用了无锁编程技术,以提...
为了直观展示Kfifo的工作原理,我们可以通过简单的图示说明。当队列为空时,所有空间都标记为空闲;put操作后,队列中填充一个数据;get操作后,队列中移除一个数据;当put操作的数据数量超过队列尾部到头部的距离时,剩余数据则被重新移至队列头部。在实际应用中,我们可以基于Kfifo原理,编写自定义的环形...
在kfifo_init和kfifo_calloc中,kfifo->size的值总是在调用者传进来的size参数的基础上向2的幂扩展,这是内核一贯的做法。这样的好处不言而喻--对kfifo->size取模运算可以转化为与运算,如:kfifo->in % kfifo->size 可以转化为 kfifo->in & (kfifo->size – 1) kfifo的巧妙之处在于in和out定义为无符号类型...
所以fifo->size - (fifo->in & (fifo->size - 1)) 即位 fifo->in 到 buffer末尾所剩余的长度,l取len和剩余长度的最小值,即为需要拷贝l 字节到fifo->buffer + fifo->in的位置上。