- 博客(43)
- 收藏
- 关注
原创 Linux中动静态库的制作
库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个⼈的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载⼊内存执⾏。库有两种:静态库:.a[Linux]动态库:.so[Linux] .dll[windows]
2025-04-02 21:55:30
992
原创 Ext2文件系统探秘:从磁盘结构到Linux的基石设计
扇区:是磁盘存储数据的基本单位,512字节,属于块设备。如何定位一个扇区呢?确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)。定位磁头(header)。定位⼀个扇区(sector)。CHS地址定址:⽂件 = 内容+属性 都是数据,⽆⾮就是占据那⼏个扇区的问题!能定位⼀个扇区了,能不能定位多个扇区呢?扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为512字节。磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头。
2025-03-27 10:10:35
801
原创 什么说一切皆文件?Linux I/O 抽象的魅力(二)
openman openpathname: 要打开或创建的⽬标⽂件flags: 打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏“或”运算,构成flags。参数:O_RDONLY: 只读打开O_WRONLY: 只写打开O_RDWR : 读,写打开这三个常量,必须指定⼀个且只能指定⼀个O_CREAT : 若⽂件不存在,则创建它。需要使⽤mode选项,来指明新⽂件的访问权限O_APPEND: 追加写返回值:成功:新打开的⽂件描述符失败:-1。
2025-03-26 17:42:15
645
原创 算法通关计划:1.前缀和:秒杀数组区间求和的算法利器
前缀和(Prefix Sum) 是一种通过 预处理数组 来快速计算 任意区间和 的算法技巧。其核心思想是通过空间换时间,将区间和查询的时间复杂度从 O(n) 优化到 O(1)。下面以一个题目来具体见识一下一维前缀和的模板:DP34 【模板】前缀和3. 二维前缀和模板 下面以一个题目来具体见识一下二维前缀和的模板:DP35 【模板】二维前缀和3.前缀和的相关题目1.724. 寻找数组的中心下标2.238.除自身之外数组的乘积
2025-03-24 12:24:23
229
原创 为什么说一切皆文件?Linux I/O 抽象的魅力(一)
⽂件在磁盘⾥。磁盘是永久性存储介质,因此⽂件在磁盘上的存储是永久性的。磁盘是外设(即是输出设备也是输⼊设备)。磁盘上的⽂件本质是对⽂件的所有操作,都是对外设的输⼊和输出 简称 IO。
2025-03-18 12:23:30
350
原创 Linux进程观:简单性如何成就强大性(六)
fork()之后,⽗⼦各⾃执⾏⽗进程代码的⼀部分如果⼦进程就想执⾏⼀个全新的程序呢?进程的程序替换来完成这个功能!程序替换是通过特定的接⼝,加载磁盘上的⼀个全新的程序(代码和数据),加载到调⽤进程的地址空间中!1.1. 替换原理⽤fork创建⼦进程后执⾏的是和⽗进程相同的程序(但有可能执⾏不同的代码分⽀),⼦进程往往要调⽤⼀种exec函数以执⾏另⼀个程序。当进程调⽤⼀种exec函数时,该进程的⽤⼾空间代码和数据完全被新程序替换,从新程序的启动例程开始执⾏。
2025-03-12 22:44:12
263
原创 Linux的进程观:简单性如何成就强大性(五)
在linux中fork函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给⼦进程。将⽗进程部分数据结构内容拷⻉⾄⼦进程。添加⼦进程到系统进程列表当中。fork返回,开始调度器调度。当⼀个进程调⽤fork之后,就有两个⼆进制代码相同的进程。⽽且它们都运⾏到相同的地⽅。但每个进程都将可以开始它们⾃⼰的旅程,
2025-03-10 16:26:57
997
原创 Linux的进程观:简单性如何成就强大性(四)
程序地址空间是操作系统为进程分配的虚拟内存区域,包含代码、数据、堆、栈等,通过映射机制隔离物理内存,实现进程独立运行与资源保护。
2025-03-06 11:01:35
771
原创 Linux的进程观:简单性如何成就强大性(三)
环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器⾏查找。环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性。
2025-03-03 22:58:22
952
原创 Linux的进程观:简单性如何成就强大性(二)
cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤,可以改善系统性能。还可以把进程运⾏到指定的CPU上,这样⼀来,把不重要的进程安排到某个CPU,可以⼤改善系统整体性能。
2025-03-03 14:10:04
742
原创 Linux的进程观:简单性如何成就强大性(一)
为了弄明⽩正在运⾏的进程是什么意思,我们需要知道进程的不同状态。⼀个进程可以有⼏个状态(在Linux内核⾥,进程有时候也叫做任务)。t追踪暂停状态(tracing stopped):在调试的过程之中程序遇到断点后停止的状态。Z僵尸状态(zombie):进程结束后到被父进程获取到结束信息并回收这段时间。R运⾏状态(running): 并不意味着进程⼀定在运⾏中,它表明进程要么是在运⾏中要么在运⾏队列⾥。
2025-03-03 13:10:10
908
原创 Linux中的cgdb的基本使用
Linux中的cgdb是一个基于GDB(GNU Debugger)的图形化调试前端,它结合了GDB的命令行界面功能和代码查看窗口,为开发者提供了一个更为直观的调试体验。
2025-02-25 20:22:18
603
原创 Linux与Git:代码管理的艺术
不知道你⼯作或学习时,有没有遇到这样的情况:我们在编写各种⽂档时,为了防⽌⽂档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出⼀个甚至多个副本。但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越多,⽂件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么吗?⽂档如此,我们写的项⽬代码,也是存在这个问题的。为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。
2025-02-17 17:51:50
971
原创 Linux项目构建秘籍:揭秘make与Makefile的奥秘
会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒。⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规则来指定,哪些⽂件需要先编译,哪些⽂件需要后编译,哪些⽂件需要重新编译,甚⾄于进⾏更复杂的功能操作makefile带来的好处就是⸺“⾃动化编译”,⼀旦写好,只需要⼀个make命令,整个⼯程完全⾃动编译,极⼤的提⾼了软件开发的效率。
2025-02-17 16:59:52
750
原创 Linux Vim编辑器:快捷键与高效编辑技巧
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以运⾏于x window、 mac os、 windows。在此博客中,统⼀按照vim来进⾏讲解。
2025-01-31 15:54:22
879
原创 Linux的基本指令(下)
Linux下find命令在⽬录结构中搜索⽂件,并执⾏指定的操作。Linux下find命令提供了相当多的查找条件,功能很强⼤。由于find具有强⼤的功能,所以它的选项也很多,其中⼤部分选项都值得我们花时间来了解⼀下。即使系统中含有⽹络⽂件系统( NFS),find命令在该⽂件系统中同样有效,只你具有相应的权限。在运⾏⼀个⾮常消耗资源的find命令时,很多⼈都倾向于把它放在后台执⾏,因为遍历⼀个⼤的⽂件系统可能会花费很⻓的时间(这⾥是指30G字节以上的⽂件系统。
2025-01-27 15:30:38
578
原创 Linux的基本指令(上)
对于⽬录,该命令列出该⽬录下的所有⼦⽬录与⽂件。对于⽂件,将列出⽂件名以及其他信息。-a 列出⽬录下的所有⽂件,包括以 . 开头的隐含⽂件。-d 将⽬录像⽂件⼀样显⽰,⽽不是显⽰其下的⽂件。如:ls ‒d 指定⽬录。-i 输出⽂件的 i 节点的索引信息。如 ls ‒ai 指定⽂件。-k 以 k 字节的形式表⽰⽂件的⼤⼩。ls ‒alk 指定⽂件。-l 列出⽂件的详细信息。n ⽤数字的 UID,GID 代替名称。-r 对⽬录反向排序。-t 以时间排序。-s 在l⽂件名后输出该⽂件的⼤⼩。
2025-01-24 23:20:57
1575
原创 C++智能指针:高效管理内存的艺术
下⾯程序中我们可以看到,new了以后,我们也delete了,但是因为抛异常导,后⾯的delete没有得到执⾏,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete内存,再把异常抛出,但是因为new本⾝也可能抛异常,连续的两个new和下⾯的Divide都可能会抛异常,让我们处理起来很⿇烦。智能指针放到这样的场景⾥⾯就让问题简单多了。
2025-01-13 20:43:55
793
原创 C++异常机制:构建健壮代码的艺术
异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理,异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。C语⾔主要通过错误码的形式处理错误,错误码本质就是对错误信息进⾏分类编号,拿到错误码以还要去查询错误信息,⽐较⿇烦。异常时抛出⼀个对象,这个对象可以函数更全⾯的各种信息。
2025-01-11 16:39:45
965
原创 C++ 哈希之道,高效存储
哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。
2024-12-23 11:54:50
806
原创 unordered_map和unorderset_set的使用
unordered_set的声明如下,Key就是unordered_set底层关键字的类型unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持将Key转成整形的仿函数传给第⼆个模板参数unordered_set默认要求Key⽀持⽐较相等,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持将Key⽐较相等的仿函数传给第三个模板参数unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第四个参数。
2024-12-20 13:40:20
785
原创 C++ 红黑树
红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。
2024-11-30 17:54:41
780
原创 C++ AVL树
1.AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制⾼度差去控制平衡。2. AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis是两个前苏联的科学家,他们在1962年的论⽂《An algorithm for the organization of information》中发表了它。
2024-11-28 13:00:19
586
原创 C++ set和map
1. map是关联容器,它按照特定的次序按照key来比较存储由键值key和值value组合而成的元素。2.在map中,键值key通常用于排序和唯一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为3.在内部,map中的元素总是按照键值key进行比较排序的。4. map。
2024-11-25 16:41:57
925
原创 C++ 二叉树进阶
二叉搜索树有称为二叉排序树,它是一颗空树,或者具有以下性质的二叉树:1. 左子树不为空,则左子树上的所有节点的值都小于根节点的值。2. 右子树不为空,则右子树上的所有节点的值都大于根节点的值。3. 它的左右子树也为搜索二叉树。
2024-11-16 09:43:35
799
原创 C++ 多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。public:cout<<"买票全价"<<endl;public:cout<<"买票半价"<<endl;那么在继承中要构成多态还有两个条件1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写概念:在虚函数的后面写上=0,则这个函数为纯虚函数。
2024-11-06 22:47:34
862
原创 C++ 模板
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)
2024-10-28 08:55:21
713
原创 C++ stack类和queue类
队列是一种容器适配器,专门用于在FIFO上下文先进先出中操作,其中从容器一端插入元素,另一端提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
2024-10-23 17:21:22
759
原创 C++ vector类
构造函数声明功能说明vector()无参构造vector(用n个值为val的构造用一个已存在的vector构造用一段迭代区间构造//无参构造//用10个1进行构造//用存在的vector来构造新的//用一段迭代区间来构造。
2024-10-15 16:54:29
875
原创 C++入门知识
• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以重复使用一个名字来定义变量就不会有冲突了。• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2024-07-24 09:03:46
877
原创 计算机网络 (第一章. 概述)
计算机网络(网络)由若干的节点和链接这些节点的链路组成,其中节点可以是:计算机、集线器、交换器或路由器等。(图1 - 2.(a))互连网:有多个网络通过一些路由器互相连接起来的,构成了一个覆盖范围更大的计算机网络。(互连网就是网络的网络)。(图1 - 1. (b))
2024-04-11 20:27:39
234
1
原创 动态内存管理
我们已经掌握的内存开辟有两种方式:intval=10;charch[5];对于方式1,我们开辟的是一个整形大小(4个字节)的大小。对于方式2,我们开辟了一个连续的空间(5个字节)。在这里我们开辟的空间是固定的,我们无法在后续改变内存空间的大小,显得特别的不方便,所以我们要引入动态内存开辟来使得内存分配更为灵活。
2024-04-02 23:09:14
1888
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人