进程管理 - 练习题

练习 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)。

思考题

  1. 为什么每个进程需要独立的内核栈?能否所有进程共享一个内核栈?
  2. 进程和线程的本质区别是什么?如何在现有PCB基础上支持线程?
  3. 如果PID用完了(wraparound到uint32_t最大值),应该怎么处理?
  4. zombie进程是什么?为什么需要wait()系统调用?