自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux网络】UDP套接字【实现英汉转化】

今天搞定 UDP 数据传输

2025-05-25 10:42:04 1062

原创 高精尖带你迅速了解 QT 基本框架

今天分享 Qt 初识基础

2025-05-25 10:23:48 689

原创 【优选算法】二分查找

【代码】【优选算法】二分查找。

2025-05-09 10:39:34 232

原创 【优选算法】C++双指针问题

三个区间:[ 0, dest ] [ dest + 1, cur - 1 ] [ cur, n - 1 ]dest:已处理的区间内,非零元素的最后一个位置。cur:从左往右扫描数组,遍历数组。双指针,一个cur,一个dest。

2025-05-09 10:37:11 489

原创 【Linux网络】初识socket套接字

在进行网络通信的时候,用户使用应用层软件来完成整个数据发送和接受的。而用户使用应用层软件之前,必须先把这个软件启动起来,即本质上就是将进程启动起来。所以,网络通信的本质就是进程间通信。网络协议中的下三层,主要解决的是数据安全可靠的送到远端机器

2025-03-26 15:35:42 675

原创 【C++进阶篇】map和set的底层实现:红黑树

每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的。【不能出现连续的红色结点,即父子结点颜色:黑+黑、黑+红、红+黑】对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点。【每条路径都包含相同数量的黑色节点】每个叶子结点都是黑色的(此处的叶子结点指的是空结点)

2025-03-26 15:34:43 1129

原创 【Linux进程地址空间】再谈进程地址空间

今天我们来继续讲一下关于进程地址空间的内容点。一个 .c 文件在被编译成为 .exe 可执行文件的时候,是会加上地址的。即一个 .c 文件会先编译形成汇编文件,将 C语言代码转化为一条条的汇编指令。之后将汇编指令转化为所对应的机器码。此时都已经被加上地址了。即 .exe 中也是有地址的概念的。

2025-03-12 15:39:53 754

原创 【Linux基础进程篇】初谈进程地址空间——初窥进程地址空间的雏形

今天分享的是关于地址空间的理解,此为第一篇,目的是打牢基础篇。一:历史核心问题回顾二:语言层面的地址空间2.1:了解2.2:验证三:系统层面的地址空间3.1:引入新概念,初步理解这种现象——引入地址空间的概念3.2:加深粒度再来理解上面父子进程同意变量的现象四:谈细节4.1:地址空间究竟是什么4.2:为什么要有进程地址空间4.3:页表4.3.1:CR3寄存器4.3.2:页表项4.3.3:缺页中断五:结语。

2025-03-12 15:39:21 1193

原创 【Linux通信篇】进程间通信——system V共享内存

今天我们来了解一些有关SystmV共享内存的内容知识。申请共享内存三步申请法:操作系统在内存上去申请一段空间将申请到的内存挂接到进程地址空间的共享区返回起始虚拟地址1.2、释放共享内存释放共享内存:去关联,释放内存。这些一系列操作(申请、挂载、去关联、释放)并不是进程自己做的,而是由操作系统完成的。即我们用户(进程)通过调用一些系统调用接口让操作系统来做这些事情。因为OS中肯定有很多进程都在相互交互、通信的,那么操作

2025-03-10 10:24:04 1005

原创 【Linux系统】深入理解日志模块

今天我们来了解一些日志板块的内容。可变参数。va_list 一个 char* 类型的指针,va_start 函数作用是将 s 指向函数栈帧中的第一个非可变形参,因为函数的实参是从右向左的顺序进行在栈帧中压栈的,所以只需要知道第一个非可变形参的位置,那么就能找到第一个可变参数的位置,之后再解析出所有的可变参数,故此必须要求可变参数的最左边必须要有一个具体的参数(n),va_arg 函数作

2025-03-10 10:23:27 841

原创 【Linux通信篇】深入理解进程间通信——管道

今天我们来了解一些关于进程间通信的管道知识,进程间通信是两个或者多个进程实现数据层面的交互。因为进程独立性的存在,就导致了进程通信的成本比较高。

2025-03-09 08:15:40 958

原创 【Linux系统】精通动静态库的制作和使用

今天讲解动静态库的制作与使用规则,静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)动态库可以在多个程序间共享,所以动态链接使得

2025-03-09 08:13:21 686

原创 【Linux文件系统】数据在内存和磁盘之间的传输

今天带大家来谈一下关于数据在内存和磁盘中的交互问题。操作系统是一定能看到物理内存的,即能看到物理内存的物理地址的。而对物理内存的管理,既然要管理,还是要 "先描述,再组织",在OS内核中有一个结构体 struct page 用来描述物理内存的。

2025-03-08 09:15:41 973

原创 【Linux文件操作篇】文件系统 && 深度学习对缓冲区的理解

今天我们来说一些关于用户文件缓冲区的理解,进程打开的每一个文件都有一个独属于它自己的操作系统级别的文件缓冲区,这个缓冲区可以减少对外设的读写操作来提高计算机的效率。write 作为系统调用接口,它直接就向文件缓冲区内写入数据了,最后调用 close 接口或程序退出时会将文件缓冲区的内容刷新到外设中。(磁盘/网卡...)。

2025-03-08 09:15:07 1013

原创 【Linux文件操作篇】基础IO重定向的实现原理

今天我们学习基础IO重定向的知识内容,计算机上进行的所有操作任务都会被操作系统解释为进程。即目前对文件的操作都依赖于进程操作。

2025-03-06 08:54:38 739

原创 【Linux文件系统】文件系统,未被打开的文件【inode与软硬链接】

今天我们来谈一下关于inode和软硬连接的内容,记录地信息有整个分区到底有多大、该分区里面每个块组的起始位置、结束位置和大小,每个块组内部的inode和block的数量、每个组的起始inode编号,还有bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。软链

2025-03-06 08:53:53 1326

原创 【Linux文件操作篇】IO基础——被打开的文件,引入文件描述符

今天我们开启新篇章——基础IO的内容用法,文件 = 文件内容 + 文件属性。即不管是内容还是文件属性,都是数据,都需要储存在磁盘当中。文件分为打开的文件还有没打开的文件。没打开的文件,一般都是在磁盘中存储,因为磁盘中的文件非常多,那么文件是如何分门别类的存储号呢?本质就是我们要快速的对其进行增删改查(快速找到文件)。打开的文件,本质就是研究进程和文件的关系。对于文件的所有操作都是通过代码来实现的,但是代码最终是到CPU上来执行的。又根据 冯·诺依曼体系结构,CPU不能直接和外设交互数据打交道,所以一

2025-03-05 15:02:13 916

原创 【Linux_进程shell版】手撕一个shell简易进程外壳程序

今天我们来谈一下关于 shell 相关内容的理解,Shell是用户与操作系统内核(Kernel)之间的命令行接口,负责解析和执行用户输入的命令。一:命令行提示符二:读取键盘指令三:键盘指令分割四:普通命令执行五:内建命令执行六、总代码结语:

2025-03-05 15:01:44 1010

原创 【Linux进程控制篇】进程的替换

今天我带大家来谈一些关于进程替换的内容知识,用 fork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种 exec 函数以执行另一个程序。当进程调用一种 exec 函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用 exec 并不创建新进程,所以调用 exec 前后该进程的 pid 并未改变。

2025-03-04 08:37:39 769

原创 【Linux进程控制篇】进程等待

今天我们来谈一些关于进程等待的知识内容,之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。

2025-03-04 08:36:50 860

原创 【Linux进程控制篇】进程的终止

今天我们来谈一下关于进程的终止相关内容,我们以前写代码的时候总是在最后面写 return 0,那么为什么 main 函数总是会返回 return 0?这个返回值给了谁呢?为什么要返回这个值?下面就带大家好好探索一下关于进程的退出。

2025-03-03 15:24:48 810

原创 【Linux进程控制篇】进程的创建

今天我们来谈一下进程创建的相关细节。Linux中,fork函数功能:在当前进程运行时创建一个新进程,该进程是当前运行进程的子进程,原进程为父进程。

2025-03-03 15:20:23 833

原创 【C++进阶】模拟map和set底层了解必备——AVL平衡树

二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。与以前写的二叉搜索树不同,AVL树的结点不仅包括了左右孩子结点,还包括了其双亲结点(方便调整负载因子)。size_t _bf;// 负载因子,_kv(kv),_bf(0){}

2025-01-05 11:00:12 927 1

原创 【C++进阶】map和set容器的使用用法(万字总结超详细)

我们已经学习的STL的部分容器如vector、list、deque等等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构里面存储的是元素本身。而关联式容器,关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是。

2025-01-05 10:58:00 1024

原创 【CPP杂货篇】C++模板(超详细)

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时才被参数化,根据实参类型产生函数的特定类型版本。定义格式:class 类模板名// 类内成员定义模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2025-01-04 11:06:50 756

原创 【C++_高阶树】上万字总结C++二叉搜索树(铺垫map和set容器·)

二叉搜索树又称二叉排序树(BST,Binart Search Tree)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树。

2025-01-04 11:05:18 833

原创 【C++_stl篇】5万字超强总结C++STL三种常见容器string & vector & list的熟练使用,模拟实现和练习题型

字符串最后一个单词的长度_牛客题霸_牛客网string str;if(i!else {vector相当于我们以前学习数据结构章节时的顺序表。1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。

2025-01-03 11:24:25 1422

原创 【C++_STL篇】容器适配器——栈和队列(上万字总结,超细)

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作。

2025-01-03 11:20:41 819

原创 【C++STL杂货铺】2万字总结学习进阶必学的两座大山:继承 && 多态(重点详解)

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。例如,学生和教师的例子。首先,学生和教师都有着相同的属性。第一点他们都是人。即都有着各自的姓名,年龄等属性。所以如果要写关于学生和教师的属性类,那么就可以复用人这一个类。而将学生和教师不同的属性放到各个的类里面。

2025-01-02 15:32:01 676

原创 【CPP_STL篇】总结可遍历STL所有容器的迭代器(反向迭代器的模拟+实现)

因为我们当时已经写了一个正向迭代器了,那么就不再需要再重新手搓一个反向的了,只需要复用当时正向迭代器的代码即可。所以目前最大的问题就是如何将反向迭代器与正向迭代器互联起来,形成一个联系,通过这个联系使得反向迭代器复用正向迭代器的代码。我们已经了解了几个容器和配接器的用法,其中容器就是为了存储数据的,分为数组型,链表型,树形......。我们以前在模拟的时候就发现了,string 和 vector的迭代器就是原生指针。下面就根据list容器来“配置”一个我们 自己的反向迭代器。

2025-01-02 15:30:40 796

原创 【C++内存管理篇】全面分析New && Delete(详解大全)

在对自定义类型进行操作的情况下,单纯C语言的malloc和free函数无法很好的支持动态申请的自定义类型对象初始化。// 内存管理| new && delete// 操作自定义class Apublic:A(int a=1):_a(a)~A()private:int _a;int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数。

2024-12-16 19:58:26 786 2

原创 多次碰壁,终于解决关于git修改本地仓库时再次push推送远端仓库生成的问题【git did not exit cleanly(exit code 1)】

在本地修改了文件,但是没有先进行 git add 和 git commit 操作。你需要先将修改添加到暂存区( git add. 可以添加所有修改后的文件),然后提交( git commit -m "你的提交信息" )。远程仓库中的文件在你上次拉取(pull)之后已经被其他人修改,而你的本地修改与远程修改有冲突。这种情况下,你需要先拉取远程仓库的最新更改( git pull ),解决冲突后再进行推送。2、再进行git commit 和 push。1、拉取远端仓库到本地(git pull)

2024-12-16 19:57:26 1051

原创 【Linux进程基础篇】总结 | => 进程环境变量(超详细)

#include #include #include int main(int argc, char* argv[], char* env[]){ pid_t id = fork(); if(id==0) //在子进程内 {{ int i = 0;for(; env[i]; i++) {printf("env[%d] => %s\n",i, env[i])

2024-11-16 14:23:36 652 3

原创 【C++类和对象基础篇下】再谈</|\>类和对象【完结撒花】

class Solution { public:class Sum {ublic: Sum() { _ret += _i;_i++; }};int Sum_Solution(int n) {Sum a[n]; return _ret; }private:static int _i; //声明stat

2024-11-16 10:07:43 1173 2

原创 【Linux进程篇5】理解&分析&更改->进程优先级❤️

因为整个操作系统大概一共有140种指针进程,其中[0,99]这前100种指针进程我们大概一辈子也用不到,则就剩下的[100,139]共40个指针进程,正好对应40个优先级。操作系统运行队列中,有 run 二级指针指向运行队列指针数组running[140],有 wait 二级指针指向运行队列指针数组 waitting[140]。操作系统会根据进程优先级将进程排进操作系统内运行队列或等待队列的各个位置。比如有一个优先级为60的进程,会将其排入到运行队列数组的下标为100(专门链入优先级为60的进程)的

2024-11-13 14:01:08 1195 5

原创 【Linux进程特别篇】深度理解辨识僵尸进程和孤儿进程

子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入僵尸状态,子进程就称之为“僵尸进程”父进程先退出,子进程还在运行,子进程被操作系统“领养”,子进程就称之为“孤儿进程”

2024-11-13 13:58:58 922 3

原创 【Linux进程篇4】深入理解:操作系统进程调度各种基本状态(运行,挂起,阻塞等)

进程正在CPU上执行。本质:进程正在CPU运行队列上排队。特点:进程已经获得了CPU资源并正在执行其指令。在单处理器系统中,同一时刻只有一个进程处于运行态。在多处理器系统中,可以有多个进程同时处于运行态,每个处理器上运行一个进程

2024-11-12 10:46:57 964 3

原创 【Linux进程篇3】说白了,Linux创建进程(fork父子进程)也就那样!!!

根据前篇文章,我们已经了解了操作系统通过先描述再组织来对进程进行管理。描述进程操作系统自动生成task_struct结构体,组织进程将多个task_struct结构体对象”链起来“形成数据结构,这样对进程的管理就变成了对链表的增删改查。进程的PCB数据结构体中含有一系列属性,例如PID和PPID就是PCB数据结构体中的属性。通过系统调用接口使用getpid()方法获取某一个进程的PID,使用getppid()方法来获取该进程的PPID(父进程PID)

2024-11-12 10:42:08 1026 2

原创 【Linux进程篇2】学习进程大框架,学习进程前期必备。

一个操作系统,不仅仅只能运行一个程序,可以同时进行多个进程(多道操作系统),所以操作系统必须得将进程管理起来。那么操作系统是怎样将进程管理起来的呢?任何一个进程,在加载到内存的时候,形成真正的进程时,操作系统要先创建进程( 属性 )的结构体对象——PCB(process ctrl block)【进程控制块】就像一个人是怎样辨别认识一个事情或者对象的?答:都是通过属性认识的。当属性足够多,这一堆属性的集合,就是目标对象。【这就是面向对象】

2024-11-11 14:56:46 776 1

原创 【Linux进程篇1】认识冯·诺依曼体系结构(引出进程详解)

一:认识冯诺依曼系统二:冯诺依曼结构——硬件层2.1:认识冯诺依曼体系硬件设备2.2:关于内存2.2.1:内存2.2.2:为什么要给计算机引入内存2.2.3:两个内存问题2.3:两个实例深入理解冯诺依曼结构2.3.1:实例一:QQ聊天数据流2.3.2:实例二:实验报告发送流三:冯诺依曼结构——软件层(操作系统)3.1:OS是什么?3.2:OS为什么进行管理?3.3:OS是怎么管理的?3.3.1:OS的六字真言3.3.2:描述被管理对象3.3.3

2024-11-11 14:54:43 1812 5

学生成绩信息管理系统源码资源

功能:对学生的成绩信息进行对应的增加、删除、修改、查询、排序等等。并使用到了相应的文件操作,即在退出系统时会将修改后的学生成绩信息保存下来。 使用技术:C/C++语言,数据结构,算法 数据库设计:正在成型。并诚挚的希望各位大佬指点。 用户界面搭建:无(简练的后端代码) 扩展需求:安全密码控制。即必须先确定其身份并输入密码才能进入学生成绩系统并修改其中的信息。

2024-09-03

空空如也

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

TA关注的人

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