- 博客(42)
- 收藏
- 关注
原创 linux线程基础概念
本篇主要讲解线程相关知识和概念、线程的相关函数使用、二级页表的讲解。之前我们学过进程,而什么是线程呢??是LWP(轻量级进程),是内核级线程,由操作系统直接管理和调度。1、在一个程序里的一个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的控制序列”2、一切进程都至少有一个执行线程3、线程在进程内部运行,本质是在进程地址空间内运行4、在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。
2025-06-08 12:51:59
937
原创 linux信号详解
pending 位图:用于记录当前进程收到的所有信号,每一位对应一个信号,若该位为 1,表示进程收到了相应的信号。block 位图:用于记录当前被阻塞的信号,被阻塞的信号不会立即被处理,而是处于挂起状态,直到该信号的阻塞被解除。handler 位图:记录了每个信号对应的处理方式(默认、忽略、自定义处理函数)。信号处理是进程对收到的信号做出响应的过程。当进程收到一个信号时,系统会根据信号的处理方式进行相应的操作。如果是默认处理,系统会按照预定义的行为处理信号;如果是忽略信号,系统会直接丢弃该信号;
2025-06-02 21:23:10
1245
原创 linux 进程间通信_共享内存
共享内存(Shared Memory)是一种高效的,允许多个进程直接访问同一块物理内存区域,实现数据的快速交换。它是IPC中速度最快的方式,因为共享内存方式的通信没有中间过程,而管道、消息队列等方式则需要将数据通过中间机制进行转换。共享内存的原理如上图所示,主要分为两部1.进程在物理内存上开辟一块空间,这块空间称为共享内存。2.不同进程将这块空间挂接到自己的进程地址空间中。3.进程通过虚拟地址和页表的映射找到共享内存,然后对共享内存进行读写数据。
2025-05-26 12:05:25
315
原创 Linux 动静态库详解
预处理:完成头文件展开、去注释、宏替换、条件编译等,最终形成xxx.i文件。编译: 完成词法分析、语法分析、语义分析、符号汇总等,检查无误后将代码翻译成汇编指令,最终形成xxx.s文件。汇编: 将汇编指令转换成二进制指令,最终形成xxx.o文件。链接: 将生成的各个xxx.o文件进行链接,最终形成可执行程序。静态库:在编译时,库的代码被直接复制到可执行文件中,程序运行时不依赖外部库文件。动态库:在程序运行时加载库的代码,多个程序共享同一份库的实现,节省内存和磁盘空间。
2025-05-14 11:08:22
1056
原创 Linux 软硬连接详解
定义:软链接是一个独立的文件,拥有自己的 inode 和属性,其内容存储目标文件/目录的路径字符串,类似于 Windows 的快捷方式。特性。
2025-05-12 18:45:12
546
原创 Linux 详解inode
是Linux文件系统中的一种数据结构,用于存储文件或目录的元数据(metadata)。每个文件或目录在文件系统中都有一个唯一的inode编号,它记录了文件的关键信息,但不包含文件名或文件内容本身。
2025-05-12 18:11:02
445
原创 Linux_进程退出与进程等待
tatus不能简单的当作整型来看,要从二进制的角度来看,32位下,整型转化为二进制有32个bit位,但是我们仅关注低16位。是用于接收子进程终止状态的关键参数,需配合特定宏解析具体信息。父进程在忙,子进程结束了,但无人回收,这样就造成了“死亡”的子进程一直占用资源。为了解决这个问题,最初的思路是:让父进程停下,等待子进程执行完,然后回。_exit :立即终止进程,不执行任何清理操作。若父进程不关心子进程状态,可将参数设为。,此时仅等待子进程结束而不获取状态信息。这个时候的子进程被称为“僵尸进程”
2025-05-08 22:24:15
1261
原创 Linux 进程替换
原理:进程替换是指通过调用特定的系统调用(如exec系列函数),将一个进程当前执行的程序完全替换为新的程序映像。替换后,原进程的代码段、数据段、堆栈等内存空间被新程序覆盖,但进程的 PID、文件描述符等资源保持不变13。替换成功后,原进程的后续代码不再执行,仅保留新程序的执行入口。
2025-05-08 19:11:53
229
原创 linux_进程地址空间(虚拟地址空间)
先看这样一个具体的例子我们发现在同一个地址空间的a变量,父进程和子进程访问时获取的值却不是相同的,这是什么原因呢?首先,我们可以理解,父子进程的值不同是因为进程间具有独立性,但是这里的i的地址居然是相同的。因此,我们可以先排除该地址是变量i在物理磁盘上的地址的可能性(因为物理磁盘的同一个地址,只能存放唯一确定的一个值)。因此,这个地址只能是虚拟地址(也称为线性地址在Linux中,有时候我们也将这种地址称为逻辑地址。操作系统为每个进程都创建了,这样每个进程都能独立的运行。
2025-05-07 21:02:58
812
原创 unordered_map、unordered_set详解
何时选择?通过合理选择容器,可以显著提升程序性能。对于大多数高频操作场景,和凭借其哈希表的高效性,成为C++开发者的首选工具。负载因子(Load Factor):桶中元素平均数量,影响冲突概率。// 设置最大负载因子// 预分配桶数量。
2025-04-20 22:34:01
642
原创 红黑树总结
通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍(最长路径也不会超出最短路径的两倍,因此红黑树的平衡性要求相对宽松,没有AVL树那样严格),从而使搜索树达到一种相对平衡的状态。红黑树(Red-Black Tree)也是是一种自平衡的二叉搜索树,与AVL树不同的是它在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。任意结点到其每个叶子结点的简单路径上,黑色节点的数量相同:确保了树的黑平衡性,即红黑树中每条路径上黑色结点的数量一致。
2025-04-20 12:34:12
288
原创 C++11新增特性—>可变参数模板、lambda表达式、包装器
1、【概念】可变参数模板是C++11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接受可变参数的函数模板和类模板,这里主要针对函数模板的可变参数。在C++11之前,类模板和函数模板中只能包含固定数量的模板参数,可变模板参数无疑是一个巨大的改进,但由于可变参数模板比较抽象,因此使用起来需要一定的技巧。在C++11之前其实也有可变参数的概念,比如printf函数就能够接收任意多个参数,但这是函数参数的可变参数,并不是模板的可变参数。
2025-04-05 14:37:04
559
原创 左值引用与右值引用详解
左值是一个表示数据的,比如:变量名、解引用的指针变量。一般地,我们可以获取它的地址和对它赋值,定义时const修饰符后的左 值,不能给他赋值,但是可以取它的地址。总体而言,可以取地址的对象就是左值。
2025-02-27 20:55:17
924
原创 AVL树详解
AVL树,又称为平衡二叉树,它基于二叉搜索树并通过平衡而得到。在数据结构中,二叉搜索树可以提高搜索数据的效率,但在数据有序的情况下会退化为单支树,此时在树中查找元素就得遍历一整个分支,时间复杂度也会退化至O(N)。AVL树的左右子树高度差不能超过1,也就是说每个节点的平衡因子的绝对值不能超过1;, _bf(0){}//节点的父节点T _data;//节点的值int _bf;// 节点的平衡因子。
2025-02-19 13:42:41
842
原创 c++ map和set功能详解
1. set是按照一定次序存储元素的容器。2. 在 set 中,元素的 value 也标识它 (value 就是 key ,类型为 T) ,并且每个 value 必须是唯一的。set中的元素不能在容器中修改( 元素总是 const) ,但是可以从容器中插入或删除它们。3.在内部, set 中的元素总是按照其内部比较对象 ( 类型比较 ) 所指示的特定严格弱排序准则进行 排序。
2025-02-17 14:02:41
839
原创 二叉搜索树
/分装每一个节点,定义成模板函数K _key;{}//搜素树的定义public:private:在BSTree类种主要实现四个函数:插入,删除,查找,中序遍历。(中序遍历搜索二叉树时得到的是有序的)下面为二叉树的代码实现,只有看了代码实现,才会对二叉树有了更深刻的认识创建一个二叉搜索树的过程,也就是不断的插入。插入的具体过程如下:1、树为空,则直接新增节点,赋值给root指针2、树不空,按二叉搜索树性质查找插入位置,插入新节点//如果树为空的情况。
2025-02-13 12:42:09
860
原创 C++多态详解
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。基类的虚函数进行重写在继承中要构成多态还有两个条件(二者缺一不可):1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:virtual void BuyTicket() { cout << "买票-全价" << endl;
2025-02-11 18:38:58
707
原创 C++继承
1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。
2025-02-09 19:52:30
641
原创 string类
在string拷贝的时候,第三个参数len如果不传或者传大于拷贝字符串的长度,就是将第二个参数pos开始拷贝到字符串结束。对于string类型,可以用迭代器来访问,也可以用[ ]来访问。对于有const修饰的字符串不可被修改,没有则可以修改。拷贝构造,流插入和流提取。可以用对象加.操作符来访问。
2024-11-14 17:26:13
137
原创 C++模板
1. 函数模板函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本。函数模板格式注意:template 返回值类型 函数名(参数列表){}typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替 class)函数模板的实例化:用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化 和显式实例化1. 隐式实例化:让编译器根据实参推演模板参数的实际类型。
2024-11-05 22:24:38
237
原创 C++内存管理
1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。3. 堆用于程序运行时动态内存分配,堆是可以上增长的。4. 数据段--存储全局数据和静态数据。5. 代码段--可执行的代码/只读常量。
2024-11-03 23:31:25
418
原创 C++类和对象
赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟 拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。赋值运算符重载的特点:1. 赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成 const 当前类类型引⽤,否则会传值传参会有拷⻉2. 有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋 值场景。
2024-11-03 22:51:47
309
原创 C++类和对象
默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数。
2024-10-27 22:36:07
240
原创 C++的类和对象相关知识详解
1、class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。2、定义在类⾯的成员函数默认为inline。C++ 升级 struct 升级成了类1 、类⾥⾯可以定义函数2 、 struct 名称就可以代表类型不再需要 typedef , ListNodeCPP 就可以代表类型。
2024-10-27 21:28:29
1219
原创 内敛函数 和 nullptr
⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就需要建⽴栈帧了,就可以提⾼效率。inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
2024-10-27 20:57:03
190
原创 进程的创建和终止
在程序创建子进程的时候,子进程和父进程的代码和数据是一起的,权限会更新成只读的;当子进程写入的时候会触发系统的错误发生缺页中断(权限的不匹配),此时系统会发生判定是否需要写时拷贝,如果需要,系统会将父进程的数据区进行拷贝一份,让子进程对拷贝的数据进行修改。申请内存,发生拷贝,修改页表,权限的更新。为什么要有写时拷贝????为了节省内存空间子进程和父进程的大部分数据都相同,不一定要全覆盖,写时拷贝有效节约了内存空间;
2024-10-27 20:40:07
483
原创 C++命名空间作用域
域:名字的隔离;影响查找规则1、作用域 限定符(指定)2、命名空间作用域可以嵌套3、多个文件可以定义同名的命名空间,在调用的时候会合并查找顺序规则:a、当前局部域b、全局域(不会到其他的命名空间作用域找)c、展开的命名空间作用域using namespace std->官方库展开命名空间作用域=>也有好处也有坏处,不能随便展开存在默认查找顺序,不太怕冲突4、指定展开某一个using bitx影响生命周期=>局部域=>全局域不影响 ->命名空间作用域。
2024-10-26 17:57:37
403
原创 Linux常见指令大全
dst目录: 把指定的目录(默认是当前目录)下,新建并拷贝src,拷贝的文件或目录的名称就叫做dst。date +%Y-%m-%d/%H:%M:%s -d@时间戳=>显示时间戳所在时间。dst文件:在指定的目录(默认是当前目录)下,新建并拷贝src。本应该从键盘输入的数据变为从指定文件读取数据。5、touch创建普通文件(如:touch ./test.c)mv src(文件,目录) dst(文件,目录)-l命令选项(显示更详细的文件内容)快捷=>ll。13、op src(文件,目录) dst(文件,目录)
2024-10-25 15:44:19
342
原创 Linux进程的切换
1、代码不会执行了——首先可以立刻释放的就是进程对应的程序信息数据退出2、进程退出,要有退出信息(进程的退出码)保存在自己的task_struct内部3、管理结构task_struct必须被OS维护起来,方便用户未来进行获取进程退出的信息task_struct->是进程的PCB进程=内核数据结构+代码和数据结构体->成员属性->退出信息(int code,其他信息)
2024-10-20 22:54:53
2073
原创 Linux权限问题、粘滞位和安装软件
权限理解:Linux下分为普通用户和超级用户普通用户之间不能切换超级用户通过:(root) su xxx可以转变为普通用户对普通用户执行一条命令(提权)(权限=>文件权限)sudo对普通用户进行提权sudo 命令=>以超级用户执行=>>不允许普通用户进行提权操作(在系统中存在白名单,而白名单属于root)1、对文件来讲,存在三种身份:拥有者,所属组,other(一个人只能有其中之一)身份决定他可以做什么操作(为了进行更细致的权限管理)权限=人+文件属性。
2024-09-20 17:19:13
495
1
原创 c语言扫雷代码设计和实现(最后有源码)
扫雷作为作为一款风靡全国的经典游戏,其玩法想必不必赘述。代码分为三个部分,game.h(头文件,用于函数的声明)game.c(源文件,用于游戏部分的实现),test.c(源文件,用于游戏的主函数和代码测试)
2023-12-11 10:44:04
745
1
原创 循环语句——while和for和do...while
在for循环中初始化、判断和调整都集中于for旁边的括号中,更加集中化。不管是看起来还是在语法使用中都更方便、不容易错,因此我更倾向于使用for循环。do..while与while循环类似,唯一的区别在于do...while是先执行一遍,再循环判断。在while旁边括号里的表达式中”0“为错误,不执行循环;而非”0“为正确,执行循环。while是c语言循环语句中三种循环的一种,还有for、do...while。而在while表达式中下面一般一段调整代码,如果不加很有可能会变成死循环。
2023-12-08 23:44:31
87
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人