<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[jun7118的博客]]></title><description><![CDATA[记忆的钩子，磁盘的缓存，脏的扇区]]></description><link>https://blog.youkuaiyun.com/jun7118</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; jun7118]]></copyright><item><title><![CDATA[futex & pthead_mutex]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/155411959</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/155411959</guid><author>jun7118</author><pubDate>Sun, 30 Nov 2025 10:25:46 +0800</pubDate><description><![CDATA[不同于内核mutex用底bit做flag，pthread mutex用高2bit做flag，低位保存的是thread id，一个flag是owner died,锁拥有者狗带了，内核的锁持有者是不能被干掉的，这里是可以的，一个flag是waiters告诉大家有人等着拿锁。除了常规的，还有pi类型，优先级继承，底层直接用了rt mutex，然后是requeue对应条件变量场景，直接把等待线程从一个futex转移到另外一个futex，与 lock;]]></description><category></category></item><item><title><![CDATA[linux mutex]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/153116274</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/153116274</guid><author>jun7118</author><pubDate>Sun, 12 Oct 2025 14:47:33 +0800</pubDate><description><![CDATA[比如A持有锁，B等着锁，且B是wait_list最top的waiter，则B置位bit1 handoff，然后A释放锁的时候，发现handoff置位，则把owner设置成top waiter，并且把 bit 2置位pickup，bit1清掉。这里引出一个逻辑，除了锁没人等，则owner是由持有锁的线程释放锁的时候，将owner设置成top waiter的task_struct, 而不是由申请锁的线程来修改owner。常规的理解，mutex，就是获取锁，没获取到就挂起。要是光看这个注释，给你看蒙蔽。]]></description><category></category></item><item><title><![CDATA[msi mesi moesi cpu缓存一致性]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/152729313</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/152729313</guid><author>jun7118</author><pubDate>Wed, 08 Oct 2025 18:35:51 +0800</pubDate><description><![CDATA[一般情况下，A改了行变成m后，其他B想用这行，必须A写回ddr，B再去ddr里面load。然后现在，B想用这行，A直接m变o，然后把这行发个B，B是s。如果这一行只有咱有，则不是s而是e，这样咱想改就直接e变m，不需要通知其他u改i了。大多数的数据他是不在多个u共享的，咱系统这么多进程，大多相互也八竿子打不着，然后多线程，也不能全是共享变量不是？大家最开始都是 s，然后咱u写了就便m了，然后通知其他u变成i。当然，有这些协议有专门的状态机转移图，细节比这复杂的多了。所以遍历事件，check，handle。]]></description><category></category></item><item><title><![CDATA[Linux RT RT RT]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/147352383</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/147352383</guid><author>jun7118</author><pubDate>Sat, 19 Apr 2025 16:38:15 +0800</pubDate><description><![CDATA[而且内核里面用的茫茫多，就遍地都是不可抢占的堡垒。however，虽然rt_mutex自己維护调用链，引入PI(priority inheritance)，用来解决优先级反转的问题，看似美好的结局，但是留下其他问题。还有一些异步通知的机制也没有锁owner的说法，所以就不能放到锁的调用链里面，没法进行PI处理。中断上下文有硬中断和软中断，且其优先级是高于进程上下文的，你的应用程序在中断老大哥面前请靠边站。这里的rt引入了一个deadline的说法，此时的实时性是保证在最大一个时间间隔内，程序被执行。]]></description><category></category></item><item><title><![CDATA[live555 俗称3个5 h264 rtp]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/145081443</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/145081443</guid><author>jun7118</author><pubDate>Sat, 11 Jan 2025 19:55:50 +0800</pubDate><description><![CDATA[f是field的意思，成员变量，与m_同。rtp这个协议一个包的 大小最大为 65535 ，然后如果用udp协议，还要考虑mtu，则更小。0001 001 为帧起始，为保证唯一，协议会把数据里面的 0001 001 转码一下。事件就是一个32bit的mask，对应到一个callback 数组。咱一个I帧轻松突破这极限，所以一个h264的帧还要分包，置标志位。其他没啥，其实协议挺简单，就那么几个flag，也没啥交互。这个类是顶层的容器，为万物之始。然后处理event，最后处理延迟任务。延迟任务就是一个队列；]]></description><category></category></item><item><title><![CDATA[strace ftrace perf 调优]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/145080508</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/145080508</guid><author>jun7118</author><pubDate>Sat, 11 Jan 2025 18:25:28 +0800</pubDate><description><![CDATA[外：有的话就用上专用的硬件加速模块，simd，加密，编解码啥的。然后就是隔离绑核优先级，smp这个玩意的使命就是尽可能的让负载平均的放在每个核上，他会根据每个进程的过去负载信息，把你挪来挪去，这个其实是与局部性对着干的。数据流，数据流，数据如水，流过各个模块，层层处理，所以要针对各个模块的轻重缓急来搞事情。然后是人的思维是结构化的，然而计算机的数据是线性的。原理是cpu有专门的硬件定时器，周期的触发中断，然后记录这时候cpu在干嘛，最后统计一波。属于是比较精细的调试手段，适用于跟踪比较具体的问题。]]></description><category></category></item><item><title><![CDATA[大话 RCU （read copy update）]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/142606497</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/142606497</guid><author>jun7118</author><pubDate>Sat, 28 Sep 2024 07:11:17 +0800</pubDate><description><![CDATA[然后厨房发话了，辣椒炒肉，清蒸鱼没有了，换成辣子鸡和红烧肉，这时候二号食堂开始上菜了，这时候站在门口的小姐姐拿出了一个新的牌子，请到二号食堂用餐。然后重点来了，此时此刻，现在一号食堂里面的学生还在点菜或者吃着，咱们不管，然后新来的学生都被新的牌子引导到二号食堂，即新的内存块去了。首先，我们要搞清楚一件事，指针它是一个变量，他在内存上也是占了空间的，然后他里面的值，是你申请的内存块的首地址。这里要提一嘴，RCU之所以能成，得益于内存对齐的指针修改是原子的，即门口的小姐姐换牌子是瞬间的事，不存在中间态。]]></description><category></category></item><item><title><![CDATA[man sched]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/131493623</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/131493623</guid><author>jun7118</author><pubDate>Sat, 01 Jul 2023 18:52:50 +0800</pubDate><description><![CDATA[thread 有两个属性，一个是调度策略(scheduling policy)，调度优先级(scheduling priority)
(SCHED OTHER，SCHED IDLE，SCHED BATCH)这三种normal调度策略中，调度优先级没得用，必须是0。
(SCHED FIFO， SCHED RR)这两种real-time调度策略中，调度优先级1 (lew)to 99 (high)
有的系统有可能不支持这么多，需要通过api确认。
调度器维护理论上99个list，thread挂在这些list上。
]]></description><category></category></item><item><title><![CDATA[Rust 30米的大砍刀]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/131018062</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/131018062</guid><author>jun7118</author><pubDate>Sat, 03 Jun 2023 10:08:50 +0800</pubDate><description><![CDATA[现在全归我编译器管，事无巨细，来龙去脉，一笔笔都给我讲清楚才让你编译过。现在我就来告诉你，东厂破不了的案由我西厂来破。一句话,东厂管得了的我西厂要管,东厂管不了的我西厂更要管!秦虽苛政，但确实战力大增，横扫六国，统一八荒。先斩后奏，皇权特许!核心概念，所有权，生命周期，不造是不是原创。东厂不敢杀的人我杀，东厂不敢管的事我管。栈一直是编译器控制的，咋整的他自己门清。数据都是放内存里面的：全局变量，堆，栈。生命周期，明确作用域，杜绝空引用。虚拟机管，周期挂起，扫描。程序员管，三分天注定，所有权，防止资源竞争。]]></description><category></category></item><item><title><![CDATA[docker]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/130775754</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/130775754</guid><author>jun7118</author><pubDate>Fri, 19 May 2023 23:47:09 +0800</pubDate><description><![CDATA[container container layer，image运行实体，加了一层可读写容器层。image read only layers，层层叠加的文件系统，unionfs实现。container只管应用程序,它只管应用程序。cgroup做软硬件资源管控，你只有这么多 /sys/fs/cgroup/dockerc/s架构，restful api进程间通信。还有如果有特殊需求，修改了内核和驱动，这算是是全局修改。namespace做隔离，让app看起来就他自己。多容器间可搭建网络通信。单容器，单应用原则。]]></description><category></category></item><item><title><![CDATA[py+cv+hsv抓特征]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/130026303</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/130026303</guid><author>jun7118</author><pubDate>Sat, 08 Apr 2023 11:10:41 +0800</pubDate><description><![CDATA[else:#exit()def cb(n):state = 1while 1:state = 0state = 1exit()cb(2)]]></description><category></category></item><item><title><![CDATA[cpp容器和ptr]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/129481293</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/129481293</guid><author>jun7118</author><pubDate>Sun, 12 Mar 2023 21:17:27 +0800</pubDate><description><![CDATA[vector 连续内存 随机访问 动态大小，不够时候从新申请内存，然后拷贝，会多整一点，所以尾巴有多出来的空位，尾巴存放快。deque碎片内存随机访问动态大小，多个碎片内存组成，所以头尾存放，只需要整头尾的那两个内存，但是遍历效率有影响。weak_ptr weak_count 访问权无控制权，解决循环依赖问题，lock访问。map红黑树 key:value key不可重复，按key进行排序。multimap红黑树 key可重复，value也可。unordered_set 哈希表未排序，迭代器慢。]]></description><category></category></item><item><title><![CDATA[lin总线 && xcp]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/129481251</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/129481251</guid><author>jun7118</author><pubDate>Sun, 12 Mar 2023 21:14:13 +0800</pubDate><description><![CDATA[携带(无条件，事件触发，偶发)，诊断帧 (reg，resp)，保留帧。针对场景，主机获取从机状态，主机设置从机状态，多从机事件上报，从机之间通信。事件触发 主机一个时隙发送，如果多从机事件上报，查询主机上的冲突解决进度表，用无条件查事件。偶发 同一帧时隙，主机发生变动，发送无条件给从机，通知变动。进度表，主机按照表挨个发送帧，帧时隙，一帧帧头到下一帧帧头的时间，必须是时基的倍数。单线，速率20kbps，12v，线与逻辑，单主多从，8byte payload。帧头必由主机发送，应答可有主机或者从机发送。]]></description><category></category></item><item><title><![CDATA[Makefile拾遗]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/129208783</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/129208783</guid><author>jun7118</author><pubDate>Fri, 24 Feb 2023 21:21:30 +0800</pubDate><description><![CDATA[makefile]]></description><category></category></item><item><title><![CDATA[DOIP && SOME/IP]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/129208827</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/129208827</guid><author>jun7118</author><pubDate>Fri, 24 Feb 2023 21:20:29 +0800</pubDate><description><![CDATA[DOIP && SOME/IP]]></description><category></category></item><item><title><![CDATA[汇编 栈]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/128781590</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/128781590</guid><author>jun7118</author><pubDate>Sat, 28 Jan 2023 20:26:49 +0800</pubDate><description><![CDATA[栈]]></description><category></category></item><item><title><![CDATA[mipi c-phy]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/128603718</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/128603718</guid><author>jun7118</author><pubDate>Sun, 08 Jan 2023 18:10:24 +0800</pubDate><description><![CDATA[两根线已经不能满足工程师的趣味了，现在捯饬三根线。取名依然很随意。]]></description><category></category></item><item><title><![CDATA[MIPI CSI-2]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/128471880</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/128471880</guid><author>jun7118</author><pubDate>Wed, 28 Dec 2022 17:41:11 +0800</pubDate><description><![CDATA[csi-2]]></description><category></category></item><item><title><![CDATA[MIPI D-PHY]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/128471235</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/128471235</guid><author>jun7118</author><pubDate>Wed, 28 Dec 2022 17:03:39 +0800</pubDate><description><![CDATA[d-phy 把两根线玩出了花儿来了。]]></description><category></category></item><item><title><![CDATA[autosar 与osek 的nm]]></title><link>https://blog.youkuaiyun.com/jun7118/article/details/127442075</link><guid>https://blog.youkuaiyun.com/jun7118/article/details/127442075</guid><author>jun7118</author><pubDate>Sun, 23 Oct 2022 08:12:42 +0800</pubDate><description><![CDATA[autosar nm]]></description><category></category></item></channel></rss>