dpdk中的timer

dpdk 中有提供time没看负责定时操作,同时在example/timer中有提供一个测试code
可以告知大家如何使用time 没看
从meson.build中可以看出源文件只有一个main.c
deps += 'timer'
sources = files(
	'main.c'
)
从makefile中可以看出binary的名字叫timer,这个main.c 可以同时被build 为动态链接库和静态链接库
# binary name
APP = timer

# all source are stored in SRCS-y
SRCS-y := main.c

# Build using pkg-config variables if possible
$(shell pkg-config --exists libdpdk)
ifeq ($(.SHELLSTATUS),0)

all: shared
.PHONY: shared static
shared: build/$(APP)-shared
	ln -sf $(APP)-shared build/$(APP)
static: build/$(APP)-static
	ln -sf $(APP)-static build/$(APP)

CFLAGS += -O3
CFLAGS += $(WERROR_FLAGS)
与此同时可以看到优化级别是O3
timer的入口函数为main函数
int
main(int argc, char **argv)
{
	int ret;
	uint64_t hz;
	unsigned lcore_id;

	/* init EAL */
	#初始化running time 环境
	ret = rte_eal_init(argc, argv);
	if (ret < 0)
		rte_panic("Cannot init EAL\n");

	#由于我们是测试timer,因此要用到rte提供的time子系统
	/* init RTE timer library */
	rte_timer_subsystem_init();

	/* init timer structures */
	#初始化两个timer的回调函数
	rte_timer_init(&timer0);
	rte_timer_init(&timer1);

	/* load timer0, every second, on master lcore, reloaded automatically */
	#timer 0在主核上(本例中是当前cpu),不一定是cpu0,自动状态
	hz = rte_get_timer_hz();
	#获取当前cpu
	lcore_id = rte_lcore_id();
	#设置timer运行的模式,例如这里就是周期运行PERIODICAL,周期是1s
	rte_timer_reset(&timer0, hz, PERIODICAL, lcore_id, timer0_cb, NULL);

	/* load timer1, every second/3, on next lcore, reloaded manually */
	#timer1 在主cpu的下一个cpu上,如果主cpu 是0 的话,则下一个cpu可能是1
	lcore_id = rte_get_next_lcore(lcore_id, 0, 1);
	#设置timer运行的模式,例如这里就是单次运行,如果要周期运行的话,需要在timer1的回调函数中继续调用rte_timer_reset
	#设置timer,运行周期是0.33s
	rte_timer_reset(&timer1, hz/3, SINGLE, lcore_id, timer1_cb, NULL);

	/* call lcore_mainloop() on every slave lcore */
	#再出了当前cpu上外的cpu上跑lcore_mainloop
	RTE_LCORE_FOREACH_SLAVE(lcore_id) {
		rte_eal_remote_launch(lcore_mainloop, NULL, lcore_id);
	}

	/* call it on master lcore too */
	#在当前cpu上跑
	(void) lcore_mainloop(NULL);

	return 0;
}

static void
timer0_cb(__attribute__((unused)) struct rte_timer *tim,
	  __attribute__((unused)) void *arg)
{
	static unsigned counter = 0;
	unsigned lcore_id = rte_lcore_id();

	printf("%s() on lcore %u\n", __func__, lcore_id);

	/* this timer is automatically reloaded until we decide to
	 * stop it, when counter reaches 20. */
	if ((counter ++) == 20)
		rte_timer_stop(tim);
}
我们看一下timer0_cb的实现,运行20次就到期了,每次一秒的话,则20s后这个timer就停止了
我们看看lcore_mainloop的实现,如上所示每个cpu上都会跑一个lcore_mainloop
static __attribute__((noreturn)) int
lcore_mainloop(__attribute__((unused)) void *arg)
{
	uint64_t prev_tsc = 0, cur_tsc, diff_tsc;
	unsigned lcore_id;

	lcore_id = rte_lcore_id();
	printf("Starting mainloop on core %u\n", lcore_id);

	while (1) {
		/*
		 * Call the timer handler on each core: as we don't
		 * need a very precise timer, so only call
		 * rte_timer_manage() every ~10ms (at 2Ghz). In a real
		 * application, this will enhance performances as
		 * reading the HPET timer is not efficient.
		 */
		cur_tsc = rte_rdtsc();
		diff_tsc = cur_tsc - prev_tsc;
		#从这里知道dpdk中通过rte_timer_manage来管理当前core上的定时器,并且定时器的分辨率是TIMER_RESOLUTION_CYCLES
		if (diff_tsc > TIMER_RESOLUTION_CYCLES) {
			rte_timer_manage();
			prev_tsc = cur_tsc;
		}
	}
}

### 回答1: DPDK(Data Plane Development Kit)是一个开源的软件开发工具集合,用于构建高性能的数据平面应用程序。DPDK提供了一系列的库函数和驱动,帮助开发人员更好地利用硬件资源,并将网络应用程序性能最大化。 DPDK文开发指南是一本为国开发人员编写的文档,旨在帮助他们了解和掌握DPDK的使用方法和技巧。 该开发指南内容丰富,包括了对DPDK框架的详细介绍、环境搭建、编译安装等基础知识。同时,还介绍了如何使用DPDK进行包处理、网络流的管理和数据包转发等高级功能。它提供了丰富的示例代码和代码解析,帮助开发人员更好地理解和应用DPDK的各种功能。 在该开发指南,还介绍了DPDK在不同平台下的使用方法,如在Linux、FreeBSD等操作系统的配置和使用。并且,该指南还特别关注了在国特定网络环境下的应用示例和最佳实践,以帮助开发人员更好地应用DPDK进行网络应用程序的开发。 总之,DPDK文开发指南是一本针对国开发人员的宝贵资料,通过它,开发人员可以更加深入地了解和使用DPDK,开发出高性能、高可扩展性的数据面应用程序。同时,该指南还为国特定网络环境下的应用提供了示例和最佳实践,帮助开发人员更好地应对挑战,提升网络应用程序的性能和稳定性。 ### 回答2: DPDK全称为Data Plane Development Kit,是一种用于加速数据平面处理的开源软件库。该库提供了一系列高性能的API,供开发者利用其进行高速数据包处理。DPDK能够通过绕过操作系统内核的方式,直接将网络流量发送和接收到用户空间,从而大大提升了网络应用的性能。 DPDK提供了一份文开发指南,方便国开发者学习和使用DPDK。这份指南详细介绍了DPDK的概念、原理和架构,以及其在高性能数据包处理方面的优势。指南还提供了一些使用DPDK的实例和案例,方便开发者理解和应用DPDK。 该指南首先介绍了DPDK的基本概念和使用环境,包括CPU的绑定与适配、内存管理和物理设备绑定等。然后,指南介绍了如何使用DPDK的API来实现网络应用,包括创建和管理网络接口、发送和接收数据包等。此外,还介绍了DPDK的报文处理框架、多队列和多核绑定等高级特性。 在指南的后面,还提供了一些常见问题和解决方案,方便开发者在使用DPDK过程遇到问题时进行参考。此外,指南还提供了一些进阶话题,如数据包包头解析、流量管理和软件交换机等,供开发者在深入理解DPDK后进行进一步探索和应用。 总之,DPDK文开发指南提供了一个全面而易懂的学习和使用DPDK的参考文档,对于想要利用DPDK开发高性能数据平面应用的国开发者来说,非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值