![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统
文章平均质量分 89
_气泡
记录学习过程
展开
-
mit 6.s081 lab10 mmap
mmap,内存映射文件,是一种在内存和磁盘之间创建映射关系的机制。它允许将一个文件的内容映射到进程的虚拟地址空间中,使得进程可以想访问内存一样访问文件,省去了繁琐的磁盘IO操作。具体来说,进程可以向操纵变量一样去访问文件,而不需要调用read和write等系统调用进行文件IO,大大提高了文件访问的效率。若将同一个文件映射到多个进程的地址空间,则可以实现进程间的共享内存通信。内核首先检查文件描述符的有效性。根据文件描述符找到相应的文件表项。检查文件表项的权限和打开方式,确保可以进行写操作。原创 2023-08-04 11:36:50 · 141 阅读 · 0 评论 -
mit6.s081 lab7 学习笔记
将已进入屏障的线程数量增加 1,然后再判断是否已经达到总线程数」这一步并不是原子操作,并且这一步和后面的两种情况中的操作「睡眠」和「唤醒」之间也不是原子的,如果在这里发生 race-condition,则会导致出现 「lost wake-up 问题」(线程 1 即将睡眠前,线程 2 调用了唤醒,然后线程 1 才进入睡眠,导致线程 1 本该被唤醒而没被唤醒,详见 xv6 book 中的第 72 页,Sleep and wakeup)这里的优化思路,也是多线程效率的一个常见的优化思路,就是降低锁的粒度。原创 2023-07-09 16:15:59 · 129 阅读 · 0 评论 -
mit6.s081 lab6 实验记录
本期实验实现了操作系统的写时复制功能(COW),cow是操作系统进程内存优化的一项机制。主要用于解决以下场景带来的问题:假设父进程通过fork产生了一个子进程,子进程会复制父进程所有的内存地址,为了确保隔离,子进程会开辟新的物理内存,并将自己的页表建立映射。但往往子进程会调用exec用新的地址空间替换复制的得到的,因此子进程的页表和复制的物理内存全部会被丢弃。子进程复制父进程内存的过程中,如果父进程很大,将会产生一个很大的内存副本,占用内存资源,另外复制过程非常耗时,浪费了大量时间。原创 2023-06-16 17:35:03 · 133 阅读 · 0 评论 -
mit6.s081 lab5实验记录
操作系统为了减少内存的开销以及大分配的映射内存的开销,会采用一种延时分配的策略。当用户进程申请扩大堆区内存时,可以先记住分配了那些内存。当进程第一次尝试使用延迟分配中新增的页面时,CPU会生成一个页面错误,此时进入trap处理程序,内核通过为期分配物理内存、置零并在用户页表添加映射来处理该错误。当重新返回用户空间再次执行该指令时,就可以正常执行了。原创 2023-06-14 20:54:06 · 181 阅读 · 0 评论 -
mit6.s081 lab4实验记录
本章实验的内容是xv6系统的陷入机制,主要讲了用户态到内核态的陷入过程。当trap发生时,需要将用户进程的“现场”保存到内核中,内核使用pcb中的trapframe模块来保存所有与进程有关的寄存器。并在返回进程时,从trapframe恢复所有的寄存器。以系统调用为例,下面简单分析一下trap的全部流程:用户进程请求系统调用由于对系统调用函数已经设置了入口entry,所以会将系统调用的编号存入CPU的a7寄存器,同时将相关参数保存在a0-a8寄存中。原创 2023-06-13 16:34:41 · 237 阅读 · 0 评论 -
mit6.s081 lab3实验记录
探索页表,完成简化内核读写用户数据的方法。参考实现(强烈建议大家先自己动手做,把相关的代码好好地阅读一下,要有自己的理解,搞懂内核、用户进程、页表的实现原理和作用时刻,最后实在搞不出来可以参考一下,但是至少要确保思路要是一致的):lab3教程定义一个vmprint函数,他有一个参数pagetable,实现按照层级打印页表。在xv6系统中,采用3级页式内存关系,页表level分为2、1、0.内核程序拥有自己的内核页表,内核的虚拟地址空间分布如下:在本系统中,内核的虚拟地址到物理地址是恒等映射,但是这原创 2023-06-08 19:49:17 · 272 阅读 · 0 评论 -
mit6.s081 lab2实验记录
这一个实验主要考察的是对进程内存地址空间分布、内核态和用户态之间的区别和联系、以及系统调用的实现原理。进程的虚拟内存地址空间分为用户态和内核态,用户态分为bss数据区、data区、代码区、堆、栈,保存着程序的二进制代码、数据、堆栈等。内核态包含了内核代码、数据和内核堆栈,用于执行内核的功能和服务。内核空间和用户空间是相互隔离的,用户进程无法直接访问内核空间的代码和数据,可以通过系统调用向内核请求服务。原创 2023-06-01 15:13:25 · 160 阅读 · 0 评论 -
mit6.s081 lab1实验记录
具体可以了解一下find . b | args grep 123 和 find . b | grep 123 的区别,前者会将找到的文件作为grep的命令行参数一起执行,这样grep会返回文件内部含有123的行;另一个用于子进程写入,父进程读取。这里需要用fork和exec实现,exec会执行新的程序,替换当前进程的资源和上下文内容,但会保留文件描述符,exec(程序路径, 程序执行的参数);用到了素数筛的思想,每个进程保留当前数组最小的,并去除他所有的倍数,接着进入下一个进程。原创 2023-05-30 14:54:40 · 103 阅读 · 0 评论