美文网首页
实时编程

实时编程

作者: 谭英智 | 来源:发表于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