本文将会详细介绍Xv6操作系统中虚拟内存的初始化过程. 基本概念 32位X86体系结构采用二级页表来管理虚拟内存.之所以使用二级页表, 是为了节省页表所占用的内存,因为没有内存映射的二级页表可以不用分配地址来存储.在这个二级页表结构中,每个页的大小为4KB,每个页表的大小也为4KB,每个页表项的大小为4字节,一个页表包含1024个页表项.一级页表表项存储的是二级页表的地址,二级页表表项存储的是对应的物理地址.虚拟地址和物理地址的最后12位总是相同,因此页表表项中的这12位可以被用作标记其他信息.…
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必须存储以下两类信息: 操作系统管理运行的进程所需要信…
Unix文件系统 当今的Unix文件系统(Unix File System, UFS)起源于Berkeley Fast File System.和所有的文件系统一样,Unix文件系统是以块(Block)为单位对磁盘进行读写的.一般而言,一个块的大小为512Byte或者4KB.文件系统的所有数据结构都以块为单位存储在硬盘上,一些典型的数据块包括:superblock, inode, data block, directory block and indirection block. Superbl…
锁是操作系统中实现进程同步的重要机制. 基本概念 临界区(Critical Section)是指对共享数据进行访问与操作的代码区域.所谓共享数据,就是可能有多个代码执行流并发地执行,并在执行中可能会同时访问的数据. 同步(Synchronization)是指让两个或多个进程/线程能够按照程序员期望的方式来协调执行的顺序.比如,让A进程必须完成某个操作后,B进程才能执行.互斥(Mutual Exclusion)则是指让多个线程不能够同时访问某些数据,必须要一个进程访问完后,另一个进程才能访问. 当…
Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文. 先看看应用情况 在<Servlet与Tomcat运行示例>一文中,我详细的记录了Tomcat是如何启动一个Servlet的程序的步骤.其中,第6步骤是启动Tomcat,也就是在windows系统上执行startup.bat, 在linux操作系统上执行startup.sh的脚本.那么,我们就从…
基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2.等待,直到DOM树构造完毕. 3.发现ng-app,自动进入启动引导阶段. 4.根据ng-app名称找到相应的路由. 5.加载默认地址. 6.Js顺序执行,加载相应模版页 sys_tpls/home.html 7.在此,可以看到index路由中只是填充了ui-view为sys_login的div模…
windows 修改 开机界面 boot启动界面 windows 修改 启动加载 版权 windows 系统如何修改开机画面的版权文字“Microsoft Corporation ... ◎Microsoft Corporation Microsoft Corporation 去掉 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com 通过16进制的编辑器(我用的是winhex)打开winloa…
SpringBoot启动加载类ApplicationRunner 有时希望项目在启动的时候加载一些系统参数,就要用到ApplicationRunner ApplicationRunner是一个接口,我们需要实现它,并重写run()方法,当项目启动时,run()方法便会自动执行 @Component @Order(value=1) public class StartLoader implements ApplicationRunner { @Override public void run(Ap…
背景 公司一年的部分业务数据放在redis服务器上,但数据量比较大,单纯的string类型数据一年就将近32G,而且是经过压缩后的. 所以我在想能否通过获取string数据的时间改为保存list数据类型,或者将数据持久化到硬盘上,或者放在不同库上,解决未来数据过大导致down机的问题. 相关知识点 string数据类型 数据持久化 数据加载 Redis的字符串(string)的实现原理 Redis是由C语言编写的,以高效和轻量著称. 比如一个简单的字符串”hello world”,其实是一个如下…