自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分享

秋招结束一段时间了,分享下我的心得。希望对学弟学妹有一丝帮助。首先说下学习知识方面,认真听课,反复看课件,一定一定要多练习!!!因为面试手撕代码是非常重要的环节。对于每一个知识点,自己要理解,尤其基础问题要能轻车熟路,如果能够拓展下那再好不过。开始也想过有的不常问的问题面试该不会问吧,结果你懂的非常尴尬,你能想的面试官也能想到,而且会问的非常细,平时要总结学习的东西,一方面可以让自己有一个完整的知识体系,另一方面也方便自己后期复习。开始时的总结好多文字看上去也不直观,不利于复习,后期经过老师指点用思维导图方

2021-01-05 10:39:19 216 1

原创 C++11新特性

1.列表初始化 2. 变量类型推导 3. 范围for循环 4. final与override 5. 智能指针 6. 新增加容器---静态数组array、forward_list以及unordered系列 7. 默认成员函数控制 8. 右值引用 9. lambda表达式 10. 线程库​​​​​​​​​​​​​​1.列表初始化1.1、C++98中{}的初始化问题在C++98中,标准允许使用花括号{}对数组元素进行统一的列表初始值设定。比如: int array1...

2020-07-17 15:42:38 262

原创 多路转接IO/多路复用 select 、poll、 epoll

多路转接IO 1.多路复用--》多路转接 2.作用:I0多路转接可以完成大量描述符的监控,监控的事件:可读事件,可写事件,异常事件 3.当使用多路转接的时候,多路转接接口发现了某一一个文件描述符就绪的时候,就会通知进程,让进程针对某一个描述符进行操作;其他描述符继续监控; 4.好处:避免了进程对其他没有就绪的文件描述符进行操作,从而陷入阻塞的情况select: 1.作用:对于大量的描述符进行用户关心事件的监控,如果有描述符就绪,则返回描述符,让用户对描述符进行...

2020-06-24 16:02:29 423

原创 几种典型IO模型

IO (input&output)过程:2.1等待IO就绪---》指的是想要获取的资源已经准备好了,可以进行操作. 读:recv/recvfrom--》想要获取的数据已经准备好了 写:想要写入数据的空间已经准备好了,可以写入数据了send/sendto2.2拷贝数据到缓冲区当中阻塞IO1.资源不可用情况下,IO请求一直被阻塞,直到资源可用2.3.阻塞IO的特点 3.1阻塞IO的方式,等待的时长取决于内核; 3.2在等待的过程...

2020-06-16 17:31:08 269

原创 NAT协议+DNS协议

NAT协议地址转换协议请求:将网络数据当中的私网的源ip地址(私网IP)转换为公网ip应答:将网络数据当中的目的IP(公网ip)转换为私网ipNAT的特点:1.网络被划分为私网和公网,NAT网关设置到私网到公网的路由出口位置,双方的流量都是需要经过NAT网关的2.网络访问只能从私网一端发起,公网是无法访问到私网的主机的3.NAT网关对于请求而言,是替换源IP地址,对于应答而言,是替换目的IP地址4.NAT网关对于双方都是透明的,双方在网络传输过程当中是无感知的;5.NAT网关为..

2020-06-16 15:51:12 1334

原创 数据链路层以太网协议+ARP协议

数据链路层1.负责相邻设备之间的传输,决定性因素是设备的MAC地址;.MAC地址:6字节的整数,uint8_taddr[6];MAC地址在每一个机器上都是独一无二的;以以网协议目的MAC地址(6字节)+源MAC地址(6字节)+类型(2字节)+数据+CRC校验 类型:标识网络层使用什么协议; 数据:有效载荷 CRC校验:检测数据链路层的数据帧是否出差错;ARP协议作用:通过IP地址获取相邻设备的MAC地址ARP协议的格式:ARP协...

2020-06-16 14:50:48 479

原创 网络层IP协议

4位版本 描述IP协议的版本IP协议分为两个版本,一个版本是IPv4版本,一个是IPv6版本,并且IPv6版本并不相兼容IPv4版本4位首部长度: 表示IP协议头部长度4个比特位算出来的数值还需要乘以4,才是IP协议头部的长度。最大的IP协议头部长度为0XF乘以4等于60字节(固定的20字节,加上40字节的选项)8位服务类型 a.前三个比特位表示优先权,但是已经弃用了 b.后面四个比特位,分别表示最小延迟SSH+最大吞吐量FTP+最高可用性+最小费用,这4...

2020-06-15 16:38:39 572

原创 TCP可靠传输

1.确认应答机制2.超时重传机制3.滑动窗口机制4.拥塞控制机制 慢启动 拥塞避免 快重传 快恢复5.捎带应答机制6.延时应答机制确认应答机制 1.当发送方发送一个报文数据的时候,需要带上序号,当接收方接收到这个报文数据时,需要对该报文进行确认 2.确认做法,给发送发发送一个确认报文,而确认报文当中的确认序号是告诉发送方,期待下一个序号是多少超时重传机制 当消息发送方。发送一条消息后,就会开启一个重传计时器,用来计算消息发出去的时...

2020-06-15 14:14:57 178

原创 传输层TCP协议

面向连接,可靠传输,面向字节流TCP协议

2020-06-14 16:18:45 300

原创 传输层UDP协议

无连接、不可靠、面向数据报 面向数据包:应用层使用UDP协议的时候,不管是从UDP发送缓冲区中拷贝数据,还是应用层将数据拷贝到UDP接收缓冲区,都是整条数据拷贝,不存在两条数据并存在缓冲区当中。UDP头部UDP报头: 源端口(2字节)+目的端口(2字节)+ 数据长度(最大表示65536)+校验和 当应用层数据大于2^16时,应该在应用层进行分片传输。分多次使用UDP协议进行传输。对于接收端UDP来说从协议栈当中接收的UDP数据对于应用层可能不是完整的,...

2020-06-13 22:21:11 425

原创 应用层自定制协议+HTTP协议

子定制协议解决tcp粘包问题1.定长包头+数据(有效载荷)+分隔符2.定长包头当中可以获得当前有效数据长度,分隔符可以找到下一条数据的起始位置(下条数据的包头)3.分隔符不一定是一个字节的字符,可以是一个字符串,通常为\r\n4.分隔符起到了一个定义数据边界的作用结构传输序列化:将对象转化为字节序列的过程 send(sockfd, Data, sizeof(Data));反序列化:将字节序列转化为对象的过程 read(sockfd, buf, s...

2020-06-13 21:37:35 539

原创 多线程、多进程版本TCP通信

1.如果只调用一次accept,就只能接受一个客户端的连接2.如果将accept放到while循环内部,则进行一次收发数据的时候,需要阻塞等待新连接的到来这两种情况都无法处理多个客户端的情况原则: 多进程: 父进程进行获取连接 子进程进行收发数据,每来一个新链接创建一个新的进程处理 多线程 主线程进行获取连接 每来一个新连接,则创建一个新的线程进行处理多进程版本//tcpsvr.h...

2020-06-12 16:51:52 261

原创 网络套接字编程

1.ip地址 2.port 3.网络字节序 4.浅层次tcp和udp区别 5.udp协议实现网络通信 6.tcp协议实现网络通信1.ip地址a.作用:在网络中唯一标识一台主机b.本质:uint32_t 无符号4个字节c.源ip和目的ip地址5元组 = 源ip+源端口+目的ip+目的端口+协议ipv6:a.ipv4和ipv6制的不同版本的ip协议 b.ipv6并不兼容ipv4,两者的ip协议的报头格式不同 c.ipv6 1...

2020-06-10 17:12:00 605

原创 网络基础

按照网络覆盖范围:局域网、城域网、广域网协议:协议指的是通信双方约定,使用同一种解析信息的手段来进行有效的沟通网络协议:通信双方对数据交换和数据传输做出的约定,指定一个通信协议标准计算机中有很多不同的网络协议,将一系列协议称之为协议簇参考模型:定义各个协议之间的关系,并且划分了每个协议需要完成的任务协议分层: OSI参考模型 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 TCP/IP五层模型 物理层、数据链...

2020-06-10 14:51:15 122

原创 C++多态

多态的概念 具体的去完成某个行为,当不同的对象去完成时会产生不同的状态。多态的构成条件 1.必须通过基类的指针或引用调用虚函数 2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写虚函数的重写 1.派生类中有一个跟基类完全相同的虚函数,即派生类虚函数与积基类虚函数的返回值类型、函数名字、参数列表完全相同。 2.在重写基类虚函数时,派生类虚函数不加virutal关键字,也可以构成重写,因为继承基类的虚函数继承下了在派生类依旧保持虚函数的属性...

2020-06-09 23:58:07 524

原创 C++继承

继承的概念 继承机制是面向对象程序设计使代码复用的重要手段,它允许保持在原有类特性的基础上进行扩展增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。1.基类的private成员在派生类中无论以何种方式继承都是不可见的。这里的不可见指的是语法上限制派生类对象不管是在类里面还是类外都无法访问它。2.基类的private成员在派生类中是无法被访问的,如果基类成员都不想在类外被访问,但需要在派生类中被访问,那么可以定义为protected。3.使用关键字class是默认...

2020-06-09 22:15:29 147

原创 C++模板总结

函数模板、类模板、非类型模板参数 、类模板的特化 、模板的分离编译 函数模板: 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 函数模板格式: template<typename T1, typename T2,......,typename Tn> 返回值类型 函数名(参数列表){}模板原理: 在编译器编译阶段,对于模板函数的使用,编译器需要根据传入...

2020-06-09 14:50:57 335

原创 单例模式

单例模式:一个类只允许创建唯一的对象 禁止在类的外部创建对象:私有化构造函数:private或protected 类的内部维护唯一对象:静态成员变量 提供访问单例对象的方法:静态成员函数,返回在类内部唯一构造的实例创建方式饿汉式:单例对象无论用或不用,程序启动即创建。 懒汉式:单例对象在用的时候再创建,不用即销毁。class singleton //实现单例模式的类 { private: singleton(){} //私有的构造函数

2020-06-08 23:22:06 110

原创 线程池

线程池: 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。线程池的应用场景:1. 需要大量的线程来完成任务,且完成任务的时间比较短。2. 对性能要求苛刻的应用,比如要求服务器迅速响应客户请求。3. 接受突发性的大量请...

2020-06-08 22:35:11 170

原创 Posix信号量

POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步 初始化信号量 #include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value); 参数: pshared:0表示线程间共享,非零表示进程间共享 ...

2020-06-08 17:28:49 253

原创 生产者和消费者模型

为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。生产者与消费者模型 1个场所(队列)+ 2种角色(消费者和生产者)+ 3种关系(生产者与生产者互斥,消费者与消...

2020-06-08 16:58:13 113

原创 条件变量

同步保证了各个执行流对临界资源访问的合理性当有资源的时候可以直接获得资源,没有资源进行线程等待,等待另一个线程生产资源,然后通知等待线程。条件变量:本质= 两个接口(等待接口+唤醒接口) + PCB等待队列接口:1.定义条件变量pthread_cond_t2.初始化:int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrictattr);3.销毁int pthread_cond

2020-06-04 16:03:26 239

原创 死锁

死锁程序当中有一个执行流没有释放锁资源,会导致其他想要获取该锁资源的执行流陷入阻塞等待,这种情况被称为死锁程序当中每一个执行流都占有一把互斥锁,但是由于各个执行流在占有所资源的的情况下,还想申请对方的锁,这种情况被称为死锁死锁的四个必要条件互斥条件:每一把锁只能被一个执行流占有保持与等待条件:当前执行流已经占有锁资源,但是还想去申请新的互斥锁循环等待条件:若干个执行流在请求所资源形成了一个闭环不可剥夺:只有当前拿着互斥锁的线程可以释放该互斥锁避免死锁的方法:1.破坏必要条件2.加锁顺序

2020-06-04 15:15:43 142

原创 常见的线程安全/不安全,可重入/不可重入

可重入VS线程安全线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,我们称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。常见的线程不安全的情况不保护共享变量的函数函数状态随着被调用,状态发生变化的函数返回指向静态变量指针的函数调用线程不安全函数的函数

2020-06-03 23:43:45 429

原创 线程安全

线程安全:多个线程同时运行,访问临界资源,不会导致程序的二义性临界资源:同一时刻,该资源只能被一个执行流访问访问:在临界区中对临界资源进行非原子操作原子操作:操作一步完成,只有两个结果,要么完成,要么没有完成保证线程安全:互斥:保证同一时刻只有一个执行流访问临界资源同步:保证程序对资源访问的合理性互斥锁使用互斥锁来保证互斥属性互斥锁的底层是互斥量,互斥量本质是一个计数器 ,计数器只有0、1取值0代表无法获得互斥锁,进而表示临界资源不能被访问1代表可以获得互斥锁,进而表示临界资源能被访

2020-06-03 23:34:13 99

原创 线程和线程控制

什么是线程?线程就是创建出来的执行流,在内核创建PCB,内核中有一个task_struct结构体线程创建pthread_create:在内核当中创建PCB,PCB指向父进程的虚拟地址空间的,内核会创建出来线程,在虚拟地址空间当中开辟一块空间,保存线程独有的东西;内核创建线程创建了一个轻量级(LWP)进程进程是操作系统分配资源的最小单位线程是操作系统调度的最小单位线程的优点:创建一个线程的开销比创建一个进程小创建一个线程用的资源少进程中有不同的线程可以并行运行多线程可以提高程序的运行

2020-06-03 22:54:40 154

原创 进程信号

信号:信号就是软件中断,打断当中正在运行的进程,让该进程去处理信号事件信号种类一共62种信号不可靠信号:1-31可靠信号:34-62信号的产生:硬件产生:ctrl+c:给前台发送一个SIGINT,中断当前的前台进程ctrl+z:SIGSTP使进程暂停ctrl+|:SIGQUIT,是进程崩溃,并产生coredump文件软件产生:kill [pid] SIGTERMkill -[signalno] [pid]函数产生:kill函数 kill(pid_t pid, int signo

2020-05-29 18:39:34 202

原创 进程间通信

进程间通信:管道(数据传输)共享内存(数据共享)消息队列(数据传输)信号量(进程控制)Socket(实现不同主机之间的通信)https://github.com/smile-vampire/Linux目的:每一个进程都拥有自己的独立的虚拟地址空间和页表结构,促使了进程独立,但是也带来了进程与进程之间的相互协作,产生了进程 间通信1.管道匿名管道和命名管道管道就是内核当中的一块内存,相当于内核为进程通信创建的缓冲区匿名管道特性:具有亲缘关系的进程间通信半双工通信提供字节流服务

2020-05-29 17:02:56 297

原创 接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序

直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序排序的思想分为单趟排序,然后进行多趟条件限制1.直接插入排序把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。单趟排序end,插入tmp。如果tmp小于end,那么把end和end+1交互位置,否则要么到最前面,要么单趟结束多趟排序考虑最后一次end在n-2的位置,控制变量即可void InsertSort(int* a, int n){ //控制en

2020-05-28 00:09:52 242

原创 为什么C++支持函数重载而C语言不支持?

gcc和g++编译的过程类似,细节处理不一样list.h list.c test.c1.预处理 头文件的展开/宏替换/条件编译/去掉注释list.i test.i2.编译 检查语法错误----->生成汇编代码list.s test.s3.汇编 将汇编代码转换成对应的机器代码list.o test.o4.链接 gcc—list.cg+±–li...

2020-03-08 21:02:04 427

原创 二叉树的构建及遍历

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。解题思路:以指针方式存储,二叉树的创建从根、左、右递归创建;然后中序遍历二叉树,遍历左、根、右。#include<stdio.h&g...

2020-01-27 17:31:17 327

原创 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。解题思路:从根节点开始遍历左右子树的深度,如果两个差值大于1则返回false,如果小于递归遍历二叉树。/** * Definition for a binary tree node. * struct TreeNode { * int...

2020-01-27 17:26:48 149

原创 另一颗树的子树

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。解题思路:先从跟结点开始,看两颗树的根节点是否相同,然后递归遍历两棵树的左右子树,如果都相同返回true;否则让树s左右子树分别和树t进行递归遍历,如果s树递归结束发现没有和树t相同的树则返回false。/** ...

2020-01-27 17:22:51 126

原创 二叉树的前、中、后序遍历

解题思路:递归遍历前序:根、左、右递归遍历中序:左、根、右递归遍历后序:左、右、根要放到数组里面开辟空间,要知道树的大小,然后递归遍历数组下标用指针,因为递归返回时原下标不动,否则下标会继续增加,结果会发生错误。前序遍历:/** * Definition for a binary tree node. * struct TreeNode { * int val; * ...

2020-01-27 17:06:12 111

原创 对称二叉树

给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。解题思路:判断两棵树的根值是否相同然后判断左树的左子树是否和右树的右子树,左树的右子树和右树的左子树是否相同,递归遍历。/** * Definition for a binary tree node. * struct TreeNode { * int val; * s...

2020-01-27 16:58:50 96

原创 检查两颗树是否相同

给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。解题思路:判断每个节点值是否相同。然后判断结点左树是否相同;结点右树是否相同。递归遍历两棵树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struc...

2020-01-27 16:52:32 181

原创 翻转二叉树

翻转一棵二叉树。解题思路:递归思路,把结点的左子树值和右子树值交换,然后递归遍历。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */str...

2020-01-27 16:48:37 112

原创 二叉树最大深度

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。解题思路:递归方法,最大深度等于左数最大深度或者右树最大深度+1/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNo...

2020-01-27 16:45:28 92

原创 单值二叉树

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。解题思路:递归解法,判断节点值是否和左右节点值相同即可/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *...

2020-01-27 16:42:53 173

原创 二叉树的实现

typedef char BTDataType;typedef struct BinaryTreeNode{BTDataType _data;struct BinaryTreeNode* _left;struct BinaryTreeNode* _right;}BTNode;// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树BTNode* BinaryTree...

2020-01-27 16:39:09 121

空空如也

空空如也

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

TA关注的人

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