自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 现代操作系统之内存虚拟化的处理(结合具体代码示例)

虚拟化内存是一种内存管理技术,通过将物理内存抽象成虚拟地址空间,使得每个进程拥有独立的地址空间。这种方法不仅提升了内存利用率,还提高了系统的安全性和稳定性。虚拟化内存管理通过分页和交换机制,实现了内存资源的高效利用和灵活管理。通过使用 TLB 和优化的页表结构,系统能够快速进行地址转换。同时,操作系统采用多种交换策略,在内存紧张时有效释放资源,确保系统性能和稳定性。了解这些机制和策略,对于深入理解操作系统的内存管理原理,以及优化程序性能,都具有重要意义。

2024-05-23 00:03:04 648

原创 基于链表实现的Map与二叉搜索树的Map对比

Set;总体而言,ULLMap实现简单,适用于小规模数据集,操作效率在键值对数量较少时表现尚可。然而,随着数据规模增大,其操作性能会显著下降。而BSTMap尽管实现复杂,但在大规模数据集下操作效率更高,尤其在平衡树情况下,其查找、插入和删除操作的性能明显优于ULLMap。因此,在需要处理较大数据集或对操作效率要求较高的情况下,BSTMap是更合适的选择。

2024-05-22 00:05:28 1216

原创 结合libc手册描述libc与Linux的爱恨情仇

libc是标准C库,包含了一系列标准函数,这些函数可以被所有C程序以及其他语言的程序使用。提供基础函数:如字符串处理、内存管理、输入输出操作等。封装系统调用:为程序提供一致的接口,使得开发者不必直接处理复杂的系统调用。libc作为Linux系统的标准C库,在程序开发中扮演着基础且关键的角色。它不仅为C语言提供了标准化的函数库和系统调用封装,还通过其高度优化的实现和广泛的功能支持,为高级编程语言提供了可靠的基础。

2024-05-21 00:00:44 1002

原创 二分查找介绍

二分查找是一种在排序数组中查找目标值位置的搜索算法。它通过反复将搜索区间一分为二来实现,直到找到目标值或搜索区间为空。二分查找利用数组已排序的特性,将时间复杂度降低到 O(log N)。

2024-05-20 00:20:05 508

原创 CS61B:并查集

并查集(Union-Find)是一种数据结构,用于处理不相交集合(Disjoint Sets)的合并和查询操作。它非常适合解决动态连通性问题,例如在图论中判断两个节点是否属于同一个连通分量。并查集的主要操作有两个:查找(Find)和合并(Union)。并查集通常使用一个数组来实现,数组中的每个元素表示一个节点,值表示该节点的父节点。如果某个元素是根节点,则其值为负数,表示集合的大小(按大小合并)或秩(按秩合并)。并查集以其高效的操作和易于实现的特性,成为解决连通性问题的常用工具。

2024-05-19 00:00:25 408

原创 Frangipani: A Scalable Distributed File System(解读)

在一段时间内,关于新创建文件的信息只存在于该工作站的缓存(RAM)中。第5节说,当Frangipani工作站释放读锁时,必须使缓存数据失效,并在释放写锁时将修改后的缓存数据写回Petal。如果一个工作站在系统调用完成后,但在发送相应的日志条目到Petal之前崩溃会发生什么?如果一个工作站在系统调用完成后,但在发送相应的日志条目到Petal之前崩溃会发生什么?如果: WS1持有一个锁,WS2认为WS1已经死亡,进行恢复,释放WS1的锁,如果WS1实际上是活着的,它随后能够尝试写入被锁定的数据吗?

2024-05-17 00:23:06 523

原创 Chain Replication for Supporting High Throughput and Availability,Chain Replication笔记

由于头部和尾部的负载可能比中间节点的负载更高,可能出现性能受到头/尾限制的情况,但中间节点却有大量空闲CPU的情况。更好的方法是提前传输状态的快照,然后冻结系统的时间足够长,以发送最后几个更新到新尾部,然后重新配置并解冻,可能使用ZooKeeper的模糊快照概念。现在,假设三个链上的活动大致相等,那么三个服务器的负载也将大致相等。通过这样的布置,请求处理工作可能更加均衡,因为每个服务器参与了多个分片组,而且分片的大小相对较小。对于主/备份系统,服务器在一些组中是主服务器,在其他组中是备份服务器。

2024-05-16 00:01:33 629

原创 详述进程的地址空间

表头:地址 (范围) ,权限 (rwxsp),对应的文件: offset, dev, inode, pathname。进程的地址空间 = 内存里若干连续的 “段”libc后的空白部分,是未被初始化的变量。合法的地址 (可读或可写)管理进程地址空间的系统调用。Execve 之后……

2024-05-15 00:19:35 1247

原创 Dash Shell手册解读

Dash (Debian Almquist Shell) 是一种符合 POSIX 标准的 Unix Shell,是 /bin/sh 的一个实现,目标是最小化和提高速度。Dash 是从 NetBSD 的 ash (Almquist SHell) 演变而来,并在 2002 年被重新命名为 Dash。Dash 特别适用于脚本执行,因为它启动速度快,执行效率高。掌握 Dash 的这些高级功能将使你能够编写更有效、更健壮的 Shell 脚本,不仅能够提高个人的工作效率,也能在整个系统层面带来性能的提升。

2024-05-14 00:02:11 967

原创 Git深入指南:核心概念和操作

通过本指南,您应该能够掌握Git的核心操作及一些高级功能,这将帮助您更有效地使用Git管理您的代码库和团队协作.持续实践是精通Git的关键,不断探索新的工具和命令可以帮助您更好地解决实际问题。

2024-05-13 08:20:52 1358 1

原创 Zookeeper笔记,MIT6.824

一旦旧协调器意识到会话已经失效,它可以创建一个新的会话,但此时它知道自己不再是协调器。因此,虽然可能存在一小段时间内的竞争情况,但在会话超时后,ZooKeeper会自动防止旧的协调器修改状态,确保新的协调器能够顺利被选举。写请求被转发到一个称为 leader 的服务器,其余的ZooKeeper服务器,称为Follower,它们从leader接收消息(主要是状态),并商定状态更改。使用 ZooKeeper ,我们能够实现我们的应用程序所需要的所有协调原语,即使只有写入是可线性化的。

2024-05-12 14:37:07 1049

原创 多年后,再探算法和数据结构

多年来,通过深入学习和实践各种编程语言,我对数据结构和算法在程序设计中的中心地位有了新的认识。本次从汇编语言到高级编程语言的探讨,展示了无论技术如何进步,构成程序的核心—算法和数据结构—始终保持其基础和不变的角色。

2024-05-09 00:11:26 439 1

原创 fork,execve,_exit从第一个程序到所有程序

这样,我们就看到了一个完整的程序生命周期:创建、执行和终止,都是通过操作系统提供的系统调用来管理的。系统已经启动,并且我们需要从一个简化的 shell 启动一个程序,如。linux中的pstree的systemd的来历。→ 程序 (状态机) 执行 + 系统调用。操作系统会加载 “第一个程序”

2024-05-08 00:01:50 1229

原创 Raft共识算法图二解释

由领导者调用以复制日志条目,同时也作为心跳信号,以维持权威并防止超时。您的日志中可能有与领导者日志不同的条目。因为#3 规定只有在存在冲突条目。:由候选者调用,用于在选举中收集选票。即使领导者没有发送任何条目,也。:所有服务器的共通行为规则。:追随者的特定行为规则。:候选人的特定行为规则。:领导者的特定行为规则。

2024-05-07 12:56:53 1399

原创 Raft共识算法笔记,MIT6.824,

在Go中实现这一点的一种方法是,领导者在每个迭代中都在一个单独的goroutine中发送AppendEntries RPC,以便领导者可以并发地发送RPC。简而言之,日志在分布式系统中的作用是有序地记录命令,确保一致性,防止丢失,并帮助系统在发生故障或重启后保持一致状态。多数投票的一个关键特性是,任意两个交集中的服务器都可以传达关于先前决策的信息,例如,另一个 Raft 领导者已经在这个任期内被选举出来。Raft 可以在缺失一个服务器的情况下继续运行,但是必须尽快修复失败的服务器,以避免降到少数派以下。

2024-05-06 00:00:29 1113 1

原创 如何面对并发下的bug

应对bug的方法在代码里边增加很多检查(加断言)usleep(1);join();防御性编程:把程序需要满足的条件用 assert 表达出来。assert()并发bug:死锁 (Deadlock)上锁的顺序很重要……swap本身看起来没有问题,swap(1, 2);swap(2, 3)swap(3, 1)→ 死锁避免死锁死锁产生的四个必要条件互斥:一个资源每次只能被一个进程使用请求与保持:一个进程请求资阻塞时,不释放已获得的资源。

2024-05-05 07:06:58 1128

原创 并发控制同步

同步的实现方法:信号量、条件变量线程同步:在某个时间点共同达到互相已知的状态生产者-消费者问题:分析左括号:生产资源 (任务)、放入队列右括号:从队列取出资源 (任务) 执行retry:goto retry;count++;count--;多个线程都等待锁的时候,容易在goto循环出空转条件变量条件变量是一个显式队列,当某些执行状态(即某些条件)不符合预期时(通过等待条件),线程可以将自己放入其中;

2024-05-04 00:02:43 1090

原创 并发控制互斥笔记

多处理器系统中数据的一致性和互斥访问所有的CPU的一级缓存都是连着的,如果是多个CPU的话,用在内存中放置标志位,来保证对当前内容的原子性读取,Xchg指令。Lock 指令的现代实现(自旋锁)(类似于悲观锁)retry:goto retry;通常描述在 L1 cache 层保持一致性 (ring/mesh bus)相当于每个 cache line 有分别的锁(实际上,这不是传统意义上的锁。

2024-05-04 00:01:37 750

原创 多线程编程并理解并发的执行笔记

并发概念:并发是指程序、算法或问题的不同部分或单元可以不按顺序或者部分顺序执行,而不影响最终结果的能力。并发的基本单位:线程(共享内存的多个执行流)执行流拥有独立的堆栈/寄存器共享全部的内存(指针可以互相引用)入门create(fn)创建一个入口函数是fn的线程,并立即开始执行参数tid从 1 开始编号语义:在状态中新增 stack frame 列表并初始化为fn(tid)join()等待所有运行线程的fn返回在main返回时会自动等待所有线程结束。

2024-05-03 00:06:45 1043

原创 Primary/Backup Reolication,基于VMFT,mit6.824笔记

系统使用一个网络磁盘服务器,由主服务器和备份服务器共享(图 1 中的 “共享磁盘”)。如果主服务器或备份服务器认为另一台服务器已经死机,因此它应自行接管,那么它会首先向磁盘服务器发送“test and set”操作。如果主服务器或备份服务器中只有一个能与磁盘服务器通信那么只有这台服务器会启动。主系统(或备份系统)只有在 test-and-set返回true,主系统(或备份系统)才会接管(“上线”)。共享磁盘服务器必须可靠,如果磁盘服务器宕机,服务也会宕机,所以需要使用昂贵的容错磁盘服务器。

2024-05-02 10:35:53 741 1

原创 操作系统:现代计算的基石

操作系统作为计算机系统中至关重要的组成部分,它不仅是资源的管理者,也是提供必要服务的平台。通过管理程序的状态变化和执行系统调用,操作系统确保了程序的高效和安全运行。深入理解操作系统如何处理这些任务,对于开发高效且安全的应用程序是非常重要的。它不仅帮助程序员更好地利用操作系统提供的服务,也有助于系统管理员更有效地管理和优化系统性能。

2024-05-02 00:14:38 26 1

原创 深入探索Google文件系统(GFS):架构、客户端交互与系统实践

本文全面探讨了GFS的设计理念、架构细节、客户端交互模式以及其在解决实际问题中的表现,从而揭示其如何优雅地处理大规模数据集并支持高效的数据操作。通过学习GFS的设计和实践,我们可以获得对现代大规模分布式系统的深刻理解,这对于任何需要处理大数据的系统设计都是极其宝贵的经验。这些设计目标导致了GFS特有的架构选择,特别是其对数据的分片(sharding)、复制和延迟一致性的处理。客户端与GFS的交互主要包括文件的读取和写入操作,这些操作体现了GFS设计的效率和复杂性。

2024-05-01 00:09:06 525 1

原创 深入探索:从输入网址 `www.qq.com` 到页面显示的完整网络流程

从简单的操作到复杂的后台处理,这一系列步骤展示了现代互联网技术的复杂性和精确性。理解这些基础的网络交互过程,可以帮助我们更好地理解网络应用的性能、优化和安全问题。本文旨在揭露当你浏览网站时,背后发生的技术细节和过程。

2024-04-30 07:20:49 388 1

原创 电脑启动的过程结合最小操作系统

脚本时,整个过程可以被理解为一个模拟的启动流程,从物理机硬件的初始化到操作系统层面的启动,直到达到用户空间初始化。这些组件共同工作,确保Linux系统能够有效地启动和运行。提供了所需的环境和工具来成功地加载系统的其余部分。则简化了开发和构建过程,使得更新和维护更为简便。命令启动 QEMU 并运行您提供的。负责引导过程中的早期阶段,而。

2024-04-29 07:44:27 1221

原创 RPC与Thread笔记

协程与线程的区别在于协程是完全在应用程序内 (低特权运行级) 实现的,不需要操作系统的支持,占用的资源通常也比操作系统线程更小一些。服务器最终必须丢弃旧RPC或者旧客户端的信息,何时丢弃是安全的,当原始请求仍在执行时,如何处理重复请求。事件驱动可以实现I/O并发,并且消除了线程的成本(可观),但无法获得多核的速度,并且编程很麻烦。当线程并行执行的时候,如果内核数量少于可运行的线程数,运行时将抢先在线程之间分配内核。eg:每个客户端的请求。最简单的故障处理方案:“尽最大努力交付”的RPC。

2024-04-28 09:55:56 1107 1

原创 MapReduce笔记

Map分裂输出,通过哈希函数将其写入Reduce之前的预处理文件。每个Reduce任务从所有Map worker处获取其中间输出。Master将Map分配给worker,直到所有的Map完成。在所有的Map完成之后,Master分配Reduce任务。一个Master,负责向worker分配任务并记录进度。每个Reduce在GFS上写入一个单独的输出文件。Map将输出(中间数据)写入本地磁盘。worker崩溃后恢复的细节。MR如何最小化网络的使用。MR如何获得好的负载均衡。

2024-04-28 09:41:14 810

原创 CS61B:循环队列

扩容成本: 扩容操作涉及到内存的重新分配及数据的复制,特别是当队列大小达到数组容量时,每次添加元素都可能触发扩容,这可能导致较大的性能开销。固定容量: 初始需要定义数组的大小,虽然可以动态扩容,但这是通过创建新数组并复制旧数组元素来实现的,耗费时间和空间。复杂度: 在链表的头部和尾部添加或删除元素都是常数时间的操作(O(1)),因为不需要移动其他元素。缓存不友好: 链表的节点可能在内存中不连续,导致缓存命中率降低,可能影响性能。可能的空间浪费: 如果队列的使用量远小于数组的实际分配大小,会造成空间浪费。

2024-04-27 22:31:22 1233 3

原创 CS61B:线性表

【代码】CS61B:线性表。

2024-04-25 20:04:20 464

原创 MIT 6.824 Lab1 MapReduce实现思路

mit6.824的lab1,实现MapReduce

2024-04-22 16:47:09 561

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除