qemu原理探究
虚拟化技术几个疑问:
为什么python,Java等要采用虚拟机来执行?
既然虚拟机最终要落在物理机的身上,为什么不去做和C一样的,针对编译器的适配,为什么不设计为编译执行的语言,而要加一个虚拟机中间层?
python和java等解释性语言的执行:源代码 - 字节码 - 解释器 - 虚拟机 - 物理机
python等易于开发的语言在设计时为了保证尽量减少底层差异对开发者的影响,对物理机做了一层虚拟机抽象,统筹和封装了硬件资源的操作,同时也隔离了python对底层硬件的操作
虚拟机跨平台的实现,是很多虚拟机是由C编写的,同时也考虑了对不同体系结构的优化和适配(提高字节码的执行效率)
C语言跨平台的实现:不同的编译器会针对特定平台和体系结构进行优化,生成不同的机器码
搭嘎,C也有虚拟机,如LLVM中的JIT(Just-in-Time),和一些嵌入式中的实现
虚拟机化技术自1974年提出到现在,愈发常见和常用,其核心概念离不开Hypervisor(虚拟机监视器),接下来深入探讨
Hyervisor有两种方案,一种是直接对硬件层的Hypervisor,在此基础上建立Guest OS,代表作 ...
Hexo
Hexo 美化记录页脚养鱼:footer.styl1234567891011121314151617181920background-color: alpha($dark-black, .1)#footer-wrap position: absolute padding: 1.2rem 1rem 1.4rem color: $light-grey text-align: center left: 0 right: 0 top:0 bottom: 0 #footer if hexo-config('footer_bg') != false &:before position: absolute width: 100% height: 100% background-color: alpha($dark-black, .1) content: ''js
12- <script src="https://cdn.b ...
6.S081
开坑课程:MIT 6.S081lab:xv6目标:掌握os,尽量手搓一个demo
Chapter 0Noteshell维护三个文件描述符,1,0,2
进程维护文件描述符表
read系统调用会前进文件的偏移量,返回0作为文件结尾
2 >& 1:将标准错误流重定向到标准输出流
管道是一对读取和写入的文件描述符,shell使用fork来产生子进程,新的cmd来运行从管道的读描述符来获取数据
文件描述符偏移量相同的两种情况:dup调用和fork出子进程
close释放文件描述符
exec来重定向文件描述符,一个进程执行新进程时,替换掉的是进程的内存映像,但是维护的文件描述符表不会发生改变
若子进程不在退出前关闭文件描述符,父进程就会在子进程偏移的地方继续写,所以子进程的文件偏移后的文件描述符的位置会保留给父进程
当进程试图访问设备文件时,内核会将对于设备文件的读写操作转发给相应的设备驱动程序或者内核代码,而不是用文件系统来操作
12345678910111213141516int p[2];char *argv[2];argv[0] = "wc&q ...
linux_base
深重悼念,Vamei
斯人已逝,文章永存
Linux架构开机时,计算机从主板BIOS(basic input/output system)中读出程序,该程序的作用是使CPU对各个硬件连接识别,然后指向启动计算机的硬件位置,可以选择启动计算机的位置
之后从选定的位置读取前512个字节,称为主引导记录MBR,MBR再从指定的分区加载引导加载程序(boot loader),引导加载程序加载操作系统内核(kernel)
内核直接管理硬件,内核之上是系统调用
内核通过驱动检测硬件以后,创建一个init进程,init运行一系列初始脚本,进行准备工作,对计算机进行一系列的初始化,之后弹出登录框,允许用户以某个组的某个用户登录
linux架构:
如图,系统调用是对内和的进一步抽象,系统调用也是操作系统的原子操作,系统调用之上的封装是库函数
用man 2 syscall可以查看所有系统调用,也可以查看具体的系统调用说明,如man 2 read(其中2代表系统调用类,具体的数字和对应的类可以用man man查看)
shell是一个程序,有内置的函数以及可以运行可执行文件(包括命令),默认的shell是b ...
ml
2023年11月8日学习ML,共耗时:6小时学习资料:machine learning
正视自己现在的态度:想做建大的事情并且快速获得可以擦后果别人的成果,想什么呢?只有掌握技术,才能去享受技术,就像只有会游泳才能享受游泳的乐趣,如果中途半途而废了,那么之前做的一切都会没有价值既然选择了走这么一条艰难地路,顶一个宏大的目标,那就坚持下去
监督学习和无监督学习监督学习:回归问题或者对于已知种类的分类判断问题无监督学习:对于未知种类的自动判断种类(聚类算法)
特征特征相当于变量,不同问题的特征值是不一样的,机器学习是对于某一种具有相同特征值的问题进行处理的方法梯度下降对于参数求导数,来判断参数往哪个方向调整会产生预期结果
线性回归最简单的对于一元自变量:多个数据来拟合一条直线,来进行预测或者分类,对于离散问题也可以使用线性回归:
y = \beta_0 + \beta_1 x_i残差:
e = y - \widehat{y}损失函数:残差平方和可以使用最小二乘法来求解拟合直线参数 $\beta_0$ 和 $\beta_1$ :对于残差平方和$Q,\beta_0,\b ...
database
参考miniob_lecture知乎-B+树看这一篇就够了MySQL索引背后的数据结构及算法原理
磁盘存储存储大小:盘面——磁道——扇区延时:寻道时间——旋转延迟——数据传输时间
增加奇偶位来判断数据是否正确
数据要进行字节对齐记录和块都有一个header来对时间戳或者偏移量来进行存储,便于数据的查找和维护,数据块对记录的存储是朝向header的栈变长记录的存储:
变长字段:首地址(address) + 字段长度 (注意变长字段一般在定长字段之后存储)
重复字段:首地址 + 字段长度 + 重复次数
文件使用堆文件,记录能插则插,为了保证页面一致性所以通常一个堆文件是一种关系
页主流操作系统对文件的处理是将文件视为无结构的流文件,只关心数据的传输而不关心数据的格式,而DBMS将流文件划分为页(虚拟分页)来进行内存和磁盘数据的交换文件分页,同一关系的文件放到一个页里DBMS有一个间接层,将页面ID映射成文件路径和偏移量,单文件只映射成偏移量数据库页是硬件页的整数倍(所以DBMS要保证一致性问题),是缓冲和磁盘交换的基本单位页头存储页面元数据,有些数据库要求页头 ...
OS-01
进程是程序执行,以及内存空间,以及执行上下文等一系列要素
线程是一个进程中的多个小的执行单元,其共享进程的堆和方法栈的资源,可以并发,每个线程有自己的程序计数器
线程崩溃则整个进程崩溃,因为线程不是独立的,但是各个进程之间是完全独立的,所以多进程比多线程健壮
线程切换只是CPU的直接访问切换,但是进程切换是包括分配内存空间,保存和产生执行上下文等步骤的切换,所以线程切换比进程开销更小
虚存:通过进程的分页设计,来让进程的一部分在运行进程的时候可以从外存实时加载到内存,以减少内存的开销
虚存先介绍几个定义:
段:有代码段和数据段,每个段在内存中占用连续的物理空间
CS寄存器:存储代码段的段基址,或者存放段选择子
DS寄存器:存储数据段的段基址,或者存放段选择子
IP寄存器:存储代码段的段偏移量
全局段描述符表:存储在内存中,有各个(可执行文件)代码和数据段的基址
全局段描述符表寄存器:存储全局段描述符表在内存中的基址
CPU访问内存中代码段和数据段的方式有以下几种:
直接存取要执行可执行文件时,代码段和数据段被分配唯一的物理地址,但缺点在不能同时执行多次这个程序,而且地址锁定也不灵活 ...
OS-02
进程控制块:操作系统创建和管理,包含了进程的充分信息,可以方便于中断,因为保存了进程的寄存器以及上下文信息等
进程轨迹:进程执行的指令序列进程轨迹的的交替方式可以描述处理器的行为分派器(调度器)控制进程的切换
进程创建,可以由进程创建进程,一个进程的显示请求创建了另一个进程的时候,称为进程派生
两状态模型:运行态和非运行态,有一个进程队列
五状态模型:非运行态分为了阻塞态和就绪态,还有未加载到内存的新建态以及可以释放的退出态具体看书上的图阻塞——就绪:当等待的事件发生了以后,阻塞态的进程就成为了就绪态运行——就绪:超时运行——阻塞:等待事件
有阻塞队列和就绪队列,当一个事件发生时,扫描等待这个事件的阻塞队列,把阻塞进程放到就绪队列里
产生了新的问题:由于处理器速度远大于IO操作的速度,所以可能会存在所有进程都处于IO的情况,内存已满进不来新的进程,解决方法是将阻塞的进程转移到磁盘的挂起队列(suspend queue)中,这个行为称之为交换,交换也是IO操作,但由于磁盘IO速度是最快的IO,所以往往可以提高效率
所以阻塞态多了一个交互的状态,成为挂起态,当事件发生的时候挂起态进程可以回 ...
SQL
2022年3月27日学习SQL,共耗时:4小时学习资料:SQL教程
姑且粗浅了解一下SQL,之后要用或者有时间再细学
基本概念字段:数据项,对应为数据库里的列
记录:一条由一系列字段组合成的数据,对应为数据库里的行
主键:用于对一条记录的唯一字段标识,一般用id或GUID类型
联合主键:多条字段设置为主键(不常用)
外键:用于关联另一个表,使用外键约束会降低数据库的性能,外键约束构造:
12ALTER TABLE studentsDROP FOREIGN KEY fk_class_id;
索引:索引用于快速检索记录,主键是最典型的索引,也可以设置多个索引提高查询效率,索引字段多用hash算法来构造,所以散列值越多,冲突越少,查询效率越高创建索引:
12ALTER TABLE studentsADD INDEX idx_score (score);
索引的优点是提高了查询效率,缺点是在插入、更新和删除记录时,需要同时修改索引,因此,索引越多,插入、更新和删除记录的速度就越慢。
创建唯一索引(不可重复):
12ALTER TABLE studentsADD UNIQUE INDEX uni ...