文章目录一、课程目标二、进程基本概念程序 vs 进程线程 vs 进程三、内核核心:进程描述符 task_struct四、进程状态五、进程创建原理写时复制 COWCopy-On-Write六、进程创建完整流程七、示例代码1fork 创建子进程用户态八、示例代码2内核态查看进程信息九、课堂练习十、课后作业十一、本章总结十二、核心关键词第9课 课程回顾总结上节课答案 第8课 用户态与内核态的区别及切换 实战作业代码代码功能说明注意事项一、课程目标理解进程本质、组成结构与生命周期掌握 task_struct 进程描述符的核心作用理解进程与程序、线程、轻量级进程的区别掌握 fork / vfork / clone 三种创建方式原理理解写时复制Copy-On-Write机制能分析进程创建完整流程为进程调度、驱动通信打基础二、进程基本概念进程是可执行程序的运行实例是系统资源分配与调度的基本单位。一个进程包含独立地址空间、代码段、数据段、堆栈、文件描述符、页表、PCB。程序 vs 进程程序静态二进制文件存放在磁盘进程动态运行实体有生命周期、占用内存与CPU线程 vs 进程进程独立资源、独立地址空间线程共享进程资源仅独有栈与寄存器Linux 中线程本质是轻量级进程LWP三、内核核心:进程描述符 task_structLinux 内核使用task_struct结构管理所有进程是 PCB 的具体实现。包含内容进程标识pid、tgid状态信息运行、就绪、等待、停止、僵尸调度信息优先级、调度类、时间片地址空间mm_struct、页表打开文件、信号、资源使用统计父子进程关系、链表链接task_struct 会被链接成双向循环链表方便内核遍历管理所有进程。四、进程状态TASK_RUNNING运行/就绪TASK_INTERRUPTIBLE可中断睡眠TASK_UNINTERRUPTIBLE不可中断睡眠TASK_STOPPED暂停被信号停止EXIT_ZOMBIE僵尸状态子进程退出父进程未wait状态切换运行 → 等待事件 → 睡眠事件到达 → 唤醒 → 就绪调度运行 → 运行退出 → 僵尸 → 父进程回收 → 销毁五、进程创建原理Linux 进程创建三剑客fork()创建子进程写时复制vfork()共享父进程地址空间阻塞父进程clone()底层系统调用可创建线程/轻量级进程内核底层统一调用do_fork() / kernel_clone()。写时复制 COWCopy-On-Writefork 时并不立即复制全部页而是共享页标记“只读”。任一进程试图修改时才真正复制一页。优点高效、节省内存、加速创建。六、进程创建完整流程用户态调用 fork()进入内核态执行 sys_fork分配新 pid分配 task_struct复制父进程属性初始化进程资源、文件表、信号处理建立地址空间共享页表COW将子进程加入运行队列标记为就绪返回用户态父进程返回子pid子进程返回0七、示例代码1fork 创建子进程用户态#include stdio.h #include unistd.h #include sys/types.h int main() { pid_t pid; printf(父进程pid%d准备创建子进程\n, getpid()); pid fork(); if (pid 0) { perror(fork失败); return -1; } if (pid 0) { printf(子进程pid%dppid%d我运行了\n, getpid(), getppid()); while(1); } else { printf(父进程pid%d创建子进程成功子pid%d\n, getpid(), pid); while(1); } return 0; }八、示例代码2内核态查看进程信息#include linux/module.h #include linux/sched.h #include linux/init.h static int __init proc_info_init(void) { printk(当前进程 pid: %d\n, current-pid); printk(进程名称: %s\n, current-comm); printk(进程状态: %ld\n, current-state); printk(父进程 pid: %d\n, current-parent-pid); return 0; } static void __exit proc_info_exit(void) { printk(模块卸载\n); } module_init(proc_info_init); module_exit(proc_info_exit); MODULE_LICENSE(GPL);九、课堂练习简述进程与程序、线程的区别。Linux 用哪个数据结构管理进程包含哪些内容列出Linux 5种进程状态。什么是写时复制优点是什么fork 创建子进程后父子进程的返回值分别是什么十、课后作业画图表示进程生命周期与状态切换。用 fork 编写程序创建一个子进程子进程打印10次“child”父进程打印10次“parent”。解释为什么 fork 后子进程不立即复制全部地址空间简述内核创建进程的完整流程。说明 fork、vfork、clone 的适用场景。十一、本章总结本章讲解进程管理子系统核心基础进程定义、task_struct 结构、五种进程状态、生命周期切换以及 fork / vfork / clone 创建机制。重点掌握写时复制COW是Linux高效创建进程的关键。进程是调度、内存、中断、文件系统的基础理解进程创建与管理是掌握Linux内核的关键一步。十二、核心关键词进程、task_struct、进程状态、fork、写时复制、COW、子进程、pid、进程创建、轻量级进程第9课 课程回顾总结本课系统讲解了Linux进程管理子系统的核心基础内容重点介绍进程概念、进程描述符task_struct、五种进程状态及切换流程以及fork、vfork、clone三种进程创建机制。课程明确了进程与程序、线程的本质区别强调线程在Linux中以轻量级进程形式实现。内核通过task_struct结构体完整记录进程的PID、状态、调度信息、地址空间、文件描述符等所有运行信息是进程管理的核心数据结构。课程详细解析了运行、可中断睡眠、不可中断睡眠、暂停、僵尸五种进程状态及其切换条件帮助理解内核如何管理任务。进程创建以fork为核心底层依靠kernel_clone完成写时复制机制大幅提升创建效率并节省内存是Linux优化的关键技术。本课通过用户态与内核态两段示例代码直观展示了进程创建方法与内核查看进程信息的方式。通过学习能够理解进程在内核中的表示、运行流程、创建原理掌握进程生命周期管理思路。本章知识是后续学习进程调度、内存管理、进程通信、驱动开发的重要基础对理解Linux系统运行机制、定位进程异常、分析系统性能问题具有重要意义。上节课答案 第8课 用户态与内核态的区别及切换 实战作业代码#include stdio.h #include fcntl.h #include unistd.h #include sys/syscall.h #include sys/types.h int main() { char buf[64] test: user to kernel switch\n; int fd; printf(【用户态】开始执行调用open系统调用\n); fd open(/tmp/test.log, O_RDWR | O_CREAT, 0666); if (fd 0) { perror(open failed); return -1; } printf(【用户态】调用write系统调用\n); write(fd, buf, sizeof(buf)); printf(【用户态】调用getpid系统调用\n); pid_t pid syscall(SYS_getpid); printf(【用户态】当前进程PID%d\n, pid); printf(【用户态】调用close系统调用\n); close(fd); printf(【用户态】所有系统调用执行完毕\n); return 0; }代码功能说明该程序是第8课用户态与内核态切换实战作业通过连续调用open、write、getpid、close四个典型系统调用完整演示用户态主动进入内核态的全过程。程序在用户态准备数据触发软中断进入内核态由内核完成文件创建、写入、获取PID、关闭文件等操作完成后返回用户态继续执行。代码直观展示系统调用是态切换最主要、最安全的方式帮助理解CPU特权级切换、上下文保存与恢复的底层逻辑适合用于验证用户态与内核态的切换流程、观察切换触发点巩固态切换理论知识为后续系统编程与驱动开发打基础。注意事项编译命令gcc switch.c -o switch运行需有/tmp目录写入权限每次系统调用都会触发一次用户态→内核态→用户态切换内核执行期间用户程序会暂停不可同时占用CPU系统调用由软中断指令实现应用层不可直接操作寄存器若出现权限错误可检查文件路径与权限配置可使用 strace ./switch 观察所有系统调用过程