第一次作业:深入源码分析xv6进程模型
1.进程
1.1 进程的概念
1) 狭义定义:进程是正在运行的程序的实例。
2) 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
1.2 进程的组成
1.3 进程控制块
引用来自:https://blog.csdn.net/hgnuxc_1993/article/details/54847732
2.操作系统如何组织进程
- 在这里把组织进程理解为管理和控制进程
- 操作系统通过PCB来管理和控制进程,每个进程创建时,操作系统为其生成一个PCB,同时通过唯一的PID标注一个唯一进程,则可通过PCB了解该进程的状态;当进程结束时,操作系统销毁进程对应的PCB。
- xv6PCB结构, 见附录
3.进程状态如何转换
4.进程是如何调度的
当前进程通过调用yield函数,进行进程切换。yield函数调用sched函数,sched函数启动swtch函数完成进程切换。整个流程是这样的:
yield => sched => swtch
sched是一个死循环,该循环不断在进程表中扫描,选择一个RUNNABLE的进程调度,即从scheduler切换器转换到新选择的进程
swatch函数任务:1. 保存当前(old)进程的上下文。 2. 加载新进程(new)的上下文到机器寄存器中。
参考网址:https://blog.csdn.net/Swartz2015/article/details/61615603
函数见附录
5.谈谈自己对该操作系统进程模型的看法
在学习进程部分时,没有注意该次作业要求,更侧重机器上电到进程创建部分,实模式与保护模式等部分,对计算机的概况有了进一步了解,而没有关注到进程的调度这块,所以匆匆补充这块知识,对调度方面没有深刻的体会。
附上一些阅读笔记,见附录。
6.参考文献
- https://legacy.gitbook.com/book/th0ar/xv6-chinese/details
- https://pdos.csail.mit.edu/6.828/2012/xv6/xv6-rev7.pdf
- https://pdos.csail.mit.edu/6.828/2012/xv6/book-rev7.pdf
7.附录
- PCB结构
struct proc {
uint sz; // 进程的内存大小(以byte计)
pde_t* pgdir; // 进程页路径的线性地址。
char *kstack; // 进程的内核栈底
enum procstate state; // 进程状态
volatile int pid; // 进程ID
struct proc *parent; // 父进程
struct trapframe *tf; // 当前系统调用的中断帧
struct context *context; // 进程运行的入口
int killed; // 当非0时,表示已结束
struct file *ofile[NOFILE]; // 打开的文件列表
struct inode *cwd; // 进程当前路径
char name[16]; // 进程名称
};
- void scheduler(void)
{
struct proc *p;
for(;;)
{
// Enable interrupts on this processor.
sti();
// Loop over process table looking for process to run.
acquire(&ptable.lock);
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++)
{
if(p->state != RUNNABLE)
continue;
// Switch to chosen process. It is the process's job
// to release ptable.lock and then reacquire it
// before jumping back to us. proc = p;
switchuvm(p); p->state = RUNNING;
swtch(&cpu->scheduler, proc->context);
switchkvm(); // Process is done running for now.
// It should have changed its p->state before coming back.
proc = 0;
}
release(&ptable.lock);
}
}
- swtch的函数代码如下