- 博客(26)
- 收藏
- 关注
原创 go语言的Reflect包
Struct结构体:.NumField()字段数量,.Field(i)第i个字段,.FieldByName(name),.FieldByIndex(index)按嵌套索引访问字段。Func函数:.NumIn()/.NumOut()入参出参个数。.In(i)/.Out(i)第i个输入输出参数类型。Array/Slice:.Elem()元素类型,.Len()数组长度。Chan通道:.ChanDir()通道方向.Elem()通道元素类型。Kind == Ptr()指针:.Elem()指针指向的类型。
2026-04-16 15:42:23
98
原创 Go设计模式学习
设计模式是解决常见编程问题的通用方案,分为创建型、结构型和行为型三大类共23种模式。创建型模式(6种)包括单例、工厂、抽象工厂、建造者和原型模式,主要用于对象创建和实例化控制。结构型模式(7种)如代理、桥接、组合、装饰器、适配器、外观和享元模式,关注类和对象的组合方式。行为型模式(11种)如责任链、命令、迭代器、中介者和观察者模式,处理对象间的交互和通信。这些模式通过封装变化、解耦组件、提高复用性来增强代码的可维护性和扩展性,是构建高质量软件系统的重要工具。
2026-04-13 12:22:00
349
原创 RPC项目学习1
早期所有应用运行在单个服务器上时,单台服务器性能容易到达瓶颈。任意服务出现故障可能影响整个系统。RPC调用需要调用其他服务器上的函数,所以需要通过网络发送请求,对方计算完成后再通过网络返回结果。现代系统会把多个独立服务拆分到不同服务器上,RPC时用来解决不同服务与服务之间通信的。客户端需要把服务名、方法名(Add)、参数(1,2)序列化通过TCP发送给服务器。服务器通过反射找到服务计算并返回结果,将结果返回客户端。(通常在另一台机器)的函数。隐藏了网络通信复杂性。
2026-04-11 21:47:41
17
原创 《CSAPP》12
本质是:通过select/poll/epoll同时监听多个文件描述符,任一fd就绪时,内核通知进程,进程串行处理就绪事件。线程完全共享地址空间、文件描述符、有独立的栈、创建开销小、上下文切换开销小、可以直接读写共享变量通信。利用OS的进程作为并发单元,通过fork创建拥有独立地址空间的子进程处理并发任务。进程间共享状态需要管道或者共享内存,复杂->线程共享地址空间。进程创建/切换开销大(毫秒级)->线程模型。使用内核通知机制->仅当I/O就绪时处理。使用单进程管理所有的连接去解决进程开销。
2026-03-24 15:40:21
37
原创 《CSAPP》11
代码运行在主机上,主机拥有IP和端口用来定位服务,发出去的信息经过路由器,链路,交换机等设备到达目的主机。type:可选SOCK_STREAM(TCP)\SOCK_DGRAM(UDP)\SOCK_SEQPACKET。domin:可选AF_INET(ipv4)\AF_INET6(ipv6)\AF_UNIX(本地)->经过路由器转发->服务器网卡接收->逆向解封装->应用层read()得到"Hello"。模型通信的基本操作是“事务”,指客户端与服务器之间一次完整、原子的请求-响应交互过程。
2026-03-23 16:47:39
358
原创 《CSAPP》10
将所有的I/O资源(磁盘文件、键盘、显示器、管道、套接字、设备)同意抽象为字节流,通过相同的接口操作。文件既可以是磁盘文件,也可以描述打开文件,通过FD进行访问的内核进程实例,通过文件描述符描述。rio_cnt指出缓冲区中剩余容量,rio_bufptr指针指向缓冲区还未取走的字节。元数据是指描述文件的属性。通过stat系统调用查询。File Descriptor(FD)文件描述符。每个进程启动时OS会分配三个标准文件描述符。进程级的非负整数句柄。生命周期为进程私有。
2026-03-22 18:40:52
306
原创 《CSAPP》09
为进程提供一致的私有地址空间抽象。作为缓存工具:缓存磁盘内容作为管理工具:简化链接、加载、共享库、内存分配。作为保护工具:设置页表权限位,实现进程隔离和安全。
2026-03-20 15:31:33
334
原创 《CSAPP》08
控制:PC程序计数器的值,指向了下一条执行的指令地址。是CPU调度的“原子量”。流:描述了指令的变化轨迹,表示PC随时间变化,包含了时间和顺序。控制流:程序按照逻辑结构(循环,分支,顺序,函数调用)形成预期执行路径。异常:处理器检测到改变了正常(预期)控制流的事件。有中断、陷阱、故障、终止等。异常控制流EOF:由异常事件的、的控制转移。
2026-03-18 21:29:59
348
原创 《CSAPP》07
链接,作为编译(预处理->编译->汇编->链接)的最后一个阶段,打通了目标文件到最后可执行文件的最后一步。静态链接由ld将所有依赖的目标代码(包含.a中归档的.o文件)完整复制到可执行文件中。过程是符号解析(解析全局变量、外部方法,局部符号)->段合并(将所有输入目标同名段合并)->重定位地址(重排地址,修正引用地址为新地址)->生成ELF可执行文件。是编译器生成的二进制容器,封装代码、数据、元数据(符号、重定位信息)等。ELF标准ELF头包含了类型Type(可重定位,可执行,共享)、适用机器(x86-64
2026-03-17 16:55:29
348
原创 《CSAPP》06
当矩阵太大,无法全部放入 Cache 时,将其划分为小块(Tile),确保每个块能完全驻留在 Cache 中。2.写回->更新Cache标记Dirty=1,当Block被驱逐时,写回主存。A被划分未Tag(高位)+Set Index(中间位)+Block Offset(低位)如数组或者结构体在内存中连续存储,指令在内存中连续存放。如果一个内存位置被访问了,拿在不久的将来很可能会再次被访问。如果一个位置被访问了,那么他附近的内存位置很可能很快被访问。->预取相邻的数据(Cache Line64字节)更高效。
2026-03-16 15:24:45
325
原创 《CSAPP》05
硬件无法从缓冲区中拿一个偏移数据,需要等待store后重新load,造成大量延迟。3.浮点运算的非结合性,因为浮点运算会出现精度损失和NaN传播,优化会改变结果。1.副作用不确定(编译器不敢确定函数方法是否会修改状态内容,必须保守保留)2.指针别名,编译器不确定是否两个指针指向同一地址,所以放弃优化。之前每次循环都要访问内存和存储内存,容易阻塞流水线,造成缓存污染。编译器无法假设“连续内存访问更快”,需程序员显式优化数据布局。首先要理解编译器的能力,会保守的按照规则进行优化。每个元素平均消耗的时钟周期。
2026-03-14 14:54:19
212
原创 《CSAPP》04
流水线是将阶段拆分,对于非流水线,对于非流水线来说,同一时间只有一条指令在执行,比如写回阶段,需要等前面的阶段都完成去执行一次。但是流水线将阶段独立出来,同一时间有多个指令在执行,写回阶段一直在工作,每个阶段增加寄存器,通过空间记录定位指令。PC,内存,状态码等。首先是要把指令执行组织为阶段,方便模块化设计,单个阶段控制逻辑边界清晰,为后续流水线化提供支持。icode是高4位负责定位指令类型,ifun负责低4位负责功能变体标识。相对不可见的就是:内部执行流水线,分支预测,内部缓存TLB,时序信息。
2026-03-13 13:17:35
24
原创 《CSAPP》03
最初的8086是16位的,实践中16位又被称为一个字(word),对于现在的64位机器来说,char*,int*,shrot*都是4个字64位的。对于cpu数据有三个来源1.立即数,常量值。2.寄存器,CPU内部存储单元的值。3.内存引用,内存地址处的值。数据无非就是这三个层面来回倒腾。代码.c---(预处理)-->代码.i---(编译)--->代码.s---(汇编)--->代码.o---(链接)--->代码。
2026-03-12 16:05:35
13
原创 《CSAPP》02
result = (A+B)mod2^w,对于CPU不关心是补码还是无符号,只是对位序列执行加法。有符号右移,需要向0舍入,-3.5=》-3,则编译器会在右移前根据数字的属性加上数字偏执,让其向0舍入。double(64位) =>1位符号位(正负)+11位阶码(指数E)+52位尾数(有效数字)float(32位) =>1位符号位(正负)+8位阶码(指数E)+23位尾数(有效数字)整数 = 位 + 编码(上下文),位本身不变,编码规则改变,解释的数字就会改变。,符号位为0补0,符号位为1补1。
2026-03-11 16:55:41
194
原创 《CSAPP》学习
信息就是位+上下文位本身没意义,对于统一穿位序列,在不同的地方有不同的解释'h'104push rax上下文是位在计算机系统的与,所有能够的的总和。对于一个位序列,根据解释者是谁(上下文)来决定最终是什么意思。
2026-03-11 14:26:38
158
原创 《苍穹外卖》Day5
List:按照插入顺序排序,可重复。zset:有顺序集合,不可重合。Hash:散列,类似于哈希表。Set:无序集合,不可重复。String:字符串类型。删除集合中一个或多个成员。key存在删除key。
2026-03-10 15:05:07
23
原创 《苍穹外卖》Day4--学习整理
java的Thread是对OS Thread的映射,每一个java线程都会映射到一个OS线程,所以java线程比较重,实际使用重会大量使用线程池对线程进行复用而非大量创造线程。JMM中分为主内存和工作内存,主内存所有线程都可以访问,工作内存是每个线程自己私有,负责保存主内存中变量的一个副本。Controller:控制层,负责接收请求、参数校验、调用Service服务、返回响应。封层后的好处:权责清晰、测试方便、代码容易复用、方便并行开发、维护方便。提供了整个项目的通用工具和基础组件,不包含业务逻辑。
2026-03-07 15:22:05
296
原创 《苍穹外卖》Day3
AOP编程,区别于OOP编程,在业务开发过程中,有许多与业务联系不紧密但又频繁出现的操作,如果每次编写类方法中都实现首先是代码十分冗余,其次就是与业务耦合不利于后期维护和更新。所以可以尝试把这些频繁出现的事情抽象出来,认为是多个类之间的一个切面进行编程。这就是面向切面编程。在业务开发中有许多公共字段比如:创建时间,创建人id,修改时间,修改人id等,每次新添代码都要新编写,十分冗余,不便于后期维护。
2026-03-06 09:52:52
10
原创 《苍穹外卖》Day2
DTO(Data Transfer Object):类似于服务器业务的一个漏斗,可以过滤去数据库中不必要的数据,保存需要的数据或是返回前端或是传递给系统内部,不需要把全部数据返回。后端返回处理结构,包含code(说明返回是否成功),data(需要的信息,可为null),msg(需要的信息,可为null)。VO(Value Object):类似于服务器业务与前端的漏斗,可以聚合多个表的数据封装到一个对象返回给前端,使用灵活。前端传一个POST请求,Header包含了文本类型,Body包含必要信息。
2026-03-03 22:15:04
24
原创 《苍穹外卖》Day1
管理端-为外卖商家使用;用户端-为用户使用管理端:员工管理、分类管理、菜品管理、套餐管理、订单管理、工作台、数据统计、来单提示用户端:登录、商品浏览、购物车、用户下单、微信支付、历史订单、地址管理、用户催单反向代理和负载均衡反向代理指的是nginx作为一个进程扮演了后端服务器的一个入口,让客户端不知道后端真实地址的情况下访问资源,可以隐藏后端复杂的服务器配置细节,也同时提供了安全性。
2026-03-02 22:09:39
665
原创 《操作系统真象还原》第十章-输入输出系统
当按下键时,会产生一个通码,如果按下不松手就会一直产生通码,当按键松开产生断码。因为键盘随着时间标准不断发展,相同按键在不同的按键中对应的编码不同,但又要在中断处理程序中根据扫描码判断具体按键,所以引入8042这个中间层进行处理。排查GP异常:访问公共资源需要多个操作,而多个操作执行过程不具备原子性,如果任务调度器断开,让其他线程有机会破坏公共资源现场。P操作包含三个操作:判断信号量是否大于0,若大于0信号量减1,若等于0,让线程阻塞等待。当信号量的值为1,V操作为释放锁,P操作为获取锁。
2026-01-29 15:46:39
233
原创 《操作系统真象还原》第九章-线程
任务调度器在内核维护一个任务表,按照一定的算法从任务表中选择一个任务并放到cpu上运行,等待任务运行时间到后,再从任务表中找到一个任务放到处理器上。线程是运行代码函数的方式,但与正常函数调用的区别是,线程是作为一个单独的调度单元独立上CPU运行,正常函数调用是作为进程或线程的一部分上cpu调度。进程中单个线程阻塞不会让整个进程挂起,其余线程仍可上cpu执行。进程是正在运行的程序,程序获得运行所需的资源才成为进程。进程是控制流的集合,其控制流的调度单位就是线程。每个进程都拥有自己的PCB并放在进程表中维护。
2026-01-25 20:37:56
276
原创 《操作系统真象还原》第八章-内存管理系统
位bit即字节中的位,图map即为位映射的资源。可以使用字节中具体位去代表一份资源状态,比如被使用或者没有被使用。空间利用率更高,只需要一个bit就可以代表一份资源通过位操作操作速度快原子性比较好/*遍历位图时,正以上以字节为单位,细节上是以位为单位,所以位图的指针必须是单字节*/#endif/*初始化位图bitmap*//* 判断bit_idx位是否为1,若为1,返回true,否则返回false *///向下取整用于索引数组下标//取余用于索引数组内的位。
2026-01-23 23:53:02
466
原创 《跟我一起写Makefile》学习笔记
makefile是为了解决大型项目编译与链接流程问题。编译是将源文件.c生成目标文件.o,中间流程有预处理(宏展开、删注释、头文件代码插入)、编译(检查程序语法,函数和变量声明,生成对应平台接收的汇编代码)、汇编(将慧彬代码翻译为机器码,生成目标文件)。链接目标是将多个.o目标文件和库文件合并为可执行的文件。扫描所有库和目标文件,为每一个未定义符号都找到其定义。分配代码段、数据段等对应的虚拟内存地址。合并代码段、数据段等并链接处理库最后生成可执行的代码文件。
2026-01-21 22:22:45
744
原创 《操作系统真象还原》第七章-中断
对于可屏蔽中断因为cpu对其认为不太重要,可以选择屏蔽不处理或者分为上下两部分处理(将紧急先处理,不紧急后处理),各有各的中断向量号。Intel 8259A是一个中断代理芯片,负责管理和控制可屏蔽中断,对外设中断进行屏蔽、进行优先级判断和向CPU提供中断向量号。中断描述符表种记录了中断处理程序的入口,当CPU接收中断时,需要在此表中找到对应中断处理程序起始地址然后进入。对于不可屏蔽中断可以认为是物理硬件问题,软件无法修复,顾不会有特定的中断号进入中断处理,中断号统一为2。从NMI进入的是不可屏蔽的中断。
2026-01-20 18:33:59
765
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅