自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(72)
  • 收藏
  • 关注

原创 线程池+日志(纯代码)

【代码】线程池+日志(纯代码)

2024-04-06 20:51:10 204

原创 C++11与thread相关使用(纯代码)

【代码】C++11与thread相关使用(纯代码)

2024-03-26 21:15:27 181

原创 Linux下对线程的认识+生产消费者模型+信号量

所以当我们的多线程竞争锁时,竞争成功的线程首先进来将数字0 move到al寄存器中,然后将al寄存器内的数据和mutex进行交换(而mutext的默认值都是1),所以此时al寄存器的内容就是1,而mutex数据的值就等于0,则进入if语句线程上锁成功,其他线程进来后也会从头执行相应的汇编代码,但是此时mutex的值还是0所以最终就会在else中挂起等待。所以我们的线程切换是。因为线程中对每种信号的处理方式都是共享的,也就是handler表共享,所以一个线程崩溃的话,其他线程就会执行相同的处理方法。

2024-03-22 20:19:05 1037

原创 进程地址空间的进一步认识

地址空间的大小取决于系统的架构和操作系统的实现。在32位系统中,地址空间大小为2的32次方(约为4GB)。而在64位系统中,地址空间大小为2的64次方。进程地址空间的划分使得不同的数据和代码可以在不同的区域中进行管理和保护。不同的区域具有不同的访问权限和特性,例如代码段是只读的,堆和栈是可读写的。进程地址空间也为操作系统提供了机会,以提供虚拟内存管理、内存映射和安全性等功能。

2024-03-18 21:37:20 337

原创 linux中对信号的认识

信号是向目标进程发送消息通知的的一种机制。信号可以以异步的方式发送给进程,也就是说,进程无需主动等待,而是在任何时间都可以接收到信号。

2024-03-04 15:02:26 801

原创 使用管道和system V进行进程间通信

然后分别在父子进程中关闭关闭其不需要的操作文件方式,此时关闭并不会直接将文件给关闭,因为我们文件的指向是采用引用计数的方式的,所以关闭进程的文件,只会使引用计数--,只有减到0才会真正的关闭文件。我们首先创建管道(实质就是打开同一个文件两次,形成两个文件描述符),然后再fork创建子进程,那么子进程会拷贝文件描述符表中的内容,此时,父子进程文件描述符表中的文件指针所指向的就是同一个文件,继续fork继续拷贝...但是我们发现,我们的结果是按照顺序读写的,也就是子进程写完一份内容,父进程才会读取一份内容。

2024-02-26 15:30:32 831

原创 动态库和静态库的理解 Linux

其实库文件里面的内容就是函数的实现方法,向我们包含的头文件其实就是函数的生命,而我们编译链接程序时会自动加载库文件,最终形成可执行程序。其实我们在编译链接时不仅仅会将文件的库文件加载进来,其实头文件也是需要加载进来的,只不过也是自动加载的。

2024-01-24 16:44:00 957 1

原创 磁盘的分区与文件系统的认识

了解磁盘的结构:1、盘片硬盘首先会有多个盘片构成,类似很多个独立的光盘合并在一起,每个盘片都有2个面,每个盘片都有一个对应的磁头,我们的磁头横移和盘面的旋转就可以读写到盘面的每一个位置,而我们的磁盘数据实际上就是在盘面上保存的。2、扇区和磁道每个盘片会分成若干个相同同心圆的磁道,磁道从外围开始编号,从0开始,每个磁道又会划分成若干个扇区,扇区是硬盘的最小存储单元,一般是存储512字节。3、磁头和柱面磁头用于读取盘面中磁道内的扇区中存储的数据。

2024-01-21 23:04:37 912

原创 C++中特殊类的设计与单例模式的简易实现

对于这种特殊类的设计我们一般都是优先考虑私有构造函数。然后对于一些特殊要求就直接通过静态成员函数的实现来完成。这里选择禁掉拷贝构造函数和拷贝函数是为了防止将已创建的对象去拷贝构造新的对象。

2024-01-18 20:10:14 1052

原创 用Linux的视角来理解缓冲区概念

缓冲区(buffer)是存储数据的临时存储区域。当我们用C语言向文件中写入数据时,数据并不会直接的写到文件中,中途还经过了缓冲区,而我们需要对缓冲区的数据进行刷新,那么数据才算写到文件当中。而缓冲区通常是一块内存区域,可以是数组、队列、链表等数据结构。

2024-01-10 20:07:20 1026

原创 异常和智能指针

智能指针是一种C++语言中用于管理动态内存的工具,,从而。智能指针可以跟踪指向的对象的,并在需要时被引用的内存,这极大地提高了内存管理的安全性和便利性。:独占型智能指针,表示它所指向的对象只能被一个指针拥有(即不能进行赋值),一旦该指针销毁,它所指向的对象也会被销毁。:共享型智能指针,允许多个指针共同管理同一个对象,通过引用计数来跟踪对象的引用次数,当引用计数为0时自动释放对象内存。

2023-12-25 22:47:29 940

原创 Linux操作系统下对文件的管理

(如果不想要最后的回车键就直接将 buf[sz-1]=0;进行设置)

2023-12-07 20:44:43 916 1

原创 右值引用和移动语义(C++11)

左值是表示数据的表达式(如变量名或解引用的指针),也可能在赋值符号右边,具有地址的、可寻址的表达式才是左值。右值是一个表达式,如:字面常量、表达式返回值,函数返回值等等,且右值不能出现在赋值符号左边不能进行取地址才是右值。

2023-12-03 12:10:00 797 1

原创 位图和布隆过滤器

在学习过哈希之后,我们对于哈希其实理解哈希可以通过与计数排序联系起来。哈希的本质其实就是将数据与下标位置对应起来,所以我们就有了unordered_map和unordered_set的出现。但是当我们如果是对数以万计的数据进行统计的话呢,那么还是用hash来辅助嘛。其实哈希的缺陷型就是空间换时间,哈希本身的消耗其实就是相当大的,因为哈希底层实际就是顺序表+单链表的存储结构。所以我们可以借助哈希的思路另寻路径。也就是我们要谈到的位图以及布隆过滤器。

2023-11-29 15:02:16 410

原创 哈希表的认识与实现

可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。所以当我们设置这种数据结构时主要就是要找好与建立好关系。但是我们插入数据的映射关系可能并不是一一对应的,也可能是多对一的关系也称为。所以说我们就要想办法解决这些多个插入数据对应一个插入位置的数据(哈希冲突)的问题,因此我们就有对应的。哈希函数可以帮助我们将插入数据与插入位置关联起来,

2023-11-24 21:13:56 464 1

原创 进程程序替换与exec系统调用

进程程序替换是指将一个正在运行的进程替换为另一个可执行程序。它的本质是调用了Linux操作系统中的exec系统调用。而exec系统调用是一个家族函数,例如execlexecvexecleexecve等。它们的共同特点是当当前进程执行到该函数时,就会直接跳转到新的程序并开始执行新的可执行文件。

2023-11-18 19:01:38 249 1

原创 map和set的简易封装(纯代码)

【代码】map和set的简易封装(纯代码)

2023-11-17 10:38:27 103

原创 对红黑树的理解与实现(C++实现)

每个节点要么是红色,要么是黑色。根节点是黑色。叶子节点(NIL节点)是黑色的。(此叶子结点指的是空节点)如果一个节点是红色的,则它的两个子节点都是黑色的。(不能有连续的两个红节点)对于每个节点,从该节点到其后代叶子节点的所有路径上,包含相同数量的黑色节点。

2023-11-13 21:22:00 103

原创 什么是进程等待?

当一个进程正常退出或者被终止时,其所占用的系统资源会被操作系统及时回收释放,而其退出状态(退出码)会被传递给其父进程。然而,如果父进程没有合理处理该状态,那么子进程将会变成一个僵尸进程。僵尸进程会占据系统资源,也就是僵尸进程的退出信息等资源,避免僵尸进程的产生:父进程通过调用 wait() 或 waitpid() 系统调用来处理已经终止的子进程,也就是处理僵尸进程所占据的资源信息。

2023-11-10 23:53:18 146

原创 AVL树的插入详解

_kv(kv)//pair内部有实现自己的拷贝构造函数,_bf(0){}int _bf;//每个节点的平衡因子(right-left)class AVLpublic:AVL(){}private:首先我们要知道AVL树的数据类型一般都是K-V型,具体说也就是pair类型,而且AVL树和一般的树据关联是不同的,属于三叉连,也就是不仅仅要有左右指针还要有父指针,而父指针的目的就是在插入数据的时候可以更方便的处理祖宗节点的平衡因子。平衡因子的计算:右子树的高度—左子树的高度。

2023-11-09 19:33:19 272 1

原创 Linux下进程地址空间初步理解

我们的每一个进程地址空间都是经过区域分区的,每个区域的数据种类不同,而为了对进程地址空间做管理则必然是有一个类似于PCB(进程控制块)的的结构体,而这个结构体的名称就是mm_struct,而这个结构体里用long long类型的变量存放了有关进程地址空间的所有区域地址划分(也就是每个区域(例如栈区)的起始位置),而区域之间的地址可以被我们直接用来使用,也正是虚拟地址。而进程PCB中也有一个指针指向这个结构体。所以此时对进程地址空间就有了一个全新的理解,

2023-10-27 18:58:48 211

原创 C++多态的认识与理解

首先我们要知道没有继承就没有多态,多态是建立在继承之上的。多态是在不同继承关系的类对象中去调用同一函数,产生不同结果的行为。

2023-10-26 11:39:58 154 1

原创 Linux下的命令行参数和环境变量

所以说我们自己的可执行程序要带上路径才能执行就是因为我们的程序不在PATH环境变量下的路径当中。其实linux下的指令是有默认搜索路径的,也就是当你使用该指令时,linux会自动在默认路径里面去找而该默认路径是什么呢?其实这是一个全局的二级字符指针,指向的正是环境变量表中的内容(也就是指向char*[]的类型)所以无论哪里我们都可以通过该指针去访问环境变量列表里的内容。用于指定可执行程序的搜索路径,当输入一个不带路径的命令时,系统会默认在PATH的内容中按照顺序在路径列表中查找可执行程序的所在路径。

2023-10-20 09:29:42 1330 1

原创 C++对多继承的理解

学到C++时我们知道了继承但是一般都是使用单继承为主,单继承就是一个子类只能继承一个父类而多继承是指一个子类可以同时继承多个父类。

2023-10-18 19:31:25 160 1

原创 C++容器适配器的使用以及优先队列的实现

所以说一般对于类的实现时如果新旧的版本中部分旧接口还在被使用。需要保留旧的接口,改变少许不同的接口的底层实现的这种情况时就可以考虑到容器适配器。

2023-10-14 10:19:47 97 1

原创 Linux操作系统下进程状态的理解

我们知道进程会有属于自己的PCB,便于操作系统的管理,而PCB结构体里面还有进程状态参数,类似于用一个变量标识对应的进程状态,就相当于将每个进程状态编号,而PCB中有一个变量存储当前进程状态所对应的编号,也就表明当前进程对应的具体状态,好让操作系统看到具体的状态,并对其更好地进行操作。

2023-10-08 20:13:24 115

原创 对进程的初步认识以及fork()函数的理解

进程是什么呢?其实解释的通俗浅显一点就是我们运行到内存的程序。我们知道运行一个磁盘里的程序时,会将该程序先加载(将磁盘的数据拷贝)到内存当中,因此该程序就可以称为一个进程。首先我们以Windows操作系统为例, 可以快捷键查看当前正在运行的进程:Ctrl+shift+Esc。

2023-10-03 10:16:08 139 1

原创 Linux下进度条程序实现以及自动化构建工具makefile的实现和对回车键的理解

在实现进度条之前我们要了解一些有关实现进度条的知识。例如回车与换行和makefile的使用。

2023-09-18 21:27:39 238 2

原创 Linux下生成可执行程序的每一步过程以及链接库的初步认识

而头文件展开是干啥呢,这里就要大略的谈谈头文件和库文件了,头文件就是我们的stdio.h,而我们包含的这个头文件功能起到一些函数、变量类型定义的作用,而函数的具体实现是在库文件里的,例如我们的printf函数也是需要实现的,就是在stdio.h定义的,如果我们要使用函数的话,编译器就需要到特定的库文件中去寻找该函数的实现,而库文件的内容实质上都是一些二进制。就以C语言代码为例,当我们写好了一份C语言代码,第一部要进行头文件的包含,然后在主函数下咔咔一顿写,再开始翻译,也就是形成可执行程序的过程.

2023-09-12 22:46:43 558 2

原创 C++中List的实现

list中const和非const迭代器封装实现以及其它

2023-08-16 15:02:16 809 1

原创 vector的模拟实现

vector是一个封装了动态大小数组的顺序容器跟任意其它类型容器一样,它能够存放各种类型的对象。以下是一些vector实现时的难点,欢迎留言!

2023-08-13 20:35:52 251 1

原创 模拟实现string类

string类的接口有很多,这里我来梳理一下自己常用的几个,并模拟实现一下可以凑合用的my_string,话不多说直接开干:

2023-08-11 13:36:05 114

原创 C++ 对函数模版和类模版的理解

所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。

2023-08-03 18:15:32 166

原创 C++中内存的动态管理

其实new和delete操作符也不是仅仅就调用了operator new和operator delete那么简单,其实实际上还调用了类的构造函数,而delete还调用了类的析构函数(delete是先调用析构函数,再调用operator delete函数释放创建的空间)new A[N]的原理1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请2. 在申请的空间上执行N次构造函数delete[]的原理1. 在释放的

2023-08-02 21:42:48 338

原创 C++中的static修饰类的成员变量和成员函数

1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

2023-07-30 14:11:17 230

原创 const对象不能调用其他非const成员函数,const成员函数不能调用其他非const成员,

在C语言中我们知道const关键字修饰的变量具有常量属性,简称常变量。即修饰后的变量不能再次修改,而C++中是兼容C语言的,同样具备该特性,但C++引入了引用(&)所以const的用法就更多了。我们知道引用的对象必须是个变量,不能有常属性,所以用const修饰过的对象就不能引用。

2023-07-29 16:40:04 373

原创 C++中对 this 指针的理解

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

2023-07-28 16:07:54 193 1

转载 为什么内联函数的声明和定义不能分离?

可是,如果函数加了inline的话,并且声明和定义分离在两个文件中,只有定义函数的文件中能使用这个函数,声明函数的文件中却不能使用函数。我们知道,如果函数没有加inline的话。它会在编译期间进行符号汇总,在汇编期间生成符号表,最后在链接的时候进行符号表的合并,这样的话,定义函数的文件和声明函数的文件都能拿到函数的地址,也就都能使用函数了。综上所述,内联函数声明和定义分离在不同文件中的话,定义函数的文件不会将函数和函数地址放在符号表中,声明函数的文件在使用该函数时会找不到该函数,所以会发生里链接错误。

2023-07-22 15:57:18 215

原创 C++引用

如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回

2023-07-19 11:36:43 112 1

原创 为什么C++支持函数重载

C语言中会在编译阶段进行符号表汇总,就是记录在进入主函数之前所创建的全局变量和函数名这些数据。在汇编阶段就会将这些数据存在符号表当中,并且每个数据都对应着各自的地址(对于函数而言:地址是在函数定义时才会出现,即在形成汇编代码时的第一句指令所在的地址)最终还在链接阶段将这些符号表合并与重定位,也就是将那些具有相同符号名的数据地址进行合并成一个有效的地址符号名。所以说回来,在C语言当中如果遇到同名函数(函数重载)时,在编译时就会出错,将两个同名的函数放到符号表进行符号表汇总时就已经出了问题了。

2023-07-18 11:33:18 237 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除