csnote
白速龙王的回眸
一命二运三风水
四积功德五读书
六名七相八敬神
九交贵人十养生
展开
-
【csnote】2PC两阶段提交
两阶段提交通过引入协调者(Coordeinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务运行过程准备阶段协调者询问参与者事务是否执行成功,参与者发回事务执行结果。询问可以看成一种投票,需要参与者都同意才能执行。提交阶段如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接受到协调者发来的通知后,才进行提交或者回滚。存在的问题同步阻塞所有事原创 2022-05-12 12:48:11 · 188 阅读 · 0 评论 -
【csnote】分布式事务
分布式事务指事务的操作位于不同的节点上,需要保证事务的ACID特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。分布式锁和分布式事务区别:锁问题的关键在于进程的互斥关系,例如多个进程同时修改账户的余额,如果没有互斥关系会导致该账户的余额不正确而事务问题的关键则在于事务涉及的一系列操作需要满足ACID特性,例如要满足原子性操作则需要这些操作要么都执行,要么都不执行...原创 2022-05-11 13:13:28 · 83 阅读 · 0 评论 -
【csnote】ZK的有序节点
Zookeeper的有序节点1.Zk抽象模型Zk提供了一种树形结构的命名空间,/app1/p_1的父节点是/app12.节点类型永久节点:不会因为会话结束或者超时而消失;临时节点:如果会话结束或者超时就会消失;有序节点:会在节点名的后面加一个数字后缀,并且是有序的,例如生成的有序节点为 /lock/node-0000000000,它的下一个有序节点则为 /lock/node-0000000001,以此类推。3.监听器为一个节点注册监听器,在节点状态发生改变时,会给客户端发送信息4.分布式原创 2022-05-10 12:47:40 · 459 阅读 · 0 评论 -
【csnote】redis的SETNX指令和RedLock算法
关于redis的分布式锁Redis的SETNX指令始用SETNX(set if not exist)指令插入一个kv对,如果key已经存在,那么会返回False,否则插入成功并返回TrueSETNX指令和数据库的唯一索引类似,保证了只存在一个Key的键值对,那么可以用一个Key的键值对是否存在来判断是否存在锁定状态EXPIRE指令可以为一个kv对设置一个过期时间,从而避免了数据库唯一索引实现方式中释放锁失败的问题Redis的RedLock算法始用了多个Redis实例来实现分布式锁,这是为了保证在原创 2022-05-09 15:49:30 · 516 阅读 · 0 评论 -
【csnote】分布式锁、数据库唯一索引
分布式锁在单机场景下,可以使用语言的内置锁来实现进程同步。但是在分布式场景下,需要同步的进程可能位于不同节点上,那么就需要分布式锁。阻塞锁通常用互斥量来实现:互斥量为0表示有其他进程在使用锁,此时处于锁定状态互斥量为1表示未锁定状态1和0可以用一个整型值来表示,也可以用某个数据是否存在表示数据库的唯一索引获得锁时向表中插入一条记录,释放时删除这条记录。唯一索引可以保证该记录只被插入一次,那么就可以用这个记录是否存在来判断是否处于锁定状态。存在以下几个问题。锁没有失效时间,解锁失败的话原创 2022-05-07 20:22:57 · 611 阅读 · 0 评论 -
【csnote】可用性和安全性
可用性冗余保证高可用的主要手段是冗余,当某个服务器故障时就请求其他服务器。应用服务器的冗余比较容易实现,只要保证应用服务器不具有状态,那么某个应用服务器故障时,负载均衡器将该应用服务器原先的用户请求转发到另一个应用服务器上,不会对用户有任何影响。存储服务器的冗余需要使用主从复制来实现,当主服务器故障时,需要提升从服务器为主服务器,这个过程称为切换。监控对cpu、内存、磁盘、网络等系统负载信息进行监控,当某个信息达到一定的阈值时通知运维人员,从而在系统发生故障前及时发现问题。服务降级服务降级是原创 2022-05-06 10:34:14 · 407 阅读 · 0 评论 -
【csnote】伸缩性、扩展性
伸缩性指不断向集群中添加服务器来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。伸缩性和性能如果系统存在性能问题,那么单个用户的请求总是很慢的;如果系统存在伸缩性问题,那么单个用户的请求可能会很快,但是在并发数很高的情况下系统会很慢实现伸缩性应用服务器只要不具有状态,那么就可以很容易地通过负载均衡器向集群中添加新的服务器。关系型数据库的伸缩性通过Sharding来实现,将数据按一定的规则分布到不同的节点上,从而解决单台存储服务器的存储空间限制。对于非关系型数据库,它们天生就是为海量数原创 2022-05-05 14:12:49 · 773 阅读 · 0 评论 -
【csnote】性能调优
1.集群将多台服务器组成集群,使用负载均衡将请求转发到集群中,避免单一服务器的负载过大导致性能降低2.缓存缓存能够提高性能的原因如下:缓存数据通常位于内存等介质中,这种介质对于读操作特别快缓存数据可以位于靠近用户的地理位置上可以将计算结果进行缓存,从而避免重复计算3.异步某些流程可以将操作转换为消息,将消息发送到消息队列之后立即返回,之后这个操作会被异步处理...原创 2022-05-04 12:31:45 · 191 阅读 · 0 评论 -
【csnote】系统性能指标
性能指标1.响应时间指某个请求从发出到接收到响应消耗的时间。在对响应时间进行测试时,通常采用重复请求的方式,然后计算平均响应时间。2.吞吐量指系统在单位时间内可以处理的请求数量,通常使用每秒的请求数来衡量。3.并发用户数指系统能同时处理的并发用户请求数量。在没有并发存在的系统中,请求被顺序执行,此时响应时间为吞吐量的倒数。例如系统支持的吞吐量为100 req/s,那么平均响应时间应该为0.01s目前的大型系统都支持多线程来处理并发请求,多线程能够提高吞吐量以及缩短响应时间,主要有两个原因:原创 2022-05-01 15:06:45 · 379 阅读 · 0 评论 -
【csnote】ER图
【ER图】entity-relationship,有三个组成部分:实体、属性、链系用来进行关系型dbs的概念设计【实体的三种联系】包括一对一、一对多、多对多三种如果A到B是一对多关系,那么画个带箭头的线段指向B如果是一对一,画两个带箭头的线段如果是多对多,画两个不带箭头的线段(被指着的是1?)【表示出现多次的关系】一个实体在链系出现几次,就要用几条线连接。下图表示一个课程的先修关系,先修关系出现两个Course实体,第一个是先修后一个是后修,要用两条线表示这种关系:【联系的多向性原创 2022-04-23 11:58:23 · 1526 阅读 · 0 评论 -
【csnote】范式
范式理论是为了解决之前提到的四种异常(冗余数据、修改异常、插入异常、删除异常)高级别的范式依赖于低级别的范式,1NF是最低级别的范式【1NF】属性不可分【2NF】每个非主属性完全函数依赖于键码可以通过分解来满足Grade满足完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩Sname、Sdept和Mname都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据【3NF】非主属性不传递函数依赖于键码上面的关系1中存在以下传递函数依赖:原创 2022-04-22 15:37:39 · 310 阅读 · 0 评论 -
【csnote】db异常(冗余数据、修改异常、删除异常、插入异常)
【异常】以下的学生课程关系的函数依赖是{Sno, Cname} -> {Sname, Sdept, Mname, Grade}, 键码为{Sno, Cname}。也就是说,确定学生和课程之后,就能确定其他信息。不符合范式的关系,会产生很多异常,主要有以下四种异常:1.冗余数据:例如 学生-2 出现了两次2.修改异常: 修改了一个记录中的信息,但是另一个记录种的相同信息却没有被修改3.删除异常:删除一个信息,那么也会丢失其他信息。例如删除了 课程-1 需要删除第一行和第三行,那么 学生-1原创 2022-04-21 11:12:23 · 3064 阅读 · 2 评论 -
【csnote】函数依赖
【函数依赖】记A->B表示A函数决定B,也可以说B函数依赖于A如果{A1,A2,… ,An}是关系的一个或多个属性的集合,该集合函数决定了关系的其他所有属性并且是最小的,那么该集合就称为键码。对于A->B,如果能找到A的真自己A’,使得A’ -> B,那么A->B就是部分函数依赖,否则就是完全函数依赖对于A->B,B->C,则A->C是一个传递函数依赖...原创 2022-04-20 14:57:17 · 134 阅读 · 0 评论 -
【csnote】Next-key Locks
【Next-Key Locks】Next-Key Locks是MySQL的InnoDB存储引擎的一种锁实现。MVCC不能解决幻影读问题,Next-Key Locks就是为了解决这个问题而存在的。在可重复度隔离级别下,使用MVCC + Next-Key Locks可以解决幻读问题。Record Locks:锁定一个记录上的索引,而不是记录本身。如果表没有设置索引,InnoDB会自动在主键上创建隐藏的聚簇索引,因此Record Locks依然可以使用Gap Locks:锁定索引之间的间隙,但是不包原创 2022-04-19 11:09:28 · 145 阅读 · 0 评论 -
【csnote】快照读与当前读
【快照读】mvcc的select操作是快照中的数据,不需要进行加锁操作。【当前读】mvcc其他会对数据库进行修改的操作(insert、update、delete)需要进行加锁操作,从而读取最新的数据。可以看到mvcc并不是完全不用加锁,而只是避免了select的加锁操作在进行select操作,可以强制指定进行加锁操作。以下第一个语句需要加s锁,第二个需要加x锁...原创 2022-04-18 11:15:30 · 442 阅读 · 0 评论 -
【csnote】readview
【readview】mvcc维护了一个readview结构,主要包括了当前系统未提交的事务列表TRX_IDs,还有该列表的最小值TRX_ID_MIN和最大值TRX_ID_MAX在进行select操作时,根据数据行快照的TRX_ID与MIN、Max之间的关系,判断数据行快照是否可以使用:1.若TRX_ID<TRX_ID_MIN:表示该数据行快照在当前所有未提交事务之前进行更改的,因此可以使用2.若TRX_ID>TRX_ID_MAX:表示改数据行快照是在事务启动之后被更改的,因此不可使用原创 2022-04-17 15:32:09 · 144 阅读 · 0 评论 -
【csnote】Undo日志
【undo日志】MVCC的多版本指的是多个版本的快照,快照存储在Undo日志中,该日志通过回滚指针ROLL_PTR把一个数据行的所有快照连接起来。例如在Mysql创建一个表t,包含主键id和一个字段x。我们先插入一个数据行,然后对该数据行两次更新操作。因为没有使用start transaction将上面的操作当成一个事务来执行,根据mysql的autocommit机制,每个操作都会被当成一个事务来执行,所以上面的操作总共涉及到三个事务。快照中除了记录事务版本号TRX_ID和操作之外,还记录了一个bi原创 2022-04-16 14:09:06 · 429 阅读 · 0 评论 -
【csnote】多版本并发控制
【多版本并发控制】multi-version concurrency control(mvcc)是mysql的innoDB存储引擎实现隔离级别的一种具体形式,用于实现提交读和可重复读这两种隔离级别。而未提交读隔离级别总是读取最新的数据行,要求很低,无需使用mvcc。可串行化隔离界别需要对所有读取的行都加锁,单纯使用mvcc无法实现。【基本思想】在封锁一节中提到,加锁能解决多个事务同时执行时出现的并发一致性问题。在实际场景中读操作往往多于写操作,因此又引入了读写锁来避免不必要的加锁操作,例如读和读没有互原创 2022-04-15 21:46:11 · 723 阅读 · 0 评论 -
【csnote】隔离级别
【未提交读 read uncommitted】事务中的修改,即使没有提交,对其他事务也是可见的【提交读 read committed】一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务原创 2022-04-14 16:05:55 · 248 阅读 · 0 评论 -
【csnote】两段锁协议、mysql隐式和显式锁定
【两段锁协议】就是指加锁和解锁分为两个阶段进行。可串行化调度是指,通过并发控制,使得并发执行的事务结果与某个串行执行的事务结果相同。串行执行的事务互不干扰,不会出现并发一致性问题事务遵循两段锁协议是保证可串行化的充分条件。例如以下操作满足两段锁协议,它是可串行化调度。lock-x(A)...lock-s(B)...lock-s(C)...unlock(A)...unlock(C)...unlock(B)但不是必要条件,例如下面不满足两段锁协议,但还是可串行化调度。lock-x(A)...unl原创 2022-04-13 10:58:53 · 733 阅读 · 0 评论 -
【csnote】封锁协议指三级封锁协议
【一级封锁协议】事务T要修改数据A时必须加X锁,知道T结束才释放锁可以解决丢失修改问题,因为不能同时有两个事务对同一个数据进行修改,那么事务的修改就不会被覆盖【二级封锁协议】在一级的基础上,要求读取数据A时必须加S锁,读取完马上释放S锁可以解决读脏数据问题,因为如果一个事务在对数据A进行修改,根据1级封锁协议,会加X锁,那么就不能再加S锁,也就是不会读入数据。【三级封锁协议】在二级的基础上,要求读取数据A时必须加S锁,直到事务结束了才能释放S锁可以解决不可重复读的问题,因为读A时,其他事原创 2022-04-12 14:42:25 · 164 阅读 · 0 评论 -
【csnote】意向锁
【意向锁】使用意向锁(intention locks)可以更容易地支持多粒度封锁。在存在行级锁和表级锁的情况下,事务T想要对表A加X锁,就需要先检测是否有其他事务对表A或者表A中的任意一行加了锁,那么就需要对表A的每一行都检测一次,这是非常耗时的。意向锁在原来的X/S锁之上引入了IX/IS,IX/IS都是表锁,用来表示一个事务想要在表中的某个数据行上加上X锁或S锁,有以下两个规定:1.一个事务在获得某个数据行的S锁之前,必须先获得表的IS锁或者更强的锁2.一个事务在获取某个数据行的X锁之前,必须先原创 2022-04-11 11:12:55 · 439 阅读 · 0 评论 -
【csnote】封锁、封锁粒度、封锁类型
【封锁粒度】mysql中提供了两种封锁粒度:行级锁和表级锁应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。但是加锁需要消耗资源,锁的各种操作(包括获取锁、释放锁、以及检查锁状态)都会增加系统开销。因此封锁粒度越小,系统开销就越大。在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。【封锁类型】1.读写锁互斥锁:简写为X锁,又称写锁共享锁:简写为S锁,又称读锁有以下两个规定:1.一个事务对数据对象A加了X锁,就可以对原创 2022-04-10 13:52:13 · 376 阅读 · 0 评论 -
【csnote】不可重复度、幻影读
【不可重复读】不可重复读指在一个事务内多次读取同一数据集合。在这一事务还未结束前,另一个事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一次事务的两次读取数据可能不一致。例如:T2读取一个数据,T1对该数据做了修改,如果T2再次读取这个数据,此时的结果和第一次读取的结果不同【幻影读】幻读本质上也属于不可重复度的情况,T1读取某个范围的数据,T2在这个范围内插入新的数据,T1再次读取这个范围的数据,此时读取的结果和第一次读取的结果不同。总结产生并发不一致性问题的主要原因是破坏了事原创 2022-04-09 14:17:39 · 426 阅读 · 0 评论 -
【csnote】autocommit,丢失修改,读脏数据
【autocommit】mysql默认采用自动提交模式。也就是说,如果显式使用start transaction语句开始一个事务,那么每个铲鲟操作都会被当作一个事务并自动提交【并发一致性问题】在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题【丢失修改】丢失修改指一个事务的更新操作被另一个事务的更新操作替换。一般在现实生活中会常遇到,例如,T1和T2两个事务都对一个数据进行了修改,T1先修改并提交生效,T2随后修改,T2的修改覆盖了T1的修改。【读脏数据】读脏数据指的不同事务原创 2022-04-08 10:48:36 · 453 阅读 · 0 评论 -
【csnote】db事务 acid
【事务】事务指的是满足ACID特性的一组操作,可以通过commit提交一个事务,也可以通过使用rollback进行回滚commit和rollback之后的都是一致性状态,其他insert update delete之后的是中间状态【acid】atomicity原子性:事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚回滚可以利用回滚日志(undo log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可consistency一致性:数原创 2022-04-07 20:43:35 · 230 阅读 · 0 评论 -
【csnote】linux进程管理
【进程状态】【sigchild】当一个子进程改变它的状态,有两件事情会发生在父进程中:1.得到sigchild信号 2.waitpd或者wait调用会返回其中子进程发送的sigchild信号包含了子进程的信息,比如进程id,状态和使用cpu的时间当子进程退出,它的进程描述符不会立刻释放,这是为了让父进程得到子进程信息,父进程通过wait和waitip来获得一个已经退出的子进程的信息【wait】父进程调用wait会一直阻塞,直到收到一个子进程退出的sigchild信号,之后wait会销毁子进原创 2022-04-06 11:08:46 · 190 阅读 · 0 评论 -
【csnote】动态链接
静态库有以下两个问题:1.当静态库更新的时候整个程序都要重新进行链接2.对于printf这种标准函数库,如果每个程序都要有代码,会极大浪费资源共享库是为了解决静态库这两问题而设计的,在linux系统中通常用.so后缀表示,windows系统称它们是DLL。有以下特点:1.在给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到引用他的可执行文件中2.在内存中,一个共享库的.text节(已编译程序的机器代码)的一个副本可以被不同正在运行的进程共享...原创 2022-03-31 11:00:47 · 172 阅读 · 0 评论 -
【csnote】静态链接、目标文件
【静态链接】静态链接器以一组可重定位目标文件为输入,生成一个完全链接的可执行目标文件作为输出。连接器主要完成以下两个任务:符号解析:每个服啊后对应于一个函数、一个全局变量或一个静态变量,符号解析的目的是将每个符号引用和一个符号定义关联起来重定位:链接器通过把每个符号定义与一个内存位置关联起来,然后修改所有对这个符号的引用,使得它们指向这个内存位置。【目标文件】可执行目标文件:直接在内存执行可重定位目标文件:可与其他可重定位目标文件在链接阶段合并,创建一个可执行目标文件共享目标文件:这是一个特原创 2022-03-30 14:14:11 · 428 阅读 · 0 评论 -
【csnote】编译系统
预处理阶段:处理以#开头的预处理命令编译阶段:翻译成汇编文件汇编阶段:将汇编文件翻译成可重定位目标文件链接阶段:将可重定位目标文件和printf.o等单独预编译好的目标文件进行合并,得到最终的可执行文件...原创 2022-03-29 11:09:02 · 223 阅读 · 0 评论 -
【csnote】磁盘寻道 电梯算法
【电梯算法】SCAN电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了SSTF的饥饿问题...原创 2022-03-28 14:11:45 · 472 阅读 · 0 评论 -
【csnote】磁盘调度:FCFS,SSTF
【先来先服务,FCFS】按照磁盘请求的顺序进行调度。有点是公平和简单。缺点也很明显,未对寻道进行优化,使得平均寻道时间较长。【最短寻道时间优先,SSTF】优先调度和当前磁头所在磁道距离最近的磁道。虽然平均寻道时间比较低,但是不够公平。如果新到达的总是比一个等待的近,那么等待的就会一直等,就会饥饿了。具体来说,两端的磁道请求更容易出现饥饿。...原创 2022-03-26 12:34:02 · 318 阅读 · 0 评论 -
【csnote】磁盘结构、磁盘调度算法
【磁盘结构】盘面:一个磁盘有多个盘面磁道:盘面上的圆形带状区域,一个盘面可以有多个磁道扇区:磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理存储单位,目前主要有512bytes和4k两种磁头:与盘面非常接近,能够将盘面上的磁场转换为电信号(读),也可以反转(写)制动手臂:用于磁道之间移动磁头主轴:使得整个盘面转动【磁盘调度算法】读写一个磁盘块的时间的影响因素有:旋转时间(主轴转动盘面,使得磁头移动到适合的扇区)寻道时间(制动手臂移动,使得磁头移动到适当的磁道)实际的数据传输时间原创 2022-03-25 13:55:22 · 467 阅读 · 0 评论 -
【csnote】段页式、分页分段比较
【段页式】程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既有分段系统的共享和保护,又拥有分页系统的虚拟内存功能【分页和分段的比较】对程序员的透明性:分页透明,但是分段需要程序员显式划分每个段地址空间的维度:分页是一维地址空间,分段是二维大小是否可以改变:页的大小不可变,段的大小可以动态改变出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要为了使程序和数据可以被划分成逻辑上独立的地址空间并且有助于共享和保护...原创 2022-03-24 11:52:07 · 456 阅读 · 0 评论 -
【csnote】分段
【分段】虚拟内存采用的是分页技术,也就是把地址空间划分成固定大小的页,每一页再与内存进行映射下图为一个编译器在编译过程中建立的多个表,有4个表是动态增长的,如果使用分页系统的一维地址空间,动态增长的特点会导致覆盖问题的出现。分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。...原创 2022-03-23 22:19:26 · 246 阅读 · 0 评论 -
【csnote】第二次机会算法、时钟
【第二次机会算法】FIFO算法可能会把经常使用的页面置换出去,为了避免在这一问题,怼该算法做一个简单修改:当页面被访问(RorW)设置该页面的R位为1.需要替换的时候,检查最老页面的R位。如果R位是0,说明这个页面又老又没有被使用,可以立刻置换掉;如果是1,就将R位清0,并把该页面放到链表的尾端,修改它的装入时间使得它就像刚装入的一样,然后继续从链表的头部开始搜索【时钟】第二次机会算法需要在链表中移动页面,降低了效率。时钟算法使用环形链表将页面连起来,再使用一个指针指向最老的页面。环形链表无需原创 2022-03-22 13:55:18 · 1132 阅读 · 0 评论 -
【csnote】页面置换算法
【最近未使用】NRU,Not Recently Used每个页面都有两个状态为:R和M,当页面被访问地时候R = 1, 当页面被修改的时候设置M = 1.其中R为会定时被清零。分成四类:当发生缺页中断的时候,NRU算法随机从编号最小的非空类中挑选出一个页面换掉NRU优先患处已经被修改的脏页面(R = 0, M = 1)而不是频繁使用的干净页面(R = 1, M = 0)【先进先出】FIFO选择换出的页面都是最先进入的页面该算法会将那些经常访问的页面换出,导致缺页率升高...原创 2022-03-21 15:22:59 · 90 阅读 · 0 评论 -
【csnote】os内存管理
【最近最久未使用】LRULeast Recently Used虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU将最近最久未使用的页面换出。为了实现LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头,这样就能保证链表表尾是最近最久为访问的。由于每次访问都要更新链表,代价很高。...原创 2022-03-20 15:38:56 · 455 阅读 · 0 评论 -
【csnote】页面置换算法和最佳置换算法
页面置换算法在程序运行过程中,如果要访问的页面不在内存中,就会发现缺页中断从而将该页调入内存中。此时,如哦内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当新缓存到达需要淘汰才能放新的。页面置换算法的目标是使得置换频率最低(缺页率最低)最佳置换所选择的被换出页面是最长时间内不再被访问的,通常可以保证获得最低的缺页率。理论上的算法,因为无法知道一个页面多久时间不再被访问。...原创 2022-03-18 15:02:57 · 301 阅读 · 0 评论 -
【csnote】分页系统地址映射
内存管理单元(mmu)管理着地址空间和物理内存的转换,其中的页表存储着页(程序地址空间)和页框(物理内存空间)的映射表一个虚拟地址分两个部分,一部分存储页面号,另一部分存储偏移量上图这个页表存着16页,这16页需要4个bits来进行索引定位,例如虚拟地址0010000000000100,前四位对应存储页面号2,读取内容1101,最后一位1表示在内存,后12位是存储偏移量,对应的页框地址是110000000000100...原创 2022-03-17 13:58:17 · 648 阅读 · 0 评论