- 博客(16)
- 收藏
- 关注
原创 链接、装载与库
本文追溯至早期计算机为背景引入重定位与链接的概念,围绕程序如何运行进行讨论,探寻各结构的设计理念,尽可能详尽地阐述程序在编译后各个阶段;最后为了串联全文,制作了一个简单的动态库,编写了一个简单的程序调用该共享库。
2025-08-11 17:22:07
1128
原创 Linux文件系统
文件由内容与属性构成,Linux下这二者是分开存储的,这种设计的核心是通过和来实现的。struct file中有结构体指针f_inode,其指向Inode结构体,这个结构体存储了文件的元数据(即文件属性),每个文件(包括普通文件、目录、设备文件等)都有一个唯一的inode,但文件名并不在其中。:数组的前几个指针直接指向数据块。:当文件较大时,直接块指针不足以存储所有数据块,此时会使用间接块指针。:指向一个块,该块中存储了更多的数据块指针。:指向一个块,该块中存储了更多的一级间接块指针。
2025-05-14 13:49:18
1143
原创 重定向操作
>在 Linux 系统中,重定向是一种非常强大的功能,它允许用户将命令的输入、输出或错误信息重定向到其他位置,例如文件、设备或管道。通过重定向,可以实现对数据流的灵活控制。
2025-05-13 20:49:50
498
原创 Linux文件结构
是一个内核数据结构,用于管理一个进程打开的所有文件。每个进程都有一个实例,它包含了文件描述符表和其他与文件相关的状态信息,中存储了指向的指针。包含了文件描述符表的指针,该表是一个结构体指针数组,每个指针指向一个以表示已打开文件实例,其中包含文件的当前偏移量、访问模式、指向文件操作函数的指针等信息。文件描述符的本质是该数组的下标,多个文件描述符可以指向同一个,例如通过fork()创建的文件描述符会共享同一个。文件描述符分配规则:分配最小且未被使用的文件描述符。这段代码,可以有效的证明上述说明。
2025-05-13 17:52:38
417
原创 性能的平衡——红黑树
为了追求效率,红黑树不似AVL树那般完全平衡,前辈们选择牺牲部分搜索效率以换取整体性能的提升。但总的来讲,红黑是比AVL树更简单,但也比其更抽象,其最关键的点在与如何对节点的颜色修改或对节点进行旋转,以保证各路径黑节点总数的一致,而这个关键点的难点又在于理解u节点为黑时的情况——这又得对其下抽象子树进行理解。
2024-12-10 00:40:59
395
原创 平衡二叉搜索树——AVL树
本文以非平衡二叉树作为切入,主要聚焦AVL树的节点旋转进行讨论分析,以具象的代数思维理解抽象的更新思想,在梳理逻辑的同时呈现具体实现
2024-12-02 05:17:46
870
原创 进程地址空间与写时拷贝
本文以一段简短的C代码为引入,简要介绍进程地址空间,突出了其为进程与进程间数据代码解耦的便利性,又以其引出写时拷贝这项在操作系统中不可或缺的技术
2024-10-10 23:15:28
507
原创 环境变量与进程控制
各种shell指令本质上也是可执行程序,但不需要加上./即可执行(./是为了指明路径,在当前目录下寻找可执行程序)下有两种不加./即可执行程序的方法——1.将这个程序移至/usr/bin/下(可能会污染指令库,不建议)2.修改默认路径,也就是环境变量PATH,指令为——export PATH=该程序所在绝对路径(会覆盖原有路径,致使shell瘫痪)export PATH=$PATH:该程序所在绝对路径。
2024-10-10 21:47:46
574
原创 进程与多进程实现
程序是什么,进程是什么,二者的区别又是什么——程序是存放在磁盘的可执行文件——也就是一系列的指令集合,而进程可以说是被加载到内存的程序,是程序的一次执行过程——同一程序可能会有多个进程执行。也就是说程序是静态的,进程是动态的。进程的组成——进程是由内核数据结构和进程对应的磁盘代码组成的。在Windows下,这个内核数据结构是PCB(Process Control Block);在Linux下,这个内核数据结构是task_struct,本文围绕Linux讨论。
2024-10-09 20:19:16
1011
原创 集合论与位运算的结合
—如:现有集合(集合中元素皆为非负整形)A = {1,2,3},那么这个集合就可以用二进制1110₂来表示——集合中的元素n如果存在,其对应二进制的(n - 1)位就为1,不存在就为0。如果要对两个哈希表取交集,这就需要遍历两个哈希表,效率不高。增加元素对应着将该元素所对应的二进制位改为1:如在上述的集合A中加上5这个元素,就是A∪{5},也就是将其二进制数0011110变为0111110,这里设 a = 0011110,将1左移五位再与a按位或即可实现,(1 << 5) | a = 0111110。
2024-09-28 15:59:12
554
原创 系统编程基础与Linux下的集成开发环境
Linux下一切皆文件,Linux中的权限自然也就是与文件相关的权限。用户:owner, grouper , other文件属性:r(read) , w(write) ,x(execute)文件类型:- 普通文件——如源代码,库文件,可执行程序,文件压缩包等d 目录文件;l 链接文件;p 管道文件;c 字符设备文件;b 块文件;s socket文件有了以上认识,再看下文件的各个属性:第一个字符为-, 说明是一个普通文件;
2024-09-18 20:50:36
784
1
原创 C++类和对象——入门
后C++引入class(此时还不叫“C++”,而是“C with Classes”,在1983被正式更名为C++),可以理解为一个可以定义函数的结构体(二者略有不同)由inline修饰的函数会在编译阶段于调用函数处展开,并不会调用函数(这种情况仅在被inline修饰函数的内容较少时出现,具体由编译器判断)类的大小为成员变量之和,但成员函数被放在公共代码段,不被算入大小,空类大小为一。对象则是其具体化实现、是类的实例,具体实现类定义的属性和行为。类的成员变量是另一个类的实例,上述代码中;
2024-06-16 23:06:15
929
原创 C++引用——类型+&+对象
事实也确实如此,在C++语法中,引用无法重新被赋值。返回值如果为非引用类型,编译器就会创建一个临时变量来持有返回值,引用类型返回值则不会(具体原因和证明就不再赘述,以后再详细展开吧)所以为了追求极致的性能,C++在能用的地方肯定是选择引用类型的返回值。但引用不一样,如果引用不进行初始化,代码是直接无法运行,并且引用的初始化赋值只能是一个对象,无法用NULL或者是nullptr对其初始化。并非如此,用引用变量接收后,它就变成了一个纯正的引用变量,编译器会自动处理,不再像指针一样需要自己去进行解引用操作。
2024-06-14 00:36:10
1535
原创 C++函数重载——拙见
原因分析:main函数位于.cpp文件之中,自然按照.cpp语法编译,此时的Add函数被重载为Add@@YAHHH@Z,Add函数的实现在.c文件中,按照c语法编译为Add。代码经过预处理->编译->汇编,到链接时,主函数用Add@@YAHHH@Z去找.c文件之中的Add,能找到吗?例如:main函数位于test.cpp文件,且main函数前已申明Add函数。用extern "C"声明函数,编译器就会以C的标准去编译这个函数,自然也就能用Add去找到Add函数的地址。
2024-06-10 01:26:47
495
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅