XV6学习(11)Lab thread: Multithreading】的更多相关文章

代码放在github上. 这一次实验感觉挺简单的,特别是后面两个小实验.主要就是对多线程和锁进行一个学习. Uthread: switching between threads 这一个实验是要实现一个简单的用户级线程,写完之后发现原来用户级线程的简单实现也没有想象的那么复杂. 首先定义一个context结构体保存线程上下文,并加入到thread结构体中.在上下文中只需要保存被调用者保存的寄存器,即sp和s0-s11,ra用来保存线程的返回地址,类似于进程中的pc. struct thread_c…
XV6学习笔记(2) :内存管理 在学习笔记1中,完成了对于pc启动和加载的过程.目前已经可以开始在c语言代码中运行了,而当前已经开启了分页模式,不过是两个4mb的大的内存页,而没有开启小的内存页.接下来就可以从main.c的init函数开始 这里会和JOS做一个对比 首先看一下在执行main.c之前的物理内存分布 0x0000-0x7c00 引导程序的栈 0x7c00-0x7d00 引导程序的代码(512字节) 0x10000-0x11000 内核ELF文件头(4096字节) 0xA0000-…
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…
xv6学习笔记(5) : 锁与管道与多cpu 1. xv6锁结构 1. xv6操作系统要求在内核临界区操作时中断必须关闭. 如果此时中断开启,那么可能会出现以下死锁情况: 进程A在内核态运行并拿下了p锁时,触发中断进入中断处理程序. 中断处理程序也在内核态中请求p锁,由于锁在A进程手里,且只有A进程执行时才能释放p锁,因此中断处理程序必须返回,p锁才能被释放. 那么此时中断处理程序会永远拿不到锁,陷入无限循环,进入死锁. 2. xv6中的自旋锁 Xv6中实现了自旋锁(Spinlock)用于内核临…
JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: var array = new Array(); array.push(1); array.push(2); array.push(3); alert(array.length) 数组声明的第二种方式,并排序: var array = [1, 3, 25]; array.sort(); //对数组排序,…
原文:ThinkPhp学习11 一.模板的使用        (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[index].html(.tpl) 更换模板文件的后缀名(修改配置文件)   'TMPL_TEMPLATE_SUFFIX'=>'.html',//更改模板文件后缀名 b.修改模板文件目录层次   'TMPL_FILE_DEPR'=>'_',//修改模板文件目录层次 c.模板主题   'DEFAULT…
因为在做的工程项目里使用了Qt,而实际上不涉及到屏幕显示,工程代码里使用了QThread,且没有使用Qt核心的信号与槽,为了以后移植准备使用更加通用的C++11 stl中的thread取代QThread. 下面是一些测试过程,因为没有为这个小测试建一个版本控制,所以为了能记录每步测试修改,这里将编写代码编写博客,开始吧. #include <iostream> #include <thread> #include <chrono> #include <functi…
XV6学习笔记(1) 1. 启动与加载 首先我们先来分析pc的启动.其实这个都是老生常谈了,但是还是很重要的(也不知道面试官考不考这玩意), 1. 启动的第一件事-bios 首先启动的第一件事就是运行bios,这个时候我们的机器位于实模式,也就是16位地址.这个时候能访问的空间只有1mb 就是设置cs寄存器的值为0xFFFF, ip的值为0x0000 这个就是bios的地址,然后我们会去运行bios执行各种对硬件的检查 但是xv6和之前的jos(也就是828)中都没有这样做,作为一个精简的os系…
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…
正在学习MIT的6.S081,把做的实验写一写吧. 实验的代码放在了Github上. 第一个实验是Lab util,算是一个热身的实验,没有涉及到系统的底层,就是使用系统调用来完成几个用户模式的小程序. Boot xv6 (easy) 启动XV6,按照文档执行就ok了. $ git clone git://g.csail.mit.edu/xv6-labs-2020 $ cd xv6-labs-2020 $ git checkout util $ make qemu 在XV6中没有ps命令,而是使…