操作系统实验:进程与线程的管理

需积分: 0 0 下载量 195 浏览量 更新于2024-08-05 收藏 528KB PDF 举报
"实验二 进程与线程1" 在操作系统中,进程是系统资源分配的基本单位,而线程则是执行单元。本实验主要关注的是进程的创建和管理,特别是通过`allocproc`函数来分配和初始化新的进程。这个函数在操作系统中扮演着关键角色,因为它负责为新的进程分配必要的资源,使它们能够开始执行。 `allocproc`函数的主要作用是在系统中创建一个新的进程。它首先获取进程表的锁,确保对进程表的访问是互斥的,防止并发访问导致的数据不一致。接着,它遍历全局的进程表结构`ptable`,寻找状态为UNUSED(未使用)的进程。UNUSED状态表示进程尚未被分配给任何任务,是可供新进程使用的。 当找到一个UNUSED状态的进程时,函数会将它的状态更改为EMBRYO,意味着这个进程正在被创建。接着,函数为新进程分配一系列资源,包括: 1. 分配进程标识符(PID):每个进程都有唯一的标识符,这里通过`nextpid++`来实现。 2. 分配内核栈空间:新进程需要有自己的内核栈,用于存储系统调用和中断处理时的上下文。`kalloc()`函数在这里被用来分配物理内存,通常为4KB大小的页面,用于构建新进程的内核栈。如果`kalloc()`失败,表示无法分配足够的内存,此时会释放之前分配的资源,并将进程状态恢复为UNUSED,函数返回0,表示分配进程失败。 如果内核栈分配成功,那么新进程的内核栈顶地址(sp)会被设置为栈空间的高端地址,这样在进程开始执行时,它就能正确地使用这个栈空间。在这个实验中,`kstack+KSTACKSIZE`表示栈的顶部,因为栈是从高地址向低地址增长的。 整个`allocproc`函数的过程就是从进程池中选择合适的空闲进程结构,初始化其状态和资源,然后准备让这个新进程开始执行。这是一个典型的进程创建流程,涉及到进程状态的转换、资源分配以及内存管理等核心操作系统概念。通过这样的设计,操作系统可以有效地管理和调度进程,保证系统的稳定运行。