.. Kenneth Lee 版权所有 2024 :Authors: Kenneth Lee :Version: 0.1 :Date: 2024-06-03 :Status: Draft .. list-table:: * - 发布时间 - 2024-03-10 6.8 *** 大特性 ====== Deadline Server --------------- 这个是解决实时任务独占的问题的。按RT类任务的系统承诺,这些东西只要在,就可以占 光所有的CPU时间,这很容易把一些关键任务饿死。之前Linux的手段是设置一个门限,只 让RT任务占95%的时间。但这样如果没有其他任务,剩下那5%的时间可能就是在Idle,有 人又建议如果是Idle,就不要切换过去好了。但这也不好,因为有些几乎Idle,不那么重 要的任务进去也不对。这个Deadline Server的方案似乎是创建一个特定优先级, Deadline Class的任务,用它来卡那5%的时间。 我最近在考虑未来穿插大量的AI运算的算力应该怎么调度,我把这些考量也放在这个上下 文一起想一想。现在这些算法很多都用异构核(GPU,TPU,NPU等)来解决,最大的问题 是有建立时间,一旦有建立时间,短时间的计算跨核调度又不值得,所以更好是作为协处 理器放在本CPU内部。但放在本CPU内部利用率又不足。所以硬件无论如何都是做成CPU内 部有轻量级的协处理器,重量级的拉到异构核上去算。这就给OS调度器造成压力了:首先 是CPU必然是大小核的,因为不值得给每个CPU都配这些协处理器,然则调度器必须根据任 务的计算特征选定不同的核进行调度,而且一旦遇到核不合适,就要触发异常,然后切换 回具有这种计算特征的核上。这样的结果是什么呢?我认为是最终我们的CPU上会支持更 多的线程,然后把这些协处理共享给多个线程共享使用,这样调度的工作就不是OS的了, 而是硬件的。等线程足够多了,我觉得一定量的实时线程,就由它去吧,反正数量不要太 多,占不光所有的CPU就行。这样一想,我觉得Linux解决的问题太多也不见得好。嵌入式 或者安全性要求高的系统,就不要来参合Linux了。 Multi-Size透明大页 ------------------ 这个文档: `Large folios for anonymous memory `_ ,定性folios的优势在于 | 让页的基础大小变得不那么重要。 对我来说,这个信息是最重要的。其他的算法问题,都是细节问题(很重要,但对不是写 这个代码的人来说不重要),得个“知”字吧。 补丁的作者是ARM的Ryan Roberts。 Mount增加了两个系统调用 ----------------------- 这个也是得个知字,我们就把接口列出来看一下就好了: .. code-block:: c struct __mount_arg { __u64 mnt_id; __u64 request_mask; }; int listmount(const struct __mount_arg *req, u64 *buf, size_t bufsize, unsigned int flags); struct statmnt { __u32 size; /* Total size, including strings */ __u32 __spare1; __u64 mask; /* What results were written */ __u32 sb_dev_major; /* Device ID */ __u32 sb_dev_minor; __u64 sb_magic; /* ..._SUPER_MAGIC */ __u32 sb_flags; /* MS_{RDONLY,SYNCHRONOUS,DIRSYNC,LAZYTIME} */ __u32 fs_type; /* [str] Filesystem type */ __u64 mnt_id; /* Unique ID of mount */ __u64 mnt_parent_id; /* Unique ID of parent (for root == mnt_id) */ __u32 mnt_id_old; /* Reused IDs used in proc/.../mountinfo */ __u32 mnt_parent_id_old; __u64 mnt_attr; /* MOUNT_ATTR_... */ __u64 mnt_propagation; /* MS_{SHARED,SLAVE,PRIVATE,UNBINDABLE} */ __u64 mnt_peer_group; /* ID of shared peer group */ __u64 mnt_master; /* Mount receives propagation from this ID */ __u64 propagate_from; /* Propagation from in current namespace */ __u32 mnt_root; /* [str] Root of mount relative to root of fs */ __u32 mnt_point; /* [str] Mountpoint relative to current root */ __u64 __spare2[50]; char str[]; /* Variable size part containing strings */ }; int statmount(const struct __mount_arg *req, struct statmnt *buf, size_t bufsize, unsigned int flags); 两个调用是配合的,前者先查有哪些mount的,每个用一个id标识,然后再用id查每个 mount的详细信息。 就是把原来从sysfs或者procfs的信息换到系统调用上,我觉得这个东西很适合我们的系 统调用块方案,我希望多搞。 perf的Data-type profiling功能 ----------------------------- 很有趣的perf调试功能。用起来是这样的: 先用:: perf mem record ; 部分可以分开读写的平台可以加-t store参数 跟踪。然后这样看结果::: perf annotate --data-type=callchain_list 这样你会看到每个变量被访问的热点,像这样: .. figure:: _static/Data-type-profiling.png 它的原理是在捕获到读写操作的时候,根据DWARF信息去获知具体是什么变量然后做的记 录。 其他有趣的东西 ============== 1. 这个版本增加了一个配置能力:禁止裸写入已经mount的分区。但这是一个总结性的说法, 修改是改在不同的文件系统的不同配置上的,只能说是在走这个方向。 2. LSM(安全子系统)增加了三个系统调用:lsm_list_modules(), lsm_get_self_attr(), lsm_set_self_attr()。我不搞这个子系统,不细看了。 3. 增加了一个Intel :math:`X^e`\ 驱动,这是个独显,中文好像叫锐炫,有针对台式机 和笔记本的不同版本。显存(DDR6)从4GB到16GB不等,主频900M到1.6G不等。但这里: `Intel Core Ultra7 `_ 显示我的Thinkpad Gen12上也集成了这个东西(有8个\ :math:`X^e`\ 核)。所以这 个应该是个架构的品牌。而且,它的主频是2.25G,和集成的NPU的1.4GHz是不同的。 这些厂家就是不把你的思路搞乱不罢休。 修改只涉及一个补丁,但涉及的文件很多,应该是内部开发后的第一个版本。 4. 字节跳动提了一组用maple tree提升fork性能的补丁。 5. /proc/sysrq-trigger现在可以一次输入多个请求,但前面要加一个下划线,比如::: echo _tsu > /proc/sysrq-trigger 这相当于顺序写入t, s和u,没有下划线的话,就相当于只写了第一个。 6. 龙芯在合入和rust/kvm有关的一些补丁。 7. 海思鲲鹏修改了hccs和zip的驱动,都是小维护而已。