2026/4/18 9:07:28
网站建设
项目流程
在网站建设工作会议上讲话,官方微信开发,咨询公司资质要求,网站开发需要什么配置的电脑主要关注这四件事#xff1a;为什么必须区分用户态 / 内核态#xff1f;什么是系统调用#xff1f;它解决了什么#xff1f;系统调用与中断的关系是什么#xff1f;一次系统调用在 OS 中发生了什么#xff1f;#xff08;最小流程#xff09;为什么必须有用户态 / 内核…主要关注这四件事为什么必须区分用户态 / 内核态什么是系统调用它解决了什么系统调用与中断的关系是什么一次系统调用在 OS 中发生了什么最小流程为什么必须有用户态 / 内核态从 前面几篇已知事实出发程序共享 CPU程序共享机器程序不可信可能崩溃 / 恶意 / Bug如果程序能直接访问物理内存修改页表操作硬件控制中断修改调度器那结果只有一个任何程序都可以破坏整个系统。因此 OS 必须做一件事把“能干危险事的代码”和“普通程序代码”强制隔离。两个模式由硬件强制区分用户态User Mode不能访问硬件不能操作页表不能关中断不能调度线程内核态Kernel Mode可以操作一切控制内存、CPU、设备、调度这不是 OS 约定是 CPU 硬件级强制。那程序怎么“让 OS 干活”——系统调用问题来了用户态程序既然不能直接干危险事那它怎么读文件、发网络、创建线程答案只有一个系统调用System Call系统调用的本质是用户态程序请求内核态代码代为执行受保护操作。关键点程序不能自己切到内核态只能通过CPU 提供的受控入口内核决定允不允许、怎么做、做多久系统调用解决了什么安全程序不能越权隔离只能操作自己的资源统一管理OS 统一调度 I/O、内存、线程系统调用是用户态 → 内核态的唯一合法通道。系统调用 vs 中断这是 这篇文章的 的关键区分点。系统调用System Call谁触发用户程序是否主动是目的请求 OS 服务例子read / write / fork / mmap中断Interrupt谁触发硬件是否主动否目的通知 OS 事件发生例子磁盘 I/O 完成网络包到达定时器中断时间片核心一句话系统调用是“我想要”中断是“事情发生了”。一次系统调用的最小执行流程不讲细节只讲不可省略的骨架。以read()为例[用户态]程序调用 read(fd, buf, size)↓CPU 执行 syscall / trap 指令↓CPU 切换到内核态↓进入内核的系统调用处理函数↓内核检查参数 / 权限↓如果数据未就绪 → 线程进入 Blocked↓调度器切换到其他线程↓某个时刻I/O 完成 → 硬件中断↓内核处理中断唤醒线程↓线程回到 Ready → Running↓系统调用返回↓CPU 切回用户态系统调用、阻塞、调度、中断在这一条路径里全部串起来了。这是五篇文章的完整闭环。Day5 的三条不可混淆结论① 用户态 / 内核态是硬件强制隔离不是软件约定。② 系统调用是用户态进入内核态的唯一合法方式。③ 中断是硬件通知 OS 的机制与系统调用完全不同。接下来是对应的问题Q1为什么必须区分用户态和内核态一句话Q2系统调用的本质是什么一句话Q3系统调用和中断的区别是什么一句话Q4为什么用户态不能直接操作硬件或内存一句话Q5一次 read() 可能为什么会阻塞阻塞期间 CPU 在干什么回答完之后OS主线就基本串联完成了。标准答案Q1为了防止用户程序直接操作硬件、内存和内核数据从而破坏整个系统。关键词必须包含用户程序 / 硬件或内核 / 破坏系统Q2系统调用是用户态程序通过受控入口请求内核代为执行受保护操作。Q3系统调用是用户程序主动请求内核服务中断是硬件被动通知内核事件发生。Q4因为用户态程序不可信若能直接操作硬件或内存会破坏系统隔离与安全。Q5read 会因等待 I/O 数据而阻塞阻塞期间线程进入 BlockedCPU 被调度去执行其他线程。原理解用于自己复盘纠正Q1为了系统安全只有结果没有因果不够Q2程序对系统内核申请权限并返回数据“申请权限”这个说法不准确系统调用不是动态申请权限而是受控进入内核执行受保护操作。Q3系统调用是用户态与内核态之间的机制而中断是硬件层面和os的机制不够精确缺“主动 / 被动”这条关键分界线。系统调用是用户程序主动请求内核服务中断是硬件被动通知内核事件发生。Q4因为不安全过于抽象说完整一点 因为用户态程序不可信若能直接操作硬件或内存会破坏系统隔离与安全。Q5read在等待os返回所需数据阻塞期间cpu在请求系统内核的数据直接把“线程在做什么”和“CPU在做什么”混到了一句话里。即半对半错“这个 read 的请求已经交给内核 / 设备了系统在处理 I/O”这一点是对的但——处理 I/O 的不是 CPU 在“等着跑”。Q5 拆分成三层来理解1.线程在干什么Thread 视角线程调用 read()→ 发现数据还没准备好→ 被内核挂起→ 状态变为 Blocked→ 不再参与 CPU 调度没后续了2.那CPU在干嘛CPU / Scheduler 视角CPU 发现当前线程 Blocked→ 立即进行一次调度→ 切换上下文→ 去执行其他 Ready 线程CPU 从来不会“等 I/O 数据”。CPU 只做两件事执行指令切换执行对象3.谁在跑I/O设备 / 中断视角磁盘 / 网卡 / DMA / 控制器→ 在硬件层面异步处理 I/O→ 完成后触发中断→ 通知内核I/O 处理是“设备在干活”不是 CPU 在干活。Q5修改后的答案read 发起 I/O 请求后线程被阻塞CPU 去执行其他线程I/O 由设备异步完成完成后通过中断唤醒线程。必须纠正“阻塞”描述的是线程状态不是 CPU 行为。