- 博客(97)
- 收藏
- 关注
原创 MYSQL--引擎
引擎1. InnoDB存储引擎2. MyISAM存储引擎3. MySQL存储引擎InnoDB与Myisam的六大区别两种存储引擎的区别数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎
2021-09-20 18:00:01
190
原创 Linux--高级IO
高级IO1. 四种典型IO方式2. IO多路转接2.1 select模型2.2 poll2.3 epoll2.4 多路转接模型IO:输入输出-- 过程:等待IO就绪,进行数据拷贝1. 四种典型IO方式典型IO:阻塞IO,非阻塞IO,信号驱动IO, 异步IO阻塞IO:发起IO调用,若IO 未就绪(IO条件不具备),则一直等待非阻塞IO:发起IO调用,若IO未就绪,则立即报错返回信号驱动IO:自定义IO信号处理,等待IO就绪收到信号打断当前操作进行IO异步IO:自定义IO信号处理,发起I
2021-09-04 00:25:50
283
原创 Linux--网络层--ip
网络层1. IP协议负责地址管理与路由选择-- IP协议,地址管理,路由选择1. IP协议4位协议版本:4-IPV4协议版本4位头部长度:以4字节为单位8位服务类型:3位优先权弃用,4位TOS,1位固定位0;16位数据报长度:IP报文最大大小64k,upd报文中数据最大大小<64k-2816位分片标识:标识当前分片属于哪个报文 udp报文大小大于MTU,则会在网络层进行数据分片 · MTU是最大传输单元-- 链路层所限制的一个最大数据帧大小 · ud
2021-09-03 00:44:54
184
原创 Linux--传输层协议--UDP/TCP
TCP/UDP协议1. UDP协议实现协议特性2. TCP协议实现协议特性三次握手四次挥手传输层:覅则应用程序之间的数据传输–TCP/UDP1. UDP协议实现16位源端-对端端口:用于描述识别通信两端进程16位数据报长度:能够存储最大数字65535-- udp报文总大小最大不能超过64k16位校验和:采用二进制反码求和算法–校验接受方接收到的数据与发送方发送的数据是否一致。协议特性无连接:通信时不需要建立连接,只要知道对方地址就可以直接发送数据不可靠:不保证数据安全、有序到达
2021-08-31 23:41:46
567
原创 Linux--https协议
HTTPS协议1. HTTPS协议2. https、ssl加密流程https加密流程1. HTTPS协议并不是一个新的协议,而是在HTTP协议基础上进行了一层加密https协议就是基于ssl进行加密实现加密传输2. https、ssl加密流程目的:实现数据的安全传输安全传输· 身份验证问题:防止伪装· 数据加密问题:防止监听ssl加密:将身份验证与加密传输合在一起身份验证实现· CA认证:通信双方在通信前先到权威机构请求给自己颁发一个CA证书(权威机构信息)· 身份验证通过,但
2021-08-31 15:38:06
354
原创 Linux--应用层协议
HTTP协议HTTP协议HTTP协议格式首行-请求行首行-响应行头部空行正文应用层:自定制协议;知名协议-HTTP;· 应用层负责应用程序之间的沟通–程序员自己定义数据的组织格式· 如何将多个数据对象组织称为一个二进制数据串进行传输· 需要考虑要素:传输性能,解析性能、调试便捷性序列化:将数据对象按照指定协议进行组织实现持久化存储或者网络通信传输的二进制数据串的过程;反序列化:按照指定协议,将二进制数据串解析得到各个数据对象的过程;· 序列化方式:结构体二进制序列化、json、pr
2021-08-31 10:49:21
258
原创 Linux--网络(socket)套接字编程
socket套接字编程1. udp协议与tcp协议的区别初识1.1 udp协议1.2 tcp协议1.3 客户端、服务端2. udp协议通信程序的编写2.1 **server**2.2 **client**2.3 接口2.3.1 创建套接字2.3.2 为套接字绑定地址信息2.3.3 接收数据2.3.4 发送数据2.3.5 关闭套接字2.3.6 字节序转换接口3. tcp协议通信程序的编写网络通信程序的编写(接口+流程)1. udp协议与tcp协议的区别初识1.1 udp协议用户数据报协议· 特性:
2021-08-31 10:14:00
302
原创 项目--文件备份
云备份1. 项目简介1. 项目简介搭建云备份服务器与客户端,实现客户端针对主机上特定目录下的文件自动进行备份到云端,服务器端会对上传的文件进行热点文件判断,对于非热点文件进行压缩存储节省磁盘空间,并且服务器端支持通过浏览器进行查看和下载以及断点续传功能。...
2021-08-30 00:04:02
231
原创 MYSQL--索引
索引1. 作用2. 适用场景3. 索引提高查询效率B树与B+树:4. 聚簇索引/非聚簇索引4.1 聚簇索引4.2 非聚簇索引5. 数据库操作中的索引类型1. 作用类似于一本书的目录,提高查询效率;2. 适用场景原理:给一张表创建一个索引,相当于又创建了一个索引表· 因此索引并不适用于所有的字段,不是越多越好· 因为索引多了,影响插入和删除的效率不经常作为条件,用于查询依据的字段不适用字段修改频率较低的字段不适用索引会额外占据磁盘空间3. 索引提高查询效率索引采用特殊的
2021-08-25 01:16:44
71
原创 MYSQL--数据库表的设计&多表联查
数据库表的设计1. E-R图2. 三大范式2.1 第一范式2.2 第二范式2.3 第三范式3. 多表联查3.1 内连接3.2 外连接1. E-R图实体-联系图一对一-- eg:能够唯一标识学生的字段就是主键;一对多-- eg:向学生实体(多的一方)添加一个班级ID多对多:设计一个中间表包含两个实体的ID,通过中间表将两个实体关联。eg:一个学生可以学多门课程,一个课程可以有多个学生上。2. 三大范式数据库表设计的三大规范2.1 第一范式1nf:表中每个字段都必须具有不可分隔原子特
2021-08-25 01:14:51
431
原创 MYSQL--安装与配置
数据库1. 数据库介绍2. 数据库的分类3. 数据库的安装4. SQL分类1. 数据库介绍概念:数据存储管理的仓库存储:· 存储介质:磁盘-文件· 相较于文件存储:①文件存储安全性低;②文件对数据的查询和管理效率较为低下;③文件不利于海量存储与查询;④文件在程序中控制不方便。SQL:结构化查询语言2. 数据库的分类关系型数据库:以一种关系模型(二维表格模型)组织数据的数据库;· 分类:oracle、mysql、sql server、mariadb、sqlite(sqlite基于简单文
2021-08-24 21:53:28
71
原创 MYSQL--数据库基本操作
数据库基本操作1. 库的操作2. 数据类型3. 表的操作3.2 表中数据的增删改查3.3 表中数据的增删改查进阶1. 库的操作sql–结构化查询语言:有具体格式与语法规则库表字段名称不能使用关键字–如果非要使用则需要使用反引号``括起来,不区分大小写查看:show databases;创建:create database dbname; create database if not exists dbname;删除:drop database dbname;使用:use dbname;查看
2021-08-24 21:48:30
119
1
原创 C++--二叉搜索树的应用
二叉搜索树的应用KV模型KV模型每个关键码key,都有与之对应的值value,即<key, value>的键值对。如:英汉词典就是英文与中文的对应关系<word, chinese>。二叉搜索树需要比较,键值对比较时,只比较key。#include<iostream>using namespace std;#include<time.h>template<class K, class V>struct BNode{ K _ke
2021-05-16 22:15:26
181
原创 C++--二叉搜索树
二叉搜索树1. 二叉搜索树2. 二叉搜索树的操作2.1 二叉搜索树的查找2.2 二叉搜索树的插入2.3 二叉搜索树的删除3. 二叉搜索树的性能分析1. 二叉搜索树二叉搜索树又称二叉排序树,性质:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上所有节点的值都大于根节点的值;它的左右子树也分别是二叉搜索树;可以是一棵空树。2. 二叉搜索树的操作二叉树的结构template<class T>struct BNode{ T
2021-05-16 22:14:58
351
5
原创 Linux--网络发展背景、IP地址、端口、协议、网络字节序
网络1. 发展背景:网络基础1:发展背景、IP地址、端口、通信协议、网络字节序1. 发展背景:局域网(覆盖范围1km以内)、城域网(1km-20km)、广域网(20km以上):根据网络覆盖范围进行的网络划分;互联网(依托于网络)、因特网:相同的东西,不同的叫法-- 国际性的更大的广域网;以太网、令牌环网:组网技术...
2021-05-08 21:47:52
215
4
原创 Linux--进程与线程总结
文章目录1. 进程进程间同步的方式2. 线程3. 进程与线程的共同点4. 进程与线程的不同点5. 多线程与多进程1. 进程进程是拥有资源的独立单位(不管系统中是否有线程);程序是静态的,不涉及进程,进程是程序运行时的实体;pthread_create是一个库函数运行在用户态,创建的是用户级线程,在内核中通过轻量级进程实现调度;可以使用ps -L命令查看轻量级进程信息, pthread_self用于获取用户态线程的tid,getpid用于获取当前进程的id;互斥锁就是标记资源访问状态的一个计数器
2021-04-28 16:54:43
409
1
原创 Linux--线程应用--线程安全的单例模式
线程安全的单例模式线程安全的单例模式单例模式饿汉方式懒汉方式线程安全的单例模式单例模式单例模式:非常典型的一种设计模式应用场景:一个类型只能实例化一个对象,一份资源只能被加载一次实现:饿汉方式/懒汉方式饿汉方式:资源在程序初始化阶段就完成加载(以空间换时间)懒汉方式:资源在使用的时候再加载(延迟加载,节省资源)饿汉方式静态修饰资源,保证资源只有一份,并且在程序初始化阶段完成加载构造函数私有化,一个类只能实例化一个对象不需要考虑线程安全问题//不需要考虑线程安全问题tem
2021-04-28 11:14:56
185
原创 Linux-- 线程应用--线程池
线程池对于生产者与消费者模型最为典型的应用;创建一堆工作线程(有最大数量限制)以及一个线程安全的任务队列,这些工作线程不断从任务队列中取出任务进行处理。优点:避免资源无限制使用所造成的资源耗尽的风险;避免频繁大量的线程创建与销毁带来的时间成本;实现:3. 直接在线程入口函数中定义好各种不同类型的处理方法4. 要处理什么数据,这个数据如何处理都由外部传入class ThreadTask{数据, 处理数据的函数}class ThreadPool{有数量上限的线程+任务队列}...
2021-04-28 11:14:34
164
原创 Linux--生产者与消费者模型-- 信号量实现
1. 信号量本质:计数器+pcb等待队列;作用:实现进程或线程间的同步与互斥;P操作:计数-1;判断计数<0 ,则阻塞进程或线程(将其加入pcb等待队列)V操作:计数+1;唤醒pcb等待队列上的一个进程或线程;同步的实现:通过计数器对资源进行计数;获取资源前进程P操作,合理则获取,不合理则阻塞。产生一个资源,则进行一次V操作。互斥的实现:计数最大为1,表示只有一个资源,访问前P操作,访问完进行V操作;操作接口:定义信号量:sem_t sem;初始化信号量int sem_ini
2021-04-27 17:18:26
204
原创 Linux--线程安全--同步的实现--生产者与消费者模型
生产者与消费者模型一种典型的设计模式设计模式:大佬们针对典型场景设计的解决方案应用场景:应用于有大量的数据产生以及进行处理的场景好处:解耦合,支持忙闲不均,支持并发为了能够支持并发,因此缓冲区必须实现线程安全生产者与生产者之间应该保持互斥关系消费者与消费者之间应该保持互斥关系生产者与消费者之间应该保持同步与互斥关系实现:两种对应角色的线程(一种入队,一种出队)+线程安全的队列实现线程安全的队列;创建线程入队数据,出队数据线程安全队列的实现:封装一个线程安全的队列
2021-04-27 17:17:55
176
原创 C++--多态--虚函数重写、抽象类
多态1. 多态的概念2. 多态的构成条件3. 虚函数4. 虚函数的重写4.1 虚函数的重写(覆盖)4.2 协变4.3 析构函数的重写4.4 override和final5. 重载、重写、重定义对比5.1 重载5.2 重写5.3 重定义6. 抽象类1. 多态的概念多态:多种形态;就是去完成某个行为,当不同的对象去完成时,会产生出不同的状态;2. 多态的构成条件多态是在不同继承关系的类对象中调用同一函数,产生了不同的行为;必须通过基类的指针或者引用调用虚函数;被调用的函数必须是虚函数,且派生类
2021-04-27 17:07:17
3159
1
原创 C++--继承和组合
继承和组合public继承是一种 is-a 的关系,组合是一种 has-a 的关系;一般优先使用对象组合,而不是类继承;继承允许根据基类的实现来定义派生类的实现,在继承方式中,基类的内部细节对子类可见。继承一定程度上破坏了基类的封装,基类的改变,对派生类有很大的影响,派生类与基类的依赖关系很强,耦合度很高;对象组合是类继承之外的一种复用选择。对象内部徐杰是不可见的,组合类之间没有很强的依赖关系,耦合度低,代码维护性好。//继承 is aclass Car{protected: str
2021-04-27 16:23:19
932
原创 C++--菱形继承
菱形继承1. 菱形继承2. 菱形虚拟继承1. 菱形继承单继承:一个子类只有一个直接父类时;多继承:一个子类有两个或以上直接父类时;菱形继承:是多继承的一种特殊情况;菱形继承有数据冗余和二义性的问题。2. 菱形虚拟继承...
2021-04-25 12:14:38
680
2
原创 C++--派生类中的默认成员函数
继承1. 派生类中的默认成员函数2. 继承与友元、静态成员1. 派生类中的默认成员函数6个默认成员函数:构造函数、析构函数、拷贝构造函数、赋值重载、取地址重载(普通对象和const对象取地址)派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员,如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显式调用;派生类拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化;派生类的operator=必须要调用基类的operator=完成基类的复制;派生类的析
2021-04-25 12:13:44
492
原创 C++--继承基本概念、对象赋值转换、作用域
继承1. 继承的基本概念1.1 继承的定义1.2 继承基类成员访问方式的变化2. 基类和派生类对象赋值转换3. 继承中的作用域1. 继承的基本概念继承是面向对象程序设计使代码复用的最重要的手段,允许在保持原有类特性的基础上进行扩展,增加功能,产生新的类,称为派生类/子类。继承是类设计层次的复用。1.1 继承的定义派生类 : 继承方式 基类class Student : public Person1.2 继承基类成员访问方式的变化父类成员在子类中的访问权限(除过父类中的私有成员):
2021-04-25 12:12:04
307
3
原创 C++--输入输出流
输入输出流1. 输入输出2. 输入输出流2.1 流2.2 C++标准IO流2.3 C++文件IO流3. stringstream1. 输入输出程序的输入:从输入文件将数据传送给程序;程序的输出:从程序将数据传送给输出文件;C++输入输出包括:对系统指定标准设备的输入输出,即从键盘输入数据,输出到显示器屏幕;以外存(磁盘、光盘)为对象进行输入输出,例如:从磁盘文件输入数据,数据输出到磁盘文件;对内存中指定的空间进行输入和输出。2. 输入输出流2.1 流输入和输出时数据传送的过程称
2021-04-21 22:29:25
1243
8
原创 C++--函数模板、类模板的特化及模板的分离编译
类模板1. 非类型模板参数2. 模板的特化2.1 函数模板特化2.2 类模板特化2.2.1 全特化2.2.2 偏特化3. 模板的分离编译4. 模板优缺点4.1 优点4.2 缺点1. 非类型模板参数模板参数分为:类型形参与非类型形参类型形参:出现在模板参数列表中,跟在class或者typename之后的参数类型名称;非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。2. 模板的特化使用模板可以实现一些与类型无关的代码,但是对于一些特殊类型可能会出
2021-04-21 20:28:45
429
3
原创 Linux--线程安全--互斥与同步的实现、死锁
线程安全1. 线程安全线程安全的实现2. 互斥的实现3. 死锁4. 同步的实现1. 线程安全线程中对临界资源的访问操作是安全的临界资源:公共资源,大家都能访问到的资源线程安全的实现同步与互斥:互斥:通过同一时间只有一个线程能够访问资源实现资源访问的安全性同步:通过条件判断让线程对临界资源访问更加合理有序2. 互斥的实现互斥的实现:互斥锁(通过互斥锁保护线程对临界资源的访问操作不会被打断)本质:是一个只有0/1的计数器原理:标记临界资源的两种访问状态,可访问或者不可访问,在线程
2021-04-18 20:16:39
1170
7
原创 Linux--多线程--线程概念与线程控制
多线程线程概念:一个进程中可以有一个或者多个线程,线程是进程中的一条执行流,负责进程中一段代码的运行调度。在Linux下,线程是通过pcb实现的,一个进程中可以有多个pcb,这些pcb共享进程中的大部分资源,相较于传统pcb较为轻量化,因此也被称作轻量级进程。线程与进程的关键性区别:· 进程是系统进行资源分配的基本单元· 线程是系统进行运行调度的基本单元线程间的独有与共享:独有:标识符、栈、寄存器、信号屏蔽字(阻塞信号集合)、errno…共享:虚拟地址空间、IO信息、信号处理方式、工作路径
2021-04-18 20:15:28
273
原创 Linux--volatile关键字、函数的重入与不可重入
文章目录1. 关键字volatile2. 函数的可重入与不可重入1. 关键字volatile作用:修饰一个变量,保持变量的内存可见性;修饰变量后,CPU每次访问变量数据都需要重新从内存中加载数据,防止编译器过度优化。2. 函数的可重入与不可重入函数的重入:一个函数在多个执行流程中,重复进入一个函数进行执行。可重入函数:一个函数重入之后不会出现预期之外的结果;不可重入函数:一旦函数重入之后,有可能造成数据二义或者逻辑混乱。判断基准:在一个函数中是否对一个全局数据进行了不受保护的非原子
2021-04-18 09:37:05
204
原创 C++--deque(双端队列)模拟实现stack和queue
deque1. deque的认识2. stack的实现(deque)3. queue的实现(deque)1. deque的认识deque(双端队列):是双开口的“连续”空间的数据结构,两端都可以进行插入和删除操作,时间复杂度为O(1);deque并不是真正的连续空间,而是由一段段连续的小空间拼接而成,分段连续,类似于一个动态的二维数组;与vector相比:头插和删除时,不需要搬移元素,效率特别高,扩容时也不需要搬移大量元素;与list相比:空间利用率比较高,不需要存储额外字段;缺陷:不适合遍历
2021-04-16 10:47:18
508
原创 C++--priority_queue 优先队列的操作及模拟实现
priority_queue1. priority_queue的常用操作2. priority_queue的模拟实现(vector)3. priority_queue的模拟实现(deque)1. priority_queue的常用操作优先队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造称堆的结构,因此优先队列就是堆。priority_queue(); --构造一个空的优先队列;empty(); --检查优先队列是否为空,是返回true,否返回
2021-04-16 10:30:20
246
原创 Linux--进程信号--产生、注册、注销、处理、阻塞、应用
进程信号1. Linux下信号种类1.1 信号产生1.2 信号注册1.3 信号注销1.4 信号处理自定义处理方式的信号捕捉流程2. 阻塞信号量不是信号!信号是一种中断机制,或者说是一种事件通知机制,本文讲述的是软件中断通过信号通知进程发生了某个事件,打断进程当前的操作,去处理事件。一个信号对应一个事件,信号必须能够被识别。1. Linux下信号种类使用kill-l 命令进行查看,62种1~31:非可靠信号,借鉴Unix而来,33~64:可靠信号,扩充,信号的生命周期:产生,注册,注销
2021-04-11 22:56:14
390
原创 数据结构--测试几种排序的性能对比
排序的动图演示链接排序测试排序的性能对比测试排序的性能对比插入、希尔、选择、冒泡、堆、计数、归并、快速排序void timetest(){ int n; printf("数据量: \n"); scanf_s("%d", &n); srand(time(NULL)); int* arr = (int*)malloc(sizeof(int)*n); int* copy1 = (int*)malloc(sizeof(int)*n); int* copy2 = (int*)mallo
2021-04-11 11:48:35
231
原创 数据结构--快速排序
排序的动图演示链接排序1. 快速排序(1)递归实现①hoare版本②挖坑法③前后指针法(2)非递归实现①利用顺序表实现②利用栈实现③利用队列实现1. 快速排序算法描述 ① 从序列中选择一个元素,即基准值(取第一个元素或者可以利用下面的getMid函数实现);② 重新对序列排序,将所有小于基准值的放在基准值前面,大于的放在后面,分区操作完成;③ 递归地将两个子序列分别排序,即排序完成;④ 非递归可以利用顺序表/栈/队列来实现。(1)递归实现①hoare版本//返回划分之后,基准值所在位置
2021-04-11 11:48:04
402
原创 数据结构--堆排序、计数排序、归并排序
排序的动图演示链接排序1. 堆排序2. 归并排序(1)递归实现(2)非递归实现3. 计数排序1. 堆排序(1)算法描述 ① 将初始待排序的序列构建成大堆,即为初始的无序区间;② 将堆顶元素与最后一个元素进行交换(此时,无序区间与有序区间分别是[1,n-1]、[n]);③ 对无序区间的序列继续建大堆,执行②,更新无序区间和有序区间;④ 重复③,直至有序区间的元素个数为n-1个,则数据有序。(2)代码实现//堆排序 时间复杂度:O(n(logn)) 不稳定//建大堆,从最后一个void
2021-04-11 11:47:05
264
原创 算法--搜索
搜索算法1. 枚举法:暴力搜索2. 深度优先搜索(DFS)3. 广度优先搜索(BFS)4. 回溯1. 枚举法:暴力搜索枚举算法又叫做穷举算法,有序的尝试每一种可能。2. 深度优先搜索(DFS)深度优先搜索的关键是解决"当下该如何做",下一步的做法和当下的做法是一样的。"当下如何做"一般是尝试每一种可能,用for循环遍历,对于每一种可能确定之后,继续走下一步,当前的剩余可能等到从下一步回退之后再处理。用两张表来进行搜索,一个叫 OPEN 表,表示那些已经展开但还没有访问的结点集,另一个叫 CL
2021-04-10 21:53:41
369
原创 算法--动态规划
动态规划1. 动态规划1)最优子结构2)重叠子问题3)动态规划的特点4)动态规划的本质5)动态规划的要素2. 自底向上动态规划1. 动态规划动态规划是分治思想的延伸。适用场景:最大值/最小值、可不可行、是不是、方案个数。1)最优子结构动态规划一般用于有最优子结构的问题,最优子结构是局部最优解能决定全局最优解。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质。即总问题包含很多个子问题,而这些子问题的解也是最优的。2)重叠子问题子问题重叠性质是指在用递归算
2021-04-10 16:37:04
192
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人