操作系统ucore lab7实验报告

这篇实验报告详细探讨了操作系统ucore的lab7,重点在于内核级信号量和条件变量的实现,以及如何应用它们解决哲学家就餐问题。报告介绍了信号量的P、V操作,以及条件变量的wait和signal操作,通过分析代码展示了如何利用这些同步机制解决进程间的同步和互斥问题。
摘要由CSDN通过智能技术生成

操作系统lab7实验报告

lab6完成了用户进程的调度框架和调度算法的具体实现,即到lab6位置,ucore系统已经可以同事调度运行多个程序。但是这又引来了一个新的问题,那就是当多个同时运行的进程要协同操作或是访问共享内存的时候,如何解决同步和有序竞争的问题。
本次实验的主要就是解决进程的同步问题

练习0:填写已有实验

同样使用一款名为meld的软件进行对比即可,大致截图如下:
enter image description here

这里把需要填充的文件罗列如下:

proc.c
default_pmm.c
pmm.c
swap_fifo.c
vmm.c
trap.c
sche.c

另外需要说明的是,上述需要填充的部分,不需要在以前的基础上再额外加以修改,直接讲lab1-lab6的代码根据对比复制过来即可。

练习1 理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题

在完成本练习之前,先说明下什么是哲学家就餐问题

哲学家就餐问题,即有五个哲学家,他们的生活方式是交替地进行思考和进餐。哲学家们公用一张圆桌,周围放有五把椅子,每人坐一把。在圆桌上有五个碗和五根筷子,当一个哲学家思考时,他不与其他人交谈,饥饿时便试图取用其左、右最靠近他的筷子,但他可能一根都拿不到。只有在他拿到两根筷子时,方能进餐,进餐完后,放下筷子又继续思考。

在分析之前先对信号量进行简介,直接看信号量的伪代码如下

struct semaphore {
int count;
queueType queue;
};

void P(semaphore S){
  S.count--;
  if (S.count<0) {
  把进程置为睡眠态;
  将进程的PCB插入到S.queue的队尾;
  调度,让出CPU;
  }
}

void V(semaphore S){
  S.count++;
  if (S.count0) {
  唤醒在S.queue上等待的第一个进程;
  }
}

基于上诉信号量实现可以认为,当多个进程可以进行互斥或同步合作时,一个进程会由于无法满足信号量设置的某条件而在某一位置停止,直到它接收到一个特定的信号(表明条件满足了)。为了发信号,需要使用一个称作信号量的特殊变量。为通过信号量s传送信号,信号量通过V、P操作来修改传送信号量。
接下来进入代码的分析。
lab7和之前的lab6的总体步骤基本没有多大的变化,开始的执行流程都与实验六相同,而二者的差异主要是从,而我们跟着代码继续往下看,一直到创建第二个内核线程init_main时,我们可以看到,init_main的内容有一定的修改,函数在开始执行调度之前多执行了一个check_sync函数,check_sync函数如下:

void check_sync(void){

    int i;

    //check semaphore
    sem_init(&mutex, 1);
    for(i=0;i<N;i++){d
        sem_init(&s[i], 0);
        int pid = kernel_thread(philosopher_using_semaphore, (void *)i, 0);
        if (pid <= 0) {
            panic("create No.%d philosopher_using_semaphore failed.\n");
        }
        philosopher_proc_sema[i] = find_proc(pid);
        set_proc_name(philosopher_proc_sema[i], "philosopher_sema_proc");
    }

    //check condition variable
    monitor_init(&mt, N);
    for(i=0;i<N;i++){
        state_condvar[i]=THINKING;
        int pid = kernel_thread(philosopher_using_condvar, (void *)i, 0);
        if (pid <= 0) {
            panic(
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值