- 博客(63)
- 收藏
- 关注
原创 页表结构&&内存访问机制
一级页表是页表系统的 “根”,仅存在 1 个,最多可关联 2¹⁰=1024 个二级页表(每个目录项对应一个二级页表入口),但二级页表按需创建,并非全部存在。因此,内存管理中缺页中断的判定,主要依赖于页表本身是否存在(通过一级页表目录项的标记)、页表项与物理内存的映射关系是否存在(通过二级页表项的标记),以此确定对应的页框是否已在物理内存中。寻址逻辑:所有变量通过 “起始地址 + 偏移量” 定位,x86 架构 CPU 通过起始地址确定数据块起点,依据类型确定偏移范围(需读取的字节数),完成对变量的完整访问。
2025-08-02 00:24:31
452
原创 进程通信————system V 消息队列 && 信号量
资源形式:由操作系统提供的消息队列功能 1:使进程双方能看到同一个队列,为通信提供基础功能 2:允许不同进程向内核发送带类型(用于区分发送方)的数据块。
2025-07-28 17:00:42
1002
原创 进程间通信————system V 共享内存
操作系统先在物理内存中开辟一块专用空间,作为进程间共享的基础资源;借助页表机制,将这块物理空间映射到参与通信的进程各自地址空间的共享区域,建立虚拟地址与物理地址的关联;向应用层返回映射后的虚拟地址起始位置,进程即可通过该地址直接读写共享内存,实现数据交互。
2025-07-28 17:00:22
765
原创 进程通信————命名管道
写操作需等待读方打开管道,否则会处于阻塞状态;读操作若缓冲区为空且没有写方,同样会阻塞。数据按 “先进先出”(FIFO)规则传递,一次交互完成后缓冲区会被清空。
2025-07-24 22:34:18
612
原创 文件操作----文件描述符
在C语言文件操作中,使用 `fwrite(message, strlen(message), 1, fp)` 写入字符串时无需添加 `+1`,因为 `strlen` 返回的是不含终止符 `'\0'` 的字符串长度。先把之前创建的log.txt删除,然后编译运行myfile.c,当前工作目录下就会有新创建的log.txt文件,查看里面的内容,就是我们写入的一行hello Linux message。我们每运行一次myfile,会发现里面会多一行abcd的内容,这体现了’a’参数追加写入的功能。
2025-07-21 20:05:56
647
原创 静态库和动态库
静态库实际上就是多个.o文件的归档集合。通过ar命令将多个.o文件打包成一个.a文件,方便在链接时统一使用。在链接阶段,链接器会从静态库中提取需要的目标文件,合并到最终的可执行文件中。定义全局变量myerrno(模拟系统 errno)当div(10,0)执行时:if(y==0){myerrno=1;// 用1标识“除数为0”错误return -1;// 返回值无法单独表示错误调用者通过检查myerrno的值,即可判断函数是否执行出错及错误类型。
2025-07-21 20:05:06
808
原创 程序替换----exec系列函数
使用execl等exec系列函数执行其他程序后,原程序中exec调用之后的代码(eg:和return 0))不会执行。无论替换为lstop等任何程序,均表现为:只执行被替换程序,原进程后续代码被完全跳过。exec系列函数用于在当前进程中替换程序(加载新程序执行),核心功能相同,差异主要体现在参数传递方式和程序查找方式。execlexeclpexecleexecvexecvpexecvpeexecve(其他库函数均基于execve实现)
2025-07-09 16:17:46
924
原创 进程控制----进程终止
退出码:进程向父进程(或 Shell)传递的执行状态标识。接收者:作用:查看命令行中最近一个正常终止进程的退出码。(三)代码示例:退出码的设置与应用1.基础示例:返回成功 / 失败码2.系统错误码示例(文件打开失败) 运行后输出,对应错误描述为 "No such file or directory"。3.自定义错误码体系三、错误码的解析与转换(一):错误码转文本描述 作用:将整数错误码转换为可读字符串(需包含)。 示例:打印系统错误码描述
2025-07-05 19:28:54
575
原创 Linux调试器-gdb
l 0l mainmainb 19mainb addToTopinfo bd 1rsaddToTopnprintfp ip &idisplay i(每次暂停自动显示i变量值)(显示所有设置了的持续变量)(取消编号2的自动显示)until 11cq。
2025-05-10 09:45:09
835
原创 C++11----智能指针
public:SmartPtr(T* ptr) : _ptr(ptr) {} // 构造时获取资源~SmartPtr() { // 析构时释放资源} // 行为像指针private:T* _ptr;// 使用示例:自动释放资源,无需手动deletevoid f() {// 解引用// 指针访问div();// 若抛异常,sp1/sp2/sp4析构时自动释放//浅拷贝问题:SmartPtr未自定义赋值导致内存泄漏sp1 = sp2;
2025-05-10 09:44:49
1022
原创 Linux进程概念
环境变量是操作系统维护的key-value(键值对)形式的全局配置参数,以name=value格式存在,用于描述系统运行环境信息,具有全局属性,可被子进程继承 (后面会详细讲解)。核心作用:路径定位:如PATH指定可执行文件搜索路径。用户配置:如HOME存储用户主目录,USER记录当前用户名。程序运行:影响程序行为(如LANG设置语言编码)。
2025-05-09 16:31:11
784
原创 C++11新特性
/ 标准构造方式// 列表初始化方式// 隐式调用构造函数(有explicit会报错,因为无法隐式类型转换)// 显式直接构造// 临时对象绑定,临时对象具有常性// 错误:非常引用不能绑定临时对象// 正确:常引用延长临时对象生命周期。
2025-04-30 17:10:33
1652
原创 C语言实现进度条
为什么我会整理这部分的学习笔记呢?因为我在学习这部分内容是对缓冲区有了全新的认识(此时我还没有学过操作系统),想趁此记录一下我的学习心得。
2025-04-19 11:09:16
531
原创 Linux项目自动化构建工具————make/makefile
1.make:2.makefile:一个文本文件(命名为 或 ),定义项目编译规则和依赖关系。 示例解释: 是目标文件,依赖 。执行 时,自动调用 编译生成 。三、清理操作(clean 规则)1. 添加清理规则为什么 后面没有依赖文件?因为 是伪目标,不依赖任何文件,直接执行命令。 2. 伪目标的作用 伪目标:不生成实际文件,仅执行命令。 的作用:强制 执行该规则,即使存在名为 的文件。依赖关系:目标文件是否需要重新生成,取决于依赖文件是否更
2025-04-09 15:06:52
367
原创 哈希表(哈希桶版本)
由数组和多个桶构成。数组元素对应桶,桶可以是链表、二叉树等(这篇文章主要讲解链表版本的)。插入时,哈希函数算哈希值,按值找数组位置放元素;查找、删除同理,再按桶对应数据结构规则操作。:哈希函数模板(默认支持整型和string特化):键类型(必须可哈希)
2025-03-27 13:45:29
986
原创 哈希表(除留余数法)
a ≥ 0.7EXIST:该位置有有效数据EMPTY:该位置为空DELETE:该位置数据被删除解决冲突探测时无法区分“从未插入”和“已删除”的问题删除时不物理删除数据,仅标记状态,避免破坏探测链:整数类型(intchar等):无法直接处理字符串等复杂类型:通过乘法和累加减少哈希冲突:字符串需要特殊处理,避免str[0]直接取首字符导致高冲突率。
2025-03-15 15:25:35
639
原创 C++----红黑树&&map和set的封装
/ map侧迭代器定义// set侧迭代器定义关键差异容器迭代器类型可修改性map普通迭代器可修改value,不可修改keysetconst迭代器完全不可修改元素。
2025-03-08 19:14:32
1164
原创 数据结构--AVL树
AVL 树是一种自平衡的二叉搜索树。它在向二叉搜索树中插入新节点时,通过特定的旋转操作,保证每个节点的左右子树高度之差的绝对值不超过 1。这使得 AVL 树在动态插入和删除节点过程中,始终保持较为平衡的状态,从而保证基本操作的时间复杂度稳定在 O (log n)。
2025-03-08 19:12:52
1131
原创 linux工具
(Package)是预先编译好的应用程序及其依赖项的集合,类似于 Windows 中的安装程序(如.exe文件)。在 Linux 中,软件包包含:可执行程序配置文件依赖关系信息安装脚本gccmake.rpm。
2025-03-04 23:56:12
986
原创 C++----异常
在服务器开发中,为了更好地管理和处理不同类型的异常,通常会设计一个异常继承体系。// 异常基类(抽象错误类型)// Exception 类:作为基类异常,包含异常信息 _errmsg 和异常编号 _id,// 并定义了虚函数 what() 用于返回异常信息,支持多态。public:// 虚析构保证正确释放protected:// 错误描述int _id;// 错误编号// SQL操作异常(具体错误类型)
2025-03-04 23:55:14
1135
原创 C++----set和map
vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。
2025-02-22 11:38:17
943
原创 二叉搜索树
二叉搜索树是一种二叉树,对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种特性使得二叉搜索树在查找、插入和删除操作上具有较高的效率,平均时间复杂度为O(logn) ,但在最坏情况下(树退化为链表)时间复杂度为O(n)。
2025-02-18 09:03:50
758
原创 C++----多态
纯虚函数的作用:在抽象类中定义纯虚函数,间接强制派生类重写该虚函数。派生类若不重写纯虚函数,自身也会成为抽象类,同样不能实例化对象。抽象类的使用:虽然抽象类不能实例化对象,但可以定义指向抽象类的指针或引用,通过这些指针或引用调用派生类重写后的虚函数,实现多态行为。在上述代码中, Func 函数通过 Car* 指针调用不同派生类的 Drive 函数,体现了这一特性。
2025-02-14 13:35:26
783
原创 C++----STL(vector)
如果已经掌握string用法的,理解vector会更容易。vector中的find:vector不像string在成员函数中直接提供了find(),而是通过<algorithm>头文件中的find函数,用于查找元素的位置。原因:vector在insert或erase操作后,可能会重新分配内存(尤其是当容量不足时),导致所有指向该vector的迭代器失效。在实际中非常的重要,在实际中我们熟悉常见的接口就可以,下面列出了。中的元素,因为这样做会导致未定义行为。在C++的STL(标准模板库)中,
2025-01-22 23:38:48
896
原创 C++----STL(string)
迭代器(iterator)是一种类似指针的对象,用于访问容器中的元素。它可能是一个指针,也可能是一个封装了指针行为的对象。迭代器提供了对容器元素的顺序访问,可以遍历容器中的元素。
2025-01-13 21:47:37
1003
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人