自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

是胖胖没错了的博客

一人我编程醉,一人我编程泪

  • 博客(124)
  • 收藏
  • 关注

原创 MySQL(4):复合查询与联合查询

        复合查询                复合函数                 

2020-11-02 22:54:01 321

原创 MySQL(3):数据库约束、表的关系、三大范式

文章目录        数据库约束                NOT NULL(非空约束)              &n

2020-11-02 12:47:33 310

原创 MySQL(2):表的增删查改

文章目录        增加                全列插入                指定列

2020-11-01 17:10:18 273

原创 MySQL(1):数据类型、库的操作、表的操作

文章目录        数据类型                数值类型                日

2020-10-30 17:29:41 170

原创 文件操作详解

C语言(标准库IO接口)打开、关闭文件path:文件路径名moder:只读r+:可读可写w:只写,文件不存在则创建,若文件存在则清空原有内容w+:相较于w,多出了可读操作a:追加写打开,若文件不存在则创建,每次总是写到文件末尾a+:相较于a,多出了可读操作返回值:文件的操作句柄(文件流指针)fp:文件的操作句柄读写文件ptr:用于接收数据的缓冲区size:一次要读取的字节大小nmemb:一次要读取多少个 sizestream:fopen返回的文件流指针返回值

2020-10-07 18:33:27 282

原创 Linux静态库与动态库的生成和使用

静态库与动态库的生成和使用库文件实际上就是封装了一大堆已经编译完成的代码文件,通过链接这个库进而获取到相应函数实现。动态库的生成动态库的打包:gcc -c -fPIC child.c -o child.ogcc -shared child.o -o libmychild.so动态库生成的链接器:gcc-fPIC:生成目标代码时产生位置无关代码,动态库会在虚拟地址空间的共享区中加载一份-share:要生成的是动态库而不是可执行程序动态库的命名:lib 是前缀  &n

2020-10-06 20:55:32 149

原创 Linux多线程(线程控制、同步与互斥、生产者消费者模型、线程池)

什么是线程?现在有一个机床工厂,加工零部件,工厂中的工人是真正干活的人。若工厂中只有一个工人,则同一时间只能完成一个零部件的加工。如何实现同时加工多个零件?第一种方式: 多建几个厂房,一个厂房中至少有一个工人第二种方式:一个厂房中多招几个工人线程的功能:多任务处理多创建几个进程,一个进程就有一个pcb,能够串行化的完成一个任务在一个进程中多创建几个pcb,因为pcb是调度程序运行的描述,因此有多少个pcb就会有多少个执行流程在之前我们说进程就是一个pcb,是程序动态运行的描述,通过p

2020-10-02 22:02:57 579

原创 Linux进程信号

信号:软件中断用于通知一个事件的发生,会打断当前进程的操作去处理这个事件;前提:必须识别这个信号信号有生命周期:信号的产生信号在进程中的注册信号在进程中注销信号的处理信号种类有很多,每个都代表不同事件:使用 kill -l 命令查看:62种1~31:继承 unix 而来,非可靠信号(信号有可能会丢失,丢失事件),也叫 非实时信号34~64:可靠信号(信号不会丢失),也叫 实时信号信号的产生硬件产生信号:ctrl + c(中断)ctrl + |(退出)ctrl + z(

2020-09-27 11:53:03 146

转载 Linux文件权限

一、Linux文件权限     每个Linux文件具有四种访问权限:可读(r)、可写(w)、可执行(x)和无权限(-)。     利用ls -l命令可以看到某个文件或目录的权限,它以显示数据的第一个字段为     准。第一个字段由10个字符组成,如下:     &nb...

2020-09-26 19:16:45 173

原创 Linux进程间通信

进程间通信目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变进程间通信发展管道System V进程间通信POSIX进程间通信进程间通信分类管道:数据流传输匿名管道命名管道System

2020-09-26 11:22:36 219

原创 Linux进程控制

进程创建fork在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。返回值:子进程中返回0,父进程返回子进程id,出错返回-1进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork函数返回,开始调度器调度vfork创建子进程,与父进程共用同一块虚拟地址空间,但是会出现调用栈混乱。为了防止调用栈混乱,因此需要

2020-09-24 19:59:40 218

原创 Linux进程概念、环境变量、虚拟地址空间

进程是什么?用户角度:正在运行的程序操作系统角度:操作系统对运行中程序的描述信息,即进程描述符,统称PCB在Linux中描述进程的结构体叫做task_structtask_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息PCB中的描述信息:内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针程序计数器:程序中即将被执行的下一条指令的地址上下文数据:进程执行时处理器的寄存器中的数据标识符PID(进程ID):描述进程的唯一标

2020-09-24 19:27:19 342

原创 IO多路复用:select、poll、epoll编程

什么是IO多路复用?IO多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄;一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作;没有文件句柄就绪时会阻塞应用程序,交出cpu。多路是指网络连接,复用指的是同一个线程。为什么有IO多路复用机制?没有IO多路复用时,有其它几种方式,但是都存在一些问题(无法处理高并发,浪费CPU资源等)同步阻塞IO资源不可用的情况下,IO请求一直被阻塞,直到资源可用。如:钓鱼的时候,鱼钩抛入到水中,眼睛一直盯着鱼漂,直到钓上鱼。同步阻塞I

2020-09-22 20:29:43 267

原创 浅谈DNS、ICMP、NAT

DNS(域名解析协议)用于存储IP地址与域名的映射关系,提供域名解析,通过域名获取服务器IP地址的服务。域名:服务器地址的别名,便于记忆,但是最后通过域名访问服务器的时候还是进行解析最终通过IP地址访问服务器的。域名服务器:记录所有服务地址与域名的映射关系。域名服务器是遍布全世界的,采用分布式存储,分摊访问压力、容灾处理。域名服务器的划分:根域名服务器、顶级域名服务器、二级域名服务器、三级域名服务器域名的划分:顶级域名(如 .com、.org、.cn),二级域名(如 .baidu.com),三级域

2020-09-21 12:00:29 497

原创 数据链路层:以太网协议、ARP协议、MTU

网络层只负责数据的源端和目的端,而链路层就是负责相邻设备之间的数据帧传输。相邻设备之间也需要描述识别(因为一个设备可能有很多相邻设备)。链路层相邻设备之间的识别是通过MAC地址实现的。以太网协议MAC地址:网卡的硬件地址,uint8_t mac[6],每一个网卡设备都拥有自己独有的MAC地址,唯一标识一个设备48位对端MAC地址、48位源端MAC地址:描述识别相邻设备(描述了相邻设备之间的数据传输)16位上层协议类型:网络层的协议类型,在数据分用时选择上层的解析协议32位CRC校验和:数据帧尾

2020-09-20 14:04:03 279

原创 网络层:IP协议(地址管理与路由选择)

IP协议端格式4位版本:IPV4、IPV64位首部长度:标识IP报头有多长,以4字节为单位(最小20字节,最大60字节)8位服务类型:3位弃用、1位置0、4位TOS字段(最大吞吐量、最小成本、最高可靠性、最小延时)16位数据报长度:限制了一个完整的报文最大长度不超过64K。如UDP报文数据的最大长度不能超过64K - 20 - 8,8字节是UDP报头长度,20字节是IP报头长度。16位分片标识:标识当前分片属于哪一个完整的上层报文分片标识:数据在实际传输时的最大长度不仅受限于数据报长度字段,

2020-09-19 12:30:10 838

原创 HTTPS加密过程解析

在学习本篇文章之前,我默认你已经熟悉掌握:HTTP协议解析在HTTP通信过程中,当我们使用Fiddler进行抓包,会发现我们在网页上输入的数据直接就是明文,我们的密码或者任何隐私的东西,都是"裸奔"在互联网中的,很明显这样是不安全的,那如何去保证安全呢?HTTPSHTTP和HTTPS的网络分层模型对比:HTTPS在应用层和传输层之间,加上了一个SSL层,该层就是用来保证安全的加密层。既然明文传输是不安全的,那我们就使用加密算法进行加密,加密算法都有哪些?怎么划分?对称加密对称加密就是加密和解密

2020-09-18 20:49:30 173

原创 应用层:HTTP协议解析

      HTTP协议是超文本传输协议,规定了客户端(浏览器)和服务端之间的通信格式。特点基于请求响应模型默认端口:80无状态的,底层是TCP实现,所以是可靠的      基于请求响应模型就是指每一次业务过程都是客户端请求服务器,服务器响应客户端。HTTP是无状态的协议,也就是下一次请求响应对上一次请求响应是没有记忆的,而我们现在一直所使用的登陆状态等功能都是通过另外的功能

2020-09-17 13:09:29 434

原创 socket网络编程:UDP通信、TCP通信

本篇文章默认你对UDP协议和TCP协议已经理解掌握了:UDP协议详解、TCP协议详解UDP网络通信编程首先我们需要知道 UDP协议是传输层协议,面向数据报,无连接,不可靠传输,实时性高。创建套接字:使进程与网卡之间建立联系domain:地址域–>使用AF_INET(IPV4)type:套接字类型        SOCK_STREAM–流式套接字–默认对应的协议:TCP   &

2020-09-16 15:16:10 587

原创 传输层:UDP协议解析

UDP协议端格式16位UDP长度, 表示整个数据报(UDP首部+UDP数据)的最大长度

2020-09-15 15:12:19 324

原创 传输层:TCP协议解析

ps:TCP三次握手和四次挥手详解TCP协议端格式16位源端端口、16位目的端端口:描述端与端之间的通信32位序号、32位确认序号:实现TCP的包序管理,TCP是有序交付的4位头部长度:以4字节位单位描述TCP报文长度,TCP报头是不定长的,最小20字节,最大60字节6位标志位:URG、ACK、PSH、RST、SYN、FINURG:紧急标志位ACK:确认标志位PSH:携带数据标志位RST:重置连接标志位SYN:连接建立标志位FIN:断开连接标志位16位窗口大小:实现滑动窗口机制,

2020-09-14 18:38:52 286

原创 TCP三次握手和四次挥手详解

在建立TCP的过程中,会用到三次握手和四次挥手,三次握手和四次挥手到底是什么?在哪里用到?TCP握手为什么是三次?两次不安全,四次没必要。SYN请求目的是为了确定对方是否具有数据收发的能力,得到ACK响应,则认为对方在线。若两次就能建立连接,则万一客户端发送了多次SYN,就都会建立连接,浪费资源。有可能客户端发送请求后退出,服务端建立的套接字就会占用资源(受TCP保活机制影响)。TCP挥手为什么是四次?发送FIN请求后,不表示完全断开连接,只能表示主动关闭方不再发送数据了,而还有可能继续接

2020-09-13 10:02:31 361

原创 C++的类型转换

C语言中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败显式类型转化:需要用户自己处理void Test1(){ int i = 1; double d = 8.88; //c语言支持相近类型的隐式类型转换(相近类型,也就是意义相似的类型) i = d; cout &

2020-09-11 09:35:50 723

原创 单例模式

请设计一个类,只能在堆上创建对象实现方式:将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝构造在栈上生成对象。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。// 创建出的类对象只能在堆上// 思路:正常创建对象一定要调用构造函数,或者拷贝构造class HeapOnly{public: static HeapOnly* GetObj() { return new HeapOnly; }private: HeapOnly() {} // C++9

2020-09-08 12:36:26 128

原创 RAII:智能指针

为什么需要智能指针?下面我们先分析一下下面这段程序有没有什么内存方面的问题?int div(){ int a, b; cin >> a >> b; if (b == 0) { throw invalid_argument("除0错误"); } return a / b;}void f1(){ int* p = new int; try { cout <<

2020-09-06 20:06:49 213

原创 异常

C语言传统的处理错误的方式传统的错误处理机制:终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。C 标准库中setjmp和longjmp组合。这个不是很常用。实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。C++异常概念异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,

2020-09-02 13:53:13 117

原创 线程库(C++11)

thread类的简单介绍在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件。C++11中线程类构造一个线程对象,没有关联任何线程函数,即没有启动任何线程构造一个线程对象,并关联线程函数 Fn,args1,args2,…为线程函数的参

2020-08-30 11:00:02 794

原创 右值引用(C++11)

C++98中提出了引用的概念,引用即别名,引用变量与其引用实体共用同一块内存空间,而引用的底层是通过指针来实现的,因此使用引用,可以提高程序的可读性。void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}int main(){ int a = 10; int b = 20; Swap(a, b); return 0;}为了提高程序运行效率,C++11中引入了右

2020-08-27 22:13:55 741

原创 lambda表达式(C++11)

C++98中的一个例子在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。#include <algorithm>#include <functional>int main(){ int array[] = { 4,1,8,5,3,7,0,9,2,6 }; // 默认按照小于比较,排出来结果是升序 std::sort(array, array + sizeof(array) / sizeof(array[0])); // 如果

2020-08-23 00:06:09 432

原创 海量数据问题解决思路

1.给定100亿个整数,设计算法找到只出现一次的整数?分析:100亿个整数大概占用40G内存空间数据出现的次数分为3种:出现0次、出现1次、出现2次及以上使用位图来解决问题,两个位表示一个整数:00、01、102.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?方案一:将其中一个文件的整数映射到一个位图中,读取另外一个文件的整数,判断在不在位图中,在就是交集,消耗500M内存。方案二:将其中一个文件的整数映射到一个位图中,将另外一个文件的整数映射到另外一个位图中,然后

2020-08-21 11:27:18 522 1

原创 哈希的应用:位图和布隆过滤器

位图首先我们来看一道腾讯的面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。那么你会想到哪些解决方法呢?遍历,时间复杂度 O(N)排序 O(N * logN),利用二分查找 O(logN)上面两种方法真的可以解决吗?40亿个不重复的无符号整数在内存中占多大空间呢?232大概是42亿,4G空间大小,一个整数占4个字节,那就是16G的空间大小,实际上我们电脑的内存没有这么大。那是否可以采用哈希进行映射处理呢?可以开232个空间,对所有

2020-08-19 12:32:02 187

原创 哈希表详解

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

2020-08-17 10:30:51 2484

原创 STL容器:map、multimap的简介与使用

map的介绍map是关联式容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。在map中,键值key通常用于排序和惟一的标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名称为pair:typedef pair value_type;在内部,map中的元素总是按照键值key进行比较排序的。map中通过键值访问单个元素的速度通常比

2020-08-15 00:10:11 382

原创 STL容器:set、multiset的简介与使用

set的介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代set在底层是用平衡搜索树(红黑树)实现的使用set时必须加

2020-08-12 10:08:13 427

原创 红黑树(RBTree)

红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点)红黑树节点的定义//节点的颜色

2020-08-10 11:33:57 267

原创 平衡二叉搜索树(AVLTree)

AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右子树都是AVL树左右

2020-08-08 12:15:39 1424

原创 二叉搜索树(BSTree)

二叉搜索树定义二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树通过观察上图可以发现:二叉搜索树中序遍历后是一个有序序列每个节点的值都是唯一的,不可重复二叉搜索树操作1.查找2.插入树为空,则直接插入树不为空,按二叉搜索树性质查找插入位置,插入新节点...

2020-08-06 20:37:38 641

原创 常见的二叉树OJ习题2

ps:标题为OJ链接根据二叉树创建字符串你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。struct TreeNode{ int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class S

2020-08-03 17:52:13 157

原创 常见的二叉树OJ习题

ps:标题为OJ链接单值二叉树如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。struct TreeNode{ int val; struct TreeNode* left; struct TreeNode* right;};bool isUnivalTree(struct TreeNode* root){ if (root == NULL) { retu

2020-08-02 11:49:31 490 1

原创 堆(Heap)详解(C实现)

堆的定义如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆的性质:堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树堆向下调整算法(建小堆)现在我

2020-08-01 11:03:26 482

空空如也

空空如也

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

TA关注的人

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