自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux - 常用的I/O 多路复用技术 select, poll, epoll

I/O 多路复用: 最明显的特征就是能监听多个文件描述符.常见的多路复用机制有: select, poll, epoll.这三个多路复用 select 的效率最低, 其次是 poll, epoll 的效率最高, 所以 epoll 在Linux 中广泛使用.

2025-01-24 22:51:46 828

原创 Linux - 五种常见I/O模型

I/O操作 (输入/输出操作, Input/Output) 是指计算机与外部设备就行数据交互的过程.什么是外部设备: 如键盘, 鼠标, 硬盘, 网卡等.

2025-01-23 17:44:41 799

原创 Linux - 线程池

什么是池?池化技术的核心就是"提前准备并重复利用资源". 减少资源创建和销毁的成本.那么线程池就是提前准备好一些线程, 当有任务来临时, 就可以直接交给这些线程运行, 当线程完成这些任务后, 并不会被销毁, 而是继续等待任务. 那么这些线程在程序运行过程中只需要创建一次. 相比当任务来临时创建线程, 当线程完成任务后销毁线程这种方法. 省去了很多线程创建销毁的成本.一次性创建多个线程, 那么就需要将这些线程集中管理起来, 将这先线程集中起来并进行管理, 这样的集合就时线程池.

2025-01-21 23:46:29 291

原创 Linux - 生产者消费者模型(信号量使用)

上面是生产者消费者?生产数据的一方称为生产者,将数据拿走用于处理的称为消费者.生产者将产生的数据放入一个固定的区域,而消费者只需要从这个固定区域取出数据即可这个存放数据的区域可以当作是超市.厂家生产出产品后,将产品送至超市.(厂家==生产者)我们(顾客),则是去到超市购买我们需要的产品.(顾客==消费者)那么生产者消费者模型有什么优点?

2025-01-20 15:55:37 732

原创 Linux - 线程的同步与互斥操作

同步: 多个线程同时运行, 线程与线程之间可能存在某种关系, 需要让线程按照某种顺序进行执行.如: 线程 A 产生需要处理的数据 X, 而处理这个数据的任务交给了线程 B. 那么线程 A, B 之间的运行关系应该是, A 线程先运行, 在 A 产生了数据 X 之后, B 线程在运行进行处理互斥: 线程共享同一进程内的资源, 一个共享资源在被多个线程同时访问时, 就有可能会出现问题. 所以, 为了应对这种情况, 就需要让这些进程互斥的去访问这个共享资源.

2025-01-17 16:45:24 1023

原创 Linux - 什么是线程和线程的操作

什么是线程:线程(Thread)是操作系统能够进行运算调度的最小单位. 它被包含在进程之中, 是进程中的实际运作单位. 一个进程可以包含多个线程.进程 : 线程 == 1 : n (n >= 1).进程是系统分配资源的基本单位.线程则是系统调度的基本单位.在 Linux 中, 线程又被称为轻量级进程. 因为线程不必再进行空间的分配. 只需要对新创建的线程进行初始化 (创建线程的PCB即可).

2025-01-12 10:49:16 1024

原创 Linux 下信号的保存和处理

阻塞和忽略:阻塞是进程没有收到对应的信号, 所以没有任何处理.忽略接收到了信号, 但是对这个信号的处理就是不做任何处理, 进行忽视虽然两者的行为是一样的, 没有任何处理, 但是本质还是有差别的。

2025-01-10 21:22:34 750

原创 Linux - 信号的概念以及信号的产生

信号本质是一种通信机制, 用户或操作系统向进程发送信号, 通知进程发生了某个事, 让进程去进行处理最常见的信号: 当我们执行了一个前台程序后, 想要终止这个进程, 我们可以按 ctrl + c, 来终止这个进程. 其中 ctrl + c 就是通过向进程发送一个终止信号, 来告知这个进程, 不需要执行下去了.Linux下有哪些信号?使用: kill -l 命令来查看所有信号可以看到一共有 64 种信号. ctrl + c 发送的就是 2 号信号. 这个信号默认的操作是终止进程.

2024-12-25 08:33:44 919

原创 Linux 进程间通信 - 匿名管道/命名管道

进程之间具有独立性. 其他的进程无法访问本进程的资源和内容.那如果想要让进程访问一些某个进程内的内容, 我们该怎么做?这时就需要通过进程间通信, 来完成两个进程之间的内容交互.管道就是用来完成进程间通信的一种方式.管道又分为匿名管道, 和命名管道.

2024-12-22 21:09:28 584

原创 Linux - 文件和重定向和软硬链接

open 函数, 打开一个文件.返回值: 返回一个文件标识符 fd, int 类型数据pathname: 想要打开的文件的路径flags: 打开文件的方式. (这是一个位图, 比特位为 1, 代表使用某个方式, 为 0 则不启用)打开文件的方式:O_RDONLY: 以只读的方式打开文件O_WRONLY: 以只写的方式打开文件O_RDWR: 以读写的方式打开文件O_CREAT: 如果想要打开的文件不存在, 则创建这个文件. mode 是新创建文件的权限。

2024-12-12 22:20:30 537

原创 Linux - 虚拟地址空间

当我们使用 fork 函数时, 系统会以本进程为模板, 创建出一个子进程.当我们打印父子进程中的同名变量的地址时, 会出现奇怪的事.可以观察到 tmp 有两个值, 这个就是父子进程之间的写时拷贝. 实际上是两个变量, 只是在父子进程中名称相同.但是, 这两个变量的地址怎么会相同.一个地址怎么可能会有两个值?难道这两个进程中的 tmp 变量都存在了同一个地址中.这两个变量的确是存储在不同的地址中, 那么为什么这两个变量地址回相同.这就引出了虚拟地址空间的概念.

2024-12-11 19:31:26 1030

原创 Linux - 进程等待和进程替换

前面我们了解了如果父进程没有回收子进程, 那么当子进程接收后, 就会一直处于僵尸状态, 导致内存泄漏, 那么我们如何让父进程来回收子进程的资源.

2024-12-09 22:16:15 863

原创 C++ - map,set

map 和 set 是C++ STL 中提供的容器, map 和 set 的底层是基于红黑树来实现的.set 是一个包含唯一元素 (key) 的集合,不允许有重复的元素.map 是一个键值对 (key - value) 的集合, 每一个键 (key) 都是唯一的.map 的key - value键值对是通过 pair 来实现的.可以观察到, map 比 set 多一个模板参数.set 只有 T, 而 map 有key 和 T.

2024-12-06 09:22:12 1000

原创 C++ - 多态, 虚函数讲解

多态: 通俗的说就是不同的人, 完成相同的任务会产生不同的结果.如: 学期结束开始放假了, 我们会买回家的票,老师买的是全价票, 而我们是学生, 学生买票是有优惠的.C++ 中多态又分为静态多态和动态多态:静态多态 (又称为编译时多态): 主要是依靠函数重载和模板来实现的.动态多态 (又称为运行时多态): 主要是依靠继承和虚函数来实现的那么这里讲的是动态多态, 即由继承和虚函数实现的多态.

2024-12-04 21:40:23 976

原创 C++ - 红黑树解析

红黑树也是一颗二叉搜索树, 红黑树不像 AVL 树一样, 对于树的高度要求的非常严格.在 AVL 树中, 树的高度要求很严格, 对于查找的的效率确实有很大的提高,但是, 相应的对于树的调整, 发生旋转的次数也会变得很高. 旋转也需要付出成本.所以在红黑树中, 对于树的高度要求放宽了一些.通过上面的五个性质可以得到一个结论:红黑树的最长路径和最短路径之间最多相差一倍.

2024-12-04 18:23:20 719

原创 C++ - 继承

在子类成员函数中,可以使用 基类::基类成员 访问.

2024-12-03 21:24:27 955

原创 C++ - AVL (二叉平衡搜索树) 解析

上一篇博客中讲解了二叉搜索树:我们了解到, 二叉搜索树的最坏时间复杂度为 O(N). (插入的顺序是有序的)所以在实际中, 直接使用二叉搜索树的情况很少.那么为了解决二叉搜索树这种最坏情况, 就有大佬提出了 AVL 树.AVL 树又称为 二叉平衡搜索树, 可以看到, 多了两个字 "平衡".那么平衡是什么意思:之前的二叉搜索树在插入顺序是有序的情况下, 会形成一个链表的结构, 从而导致查找的时间复杂度变为 O(N).

2024-12-01 17:36:36 686

原创 C++ - 二叉搜索树讲解

因为如果随意修改二叉搜索树节点的值, 那么就有可能会导致, 这棵树不再满足二叉搜索树的条件.这两个选择方法, 选择出来的要交换的节点的值, 都是最接近 本节点值的 节点.和只有左孩子相同, 删除本节点, 右孩子连接到本节点的父节点上。1. 本节点右子树中的最小值的那个节点 (即右子树的最左节点)2. 本节点左子树中的最大值的那个节点 (左子树的最右节点)从根节点开始, 如果插入的值小于节点值, 那么向左走,将本节点删除后, 将节点的左孩子连接到本节点的父节点上。如果插入的值大于节点值, 那么向右走,

2024-11-30 22:48:46 721

原创 Linux 僵尸进程和孤儿进程, 进程优先级

之间在进程状态中了解到了 "僵尸状态".那么处于僵尸状态的进程就是僵尸进程."僵尸状态" 的本质就是死亡状态.如何理解僵尸进程:举个例子: 一个正常的人突然死亡了, 我们并不会直接将人送入火葬场, 而是要确认这个人的死亡原因.这个人的死因是什么, 自杀, 意外, 还是他杀. 我们需要进行调查. 进程也是如此, 当一个进程死亡后, 我们也需要知道, 进程的死因 (任务已完成, 程序出现错误 ...). 在原因未查明之前, 这个 "尸体" 会被保留. 此时就处于僵尸状态.创建一个进程就是为了完成任务, 现在

2024-11-29 17:13:44 646

原创 C++ - priority_queue讲解, 适配器 和 仿函数

之前了解 stack 和 queue 的使用时, 我们会发现, 他们的构造函数都非常简单.但是, 当我们在官网上 () 查找 stack 或 queue 时, 会发现他们的模板参数不止一个.我们可以观察到, stack 和 queue 除了一个 T 模板参数, 还有一个 Container 模板参数, 而且这个模板参数还有默认值 deque<T>.1. 那么这个 Container 这个模板参数是什么?2. deque<T> 又是个什么?

2024-11-28 22:03:36 610

原创 Linux 下进程的状态

当我们这个程序运行起来之后, 就会在控制台中要我们输入数据, 如果我们一直不输入数据, 那么这个程序就不会向后执行. 这就是一种阻塞状态, 进程在一直在等待键盘的资源.此时, 操作系统更关心的是能否存活下去, 而不是效率, 如果操作系统直接宕机, 那么所有的进程都会直接结束, 哪还谈什么效率.我们知道创建子进程, 是为了去完成任务, 那么这个任务是否完成, 完成的结果如何等信息, 都应该要告诉父进程.所以, 操作系统就提供了一个 D 状态, 当进程处于 D 状态时, 操作系统就不会杀死这个进程.

2024-11-27 21:04:06 757

原创 leetcode - LRU缓存

int value;// 节点中不仅存储 value, 还存储 key, 这在后面的 put 函数中有用。

2024-11-26 22:32:21 640

原创 C++ STL - stack, queue 讲解

stack 是 STL 提供的容器. 实现的数据结构是栈.

2024-11-26 20:35:49 288

原创 Linux 子进程 -- fork函数

什么是子进程?子进程指的是由一个已经存在的进程(称为父进程或父进程)创建的进程.如: OS (操作系统) 就可以当作是一个进程, 用来管理软硬件资源, 当我点击浏览器, 想让浏览器运行起来时, 实际上是由 OS 接收指令, 然后 OS 帮我们将浏览器运行起来, 浏览器就是一个子进程, 是由 OS 创建出来的进程, 所以 OS 就是浏览器这个进程的父进程.( OS 并不是一个单独的进程, 是由多个进程和线程组成的复杂结构, 这里为了方便理解, 将整个 OS 当作是一个进程)

2024-11-26 16:52:15 1885

原创 Linux操作系统 , 进程基础, 了解PCB

进程就是运行起来的程序.程序又是什么, 我们写了一个 test.cpp 文件, 当我们编译之后会得到一个 .exe 文件, 这个文件就可以被称为程序.在我们运行这个程序之前, 这个程序是不会起作用的, 它就是一个文件, 是静态的.当我们将这个程序运行起来之后, 它就会有各种各样的功能提供给我们, 此时这个程序就被赋予了动态的属性, 此时它也就可以被称为是一个进程.进程和程序对比程序: 程序是静态的, 是一组指令和数据的集合, 存储在磁盘或其他存储介质上.

2024-11-25 20:46:21 881

原创 vector, list 模拟实现

这里的迭代器可以看到就是指针, 这只是一种实现方式也可以创建一个 struct iterator {};进行一层封装.同样的这里没有使用 size 和 capacity, 而是通过三个指针来代替也可以使用 size 和 capacity 来实现。

2024-11-24 16:31:47 518

原创 C++ STL - vector/list讲解及迭代器失效

vector 是一个动态数组.

2024-11-23 21:51:28 944

原创 C++ STL - String

C++的STL是“Standard Template Library”(标准模板库)的缩写,它是C++语言中一组预先定义的模板类和函数的集合,用于提供常见的数据结构和算法的实现。

2024-11-22 22:59:39 924

原创 C++ - 模板特化, 非类型模板参数

定义模板时模板的参数可以不是类型, 还可以是常量.在上面的代码中实现了一个静态的数组类.这个数组的大小就是由 size_t N 来决定的.

2024-11-20 22:30:19 225

原创 C++ - 模板

/ 属性, 方法// 同样可以有多个模板函数可以看到, 和函数模板的定义是一样的, 在定义语句的前面加上 template<class T>.public:_size(0){}private:T* _data;int _size;

2024-11-19 22:08:36 835

原创 C++内存管理 - new/delete

int main()// 为类型 A 实例化出一个对象, 并将对象中的 _a 初始化为10, 返回对象的地址return 0;int main()// 创建了 5 个 A 类型对象, 前三个初始化为 1, 2, 3 后两个默认初始化为0return 0;

2024-11-18 23:15:32 1939

原创 C++类和对象 - 拷贝构造, 赋值重载

拷贝构造作用:一个已经存在的对象去初始化另一个要创建的对象日常写代码中会出现如下场景:在上面的代码中, 我们想要使用一个已存在的对象去初始化另一个对象, 此时拷贝构造的作用就体现出来了.

2024-11-14 12:40:50 1558

原创 C++类和对象 - 构造, 析构函数

我们之前使用了C语言实现了一些数据结构, 比如: 栈和队列.我们经常会忘记写或者调用函数去初始化, 然后在使用完之后,忘记调用函数去销毁开辟的空间, 导致内存泄漏.C++ 为了解决忘记调用这些函数导致程序出错的问题, 引入了构造和析构函数.

2024-11-13 13:15:00 1005

原创 C++类和对象 - 基础

在C++中struct升级成了类.新增加了很多功能, 在C++中 struct 不仅能定义成员变量,还能定义成员函数.在C++中定义类更喜欢使用class关键字.class和struct之间的区别只有访问限定修饰符的区别,struct默认是public,class默认是private。

2024-11-11 20:40:28 676

原创 https加密流程

对称加密: 加密和解密, 使用的密钥是 同一个密钥.设密钥 key明文 + key => 密文密文 + key => 明文。

2024-10-30 20:00:00 307

原创 C语言实现二叉树

可以看到, 一个二叉树节点有三个部分:1. 存储数据的位置2. 指向左节点的指针3. 指向右节点的指针// 用来存储当前节点的值// 指向左孩子// 指向右孩子}BTNode;前序中序后序, 是站在根节点的角度来看的.前序: 先访问根自己的数据, 再访问左右子树.根的访问位于最前面中序: 先访问自己的左子树, 然后访问自己的数据, 最后访问自己的右子树.根的访问位于中间后续: 先访问自己的右子树, 然后访问自己的右子树, 最后访问自己的数据.根的访问位于最后。

2024-10-29 15:46:57 656

原创 C++引用

一个对象可以有多个引用.引用的类型需要和被引用的对象类型相同int a = 10;int& b;// 在定义是没有初始化, 会报错int a1 = a;int a2 = a;int a3 = a;// a1, a2, a3 都是 a 的引用, 修改三个中任意一个,// 另外两个和 a 都会改变// 这是不可以的, 类型一定要匹配。

2024-10-26 23:22:20 837

原创 C++命名空间, 缺省参数和函数重载

若没有指定实参, 则采用该形参的缺省参数.

2024-10-25 13:00:00 323

原创 HTTP协议解析

URL: 描述了某个资源在网络上的所属位置.

2024-10-24 13:15:00 358

原创 数据链路层, DNS

但是全世界访问这一个服务器, 访问量太大了, 对服务器要求太高了. 最开始的服务器称为"根服务器", 然后在每个地区都会建立一个服务器, 其中的内容都是从 "根服务器" 复制过来的, 在地区中的电脑请求 解析域名 时, 都会访问地方服务器, 地方服务器如果查找不到域名, 就会向 上级服务器 索要数据来更新数据. 服务器也会定时向上级服务器索要数据来更新数据.于是就有大佬搭建了一套 DNS 系统 (一组服务器). 将上述的映射关系, 保存到这个服务器中.我们要访问网址, 都是需要使用 IP 的.

2024-10-23 13:00:00 254

空空如也

空空如也

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

TA关注的人

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