于渊<orange's 一个操作系统的实现>中文件系统的bug

本文探讨了在操作系统中进程调度对文件系统初始化的影响。通过具体案例分析,解释了为什么某些进程看似无用却能避免系统崩溃的问题。并提出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实这不属于文件系统的bug,这应该属于进程的bu,不知道有没有跑过第九章文件系统的最后代码的,是一个和linux下文件系统调用一样的范例。

一开始感觉TestB()和TestC()这两个进程没用,这两个实际进程没做什么,就是Print一下,然后就死循环了,然后就删掉了,只留下了个进程TestA(),然后问题就出现了总是报异常,但是另外两个进程加上去之后就没事了,很不解。

后来发现,文件系统也是由一个系统级的进程写入硬盘的,在mkfs()写入过程中后该进程就陷入阻塞等待硬盘说写完的中断后才能解除,而TestA中是需要用到这个文件系统的,由于进程的轮转导致文件系统还没初始化好就切换到进程TestA的运行了,就导致挂了,当加入TestB()和TestC()之后,由于进程调度schedule所需要的时间更长了,导致在切换进程TestA的时候,硬盘已经将磁盘文件系统写入,并告诉虚拟文件系统初始化完毕这个时候就可以了。

为此我把Testc()和Testb()两个进程删除之后,在TestA()中开始涉及到使用文件系统之前先加个延时million_delay(200)让文件系统初始化完毕先再运行。

问题大概是定位到这里,但实际上在原因上究竟是不是由于磁盘文件没有初始化完毕导致TestA()挂掉我也不是很确定,因为在orange’s的系统调用此时已经改成微内核的消息传递了,如果文件系统没有初始化完毕, TestA()就进行系统调用,按道理是会把消息挂在它的待接收队列上的,应该不会出现问题才对,由于没时间,下次再回它的IPC看看是不是哪里么写到。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值