内存管理(ObjectPool/BlockHeader/FreeNode),一切数据结构的地基,项目最底层,AI最容易写错的区域:对齐、无锁、虚拟内存——你不懂就看不出AI的坑
“掌握底层知识,AI代码有坑”。内存管理是这个项目最深的水,也是AI代码最容易出事的地方。你如果把这个搞透了,后面所有数据结构你都能”透过现象看本质”。
它是什么想象一个工厂:
你开了一个生产零件的工厂(程序运行)。每次需要零件,你就去仓库拿一个(new)。用完了扔掉(delete)。但问题来了:
每次去仓库拿零件都要填申请表、走审批(malloc/new 很慢)
零件到处乱扔,仓库碎片化了(内存碎片)
多个车间同时去拿零件,可能撞车(并发竞争)
ObjectPool 就是你的”零件自助货架”:预先把一整排货架拉进来(VirtualAlloc大块内存),每个零件摆在固定位置,拿的时候不需要审批(无锁CAS),放回来直接扔进回收箱(FreeNode链表)。
三个核心角色:
角色 大白话 代码本质BlockHeader 一排货架,带一个计数器显示”已用几个” alignas(64) 的内存块头 + atomic 已用计数 + 柔性数组 char data[]FreeNode 回收箱里的一张纸条,写着”这个位置空了” atomic<FreeNode*> 链表,无 ...
我要开一个超市,超市里面卖的是“计算机网络(4)”
第八阶段:超市帝国的新挑战 —— 补齐遗漏的核心知识点随着超市帝国不断扩张,我们遇到了一些新的业务场景,这些场景恰好对应了计算机网络中那些尚未提及的关键技术。
1. 无线超市与移动POS机 —— 无线网络与CSMA/CA为了提升顾客体验,我们引入了移动POS机,收银员可以拿着手持终端在货架旁直接结账。这些设备通过Wi-Fi连接网络。
问题:无线环境和有线完全不同。在空气中,信号会衰减、干扰,而且设备无法像有线那样“边发边听”(因为无线收发通常不能同时进行)。如果两个POS机同时发送,信号在空中碰撞,就会导致数据损坏。这就像两个收银员同时喊话,互相听不清。
解决方案:CSMA/CA(载波监听多点接入/冲突避免)这是Wi-Fi(802.11)采用的协议。它不像有线以太网的CSMA/CD那样检测冲突,而是主动避免冲突:
先听后说:发送前先监听信道,如果空闲,则等待一个随机时间(帧间间隔)后再发送,减少碰撞概率。
虚拟载波监听:通过RTS/CTS机制(请求发送/允许发送),发送方先发一个RTS帧,包含要占用的时间;接入点回复CT ...
我要开一个超市,超市里面卖的是“计算机网络(3)”
从街角小店到零售帝国:用开超市彻底搞懂计算机网络(终极完整版)设想一下,我不只是开一家超市,而是要打造一个像沃尔玛、亚马逊那样的零售帝国。从第一家街角小店开始,一步步扩张到全国连锁、线上线下一体化、最后走向全球。这个过程遇到的所有问题,恰好就是计算机网络从诞生到演进所解决的所有问题。
第零章:顶层设计 —— 网络体系结构在动工之前,我得先有个总体规划。超市需要分成不同部门(采购部、仓储部、销售部),部门之间要明确分工和接口。这就是 网络体系结构 。
OSI七层模型 就像一套理想化的完美超市设计蓝图,把功能分成七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。它概念清晰,但过于复杂。
TCP/IP四层/五层模型 是现实中互联网采用的方案,它更务实,把会话层和表示层合并到应用层,形成了我们熟知的应用层、传输层、网络层、数据链路层、物理层 。我们的超市帝国就按这个架构来搭建。
第一阶段:物理层 —— 超市的实体基础设施超市得有实体店面。位置选在哪?货架怎么摆?通道多宽?这些都是物理层要考虑的。
传输介质:开在市中心繁华地段(光纤),带宽大、速度快, ...
我要开一个超市,超市里面卖的是“计算机网络(2)”
用开超市彻底搞懂计算机网络(深度扩展版)假设我要开一家大型连锁超市,从选址、装修到运营、扩张,整个过程中遇到的各种问题,恰恰对应了计算机网络要解决的核心问题。下面我们就一步步展开,把每一层、每一个关键技术都串起来,并且深入细节。
第一阶段:超市的物理基础设施 —— 物理层超市要开业,首先得有个地方。选址决定了超市的客流潜力,这就像物理层,负责把原始的比特流从一个地方传到另一个地方。物理层要考虑介质(双绞线、光纤、无线电波)、接口形状(RJ45、SFP)、电压、频率等。
问题:超市开在市中心(光纤)带宽大、速度快,但成本高;开在郊区(双绞线)成本低,但速率有限。如果选址在偏远山区(无线),信号可能受天气干扰。物理层就是解决这些物理传输问题的,它定义了“怎么把0和1变成光信号或电信号发出去”。
第二阶段:超市内部商品管理 —— 数据链路层超市有了物理空间,接下来要摆货架、放商品。每个商品都需要一个唯一标识,方便顾客找到,这就是 MAC地址,是设备出厂时烧录的,全球唯一。
问题:如果多个顾客同时去拿同一货架的商品,就会发生冲突。早期以太网用 CSMA/CD(载波监听多点接入& ...
我要开一个超市,超市里面卖的是“计算机网络(1)”
第一阶段:超市的物理选址与布局 —— 物理层
假设我想开一家超市,首先得选个地方。这就像计算机网络里的物理层,负责把原始比特流从一个地方传到另一个地方。选址要考虑交通是否便利、人流量大不大,对应到网络里就是用双绞线、光纤还是无线信号。比如,超市开在市中心,就像用光纤,带宽大、速度快;开在偏远郊区,就像用双绞线,成本低但速率有限。物理层定义了接口的机械、电气特性,比如RJ45网口的针脚定义,或者Wi-Fi的频段和调制方式。没有物理层,数据就是空中楼阁。
第二阶段:超市内部商品摆放与顾客拿取 —— 数据链路层
超市选好址,接下来要布置货架、摆放商品。每个商品都得有个标签,方便顾客找到,这就好比数据链路层的MAC地址,是设备出厂时烧录的唯一标识。货架之间要有过道,商品摆放要整齐,否则顾客会撞到一起——这就引入了介质访问控制(MAC)。早期以太网用的是CSMA/CD(载波监听多点接入/冲突检测),就像超市里大家先看看通道有没有人,没人就走,如果同时有人就退避再试。后来用交换机,每个端口独享带宽,就像给每个货架配了专属通道,避免了冲突。数据链路层还负责差错控制,比如CRC校验 ...
我要开一个超市,超市里面卖的是“操作系统(3)”
上次我们把超市扩展成了连锁集团,覆盖了进程、内存、文件、网络等核心模块。今天我再来做一次”总部巡视”,把之前遗漏的角落都检查一遍——比如安保系统(安全机制)、总部组织架构(操作系统结构)、紧急预案(中断与时钟)、以及新兴业务形态(虚拟化与分布式系统)。这样就能构建一个完整的操作系统知识图谱。
11. 操作系统安全机制:超市的安保系统超市运营中,安全是底线。操作系统作为资源管理者,必须提供全方位的安全保障。
11.1 身份认证——员工刷卡进门每个员工进入超市前必须刷卡验证身份。操作系统在用户登录时验证用户名和密码,这是最基础的身份认证。现代系统还支持生物识别(指纹)、双因素认证等。Linux的PAM(可插入认证模块)就像超市的模块化门禁系统,可以灵活配置多种认证方式。
11.2 访问控制——不同权限的工牌员工工牌决定了能进哪些区域:收银员只能进收银台,仓库管理员才能进仓库,店长才能进财务室。操作系统的访问控制机制与此类似:
DAC(自主访问控制):文件所有者可以随意设置权限,比如Linux的rwx权限。就像部门经理可以决定谁进自己的办公室。
MAC(强制访问控制):系统全局策略强制规 ...
我要开一个超市,超市里面卖的是“操作系统(2)”
这次我们把这个超市扩展成一家大型连锁超市集团,有多个分店、线上商城、中央仓库和会员系统。操作系统就相当于整个集团的管理中枢,负责调度所有资源。我们从最基础的开始,一步步深入。
0. 总体视角:操作系统是资源管理者操作系统管理CPU、内存、磁盘、网络等硬件,为上层应用提供抽象。就像连锁集团管理各个分店(进程)、货架(内存)、仓库(磁盘)、收银台(CPU核心)和网络订单。每个分店有自己的虚拟地址空间,感觉自己独占所有资源,实际上资源是共享的。
1. 进程与线程管理:分店的运营调度1.1 进程控制块(PCB)——分店的档案每个分店(进程)在操作系统里都有一个对应的结构体,比如Linux的task_struct,这就是PCB。它记录了分店的所有信息:
标识符:PID,分店编号。
状态:运行、就绪、阻塞(比如等货)。
程序计数器:当前正在执行哪一步(比如正在结账还是理货)。
CPU寄存器:上下文信息。
内存指针:指向分店自己用的货架(虚拟地址空间)。
打开文件表:分店正在用的文件(比如库存清单)。
信号处理:分店收到总部的指令(信号)如何处理。
资源统计:用了多少CPU时间、内存等。
1 ...
我要开一个超市,超市里面卖的是“操作系统(1)”
从开超市说起:操作系统的资源管理之道假设我要开一家超市。一开始,超市很小,只有一个收银台,一个货架,一个仓库。顾客进来,自己拿商品,然后到收银台结账。这就像一个单进程的单道程序,顺序执行,简单直接。
但很快,顾客多了,排队越来越长。我发现问题:只有一个收银台,顾客结账慢,而且收银员有时闲着(比如等顾客找零),CPU利用率不高。于是,我决定增加收银台,也就是引入多进程/多线程。每个收银台可以独立处理一个顾客,这样就能并行服务,提高吞吐量。
1. 进程管理与调度:收银台怎么分配顾客?现在有多个收银台,但顾客还是源源不断。我需要决定哪个顾客去哪个收银台,以及收银台的服务顺序。这就是CPU调度。
先来先服务(FCFS):最简单的,谁先到谁先结账。但问题是,如果一个顾客买了很多东西,结账时间很长,后面买一两件东西的顾客就得等很久,导致平均等待时间长。这就像长作业阻塞短作业。
短作业优先(SJF):让买得少的顾客先结账,这样平均等待时间短。但问题是有可能让长作业一直得不到服务,导致饥饿。
时间片轮转(RR):我规定每个收银台每次最多服务一个顾客1分钟,时间到了就换下一个顾客,循环往复。 ...
我要开一个超市,超市里面卖的是“数据库和中间件(4)”
第六章:超市精细化运营——补齐剩余核心知识点6.1 收银台排队:Redis List模拟队列超市收银台排队,可以用Redis的List结构模拟一个先进先出的队列。顾客结账时,LPUSH订单号到队列,收银员处理完后RPOP。List底层:当元素少时用ziplist,多时用linkedlist(quicklist)。quicklist是ziplist和linkedlist的结合,每个节点是一个ziplist,节省内存且支持两端操作。应用场景:除了收银队列,还可以用于异步任务(如发短信),但生产环境更推荐消息队列(因为Redis List不支持消息确认、重试)。不过,对于简单的、允许丢失的场景,List足够轻量。
6.2 会员标签:Redis Set实现精准营销超市想给会员打标签(如“高消费”、“生鲜爱好者”),用于定向推送。用Redis Set存储每个标签下的用户ID集合。Set底层:元素全为整数且数量少时用intset(有序数组),否则用hashtable。集合运算:计算“高消费且生鲜爱好者”的交集,用sinterstore,结果存入新key,后续推送用。Bitmaps替代:如果标签数量 ...
我要开一个超市,超市里面卖的是“数据库和中间件(3)”
第一章:筹备期——基础系统搭建(MySQL核心)1.1 选址与装修:数据库选型与存储引擎你准备开一家社区超市,需要一套系统管理商品、库存、销售。你选MySQL作为主数据库,因为要保证数据持久化、支持事务。
为什么选InnoDB?InnoDB支持事务(ACID)、行级锁、崩溃恢复,适合超市交易场景。MyISAM虽然查询快,但不支持事务,表锁并发差,只适合只读报表。我们决定所有核心表都用InnoDB。
1.2 货架摆放:表结构设计与数据类型优化商品表(product):
id BIGINT(主键,自增)
name VARCHAR(128)(变长,UTF8MB4支持emoji)
price DECIMAL(10,2)(精确小数,避免浮点误差)
category_id INT(分类ID,外键)
stock INT UNSIGNED(库存,非负)
create_time DATETIME(3)(毫秒精度)
数据类型细节:
能用INT不用BIGINT,减少索引空间。
时间用DATETIME(3)而非TIMESTAMP,避免2038年问题。
商品描述用TEXT,但单独拆出produ ...
