操作系统内核常见考点解析

进程与线程的区别

打开电脑上的任务管理器,你会看到一堆正在运行的程序。每个程序背后其实是一个或多个进程在工作。进程是资源分配的基本单位,拥有独立的内存空间。而线程是CPU调度的基本单位,一个进程可以包含多个线程,它们共享进程的资源,但各自执行不同的任务。

比如你在浏览器里一边看视频一边下载文件,很可能就是两个线程在同时干活。线程切换比进程切换快,因为不用换整个内存环境。

系统调用的作用

普通程序不能直接操作硬件,比如你想读一个文件,应用程序不能自己去硬盘上找数据,得通过系统调用来“喊”内核帮忙。这就像你在餐厅点菜,不能自己冲进厨房炒菜,得让服务员(系统调用)传话给厨师(内核)。

常见的系统调用有 open()、read()、write()、fork() 等。它们是用户态和内核态之间的桥梁。

一个简单的系统调用示例

#include <unistd.h>
int main() {
write(1, "Hello Kernel\n", 13);
return 0;
}

这里的 write 就是系统调用,把字符串输出到标准输出设备,实际执行时会陷入内核完成IO操作。

中断与异常处理

你正打着字,突然鼠标动了一下,这个信号就是通过中断告诉CPU的。中断分硬件中断和软件中断,硬件来自外设,比如键盘敲击;软件则是程序主动触发,比如执行 int 指令。

异常则是程序出错时产生的,比如除以零、访问非法地址。内核会根据中断号或异常类型跳转到对应的处理函数,处理完再回到原来的地方继续执行。

内存管理机制

电脑只有8GB内存,但你能同时跑几十个程序,靠的就是虚拟内存。每个进程都以为自己独占一片大内存空间,其实是内核用页表把虚拟地址翻译成物理地址。

当物理内存不够时,系统会把暂时不用的页面写入磁盘交换区(swap),腾出空间给新来的页。这就是为什么有时候内存满了电脑还能撑一会儿,只不过会变慢,因为磁盘比内存慢得多。

调度算法类型

CPU怎么决定下一个执行哪个进程?这就涉及调度算法。常见的有先来先服务(FCFS)、时间片轮转(RR)、多级反馈队列等。

桌面系统偏向响应快,喜欢用抢占式调度,保证你按鼠标不会卡住;服务器则可能更关注吞吐量,倾向于让长时间任务稳定运行。

文件系统实现原理

你双击打开一个文档,背后是内核在帮你从硬盘上找到这块数据。文件系统负责组织和管理磁盘上的文件,常见的如ext4、NTFS、APFS。

它记录了哪些块被占用、文件名对应哪些数据块、权限信息等。inode 是Linux中关键的数据结构,存储文件元信息,不包含文件名。

查看inode的小技巧

在终端输入:

ls -i filename

就能看到该文件的inode编号,两个硬链接文件会有相同的inode。

内核态与用户态切换

为了安全,CPU设置了两种运行模式。用户程序运行在用户态,权限受限;一旦需要访问硬件或敏感操作,必须通过系统调用进入内核态。

这种切换是有代价的,会消耗一定时间。频繁的系统调用会导致性能下降,所以像批量读写操作通常建议用缓冲减少调用次数。