求 n 个数中前 k 小的数
面试时遇到的一道题:给出给出 n 个数,求出前 k 小的数字。 输入是 n + 1 行: 第一行是 n 和 k 之后 n 行是这个数列 输出是 k 个数。 当时没想出来怎么做,直接嗯排序,然后输出,OJ 的时限比较宽容,竟然过了😄。 ...
面试时遇到的一道题:给出给出 n 个数,求出前 k 小的数字。 输入是 n + 1 行: 第一行是 n 和 k 之后 n 行是这个数列 输出是 k 个数。 当时没想出来怎么做,直接嗯排序,然后输出,OJ 的时限比较宽容,竟然过了😄。 ...
代码仓库为 hustos riscv-pke 以下内容基于 lab2 代码 入口在哪? 入口为 kernel/machine/mentry.S 的 _mentry ,它调用了 kernel/machine/minit.c 的 m_start(uintptr_t hartid, uintptr_t dtb) ,两个参数并没有在 _mentry 中设置,这是因为 spike 会自动设置 a0 寄存器为 CPU id ,设置 a1 寄存器为设备树字符串,这刚好也符合 RV 的传参规则。 ...
昨天朋友跟我说我的 MIT6.S081 lab1 的 xargs 命令的代码无法通过,看到他的测试方法才知道原来是这样测试的,感觉之前写的测的都太简略了。 例如测试 xargs 命令这一关可以这样测试: ...
即是知识回顾,也是最近学到知识的拓展延伸。 ARMv6 Manual: “The only architecturally-guaranteed way to invalidate all aliases of a physical address from a VIPT instruction cache is to invalidate the entire instruction cache.” Cache 的基本情况 Cache 也就是缓存,作为高速的 CPU 和低速的内存之间的缓冲,用于加速访问。 ...
前因 最近看了一篇介绍 Ventana 的 Veyron V1 核心的博客 HotChips 2023: Ventana 不寻常的 Veyron V1 ,里面出现了很多我没听说过或者不甚了解的名词,在阅读这篇博客和查找资料的过程中,我学到了很多新的 CPU 知识。 ...
赛博考古:Linux 支持 POSIX 线程标准的前世今生 线程是什么 操作系统能够进行运算调度的最小单位。在一般的操作系统上,它被包含在进程之中,是进程中的实际运作单位。 ...
看到了 xuanwo 的一篇 博客,感觉很有意思。 完整读一遍也可以,不过也可以看我的省流。 Python IO 比 C / Rust IO 更快 有人发现在 AMD Ryzen 9 5900X 和 AMD Ryzen 7 5700X 上访问页对齐的前10个 byte 会比其他偏移有更多的 L1 prefetch 和 load 的 miss 。 学过 x86 汇编的应该知道不同于 RISC ,x86 是有专门用于复制字符串的指令的。有人发现上述问题的底层原因来自于 AMD 对 FSRM(Fast Short REP MOV) 的实现,逆天的是在 Zen 3 上,访问页对齐的数据比不对齐慢。 更有趣的事情 作者发现将 C 的分配器换成 jemalloc 后速度就可以击败 Python 了,我个人猜测可能是 mmap 后分配的页对齐的内存使用了更多(也就是大于 glibc 的 10 byte)来存 meta data ,恰巧避免了这个硬件 bug 。 有人使用 eBPF profile 发现 Rust 和 Python 的 fs read 在系统调用的延迟上存在差距,Rust 更慢。 为了解决这个奇怪的性能问题,作者(开源大手子漩涡)和他的开源伙伴(包括了热心网友、国内开源大佬依云和一些内核开发者)使用了 strace, perf, eBPF 等各种性能分析工具,以及分析了各种可能导致性能问题的原因(内存大页、CPU 核亲和性、mmap 分配匿名内存、Linux 启动选项例如 Enable Mitigations、系统调用延迟等)。 有 朋友 告诉我「Intel 前几天刚出了 rep mov 导致的 Dos 漏洞」。 好消息是 FSRM 是微码实现,也许在未来的某一次更新就修好了🥰。 相关链接 Terrible memcpy performance on Zen 3 when using rep movsb
最近在完成一个使用 Rust 语言编写 Linux 内核引导程序的项目 lboot ,其核心代码和原理在之前的博客中介绍过 UEFI 如何启动 Linux 。 因为不可能直接在 UEFI 环境下进行代码开发,所以我使用的是交叉编译的方法,目标平台是 x86_64-unknown-uefi 和 aarch64-unknown-uefi 。这就带来了一个问题,使用命令 cargo run 不能直接运行代码,必须使用 qemu 来模拟目标架构的执行。 ...
之前讲到了 Linux 是如何启动的,现在就写一个 UEFI 程序可以启动 Linux ,语言选择的是非常火热的 Rust 。 Linux Kernel 经过了这么多年的发展,其实完全有着 boot 的能力,使用 UEFI 启动 Kernel 其实是非常简单的一件事情,不再需要像以前 BIOS 启动老版本内核一样要把内核加载到某个内存地址,把参数放到某个内存地址,再将这个地址放到寄存器中等等复杂操作。 ...
“pull oneself up by one’s bootstraps.” 拽着鞋带把自己拉起来 大家在安装 Arch Linux 或者其他 Linux 发行版时,可能会看到很多有关启动或者引导的名词,例如 BIOS 、UEFI 、GRUB 、ESP 、GPT 、LBA 、MBR 等等。有些名词比较熟悉,有些就会一头雾水,今天就来讲讲这些名词。 ...