- 博客(58)
- 收藏
- 关注
原创 网络基础 【UDP、TCP】
为什么TCP这么复杂?因为要保证可靠性同时又尽可能的提高性能可靠性校验和序列号按序到达确认应答超时重发连接管理流量控制拥塞控制提高性能滑动窗口快速重传延迟应答捎带应答其他定时器超时重传定时器, 保活定时器, TIME_WAIT定时器等。
2025-02-13 21:22:54
1857
原创 网络基础 【HTTPS】
在上面的网络协议栈示意图中,报文层层向下交付,到了传输层和网络层这里就有一个问题。传输层和网络层属于OS,但是人家OS没有义务给你添加加密算法。下三层人家解决的是数据如何传输的问题。所以我们的请求和响应 要想不被中间人 拿到,需要在应用层添加 加密解密层。以前是直接发给OS ,现在有了加密解密层,HTTP的报文先发给加密解密层,然后加密解密层发给OS。给报文加密就变成了密文, 给密文解密 还原成明文。加密也是需要其他的数据来辅助的,而这部分辅助的数据叫做密钥。对于服务器来说也是一样!这就是HTTPS。
2024-10-05 21:33:53
1131
原创 网络基础 【自定义协议、序列化与反序列化】
网络通信的核心在于数据的传输和接收。为了确保数据能够在不同的系统和设备之间高效、准确地传递,我们需要遵循一定的规则和标准,这些规则和标准就是我们所说的“协议”。协议定义了数据如何被组织、传输和解释,它是网络通信的基石。然而,在实际的应用场景中,我们经常会遇到标准协议无法满足特定需求的情况。这时,自定义协议就显得尤为重要。自定义协议允许开发者根据特定的应用需求来设计和实现通信规则,从而提供更加灵活和优化的解决方案。在网络通信过程中,数据需要在不同的格式和表示之间转换,这一过程称为“序列化”和“反序列化”
2024-10-04 19:59:43
994
原创 网络编程 【Socket套接字、简易UDP、TCP网络程序】
在当今数字化时代,互联网已成为我们生活中不可或缺的一部分。从简单的网页浏览到复杂的云计算服务,网络技术支撑着现代社会的通信和数据交换。网络编程,作为这一基础设施的核心,不仅是一门科学,更是一门艺术,它要求开发者不仅要有深厚的技术功底,还要有创新和解决问题的能力。本篇我们将探索网络协议的原理,学习如何使用套接字(sockets)进行网络通信,了解网络安全的重要性,能够实现一个简单的udp客户端服务器;能够实现一个简单的tcp客户端服务器单连接版本多进程版本多线程版本理解tcp。
2024-08-11 12:17:40
621
4
原创 网络基础 【发展、协议、传输、地址】
了解网络发展背景对局域网广域网的概念有基本认识;了解网络协议的意义重点理解TCP/IP五层结构模型;学习网络传输的基本流程理解封装和分用;
2024-07-15 23:13:03
1168
6
原创 Linux 【线程池】【单例模式】【读者写者问题】
线程章节到此结束,从初始线程,如何控制线程,后面我们认识到了线程并发访问临界资源是有线程安全的问题,从而我们又学习了锁、条件变量、信号量。悲观锁:在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁(读锁,写锁,行锁等),当其他线程想要访问数据时,被阻塞挂起。线程池应用场景不止这些,线程池的应用场景非常广泛,关键在于根据具体需求合理配置线程池的大小和特性,以达到最佳的性能和资源利用率。:线程池通过预先创建一定数量的线程,避免了频繁创建和销毁线程的开销,从而提高了线程资源的利用率。
2024-07-02 23:51:29
1240
5
原创 Linux 生产消费者模型
生产者-消费者模型是一个经典的并发编程问题,它描述了两种角色:生产者和消费者。生产者负责生成数据,而消费者则负责消费这些数据。这个模型通常用于处理多线程或多进程环境中的资源分配问题。生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取。阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
2024-06-29 19:45:59
1714
2
原创 Linux 线程的同步与互斥
由于线程之间存在竞争,就导致了多线程有的线程涝的涝死,饿的饿死,就需要让线程之间保持某种平衡,让它们被CPU雨露均沾。这就是所谓的同步。由于临界资源只有一份,线程之间同时共享临界资源。为了防止临界资源的安全,线程之间需要互斥。1.资源共享问题在Linux 线程控制文章我们知道了一个进程中的所有线程,在地址空间中的代码区、未初始化区、什么堆区也好、栈区也好,还是共享区也好都是共享的。就好比下面这个代码int n = 0;return 0;
2024-06-21 20:23:36
832
1
原创 C++ 智能指针
借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:不需要显式地释放资源。采用这种方式,对象所需的资源在其生命期内始终保持有效这里和互斥锁那里是一样的。
2024-06-17 21:52:12
1199
2
原创 Linux 线程控制
在Linux 线程概念 中 我们知道Linux中的线程是轻量级的,这就意味着Linux中是没有线程这种概念的。所以用户要想用线程,OS不会提供,Linux程序员在应用层给我们提供了第三方库pthread库在线程概念章节中,最后简单演示了创建线程的代码,这里就有个问题了?一个进程中什么是主线程,一个线程要被调度,cpu怎么知道该调度谁了?
2024-06-14 15:50:26
1162
1
原创 C++ 11 【线程库】【包装器】
在C++11之前由于没有线程库,这就导致了在Linux能跑的代码,在windows下就不行,反之也是一样。导致了代码的可移植性差!!!而C++11之后出现了线程库,并行编译时不需要依赖第三方库。而且在原子操作中还引入了原子类的概念。一、thread类的简单介绍。
2024-06-08 18:50:35
1385
原创 C++ 11 【可变参数模板】【lambda】
上篇重点讲解了右值引用,本篇的可变参数模板和Lambda也是11里面非常有用的。如果学会这两个以后编程会感觉非常的爽。废话不多说直接开始!!!一、新的类功能1.1默认成员函数——移动构造、移动赋值移动构造和移动赋值。针对移动构造函数和移动赋值运算符重载有一些需要注意的点如下:如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类。
2024-06-06 15:43:59
935
1
原创 C++ 11【右值引用】
目录1.C++ 11 简介2. 统一的列表初始化2.1 {}初始化3.1 auto4.右值引用和移动语义4.2 左值引用与右值引用比较4.3 右值引用使用场景和意义4.4 右值引用引用左值及其一些更深入的使用场景分析5.完美转化5.1模板中的&& 万能引用(引用折叠)C++11是C++编程语言的一个主要更新版本,它在2011年被国际标准化组织(ISO)正式批准为ISO/IEC 14882:2011标准。这个版本引入了许多新特性和改进,旨在提高语言的表达能力、性能和易用性。自动类型推断(auto关键字)
2024-06-06 15:43:43
1161
原创 Linux 线程概念
什么叫线程?我们认为:线程操作系统调度的基本单位!内核观点:进程是承担分配系统资源的基本实体。所以可以得出一个结论:线程就是我进程内部执行流资源!进程:进程 = 内核数据结构 + 代码和数据 +执行流(线程)3.再谈地址空间既然进程是承担分配系统资源的基本实体,地址空间又是进程的资源窗口,那地址空间的资源又是如何分配给线程的?线程资源的分配本质是分配地址空间范围那如何分配地址空间的范围?地址空间是虚拟地址,那虚拟地址是如何转化成物理地址?下面我以32位虚拟地址为例所以即使是每个物理地址。
2024-05-18 22:07:05
1049
原创 Linux 信号捕捉与处理
信号产生到处理这是有一个过程的,从上篇信号保存我们知道了有一个handler表 里面存放的是对信号处理的方法。那什么时候调用这些方法?本篇就揭晓处理信号的时机。1. 信号的处理时机直接说结论:当我们用户从内核态返回到用户态时,进行信号的检测与处理。那什么是用户态?什么又是内核态?// 传统信号处理函数// SA_SIGINFO 标志设置时使用的信号处理函数// 信号掩码,定义了信号处理函数执行时哪些信号应当被屏蔽// 信号处理标志// 已废弃,不应使用。
2024-05-17 21:28:14
865
原创 Linux 信号保存
信号产生的篇章是帮助大家对信号的概念有一个了解,从上篇我们知道了产生信号4种方式,当今的社会中,每天都会有许多的信息产生,一些重要的信息都会被保存,那进程的产生的信号是如何被保存的?我们只需要用一个整型位图来表示就行了,一个整型32个比特位,从1号位开始一直到31,在比特位中1表示就是有信号,反之0就是没有。
2024-05-12 22:47:01
1059
1
原创 Linux 进程信号【信号产生】
在前面的进程控制篇章里,父进程是怎么知道子进程退出了?并且回收子进程。以及我们之前写的代码报错之后,进程就终止了。这背后的一切都是基于信号,那进程中信号是什么?
2024-05-11 00:00:24
828
原创 Linux 进程间通信之命名管道
书接上回,进程间通信我们利用管道可以通信,但是这些进程都是有血缘关系的进程,那有没有能让两个毫不相干的进程也能通信?有的,我们用命名管道,就能实现两个没有任何关系的进程进行通信。
2024-05-02 18:38:05
927
原创 Linux 进程间通信之匿名管道
从进程控制篇章,我们知道了进程是具有独立性,既然各进程具有独立性,它们之间是互不联系的,那它们是怎么通过一种方式取得联系?为什么要有进程间通信?进程间通信本质是什么?
2024-05-01 20:38:24
1270
1
原创 C++ 哈希
如果你会用map和set,那么你就会用哈希表这种数据结构底层实现的unordered_map 和unordered_set。看名字unordered无序,而map和set是有序的。数据结构也是不同,map和set是搜索二叉树,而unordered_map 和unordered_set是哈希表(哈希桶)。
2024-04-27 17:43:54
1054
1
原创 【C】 初识C语言
从本篇开始,带你从不会C语言到精通C语言。这篇是让大家对C语言有个初步的了解。下面的内容会拆分不同篇幅单独进行详细讲叙。数据类型变量、常量字符串转义字符注释选择语句循环语句函数数组操作符常见关键字define定义常量和宏指针结构体1.什么是C语言?C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
2024-04-21 12:08:44
902
2
原创 C++ map和set模拟实现
前面我们实现了红黑树,本篇就讲map和set的底层是怎么用红黑树来进行封装的!!!我们要模拟实现map和set需要改造之前的红黑树,因为set只有一个K,而我们的红黑树模板参数是2个一个T和一个V。
2024-04-20 17:38:17
919
原创 C++ 红黑树模拟实现
前面我们实现了AVL树,发明AVL树的人是天才,那发明红黑树的人就是天才中天才。AVL由于加入平衡因子,所以对树的平衡过于严格。这就导致了频繁的旋转。从而增加时间复杂度。这也是为什么map和set底层的封装没有用AVL树,而是用的红黑树!!!
2024-04-14 11:57:16
1020
原创 C++ AVL树底层实现原理
这篇从了解到使用map,map也是搜索二叉树,因为搜索二叉树会出现歪脖子树的情况,本篇就讲如何解决歪脖子树。记住口令 旋转 旋转 旋转!!!重要的事说三边。搜索二叉树加入平衡因子 旋转 就成了传说之中的AVL树AVL树1.1 AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数G.M.Adelson-Velskii和E.M.Landis在1962。
2024-04-09 09:16:43
918
1
原创 C++ set&&map
C++二叉搜索树最后简单的讲解了搜索二叉树的应用场景,而本篇的set对应的就是K模型,map对应KV模型。set是C++标准模板库(STL)中的一个关联容器,它包含唯一元素的集合。以下是关于set的一些基本介绍:set中的元素都是唯一的,重复的元素在插入时会被自动忽略。set中的元素默认按照升序排序。如果需要自定义排序规则,可以通过提供比较函数或重载运算符来实现。set支持前向迭代器,可以用来遍历容器中的元素。insert():向set中插入一个元素。find():查找一个元素是否存在于set中。
2024-04-05 14:54:33
1305
3
原创 C++ 二叉树OJ题
C++二叉搜索树这篇讲解了搜索二叉树的实现的,本篇从实战出发,让大家更好的掌握和理解二叉树的!!!!1. 二叉树创建字符串。606. 根据二叉树创建字符串 - 力扣(LeetCode)找出规律,我们就好办了 直接代码演示。public:if(root == nullptr) //根为空 直接返回空串!return "";//外面解释这个函数//结合 刚才的3点总结 左右都为空不加括号,左为空是要加括号的。str += '(';str += ')';str += '(';
2024-03-31 14:47:48
1356
4
原创 Linux 基础IO [缓冲区&&文件系统]
基础IO讲了什么是fd,以及fd的本质是什么,系统调用接口。本篇重点缓冲区,理解文件系统,全面认识Linux下一切皆文件。
2024-03-28 20:03:33
1077
2
原创 C++二叉搜索树
观察上图,我们可以发现根节点7的左边节点是小于右边的节点,左子树的上所有的节点都小于根节点,右子树的所有节点都大于根节点。而且根的左右子树也都是搜索二叉树二.二叉搜索树循环操作1.二叉搜索树的插入先定义出二叉搜索树结构//定义二叉树节点K _key;,_key(key){}public:private:二叉搜索树插入实现方法↓public://二叉搜索树插入实现if (_root == nullptr) //第一次就不用说了。
2024-03-24 23:09:17
1099
原创 Linux 基础IO
本篇非常重要,承上启下的作用,对linux一切皆文件和重定向从底层原理剖析,为什么要有缓冲区?以及什么是文件系统,为什么C语言有了文件操作的函数,操作系统还要有自己的一套操作文件的方式?
2024-03-24 19:34:37
967
原创 linux 模拟shell
💓⏪🚚🌹关注我🫵带你学习更多知识🔝🔝想想Xshell的命令解释器,我们在命令行输入ls命令,他的父进程是谁?bash。根据之前的讲的进程替换,根据这个原理父进程当个监工,让子进程去做一些其他事情。
2024-03-12 21:16:38
497
原创 Linux 进程程序替换
上篇等待函数里面还有一个参数option参数没有讲,以前演示的fork创建子进程,子进程继承父进程的代码,执行一样的代码,那如果子进程要执行其他的代码怎么办?
2024-03-10 22:21:28
782
原创 Linux 进程控制
上篇重点讲了什么是地址空间,地址空间重要性,有了这个概念我们就可以把之前遗留的僵尸进程在这篇进程控制来解决,以及写实拷贝的概念。本篇重点进程控制和等待。写实拷贝:顾名思义 数据要写入时再拷贝。你要用的时候,OS才会给你分配内存。这样内存使用的效率的就大大的提高了。看下图总结:写实拷贝使父子进程得以彻底分离!完成了进程独立性的技术保证。写实拷贝是一种延时申请技术,可以提高整机内存使用率。
2024-02-23 00:15:30
690
1
原创 Linux进程概念 (下) 地址空间
首先我先讲一个故事在一家公司里有小明小美和小红三个员工,有一天老板对这个三个员工分别单独在没有其他人情况下许下了承诺(PUA)"你今年努力干工作年底给你调职加薪"许下承诺后三个员工就继续干工作了,但是他们都以为自己是唯一一个被老板叫去谈话的且认为自己独享这福利待遇。故事到这里先暂停一哈我们先引出几个相对应的概念这里的老板就是操作系统三个员工就是进程调职加薪就是虚拟地址 ->(物理内存)看到这里你就会明白了 所有的进程都会有一份自己的虚拟地址。
2024-02-18 20:26:55
821
原创 Linux进程概念(中)环境变量
上篇进程写的是什么进程,演示了linux下进程的状态是什么样子的,本篇重点•孤儿进程•环境变量•优先级•地址空间。
2024-02-16 12:50:01
1193
1
原创 C++继承
继承?继承老爸的财产。1.继承的概念及定义2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6.继承与静态成员2.继承的概念及定义1.1继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。
2024-02-12 23:22:45
692
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人