Linux的高效的数据传输技术-Relay

Linux的高效的数据传输技术-Relay》摘要: 面向内核空间的 API 这些API接口向位于内核空间的用户提供了治理relay通道、数据写入等功能。下面介绍其中主要的部分,完整的API接口列表请参见这里。 ●relay_open() - 创建一个relay通道,包…
  

面向内核空间的 API

  这些API接口向位于内核空间的用户提供了治理relay通道、数据写入等功能。下面介绍其中主要的部分,完整的API接口列表请参见这里。

  ●relay_open() - 创建一个relay通道,包括创建每个CPU对应的relay缓冲区。

  ●relay_close() - 关闭一个relay通道,包括释放所有的relay缓冲区,在此之前会调用relay_switch()来处理这些relay缓冲区以保证已读取但是未满的数据不会丢失

  ●relay_write() - 将数据写入到当前CPU对应的relay缓冲区内。由于它使用了local_irqsave()保护,因此也可以在中断上下文中使用。

  ●relay_reserve() - 在relay通道中保留一块连续的区域来留给未来的写入操作。这通常用于那些希望直接写入到relay缓冲区的用户。考虑到性能或者其它因素,这些用户不希望先把数据写到一个临时缓冲区中,然后再通过relay_write()进行写入。

  Relay的例子

  我们用一个最简单的例子来介绍怎么使用Relay。这个例子由两部分组成:一部分是位于内核空间将数据写入relay文件的程序,使用时需要作为一个内核模块被加载;另一部分是位于用户空间从relay文件中读取数据的程序,使用时作为普通用户态程序运行。

  内核空间的程序主要操作是:

  加载模块时,打开一个relay通道,并且往打开的relay通道中写入消息;

  卸载模块时,关闭relay通道。

  程序内容:

/* 
 * hello-mod.c 
 * a kernel-space client example of relayfs filesystem 
 */ 
#include <linux/module.h> 
#include <linux/relayfs_fs.h> 
static struct rchan *hello_rchan; 
int init_module(void) 
{ 
        const char *msg="Hello world"; 
        hello_rchan = relay_open("cpu", NULL, 8192, 2, NULL); 
        if(!hello_rchan){ 
                printk("relay_open() failed."); 
                return -ENOMEM; 
        } 
        relay_write(hello_rchan, msg, strlen(msg)); 
        return 0; 
} 
void cleanup_module(void) 
{ 
        if(hello_rchan) { 
                relay_close(hello_rchan); 
                hello_rchan = NULL; 
        } 
        return; 
} 
MODULE_LICENSE ("GPL"); 
MODULE_DESCRIPTION ("Simple example of Relay");
你的位置:电脑故障网 >> 操作系统 >> Linux/Unix >> Linux的高效的数据传输技术-Relay