美文网首页
实时编程

实时编程

作者: 谭英智 | 来源:发表于2023-10-20 00:50 被阅读0次

问题

在写一个us级别的系统,需要考虑什么因素

因素

线程

通过中断的方式处理线程,会让线程不断的从睡眠和唤醒来回,这些行为虽然可以提高CPU的使用率,在无事可做的时候,CPU可以休息。

但是对于实时系统,这些开销是非常可观的,会对程序的性能造成几十到上百微妙的延时

影响一个线程进入睡眠和唤醒的因素:

  • 调用sleep函数
  • 调用block system call
  • 申请堆内存
  • 释放堆内存
  • 等待信号量
  • 等待中断等等
  • mutex lock

在实时系统的设计中,线程应该是一直running的状态

不允许线程切换出去

这样才可以在最大限度上,保证时延

上下文切换

上下文切换的开销包括:

  • 寄存器的保存
  • 地址空间
  • 程序的地址

造成上下文切换的因素有:

  • system call
  • 使用了协程
  • 线程被切走

所以在设计时,system call和协程是不允许使用的

存储访问

内存分为:

  • CPU cache
  • RAM
  • Disk

数据从Disk获取,会造成ms级别的latency

CPU在处理RAM的数据时,应该尽量考虑数据的邻域性,分配内存时,在关键结构体,应当使用局部allocator,allocator需要做到预分配内存,并在程序运行过程中,不会发生任何的向系统申请内存和释放内存的操作

线程之间的数据共享

  • 使用FIFO来传输数据
  • 不使用mutex lock
  • 使用原子编程
  • 使用try lock
  • 使用double buffering
  • 避免伪共享

事件循环

  • 事件触发
  • 任何事件都不允许block住整个线程
  • 区分热点事件和冷事件,并区别处理

相关文章

网友评论

      本文标题:实时编程

      本文链接:https://www.haomeiwen.com/subject/jjckidtx.html