XV6学习(10)锁】的更多相关文章

在包括XV6的绝大部分操作系统都是多个任务交错执行的.交错的一个原因是多核硬件:多核计算机的多个CPU核心独立执行计算,如XV6的RISC-V处理器.多个CPU核心共享物理内存,XV6利用这种共享来维护所有核心都会读写的数据结构.而这种共享会导致一个CPU在读取某数据结构时,可能有另一个CPU正在对此数据进行更新:或者多个CPU同时更新同一个数据.如果不对这种并行访问进行小心的设计,就可能会导致错误的结果产生或者损坏数据.即使是单核处理器,内核也可能会在多个线程之间进行切换,导致它们交错运行.最…
xv6学习笔记(5) : 锁与管道与多cpu 1. xv6锁结构 1. xv6操作系统要求在内核临界区操作时中断必须关闭. 如果此时中断开启,那么可能会出现以下死锁情况: 进程A在内核态运行并拿下了p锁时,触发中断进入中断处理程序. 中断处理程序也在内核态中请求p锁,由于锁在A进程手里,且只有A进程执行时才能释放p锁,因此中断处理程序必须返回,p锁才能被释放. 那么此时中断处理程序会永远拿不到锁,陷入无限循环,进入死锁. 2. xv6中的自旋锁 Xv6中实现了自旋锁(Spinlock)用于内核临…
xv6学习笔记(4) : 进程 xv6所有程序都是单进程.单线程程序.要明白这个概念才好继续往下看 1. XV6中进程相关的数据结构 在XV6中,与进程有关的数据结构如下 // Per-process state struct proc { uint sz; // Size of process memory (bytes) pde_t* pgdir; // Page table char *kstack; // Bottom of kernel stack for this process e…
JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以及String. Undefined数据类型的值只有一个:undefined. 在JavaScript中,如果函数没有声明返回值,那么会返回undefined.(后面有实例). 如果typeof后面跟一个未定义的参数,也是返回undefined. Null数据类型的值只有一个:null. null与…
原文:ThinkPhp学习10 查询操作 Action模块 User下的search public function search(){ //判断username是否已经传入,且不为空 if(isset($_POST['username'])&&$_POST['username']!=null){ //不管{是出现在$前面还是后面,只有两者紧挨着时花括号才会被当成是界定符号.不要在之间加空格,要不然就会被当作普通的花括号处理 $where['username']=array('like',…
python学习10—迭代器.三元表达式与生成器 1. 迭代器协议 定义:对象必须提供一个next方法,执行该方法或者返回迭代中的下一项,或者返回一个StopIteration异常,以终止迭代(只能往后走不能往前退) 2. 可迭代对象 实现了迭代器协议的对象,对象内部定义一个__iter__()方法 3. for循环实现机制 字符串.列表,元组,字典,集合,文件等都不具有next方法,所以他们都不是可迭代对象(iterable object),但是为什么for循环可以进行呢? 原因:for循环首…
代码在github上 这一次实验是要对XV6内部的锁进行优化,减少锁争用,提高系统的性能. Memory allocator (moderate) 第一个实验是对XV6内核的内存页面分配器进行改进,改进的策略在前面的章节中也讲过了.XV6原本是使用一个空闲页面链表,但是这样就会导致不同CPU上的kalloc和kfree会产生锁争用,内存页面的分配被完全串行化了,降低了系统的性能. 而一个改进策略就是为每个CPU核心分配一个空闲链表,kalloc和kfree都在本核心的链表上进行,只有当当前核心的…
XV6学习笔记(1) 1. 启动与加载 首先我们先来分析pc的启动.其实这个都是老生常谈了,但是还是很重要的(也不知道面试官考不考这玩意), 1. 启动的第一件事-bios 首先启动的第一件事就是运行bios,这个时候我们的机器位于实模式,也就是16位地址.这个时候能访问的空间只有1mb 就是设置cs寄存器的值为0xFFFF, ip的值为0x0000 这个就是bios的地址,然后我们会去运行bios执行各种对硬件的检查 但是xv6和之前的jos(也就是828)中都没有这样做,作为一个精简的os系…
XV6学习笔记(2) :内存管理 在学习笔记1中,完成了对于pc启动和加载的过程.目前已经可以开始在c语言代码中运行了,而当前已经开启了分页模式,不过是两个4mb的大的内存页,而没有开启小的内存页.接下来就可以从main.c的init函数开始 这里会和JOS做一个对比 首先看一下在执行main.c之前的物理内存分布 0x0000-0x7c00 引导程序的栈 0x7c00-0x7d00 引导程序的代码(512字节) 0x10000-0x11000 内核ELF文件头(4096字节) 0xA0000-…
xv6学习笔记(3):中断处理和系统调用 1. tvinit函数 这个函数位于main函数内 表明了就是设置idt表 void tvinit(void) { int i; for(i = 0; i < 256; i++) SETGATE(idt[i], 0, SEG_KCODE<<3, vectors[i], 0); SETGATE(idt[T_SYSCALL], 1, SEG_KCODE<<3, vectors[T_SYSCALL], DPL_USER); initlock…