从零写OS(二十八):timer —— 让进程睡一会儿

Linux 里的 sleep(2) 背后是什么? 进程调用 sleep,内核把它标记为"阻塞",让出 CPU 给其他进程,等时间到了再唤醒它。实现这个功能需要两个组件配合:定时器(知道时间到了)+ 调度器(切换进程)。 好消息是这两个我们都有了:PIT 100Hz 时钟 + round-robin 调度器。这一章只需要把它们接起来。 核心思路 SYS_SLEEP(ms) → sleep_until = pit_get_ticks() + ms/10 → state = PROC_BLOCKED IRQ0 handler(每 10ms) → pit_tick() // ticks++ → timer_tick() // 扫描所有进程,到期则唤醒 → sched_tick() // 调度下一个 READY 进程 进程睡觉时设好"闹钟"(sleep_until),然后自己进入 PROC_BLOCKED。 每次时钟中断,timer_tick 扫一遍所有进程,到期的改回 PROC_READY,下次调度就能运行了。 实现 1. process_t 加一个字段 typedef struct { // ... 原有字段 uint64_t sleep_until; // 睡到哪个 tick,0 表示没在睡 } process_t; 2. timer.c void timer_tick(void) { uint64_t now = pit_get_ticks(); for (int i = 0; i < MAX_PROCS; i++) { if (procs[i].state == PROC_BLOCKED && procs[i].sleep_until > 0) { if (now >= procs[i].sleep_until) { procs[i].sleep_until = 0; procs[i].state = PROC_READY; } } } } 逻辑极简:遍历,到期,唤醒。 ...

May 15, 2026 · 2 min · 大飞
京ICP备14031575号-3