- 博客(245)
- 问答 (1)
- 收藏
- 关注

原创 TCP笔记详解
文章目录一:为什么要传输层二:寻址三:运输层的两个协议1.UDP协议(1).UDP协议的特点(2) UDP的首部格式(8字节)2.TCP协议(1)TCP的特点(2)套接字(3)TCP报文段的首部格式(4)TCP的建立连接(5)TCP连接的释放(6)TCP的可靠传输(7)TCP的流量控制(8) TCP的拥塞控制一:为什么要传输层既然IP协议能够把源主机发送出的分组按照首部中的目的地址交送到目的主...
2020-03-14 22:38:39
692
原创 第二章:核心数据结构与面向对象思想之数组与切片
数组和切片是 Go 语言中不可或缺的数据结构。数组是定长、值类型,其长度是类型的一部分,通常作为切片的底层存储。切片是变长、引用类型(实际是包含指针、长度和容量的结构体),是对底层数组的一个“视图”,提供了极大的灵活性和便利性。深入理解切片的内部结构(指针、长度、容量)是掌握 Go 语言内存管理的关键。append操作智能地处理内存分配和扩容,通过返回新的切片头部来确保数据的连续性和动态增长能力。copy操作则提供了精确的元素复制,在需要数据独立性时非常有用。
2025-07-30 07:43:40
845
原创 第一章:Go语言基础入门之指针
指针是 Go 语言中一个强大且不可或缺的特性,它提供了直接访问内存和修改外部状态的能力。通过操作符获取变量地址,通过操作符解引用指针获取或修改其指向的值,是掌握指针的基础。在函数传参中,指针能够实现“引用传递”的效果,对于优化大型数据结构传递性能和实现函数对外部数据的修改至关重要。最重要的是,Go 语言对指针施加了严格的安全限制,如禁止指针算术、强类型检查和自动垃圾回收,这使得 Go 的指针操作相对于 C/C++ 更加安全和易于管理,大大减少了因指针问题而导致的程序崩溃和安全漏洞。
2025-07-30 07:38:15
341
原创 第一章:Go语言基础入门之错误处理
Go 语言的错误处理哲学强制开发者以一种显式、直接的方式思考和处理错误。通过返回error接口,结合 Go 1.13+ 引入的错误包装(fmt.Errorf的%w)和错误判断机制(errors.Is和errors.As),我们能够构建出强大、清晰且易于追溯的错误链。
2025-07-29 07:26:42
501
原创 第一章:Go语言基础入门之包与模块
每个 Go 源文件的开头都必须包含语句,其中name是该文件所属包的名称。入口包main任何可执行的 Go 程序都必须有一个名为main的包,且该包中必须包含一个main函数,它是程序的入口点。通常,一个包的所有源文件都放在同一个目录下,且该目录的名称通常与包名一致。包的导入路径是其在 Go 模块中的相对路径或绝对模块路径。示例:一个简单的包结构假设我们有一个名为myprojectmyproject/└── utils/:定义一个名为utils的包,其中包含一个将字符串反转的函数。
2025-07-29 07:20:56
703
原创 第一章:Go语言基础入门之函数
函数是执行特定任务的代码块。在 Go 中,函数的定义以func关键字开始。// 定义并立即执行一个匿名函数func() {fmt.Println("这是一个立即执行的匿名函数。")}() // 注意末尾的括号,表示调用// 定义一个带参数和返回值的匿名函数并立即执行}(10, 20) // 传递参数fmt.Printf("匿名函数计算结果: %d\n", result) // 输出: 匿名函数计算结果: 30简洁的定义与调用: 易于学习和使用。多返回值。
2025-07-28 19:12:21
448
原创 第一章:Go语言基础入门之流程控制
if-else提供了灵活的条件判断,特别是支持短声明,使得错误处理更加紧凑。for是 Go 中唯一的循环语句,但其多样的形式足以应对所有循环场景,尤其是,极大地简化了集合的遍历。switch提供了清晰的多分支选择,其隐式break行为减少了错误,无表达式的switch和类型switch则提供了强大的灵活性。应谨慎使用。break和continue提供了对循环流程的精细控制,配合标签可以处理复杂的多层循环跳转。goto提供了无条件跳转的能力,但鉴于其对代码可读性和可维护性的负面影响,应极力避免。
2025-07-28 19:11:35
485
原创 第一章:Go语言基础入门之函数
函数定义了一段执行特定任务的代码块。在 Go 语言中,函数的定义清晰且直观。// 函数体func: 声明函数开始的关键字。: 函数的名称。: 参数列表,每个参数由名称和类型组成。如果连续的参数类型相同,可以省略前面参数的类型,只保留最后一个。(x, y int)等同于。returnType: 函数返回值的类型。如果函数不返回任何值,则可以省略。{}: 函数体,包含要执行的代码。return: 返回指定类型的值。如果函数没有返回值,return语句也可以省略或单独写一个return。
2025-07-25 08:19:09
687
原创 第一章:Go语言基础入门之流程控制
Go 语言的流程控制语句简洁而强大。if-else提供了清晰的条件判断,其短声明特性在错误处理中尤其方便。for是 Go 唯一的循环语句,但它通过灵活的语法涵盖了所有常见的循环模式,尤其是for-range,极大地简化了集合的遍历。switch语句非常灵活,默认不穿透的设计减少了错误,无表达式的switch更是替代复杂if-else if链的优雅方式,而类型switch则增强了接口处理的能力。break和 continue提供对循环内部流程的精细控制,配合标签可以处理多层嵌套的情况。goto。
2025-07-25 08:16:24
725
原创 第一章:Go语言基础入门之运算符与类型转换
Go 语言的运算符提供了对数据进行各种操作的能力,它们是构建程序逻辑的基本元素。而 Go 严格的类型系统和强制的显式类型转换,是 Go 语言健壮性和可读性的重要基石。
2025-07-24 07:36:31
854
原创 第一章:Go语言基础入门之变量、常量与基本数据类型
特性var关键字短变量声明:=使用场景包级别或函数内部声明变量,可以不初始化(获得零值)仅限函数内部声明并初始化变量初始化可选择初始化,不初始化则自动赋零值必须初始化,且强制进行类型推断类型可显式指定类型,也可通过初始化值推断强制类型推断,不能显式指定类型简洁性相对冗长简洁,常用新变量每次声明都是新变量左侧至少有一个新变量,否则报错 (多变量特例除外)在函数内部,如果变量需要声明并立即初始化,优先使用:=,因为它更简洁。在包级别(函数外部)或你需要明确指定变量类型而不立即初始化时,使用var。
2025-07-24 07:33:11
883
原创 第一章:Go语言基础入门之Hello World与Go程序结构
编写并成功运行了你的第一个Go语言程序“Hello, World!深入理解了Go程序中的特殊含义,它是可执行程序的标志。掌握了import关键字的作用,用于引入外部包(如fmt理解了作为程序入口点的关键作用。学会了使用go run进行快速开发和测试。学会了使用go build将Go程序编译成独立的可执行文件用于部署。现在,你已经掌握了Go语言程序的最基本结构和运行方式。这为你进一步深入学习Go语言的语法、数据类型、控制流、函数、并发等高级特性奠定了坚实的基础。
2025-07-23 19:51:02
961
原创 第一章:Go语言基础入门之Go语言安装与环境配置
成功下载并安装了Go语言SDK。理解了GOPATH和GOROOT这两个Go语言环境的关键变量。掌握了现代Go项目开发中Go Modules的核心概念和基本用法。编写、编译并运行了你的第一个Go语言程序Hello, Go!。这为你深入学习Go语言打下了坚实的基础。基本语法(变量、常量、数据类型)控制流(if/else, for, switch)函数与方法结构体与接口并发编程(goroutines 和 channels)错误处理标准库的强大功能。
2025-07-23 19:47:23
731
原创 go语言基础与进阶
真正的精通,源于对底层原理的透彻理解和在真实世界中的反复锤炼。希望这份指南能成为你Go语言学习道路上的明灯,祝你早日成为驾驭Go的顶尖高手!
2025-07-22 01:39:18
988
原创 扩展:操作系统之高性能网络计算
技术性能 (发包速度)易用性复杂性内存复制内核栈参与程度标准 Socket低非常高低多次 (用户->内核->驱动)高Raw Socket较低低中多次 (用户->内核->驱动)中高中较低中多次 (用户->内核->驱动)中低中高低中高减少/零拷贝 (mmap)中低AF_XDP高非常低高零拷贝 (UMEM)低非常高非常低非常高零拷贝无RDMA极致 (特定场景)非常低非常高零拷贝无 (点对点内存)
2025-07-15 17:20:29
1138
原创 扩展:操作系统之系统内核网络协议栈
Linux 网络栈的经典设计为通用场景提供了稳定性,但在高性能需求下显得力不从心。理解其处理流程是优化网络应用的基石,而结合 eBPF/XDP、DPDK 等新技术,开发者可在不同场景下实现从10Gbps 到 100Gbps+的性能跨越。未来随着智能网卡(SmartNIC)和可编程硬件的普及,网络栈的边界将更加模糊,用户态与硬件的直接交互将成为超高性能网络的终极形态,内容将在下一篇博客进行介绍。
2025-07-15 17:10:39
884
原创 八:操作系统设备管理之RAID
正是这些RAID技术在操作系统层面的有效管理和使用,构筑了我们今天所依赖的快速、可靠的数据存储基础,确保了从个人电脑到大型服务器的数据安全与高效访问。无论是通过硬件RAID控制器还是软件RAID实现,操作系统都负责管理这个由多个物理硬盘组成的阵列,并向应用程序提供一个统一的、高性能或高可靠性的存储接口。在计算机的世界里,数据是核心。而数据的长期存储则依赖于存储设备,最常见的就是硬盘。然而,单个硬盘存在固有的局限性:它的访问速度相对较慢,而且是系统的单点故障——一旦硬盘损坏,其上的所有数据都可能丢失。
2025-06-05 13:13:13
760
原创 八:操作系统设备管理之磁盘调度算法
移动距离会是 15+2+31+24+2+59 + |199-183| + |37-199| + |14-37| = 15+2+31+24+2+59 + 16 + 162 + 23 = 334。总距离会是 15+2+31+24+2+59 + |199-183| + |0-199| + |14-0| + |37-14| = 15+2+31+24+2+59 + 16 + 199 + 14 + 23 = 385。磁头像电梯一样,在一个方向上移动,沿途服务遇到的所有请求,直到到达该方向的尽头(或最远请求)。
2025-06-05 13:07:00
1102
原创 八:操作系统设备管理之磁盘结构
操作系统通过磁盘调度和文件系统的设计来管理对这些物理资源的访问,努力将应用程序的逻辑I/O请求转化为高效的物理磁盘操作,从而弥合CPU与慢速机械硬盘之间的性能差距,确保系统能够快速、可靠地存储和检索数据。由于在同一个柱面内切换磁头比跨柱面寻道快得多,操作系统和文件系统在可能的情况下,会尝试将相关的数据(如同一个文件的连续块)存储在同一个柱面内的不同磁道上。扇区是最小的传输单位,磁道是数据的圆形路径,而柱面是由所有盘片上同一半径的磁道组成的集合,是优化寻道操作的关键。磁道是数据存储的基本圆形路径。
2025-06-05 13:04:35
606
原创 八:操作系统设备管理之缓冲、缓存与假脱机
缓冲是解决I/O速度不匹配问题最基本、最直接的技术,它通过引入临时存储区域来平滑数据传输,减少物理操作次数。
2025-06-05 13:01:44
1270
原创 八:操作系统设备管理之I/O 软件层次结构
操作系统通过精心设计的 I/O 软件层次结构,将用户程序的 I/O 请求层层传递和转换,最终驱动底层的硬件完成任务,并将结果层层返回。从用户层便利的库函数,到设备无关层统一的接口和管理,再到设备驱动程序对硬件的精确控制,以及中断处理程序对硬件事件的快速响应,每一层都承担着特定的职责,共同构建起高效、灵活且易于扩展的 I/O 子系统。理解这个分层结构,是理解现代操作系统如何管理复杂硬件的关键。
2025-06-04 13:16:22
750
原创 八:操作系统设备管理之设备驱动程序
简单来说,设备驱动程序是一段软件代码,它知道如何与某种特定型号的硬件设备进行通信和控制。您可以把它想象成一个“翻译官”或“操作手册”,操作系统通过这个翻译官来指挥某个具体的硬件设备干活。设备驱动程序是现代操作系统的基石之一。它们是精心编写的硬件特定代码,掌握着与特定设备通信的“秘密语言”。同时,它们向上提供了标准化的接口,将复杂多样的硬件世界隐藏在身后,使得操作系统内核和应用程序能够以一种统一、简单的方式进行 I/O 操作。
2025-06-04 13:14:43
462
原创 八:操作系统设备管理之I/O 操作方法
最简单,但 CPU 效率最低,浪费大量 CPU 周期等待。适用于非常简单的控制器或对实时性要求不高且 CPU 负载极轻的场景(现代操作系统极少用于常规设备 I/O)。提高了 CPU 效率,CPU 无需忙等,可以在等待时做其他事情。适合处理单个事件或传输少量数据的设备(如键盘、鼠标)。效率最高,尤其适合批量数据传输。CPU 仅在开始和结束时参与设置和处理完成通知。是现代高速 I/O 设备(硬盘、网卡、显卡)的标准方式。CPU 写入命令到磁盘控制器的命令/状态/数据端口,设置 DMA 传输的参数。
2025-06-04 13:12:20
763
原创 八:操作系统设备管理之I/O 硬件基础
设备控制器是设备的“大脑”,负责处理设备特定的逻辑和提供统一的接口。端口是控制器提供给 CPU 访问其内部寄存器的地址。总线是连接所有组件的通信高速公路。内存映射 I/O将设备寄存器映射到内存地址空间,使用普通内存指令访问。端口映射 I/O使用独立的 I/O 地址空间和特殊的 I/O 指令访问设备寄存器。理解这些 I/O 硬件基础,有助于我们更深入地理解操作系统如何进行设备管理、如何实现中断处理、如何进行 DMA (Direct Memory Access) 等更高级的 I/O 技术。
2025-06-04 13:07:45
492
原创 七:操作系统文件系统之日志文件系统
日志文件系统引入了一个特殊区域在磁盘上,称为日志 (Journal)或事务日志 (Transaction Log)。在对文件系统进行任何实际修改之前,文件系统会先将描述这些即将进行的修改的信息写入这个日志区域。这些信息被组织成事务 (Transactions)。一个事务代表一个逻辑上完整的操作单元,比如创建一个文件、删除一个文件、追加数据到文件等。写日志优先。在真正修改文件系统的主体结构(如 i-node 表、目录块、位图等)之前,先将打算进行的修改操作记录在日志中。
2025-05-28 13:03:09
660
原创 七:操作系统文件系统之文件系统性能
文件系统缓存是操作系统提升文件系统性能的关键技术。通过将磁盘上的数据(包括文件数据和文件系统元数据)临时存储在快速的内存中,操作系统能够显著减少对慢速物理存储设备的访问次数。侧重于块级别的缓存。Page Cache侧重于以内存页为单位缓存文件数据,并与虚拟内存集成。是现代操作系统将前两者功能整合而形成的单一缓存管理机制,以提高效率和简化设计。这些缓存机制结合预读和延迟写入等技术,使得用户能够感受到流畅的文件操作体验,尽管底层存储设备的访问速度远低于 CPU 和内存。
2025-05-28 12:57:56
933
原创 七:操作系统文件系统之文件系统实现
当用户或应用程序想要读取文件时,请求会从用户接口开始,逐层向下传递。每一层都添加或处理特定的信息(路径解析、权限检查、逻辑到物理地址映射、缓存管理),直到设备驱动程序执行实际的硬件 I/O。数据则沿着相反的方向逐层向上返回。
2025-05-28 12:53:28
1104
原创 七:操作系统文件系统之目录实现
特性线性列表 (Linear List)哈希表 (Hash Table)查找效率O(N) (线性)平均 O(1), 最坏 O(N) (取决于冲突)实现复杂非常简单复杂空间开销紧凑,只存储条目需要额外空间存储哈希表结构,可能存在空闲槽目录操作增删慢 (尤其需要移动条目时)增删快 (平均)适用于小目录大目录顺序遍历容易困难可靠性简单数据结构,相对可靠结构复杂,哈希函数/冲突处理是关键。
2025-05-28 12:45:35
1012
原创 七:操作系统文件系统之空闲空间管理
特性位图 (Bitmap)空闲链表 (Free List)分组 (Grouping)计数 (Counting)基本单元单个块 (1 bit)单个块 (需指针)多个块 (组)连续块段 (起始+计数)查找连续块高效 (扫描位图)低效 (需外部机制或遍历判断)低效 (需外部机制或遍历判断)高效 (扫描列表条目)随机访问空闲低效 (需扫描)高效 (取头部)较高效 (一次取多个)效率一般 (需扫描列表)空间开销与总块数成正比 (小)极小 (指针在块内)需要专门的分组块/结构。
2025-05-28 12:42:01
948
原创 七:操作系统文件系统之文件分配方法
特性连续分配链式分配索引分配 (单级/多级/混合)外部碎片严重无无随机访问非常高效 (给定起始和长度)非常低效 (需遍历)高效 (单级 2次读,多级更多次)顺序访问非常高效效率一般 (需读取指针)高效 (一次读索引块,然后顺序读数据块)文件增长困难容易容易 (在索引块未满前)空间开销目录条目简单每个数据块需指针 (或 FAT 表)每个文件需索引块 (或 i-node)可靠性高指针损坏影响后续块索引块损坏影响整个文件实现复杂简单简单 (FAT 稍复杂)复杂文件大小。
2025-05-28 12:39:19
1193
原创 七:操作系统文件系统之文件系统挂载
简单来说,文件系统挂载是将一个独立的文件系统连接到现有目录树上的过程。操作系统维护一个全局的、单一的目录层次结构,通常以根目录开始。当你挂载一个文件系统时,你指定一个现有的目录作为挂载点 (Mount Point)。这个挂载点目录就像一个入口,通过它你可以访问被挂载文件系统中的所有文件和目录。在挂载之前,目标文件系统的根目录是无法直接通过主目录树访问的。挂载后,该文件系统的根目录内容会“覆盖”或“取代”挂载点目录下原有的内容(注意:原有的内容并没有被删除,只是在文件系统被挂载期间无法访问)。
2025-05-28 12:34:50
1254
原创 七:操作系统文件系统之目录结构
从单级目录的简单到通用图目录的复杂,目录结构的发展是为了更好地解决文件的组织、命名和共享问题。树形目录结构因其良好的组织性、易用性和适中的实现复杂性,成为现代操作系统中最普遍采用的基础结构。在此基础上,通过引入链接(尤其是符号链接),操作系统实现了无环图的共享能力,进一步提升了文件管理的灵活性,同时避免了通用图结构带来的难以克服的复杂性。理解这些不同的结构,有助于我们更好地理解文件系统的工作原理以及如何高效地管理文件。
2025-05-23 13:11:30
1140
原创 七:操作系统文件系统之文件概念
从用户的角度看,文件(File)是一组相关信息的有序集合。操作系统将这些信息组织成一个逻辑单元,并赋予它一个名称,以便于用户和应用程序识别和访问。
2025-05-23 13:06:05
769
原创 六:操作系统虚拟内容之内存文件映射
在计算机系统中,文件是长期存储数据的主要方式。我们通常通过操作系统提供的文件I/O接口来与文件交互,比如read()和write()系统调用。这些传统的文件I/O操作涉及数据在用户空间和内核空间缓冲区之间的复制,然后由操作系统负责将数据刷入或从磁盘读取。虽然这种方式直观且易于使用,但对于某些应用场景,例如需要频繁随机访问文件内容、处理非常大的文件或需要在多个进程间高效共享文件数据时,其性能可能不如人意。提供了一种替代性的文件I/O机制,它将文件内容直接“映射”到进程的虚拟地址空间中。
2025-05-22 13:20:38
759
原创 六:操作系统虚拟内存之抖动
抖动是虚拟内存系统中的一种病态现象。它发生在系统过度使用交换空间时,即操作系统花费大部分时间将页从物理内存换出到磁盘,然后再将需要的页从磁盘换入物理内存,而不是执行实际的应用程序指令。想象一下这样的场景:系统中运行着很多进程,它们都在积极地访问内存。由于物理内存不足,每个进程可能无法获得足够的帧来容纳其当前正在使用的所有页(即其工作集当一个进程需要访问一个不在物理内存中的页时,会发生缺页中断 (Page Fault)。
2025-05-22 13:10:14
777
原创 六:操作系统虚拟内存之帧分配
帧分配是虚拟内存管理中的一个重要环节。固定分配为每个进程提供固定的帧数,简单但缺乏灵活性。可变分配允许进程的帧数动态调整,更灵活但实现复杂且有潜在的系统不稳定风险。全局替换在所有物理帧中选择,提高了内存利用率,但也可能导致进程间干扰和全局颠簸。局部替换只在发生缺页的进程自己的帧中选择,提供了更好的隔离性,但可能导致内存浪费。通常,固定分配与局部替换搭配,可变分配与全局替换搭配,形成两种主要的内存管理流派。
2025-05-22 13:05:25
886
原创 六:操作系统虚拟内存之页替换算法
页替换是虚拟内存管理中的一个关键环节,它发生在物理内存不足以容纳新页面时。页替换算法的目标是选择一个“最佳”的页面从物理内存中移除,以最小化未来的缺页次数。OPT是理论最优但不可实现的算法。FIFO简单但性能较差,不考虑页面使用模式。LRU基于局部性原理,性能通常较好,但精确实现开销大。时钟算法(第二次机会算法)是 LRU 的一种有效近似,利用引用位在性能和实现复杂度之间取得了平衡,是许多实际操作系统采用的方法。LFU基于使用频率,但实现复杂且难以适应程序行为变化。
2025-05-21 12:58:05
691
原创 六:操作系统虚拟内存之缺页中断
缺页中断是一种特殊的中断 (Interrupt)或更准确地说,是陷阱 (Trap)或异常 (Exception)。它发生在当程序试图访问一个虚拟地址时,内存管理单元 (MMU) 在该进程的页表中查找对应的页表条目 (Page Table Entry, PTE),发现该页面的存在位 (Present Bit)为 0。存在位为 0 表示该虚拟页面当前不在物理内存中。此时,MMU 无法完成虚拟地址到物理地址的翻译,硬件会立即停止当前指令的执行,并产生一个内部中断信号,将控制权交给操作系统内核中预设的。
2025-05-21 12:56:09
1092
原创 六:操作系统虚拟内存之虚拟内存概念
虚拟内存是操作系统提供的一种抽象(Abstraction)。它给每个进程提供了一个独立、连续且巨大的地址空间,称为虚拟地址空间。这个空间的大小通常远大于实际的物理内存。程序中使用的地址。程序看到的内存范围是从 0 到某个非常大的值(例如,在 64 位系统上可达 2^64)。实际硬件内存(RAM)的地址。将程序的虚拟地址空间映射(Mapping)到物理内存空间。这种映射是由操作系统和硬件(主要是内存管理单元,MMU - Memory Management Unit)共同完成的。
2025-05-21 12:53:21
1055
原创 五:操作系统内存管理之非连续内存分配
在上一篇文章中,我们讨论了连续内存分配策略(如固定分区和动态分区)及其主要问题:内部碎片和外部碎片。虽然紧凑技术可以缓解外部碎片,但其高昂的成本使得它在现代多任务系统中不甚理想。为了更有效地利用内存并解决这些碎片问题,现代操作系统普遍采用了**非连续内存分配 (Non-Contiguous Memory Allocation)**技术。非连续内存分配允许一个进程的不同部分可以分散地加载到物理内存中的不同非连续区域。这需要操作系统和硬件的紧密协作来管理这些分散的内存块,并在进程执行时进行地址翻译。
2025-05-20 13:15:09
1756
空空如也
多线程生产者消费者bug,感觉比较困难,求帮助
2022-04-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人