操作系统第三次实验报告
问题1:fork与vfork的本质区别是什么?在内存管理上有何不同?
fork 是完整克隆,子进程复制父进程地址空间,二者后续互不影响。在本实验里对应为复制 128KB 槽位内存。vfork 是临时共享地址空间,子进程与父进程共用同一 mem_base,只做栈偏移避免直接冲突,设计目标是让子进程尽快 exec 切换到新程序。
问题2:vfork为何需要限制其创建的子进程数量?它如何通过与exec的配合来控制子进程数量?
因为 vfork 期间父子共享内存,若同一父进程同时存在多个未完成的 vfork 子进程,会导致共享状态竞争和不可预测行为。
实验里通过父进程 vfork_count 做并发门控,超过 1 直接失败。子进程执行 exec 后,系统恢复其独立槽位并对父进程 vfork_count 递减,从而释放下一次 vfork 资格。
问题3:描述schedule()函数中上下文切换的过程。 调度器从高 PID 到低 PID 逆向扫描,选第一个 RUNNABLE 或 RUNNING 进程。
若发生切换,先把旧 RUNNING 进程置回 RUNNABLE,再把 next 置 RUNNING,更新 current 指针。
随后更新 tss.esp0 指向新进程内核栈顶,并调用 update_user_seg_base 切换用户段基址,使用户态看到的是该进程对应槽位。