自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++库函数——vector类

vector类提供了一种方便和灵活的方式来处理一系列元素。它适用于需要频繁插入、删除和访问元素的场景,并且能够根据需要自动调整容量。

2024-12-20 16:38:03 821

原创 Linux网络应用——高级IO

I/O 即 Input && Output(输入/输出),在 Linux 中主要使用 read && write 函数那么什么才叫做高效 I/O 呢?——在单位时间内,I/O 过程中,等待条件满足的时间占比越小,I/O 的效率越高!几乎所有提高 I/O 效率的策略其本质都是使等待条件满足的时间占比变小。5 种 I/O 模型分别是 阻塞式 I/O、非阻塞式 I/O、信号驱动 I/O、多路复用 I/O 和 异步 I/O。

2024-12-18 22:51:19 852 1

原创 Linux网络——数据链路层

前面我们说网络层的功能是提供一种能够将数据跨网络从A主机传输到B主机的能力,而数据链路层解决的是直接相连的主机之间(如电脑与路由器)进行数据交付的问题!

2024-12-07 23:07:54 1111 1

原创 Linux网络——网络层

在整个通信过程中, TCP 提供的是可靠性策略,而 IP 协议的本质工作则是提供一种能够将数据跨网络从 A 主机传输到 B 主机的能力。

2024-12-06 13:34:13 924

原创 Linux网络——传输层

我们之前已经谈到过传输层负责的是保证数据能够完整的从发送端发送到接收端。

2024-12-02 15:41:47 1274

原创 Linux网络——应用层

在这里我们实现一个简易的网络版计算器,首先我们先完成一个 TCP 服务,如下enumBindErr,ListenErr// 监听时套接字排队的未处理连接请求的最大数量class Sockpublic:Sock(){}~Sock(){}public:// 创建套接字// 创建字节流型(TCP)套接字// 绑定// 将一个地址(包括IP地址和端口号)分配给套接字,使得套接字与特定的网络接口和端口关联起来。

2024-11-27 09:20:02 891

原创 Linux网络——套接字编程

在公网上, ip 地址能标识唯一一台主机,端口号 port 能标识该主机上的唯一一个进程,因此我们可以使用 ip:port 来表示全网唯一的一个进程而我们将 client_ip:client_port 与 server_ip:server_port 间的通信称为套接字编程!

2024-11-19 23:23:45 1049

原创 Linux网络——网络初识

在谈及网络之前,我们要先对学的知识有一个了解网络的本质就是获取数据,而系统的本质就是加工数据。

2024-11-14 22:26:13 720

原创 Linux基础——线程

线程:我们认为线程是OS调度的基本单位进程:对OS来说,进程是承担分配系统资源的基本实体既然如此,那么线程是资源吗?——算,不过它是当前进程的内部执行流资源!我们重新定义它们后,之前讲的进程又如何理解呢?——OS以进程为单位来分配资源,而当前进程内部只有一个执行流。由于 进程:线程 = 1:n,即 OS 中一定存在大量的线程,而 OS 想要管理它们就需要先描述再组织,而这个过程中不同的操作系统就采取了不同的方案。

2024-11-11 11:14:05 1067

原创 Linux应用——线程池

我们创建线程池的目的本质上是用空间换取时间,而我们选择于 C++ 的类内包装原生线程库的形式来创建,其具体实行逻辑如图可以看到,整个线程池其实就是一个大型的 CP 模型,接下来我们来完成它。

2024-11-09 22:11:15 555

原创 Linux基础——信号

对于信号的概念,我们还是举几个生活中的例子,比如照明信号弹,上下课铃声,发令枪,集合哨子,闹钟,外卖电话等等从这里我们就可以提出几点1. 我们是怎么认识这些信号的?——有人教 -> 我们记住了这些常见的信号2. 即便没有信号产生,我们也知道信号产生之后该干什么3. 信号产生了并不代表我们要立刻处理这个信号,可以挑选一个合适的时间去处理,因为我们有可能正在做更重要的事。因此,信号产生后会为他创建一个时间窗口,在处理信号时,我们需要在这个时间窗口内记住有信号来过。

2024-10-22 15:46:34 1169

原创 Linux基础——进程间的通信

我们现在所做的工作只是让不同的进程看到同一份资源,我们现在来编写通信代码(IPC code),对于客户端(client)来说,一旦有数据写入到共享内存,立马就能看到,不需要经过系统调用,直接就能看到地址;综上,我们对信号量进行 PV 操作时,必须保证它们是原子的(要么做完,要么不做,没有正在做的概念)!其中,pipefd[2] 是一个输出型参数,它的作用是将文件的文件描述符数字带出来,让用户使用,比如:3,4,其中pipefd[0] 表示读下标(3),pipefd[1] 表示写下标(4)。

2024-10-13 15:25:22 671

原创 Linux应用——简易日志

对于一个日志来说,我们任认为其应该具有以下的内容1. 日志时间2. 日志等级3. 日志内容4. 文件名称与行号在此基础上我们对不同的日志做出分级,即info: 常规信息warning: 报警信号error: 严重信号,可能需要立即处理fatal: 致命信号Debug: 调试信息。

2024-10-03 19:29:29 255

原创 Linux基础——文件

1. 从本质上来说,文件其实就是内容加上属性。而一个文件一般都是先拥有属性,再拥有内容的。2. 文件分为未打开的文件和打开的文件。3. 对于未打开的文件,它们存放在哪呢?——磁盘,对于未打开的文件,我们最关注的是什么呢?我们要知道,在整个磁盘中,没有被打开的文件是相当多的,因此最值得被关注的应该是:文件如何被分门别类的放置好,以便我们快速的进行增删查改。4. 对于打开的文件,它们是由谁来打开呢?——进程,所以研究打开的文件本质上就是研究进程和文件的关系。

2024-09-19 17:20:10 1163 1

原创 数据结构——图

在离散数学中,图(Graph)是用于表示物体与物体之间存在某种关系的结构。数学抽象后的“物体”称作节点或顶点(英語:Vertex,node或point),节点间的相关关系则称作边。在描绘一张图的时候,通常用一组点或小圆圈表示节点,其间的边则使用直线或曲线。

2024-06-27 10:38:29 1021

原创 数据结构——并查集

在计算机科学中,并查集(英文:Disjoint-set data structure,直译为不数据结构交集)是一种数据结构,用于处理一些​​​​​​​不交集(Disjoint sets,一系列没有重复元素的集合)的合并及查询问题。

2024-06-26 22:39:02 2781

原创 算法——BFS算法

BFS(广度优先搜索,Breadth-First Search)算法是一种用于图和树等数据结构中进行搜索的基本算法。它从指定的起始节点开始,逐层地向外扩展搜索,直到找到目标节点或遍历完整个图。BFS算法的基本思想是:先访问起始节点,然后依次访问起始节点的邻居节点,再依次访问邻居节点的邻居节点,以此类推,直到搜索到目标节点或者遍历完整个图。BFS算法使用队列来辅助实现节点的遍历顺序,保证每一层的节点按顺序访问。

2024-04-22 09:27:45 1379 1

原创 算法——动态规划

动态规划(Dynamic Programming)是一种解决多阶段决策问题的优化方法。它通常用于解决具有重叠子问题和最优子结构性质的问题,能够将一个大问题分解为多个重叠的子问题,并通过存储子问题的解来避免重复计算,从而提高算法效率。

2024-03-05 15:18:59 1666

原创 Linux基础——进程控制

在这之前我们曾了解过进程创建(详见),我们在这里对fork函数做一些补充其实对于父子进程来说,若是有一方试图修改数据时,会向物理内存中申请一份新空间,并将数据拷贝到其中,拷贝完成后将自己对应页表中的只读属性去掉。

2024-03-05 09:21:43 1078

原创 算法——分治

分治算法是一种将一个大问题分解成若干个相似而独立的子问题来求解的算法设计策略。通过递归地将问题分解为更小的子问题,然后将子问题的解合并起来,最终得到原始问题的解。

2024-03-04 14:51:08 977

原创 算法——双指针

双指针算法是一种常用于解决数组或链表中的问题的技巧。它涉及使用两个指针(索引或引用),通常分别称为“快指针”和“慢指针”或“左指针”和“右指针”,以协同进行遍历或搜索。该算法的核心思想是通过移动这两个指针来实现特定的目标,例如寻找一对元素的和、判断是否存在某种关系或在特定条件下移动其中一个指针。双指针算法通常能够在O(n)的时间复杂度内解决问题,具有较好的效率。

2024-02-27 15:08:53 3896

原创 算法——滑动窗口

滑动窗口算法是一种解决数组或列表中子数组或子序列问题的有效方法。该算法通过定义一个窗口,然后在数据结构上滑动该窗口,逐步处理数据,以解决特定类型的问题。其基本思想是维护一个窗口,初始时窗口覆盖数组中的一部分元素,然后通过滑动窗口来依次处理每个子数组。在每次窗口滑动时,可以通过添加新元素和删除旧元素来更新窗口的内容,以在O(1)时间内完成操作。

2024-02-26 09:38:36 10780

原创 算法——模拟

官方一点来说模拟算法(Simulation Algorithm)是一种通过模拟现实或抽象系统的运行过程来研究、分析或解决问题的方法。它通常涉及创建一个模型,模拟系统中的各种事件和过程,以便观察系统的行为,收集数据并得出结论。这类算法适用于复杂的系统,其中涉及许多相互作用的元素和随时间变化的状态。通俗来说我们只需要对照题目,提取出对应的流程,将这个流程转换成代码。需要注意的是, 我们要在草稿纸上过一遍流程,不然很容易出问题。

2024-02-22 23:15:57 1836

原创 算法——位运算

位运算符是在二进制位级别上对数据进行操作的运算符。

2024-02-19 22:05:39 1174

原创 算法——前缀和算法

前缀和算法(Prefix Sum)是一种用于快速计算数组元素之和的技术。它通过预先计算数组中每个位置前所有元素的累加和,将这些部分和存储在一个新的数组中,从而在需要计算某个区间的和时,可以通过简单的减法操作得到结果,而不必重新遍历整个区间。

2024-02-07 22:32:36 2918 1

原创 算法——二分查找算法

简单来说,"二分"指的是将查找的区间一分为二,通过比较目标值与中间元素的大小关系,确定目标值可能在哪一半区间内,从而缩小查找范围。这个过程不断重复,每次都将当前区间二分,直到找到目标值或确定目标值不存在为止。这种分而治之的策略使得二分查找算法具有较高的效率,时间复杂度为O(log n)。大致图解如下即通过二段性,在每次判断过后可以一次性减少将近一半的数据,然后通过不断的挪移左右区间来筛选出最后的结果。

2024-02-05 21:48:35 3053

原创 算法——递归与搜索算法

官方一点来说递归指的是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。通俗一点来说,递归就是一个函数自己调用自己的过程。

2024-02-04 20:30:40 1741 1

原创 Linux基础——进程地址空间

之前我们在学习语言时,曾知道有下面这张图对于这个图我们可以用下面的代码验证运行后我们可以发现其对应关系如下我们使用fork函数,来分别对父子进程中的g_val进行修改,即运行后我们可以发现在子进程修改了g_val后,父子指向同一地址时,但是读取到了不同的内容,我们可以知道如果变量的地址是物理地址,那么上面的情况不可能发生,因此这里的地址绝对不是物理地址,我们将其称为线性地址(或虚拟地址)。

2024-01-06 17:24:04 494

原创 Linux基础——进程初识(三)

首先我们要知道,进程优先级是操作系统用来确定多个进程同时运行时,哪个进程会获得更多CPU时间片的相对重要性或优先级的评估。他和权限的区别在于权限决定了能不能访问资源,而优先级是在能访问资源的前提下,决定了资源访问谁先访问,谁后访问。那么我们为什么需要优先级呢?在去食堂的时候,如果能给我们每一个人配备一个厨师,那么我们就不需要进行排队了,问题是没有那么多的厨师分配给我们,而进程也是同理,因为资源是有限的,而进程有多个,那么注定了进程之间的关系为竞争关系——这就是进程的竞争性。

2024-01-04 16:27:29 959

原创 Linux基础——进程初识(二)

我们知道在创建一个文件时,它会被默认创建到当前目录下,那么它是如何知道当前目录的呢?对于下面这样一段代码在它被加载成为一个进程时,我们查看相应的PID有在Linux中所有进程是被存放在一个/proc目录中的,即我们找到对应的PID就能进入并查看该进程,进入后发现可以看到,在进程中有一个cwd文件,即current work dir(当前工作目录),在代码中使用fopen向磁盘中写入文件tmp.txt时,会自动的将cwd中的路径拼接到它的前面。

2024-01-02 17:38:14 1840

原创 Linux基础——进程初识(一)

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)(operating system)内核(进程管理,内存管理,文件管理,驱动管理)其他程序(例如函数库,shell程序等等)简单来说,操作系统是一个对软硬件资源进行管理的软件。

2023-12-08 19:57:25 1083

原创 Linux基础——基础工具

1. 在Linux下安装软件一个通常的办法是下载程序的源代码并进行编译得到可执行程序2. 但是这样太麻烦了于是有些人把一些常用的软件提前编译好做成软件包可以理解成windows上的安装程序)放在一个服务器上通过包管理器可以很方便的获取到这个编译好的软件包直接进行安装3. 软件包和软件包管理器就好比"App"和应用商店这样的关系是Linux下非常常用的一种包管理器主要应用在Fedora, RedHat, Centos等发行版上。

2023-11-02 15:11:25 260

原创 Linux小程序——进度条

首先我们需要知道,回车与换行是两个概念,在C语言中使用"\n"时,默认使用的是回车+换行,举一个简单的例子,在以前写作文时,我们在某一行写到最后一个字时,我们会将字写在下一行,此时这个换行的动作就叫换行,但是如果只换行的话此时的笔尖应该落在下一行的最后一个格子上,此时我们再将笔尖移动到这一行的开始,这个动作就叫做回车。也就是说如果我们只使用回车("\r")的话,会将光标移动到本行的一开始,只使用换行的话,会将光标移动到下一行的相同位置。

2023-10-26 20:53:28 137

原创 C++基础语法——智能指针

内存泄漏是什么?内存泄漏:指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。那么内存泄漏会有什么样的危害?长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。这里一般有两种情况,如// 1.内存申请了忘记释放// 2.异常安全问题div();

2023-10-25 18:49:53 176

原创 C++基础语法——C++11

在C++98标准中,允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。即而在C++11中,大括号括起的列表(初始化列表)的使用范围被扩大了,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。如注:建议在日常定义中,不要去掉=,虽然不要求会用但是要能看懂。

2023-10-24 19:19:45 157

原创 数据结构——哈希

在顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN),搜索的效率取决于搜索过程中元素的比较次数。那么我们理想的搜索方法是:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中:1. 插入元素。

2023-10-19 15:28:09 538

原创 C++基础语法——unordered_map和unordered_set

源文档如下大致翻译如下1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

2023-10-06 16:15:42 406

原创 C++库函数——set与map的模拟实现

对于上面这棵红黑树,我们可以很容易得知道begin()是红黑树的最左节点,end()应该是一个空节点。即接下来定义iterator及其具体操作。

2023-10-06 15:11:25 238

原创 数据结构——红黑树

/ 在这里为了方便表示我们先将颜色枚举// 在红黑树中只有黑与红,即BLACK与REDenum ColorBLACK,RED// 因为节点是公用的,因此设定为struct:_kv(kv)// 根据红黑树的性质可以知道// 要插入的新节点不应该是黑色的,而应该是红色的// 如果是黑色的那么就会影响它当前路径的黑色节点总数{}

2023-09-18 18:37:42 645 3

原创 C++库函数——map与set

我们先来看源文档翻译如下set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2023-09-17 23:14:42 612

空空如也

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

TA关注的人

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