XV6操作系统是MIT 6.828课程中使用的教学操作系统,是在现代硬件上对Unix V6系统的重写.XV6总共只有一万多行,非常适合初学者用于学习和实践操作系统相关知识. MIT 6.828的课程网站是https://pdos.csail.mit.edu/6.828/.XV6操作系统有官方文档,英文版在前面的网站可以下载,中文版翻译参见https://th0ar.gitbooks.io/xv6-chinese/content/. 此部分内容另有PPT 前置知识 在阅读XV6操作系统代码前,需要…
1. 进程的基本概念 从抽象的意义来说,进程是指一个正在运行的程序的实例,而线程是一个CPU指令执行流的最小单位.进程是操作系统资源分配的最小单位,线程是操作系统中调度的最小单位.从实现的角度上讲,XV6系统中只实现了进程, 并没有提供对线程的额外支持,一个用户进程永远只会有一个用户可见的执行流. 2. 进程管理的数据结构 根据[1],进程管理的数据结构被叫做进程控制块(Process Control Block, PCB).一个进程的PCB必须存储以下两类信息: 操作系统管理运行的进程所需要信…
本文将会详细介绍Xv6操作系统中虚拟内存的初始化过程. 基本概念 32位X86体系结构采用二级页表来管理虚拟内存.之所以使用二级页表, 是为了节省页表所占用的内存,因为没有内存映射的二级页表可以不用分配地址来存储.在这个二级页表结构中,每个页的大小为4KB,每个页表的大小也为4KB,每个页表项的大小为4字节,一个页表包含1024个页表项.一级页表表项存储的是二级页表的地址,二级页表表项存储的是对应的物理地址.虚拟地址和物理地址的最后12位总是相同,因此页表表项中的这12位可以被用作标记其他信息.…
锁是操作系统中实现进程同步的重要机制. 基本概念 临界区(Critical Section)是指对共享数据进行访问与操作的代码区域.所谓共享数据,就是可能有多个代码执行流并发地执行,并在执行中可能会同时访问的数据. 同步(Synchronization)是指让两个或多个进程/线程能够按照程序员期望的方式来协调执行的顺序.比如,让A进程必须完成某个操作后,B进程才能执行.互斥(Mutual Exclusion)则是指让多个线程不能够同时访问某些数据,必须要一个进程访问完后,另一个进程才能访问. 当…
Unix文件系统 当今的Unix文件系统(Unix File System, UFS)起源于Berkeley Fast File System.和所有的文件系统一样,Unix文件系统是以块(Block)为单位对磁盘进行读写的.一般而言,一个块的大小为512Byte或者4KB.文件系统的所有数据结构都以块为单位存储在硬盘上,一些典型的数据块包括:superblock, inode, data block, directory block and indirection block. Superbl…
引言 Bleve是Golang实现的一个全文检索库,类似Lucene之于Java.在这里通过阅读其代码,来学习如何使用及定制检索功能.也是为了通过阅读代码,学习在具体环境下Golang的一些使用方式.代码的路径在github上https://github.com/blevesearch/bleve. Index Mapping是bleve的一个功能特性,用来控制每个类型的文档,文档内的每个字段,具体应该如何被分析.索引.存储,这部分与Lucence的设计思路相同. 1 IndexMapping的…
垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区则不一样. Java堆中存储了几乎所有的对象实例,垃圾收集器进行对堆的回收之前,需要判断这些对象是否还存活 一.判断对象是否存活 判断对象是否还活着,主要有两种方法 1.引用计数法 给对象添加一个引用计数器,每当一个地方引用时,计数器值加1: 每当一个引用失效时,计数器减1: 任何计数器为0的对象为不可能被使用的对象. 优点:实现简单,…
上一篇文章主要讨论了RC的总体框架,本文开始分析具体的代码实现细节.分析的顺序按照总体框架来,即初始化-->更新. (1)m_cRateCtrl.init() #if M0036_RC_IMPROVEMENT Void TEncRateCtrl::init( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight…
这是第二篇读书笔记,这本书我已经读了有一大半了,感觉书中所描述的人都是疯子,一群有创造力,却又耐得住寂寞的疯子. 我从书中发现几点我比较感兴趣的内容. 第一个,乐高之梦.将程序用乐高积木一样拼接起来.对于这一点,现在很多公司都已经多多少少在用了.但是书中也提到,有很多程序员往往不喜欢借用别人的代 码,如果看一个文档超过两分钟没有找到自己所需的东西就认定它不存在,从而自己来编写.在我看来这类人就是疯子,也是一群可爱的疯子,他们往往视代码为第 一存在,乐于编程,爱上编程,虽然对于团队的经理,这群牛仔…
Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_ioctl实现网络接口的配置的. 具体方法大致如下,即建立一个socket,得到一个fd,然后在此fd上执行ioctl即可完成各种操作(例如,查询/配置mac.ip.mtu,启动/停止网络接口). int fd = socket(AF_INET, SOCK_DGRAM, 0); ioctl(fd, SI…