- 博客(23)
- 收藏
- 关注
原创 【mit 6.S081】学习笔记 Lab10 Mmap
实现内存映射文件的操作,将文件映射到内存中,从而在与文件交互的时候减少磁盘操作。复制了父进程惰性分配的页面都会导致panic,因此需要修改。,或者子进程在fork中调用。如果对惰性分配的页面调用了。系统调用,这里不再赘述。所有的问题都解决了。
2023-12-19 21:46:38 127
原创 【mit 6.S081】学习笔记 Lab9 File system
使其在遇到符号链接的时候,可以递归跟随符号链接,直到跟随到非符号链接的 inode 为止或者达到最大跟随深度。系统调用,添加一个系统调用的过程不再赘述,这里只说明。实现二级索引以及释放块,与一级索引相似。
2023-12-19 21:46:02 142
原创 【mit 6.S081】学习笔记 Lab8 Lock
这个链表,将空闲物理页本身直接用作链表项,然后连接成一个链表,这样可以不使用额外的空间,在分配的时候,将分配后的物理页从该链表中删除,回收时将该物理页放回链表中。这个链表,而修改不是一个单步操作,所以说,为了保证多线程的正确性,必须加锁,但是加锁势必会导致多线程无法并发的申请内存,降低并发效率。而锁优化大抵是有俩种思路,其一是,资源只在必须共享的时候共享,其二是,尽量缩短在关键区中停留的时间。返回当前的核心编号,但只有在中断关闭时调用它并使用其结果才是安全的。核共享,然后,大锁化小锁,降低锁的粒度。
2023-12-19 21:45:14 276
原创 【mit 6.S081】学习笔记 Lab7 Multithreading
另外一个,无论是程序主动 sleep,还是时钟中断,都是通过 trampoline 跳转到内核态 usertrap(保存 trapframe),然后再到达 swtch 保存上下文的。的功能,所以说对照内核中的线程调度机制很有必要,这里的线程感觉更像协程,原因是这里的线程是完全用户态实现的,多个线程也只能运行在一个 CPU 上,并且没有时钟中断来强制执行调度,需要线程函数本身在合适的时候主动 yield 释放 CPU。上锁的粒度会影响程序的效率,所以我将锁的粒度降低到每一个桶一个锁。
2023-12-19 21:40:17 177 1
原创 【mit 6.S081】学习笔记 Lab6 Cow
但是这样对于释放用户内存的物理页面变得更加棘手,所以我们将引入引用计数机制。这是为了确保每个物理页在最后一个PTE对它的引用撤销时被释放,而不是在此之前。将父进程的物理页映射到子进程的,而不是立即分配新页,同时,清除父子进程的写权限并设置COW权限。导致子进程共享页面时,增加页的引用计数;每当任何进程从其页表中删除页面时,减少页的引用计数。使其能能够识别页面错误,当COW页出现页错误时,我们才使用。分配一个新页,并将旧页复制到新页,然后将这个新页添加到。分配页时,将页的引用计数设置为1。
2023-12-19 21:38:29 213 1
原创 【mit 6.S081】学习笔记 Lab5 Network diver
为什么要使用锁,是为了避免竞态条件,在发送数据时,由于多个线程同时访问发送环(TX_ring)中的描述符,倘若没有锁来保护对描述符的访问,可能对引发竞态条件,导致访问失败。主要在中断上下文中执行,而中断上下文是一个特殊的执行环境,它不会被抢占。在中断上下文中执行的代码是原子的,不会被其他中断打断,因此不需要额外的锁来保护。的提示部分已经很详细了,只需要将文字转化为代码即可。网卡对于数据包的传输和接受,其实。接收时不使用锁的原因是,调用。是中断处理函数,所以说。
2023-12-19 21:37:32 70 1
原创 【mit 6.S081】学习笔记 Lab4 Traps
最后,您应该在每次报警计数器关闭后“重新配置”它,以便周期性地调用处理程序。”后崩溃,对于目前来说也是正常的。fp 指向当前栈帧的开始地址,sp 指向当前栈帧的结束地址。(栈从高地址往低地址生长,所以 fp 虽然是帧开始地址,但是地址比 sp 高。在 xv6 中,使用一个页来存储栈,如果 fp 已经到达栈页的上界,则说明已经到达栈底。时间消耗的受计算限制的进程,或者对于那些计算的同时执行某些周期性操作的进程可能很有用。注意栈的生长方向是从高地址到低地址,所以扩张是 -16,而回收是 +16。
2023-11-26 18:46:14 125 1
原创 【mit 6.S081】学习笔记 Lab3 Page tables
RISC-V 的逻辑地址寻址是采用三级页表的形式,9 bit 一级索引找到二级页表,9 bit 二级索引找到三级页表,9 bit 三级索引找到内存页,最低 12 bit 为页内偏移(即一个页 4096 bytes)。):页表里的"value",根据PTE可以找到相关的物理内存页(的起始地址)。虚拟内存页:page,每页有4KB大小,相应的物理内存页存放了相关数据。中,如果用户态调用系统调用,就会切换到内核态,这中间一定是有开销的,至少。,其作用是从一个用户页表地址开始,搜索所有被访问过的页并返回一个。
2023-11-14 19:58:43 482 1
原创 【mit 6.S081】学习笔记 Lab2 System calls
中,空余内存页的存储方式是,将空余页表页本身直接作为链表节点,形成一个空余页的链表,在分配页表时,直接把该链表的根节点所对应的页表分配出去,在回收时,直接把要回收的页作为新的根节点,接在原本的空余页的链表后。这个问题的答案与之后学习的页表知识相关,这是由于内核和用户进程所使用的页表不同,寄存器也不互通,所以说参数是无法通过函数参数传参的形式从用户态直接传到内核态的,而是需要使用一些特定的函数实现这样的功能,即通过。的方法结合进程的页表,才能顺利找到用户态的指针所对于的物理内存地址。这玩意好像是会生成一个。
2023-11-13 21:37:28 181
原创 Linux_C 高级IO
有限状态机(Finite State Machine,FSM)是一种计算模型,它将计算过程分为一系列离散的状态,每个状态能够接收输入并执行一定的动作,然后转移到下一个状态。在使用文件锁时,可以将一个文件或其中的某个区域标记为“被锁定”,从而防止其他进程对其进行修改或删除。函数时,操作系统会为该文件或设备分配一段虚拟内存地址,并将其映射到指定的文件或设备上,从而实现了对文件或设备的直接访问。在 Linux 系统中,推荐使用。函数相比,其使用方法更为简单,但是其只能实现基于文件和进程的互斥锁,不支持共享锁。
2023-11-12 22:12:51 38
原创 Linux_C 线程
如果互斥量当前没有被其他线程锁定,则该线程会锁定互斥量,并且可以访问共享资源。为了避免线程竞争,可以采用各种同步机制,如锁、信号量、条件变量等,保证每次只有一个线程能够访问共享资源,从而避免产生冲突。线程竞争是指多个线程在同时访问共享资源时,由于执行顺序不确定或者执行时间片长度的随机性,导致对该资源的操作产生了冲突,从而引发程序错误或者结果不正确的情况。总的来说,互斥量和锁都是用于同步并发程序的机制,它们可以防止多个线程同时访问共享资源,从而避免竞态条件等问题的发生。posix线程是一套标准,而不是实现。
2023-11-12 22:08:17 33
原创 【mit 6.S081】学习笔记 Lab1 Utilities
这个lab只是实现了几个Unix的实用工具,熟悉xv6的使用!fork创建子进程,创建管道,实现父子进程之间的数据传输。工具从标准输入读入数据,将每一行当作参数,加入到传给。通过多进程实现埃氏筛算法,很有意思的一道题目。的程序名和参数后面作为额外参数,然后执行。
2023-11-12 21:59:24 98
原创 Project4 Use C++ implements a simple STL list
Project4 Use C++ implements a simple STL list
2023-05-16 19:27:47 107
原创 Linux_C 文件系统
inode节点:stat,亚数据,隐藏内容,数据块指针组(15个),前12个指针:直接数据块指针,13:一级间接块指针(直接数据块指针数量:大小/指针大小)14:二级间接块指针(直接数据块指针数量:大小/指针大小)15:三级间接块指针(直接数据块指针数量:大小/指针大小) inode位图:0/1确实inode是否使用,确定inode是否使用,确定数据块的使用。stat:通过文件路径获取属性,面对符号链接文件时获取的是所指向的目标文件。
2023-04-16 21:59:44 149
原创 Linux_C I/O:一切实现的基础
分类:行缓冲:换行时刷新,满的时候刷新,强制刷新[fflush()],(stdout是这样的,stdout是终端设备)区别:响应速度(文件IO快,实时响应),吞吐量(标准IO大,缓存区) 全缓冲:满的时候刷新,强制刷新(默认,只要不是终端设备)/dev/fd/目录:虚目录,显示当前进程的文件描述符信息。文件描述符的概念(int类型,本质是数组下标) 标准IO合并以后统一调用系统IO。在二者都可用的情况下,优先使用标准IO。 标准IO与文件IO不可混用。分类:stdio 标准IO。
2023-04-13 20:56:07 80
原创 Project 3 Use C implements a simple Shell
Project 3 Use C implements a simple Shell
2023-03-25 16:39:29 97
原创 Project 2 Use C to implement the basic functions of LS
Project 2 Use C to implement the basic functions of LS
2023-03-08 19:26:24 66
原创 Project 1 Design a dynamic expansion buffer (strbuf) in c language
一个小小的C语言项目
2023-01-01 19:55:44 91 1
原创 C language predictive processing note
C language predictive processing note
2022-12-03 00:39:00 108
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人