进程管理 - 练习题
练习 1:进程统计
实现统计函数:
uint32_t process_count(void); // 总进程数
uint32_t process_count_by_state(process_state_t state); // 按状态统计练习 2:进程优先级
扩展PCB支持优先级调度:
- 添加
priority字段(0=最高,255=最低) - 实现
process_set_priority(uint32_t pid, uint32_t priority) - 按优先级排序就绪队列
练习 3:独立地址空间
修改process_create,为每个进程创建独立的页目录:
page_directory_t *new_dir = vmm_clone_directory(kernel_directory);
proc->page_dir = new_dir;实现 vmm_clone_directory,复制内核映射但不共享用户空间。
练习 4:进程树
添加父子关系:
typedef struct process {
// ...现有字段...
struct process *parent;
struct process *children;
struct process *sibling;
} process_t;实现 process_get_children(uint32_t pid) 和 process_get_parent(uint32_t pid)。
思考题
- 为什么每个进程需要独立的内核栈?能否所有进程共享一个内核栈?
- 进程和线程的本质区别是什么?如何在现有PCB基础上支持线程?
- 如果PID用完了(wraparound到uint32_t最大值),应该怎么处理?
- zombie进程是什么?为什么需要wait()系统调用?