自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux】零窗口、糊涂窗口以及Nagle算法

滑动窗口发送方发送数据速率与接收方接收数据速率相匹配。零窗口问题定义TCP报头结构中有16位的窗口大小:由接收方填充, 用来告知发送方当前本端还能接收的数据长度。如果接收方不断从网络中接收并缓存数据,但是应用程序并没有处理缓存的数据。直到最后,接收方就会向发送方发送一个0窗口的报文段。如何处理?持续计时器 +零窗口探测报文段为了解决这个问题,TCP为每一个连接设有一个持续计时器(persistence timer)。只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设

2020-10-13 22:58:03 595

原创 【Linux】网络基础

网络的概念:通过设备和线路把计算机(不同的主机)连接起来互联网的概念:将不同的网络连接起来(因特网是最常说的)网络设备:串联各网络或者各主机的节点:路由器和交换机(路由器在网络层,做网间连接;交换器在数据链路层,做端口扩展的)。网络的线路:网线(双绞线)、同轴电缆、光纤IP地址:主机的逻辑地址,可以唯一标识一台主机,可改变,便于管理(1)Ip地址就是给因特网上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的标识符。(2)IP地址分为IPV4和IPV6,IP

2020-10-13 22:57:49 144

原创 【Linux】TCP的三次握手和四次挥手

TCP链接是 全双工的TCP建立连接的三次握手(客户端是在调用connect的时候,服务端是在listen之后,accept之前)客户端①[CLOSED -> SYN_SENT] 客户端调用connect, 发送同步报文段;③[SYN_SENT -> ESTABLISHED] 接收到服务器端发送的SYN报文,并向服务器端发送SYN确认报文。此时connect调用成功, 则进入ESTABLISHED状态(已连接状态), 开始读写数据;服务器端①[CLOSED -> L.

2020-10-13 22:57:29 124

原创 【Linux】TCP协议编程流程

一、传输层协议TCP协议:面向连接的,可靠的、字节流服务UDP协议:无连接的,不可靠的,数据包服务二、TCP协议的编程流程(系统调用)服务器:一般为被动通讯;客户端:一般为主动通讯1、服务器端编程流程(1)int socket();创建一个用于监听客户端链接的网络套接字int socket(int domain,int type,int protocol);返回值:成功时返回一个socket(套接字的)文件描述符,这个文件描述符是>=0;失败则返回-1 domai

2020-10-13 22:57:13 111

原创 【Linux】UDP协议编程流程

UDP:无连接的、不可靠的、数据报服务UDP在进行服务器与客户端的建立时是不需要建立连接的。1、服务器编程流程(被动)(1)int socket();创建一个用于监听客户端连接的网络套接字(2)int bind();作为服务器,必须将地址信息和sockfd进行绑定(3)int recvform();接收任意一个客户端的数据ssize_t recvfrom(int sockfd,void *buf,size_t len, int flags, struct sockaddr *src

2020-10-13 22:56:57 100

原创 【C++】设计模式之观察者模式

观察者模式:当事件到来以后自主的通知对应的监听者处理事件,而不是让监听者接收事件到来再去处理事件观察者模式的划分:1、观察者:观察事件是否到来,并通知感兴趣的监听者去处理事件(1)通过传参的方式观察事件的到来,传入这个标志,调用观察者的接口,观察者的接口一旦被调用就可以认为事件到来(2)消息通知只需要调用监听者对应的事件处理接口可以让监听者处理时间(3)怎么判断监听者感不感兴趣,应该通知哪些监听者处理事件?观察者内部存放一张注册表,这个注册表存放事件编号和感兴趣的监听者(保存对应

2020-08-05 23:43:46 107

原创 【C++】设计模式之工厂模式

迭代器模式:核心功能实现begin()、end()、next(++)、curitem(解引用)工厂模式:工厂模式核心就是为了生成对象工厂模式生成对象和普通模式相比的好处:工厂模式生成对象是把对象封装在工厂中处理1、不需要考虑对象的生成过程2、可以通过标记来简化针对名称的记忆工厂模式的分类:1、简单工厂模式2、工厂方法模式3、抽象工厂模式简单工厂模式核心思想:同一个“工厂”中生产多个“产品”。比如我们现在要得到苹果,香蕉,梨这三种水果。1代表苹果,2代表香蕉,3代表

2020-08-05 23:13:27 142

原创 【C++】设计模式之单例模式

一、单例模式1、目的:为了让整个类只能实例化一个对象,也就是如果调用时是不能生成第二个对象的2、一个对象的生成的特点:开辟内存空间(这是系统进行开辟的,我们无法进行操作) 调用构造函数(我们可以让构造函数只被调用一次,也就是让对象只能在第一次调用时,调用构造函数)3、处理方法:(1)屏蔽构造函数(把构造函数写在私有里面)(构造函数在公有里面就可以任意位置访问构造,任意位置生成对象)注意:屏蔽构造函数还要把拷贝构造函数也屏蔽,因为系统提供的拷贝构造函数也在公有里面(2)类中提供..

2020-08-05 16:26:34 237

原创 【C++】STL

STL标准模板库:(6大组件)一、容器类:C++把C语言中的数据结构进行封装1、顺序容器(1)vector容器。它是一个矢量容器,它的底部是一个数组。是对顺序表进行了封装。头文件:#include(2)list容器。它也是双向链表容器。它的底部是一个双向链表(环状)。所以它的底部是一个双向循环列表。头文件:#include(3)deque容器。它是一个双端队列容器。它的底部放的是一个双端队列。头文件:#include2、关联容器:关联容器是由红黑树组成。(1)set容器。又称单集

2020-08-04 17:11:39 113

原创 【Linux】---线程安全

线程安全:线程安全,即就是在多线程运行时,不论线程的调度顺序怎样,最终的结果都是一样的、正确的,那么就说这些线程是安全的。保证线程安全的条件:(1)对于线程同步,保证同一时刻只有一个线程访问临界资源。(2)在多线程中使用线程安全的函数(可重入函数),所以线程安全的函数指的是如果一个函数能够被多个线程同时调用,且不发生竞态事件,则我们认为是线程安全的。常见可重入的方法:1、不使用全局变量和静态变量2、不使用malloc或者new开辟出的空间shi3、不调用不可重入函数...

2020-08-01 22:49:04 71

原创 【Linux】线程同步

线程/进程同步:解决线程/进程之间的竞争关系或者协作关系(线程中竞争关系会更多,因为线程数据共享会很多,会访问共享数据,访问共享数据会出现竞争)线程同步方法:互斥量(互斥锁)、信号量---线程库中的信号量、条件变量、读写锁一、互斥锁:操作的实体是锁,锁的状态有两种:加锁和解锁 线程在进入临界区之前,加锁操作;如果锁是加锁状态,则执行加锁操作将被阻塞 临界区就是共享资源的访问代码 线程退出临界区之后,解锁操作 互斥锁就是因为这把锁只允许一个线程进行加锁1、互斥锁类型:prhread

2020-08-01 21:23:51 121

原创 【Linux】---线程的概念和创建

线程概念:线程是进程内部的一条执行序列(执行流),一个进程可以包含多个线程。一般将main函数(进程执行的入口)所执行的线程称之为主线程,其他线程称之为函数线程(创建线程时,需要指定线程的执行序列(函数))。...

2020-07-29 18:56:28 128

原创 【C++】智能指针

C++中new就必须delete,但可能会因为忘记写或者代码跳转忘记delete,会导致内存泄漏,因此我们需要设计一种自主的内存回收机制,让人为的开辟内存,系统释放内存,就不需要delete。智能指针普通方法开辟内存:用智能指针开辟内存:开辟一个堆内存交给栈上一个有名称的对象来管理,在对象里定义一个指针指向堆内存智能指针的设计思想:当对象的生存周期到了,系统释放这个栈上的对象,针对于这个对象销毁系统先调用析构函数,可以把堆内存当成对象的其他资源一起销毁,这样就实现了人为开辟,

2020-07-28 20:14:40 147 1

原创 【C++】继承和多态

C++三大特性:封装、继承、多态一、继承继承的本质:代码复用1、继承和派生的关系2、派生类继承了基类什么东西?继承了除构造和析构以外的所有成员(1)普通的成员变量和普通的成员方法(2)静态的成员变量和静态的成员方法(3)作用域3、派生类的内存布局(1)如果基类的成员变量和派生类不同,比如一个ma,一个mb,基类的布局优先于派生类,因为派生类继承了基类的一些东西,要依赖于基类中已经存在的某些东西执行.(2)如果基类的成员变量和派生类相同,比如两个ma,这两个ma是.

2020-07-28 18:45:05 130

原创 【Linux】进程间通讯---共享内存

共享内存:进程的地址空间都是独立的 ,受保护的;如图,我们可以通过共享存储空间进行数据的传递交互。A和B进程有一块逻辑地址空间共同映射到同一块物理内存上,作为共享内存;共享内存的空间必须有一个内核对象去保存它‘。共享内存相关函数:1、int shmget()函数:创建或者获取共享内存int shmget((ket_t)key, int size, int flag); shmget()成功返回共享内存的ID,失败返回-1 key:不同的进程使用相同的key值可以获.

2020-07-27 19:10:57 324

原创 【Linux】进程间通讯---信号量

信号量:实现两个进程的同步,对于进程执行的同步控制特殊的一个变量(计数器),其值大于0时,纪录临界资源的个数;当值小于0时,对此信号量执行P操作(-1),会阻塞,直到信号量的值大于0,或者有其他进程在此信号量上执行了V操作。信号量的相关操作:1、临界资源:临界资源是指每次仅允许一个进程访问的共享资源,即各进程采取进程互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。2、临界区:每个进程中访问临界资源的那段代码称为临界区.

2020-07-26 19:57:50 72

原创 【Linux】进程间通讯---消息队列

消息队列:消息:类型+数据,队列:先进先出(优先级队列) 信号量、消息队列、共享内存都通过内核对象(操作系统内核中)共享,系统中所有进程的用户空间是独立的,内核空间是共享的消息队列相关函数:1、msgget函数:创建一个新的消息队列或打开一个已有的消息队列int magget( (key_t)key , int flag );返回值:成功返回内核对象的ID值,失败返回-1 key:用户标识,如果多个进程想通过同一个消息队列完成数据通信,则每个进程使用相同的key值创建或者获取相同

2020-07-25 20:03:22 82

原创 【C++】运算符重载、迭代器、写时拷贝、内存池

一、基础运算符的重载机制哪些运算符不能重载?(1)指向->可以重载,.不能重载(2)::不能重载(3)三目运算符(4)sizeof运算符的重载规则?(1)不能改变运算符的优先级和结合性(2)不能改变运算符的用法(3)不能创造新的运算符(4)运算符重载函数中不允许有函数的默认值二、迭代器优点三、写时拷贝下面三个拷贝用string类举例1、浅拷贝浅拷贝是一个简单的赋值,如果有指针存在,会让两个指针指向同一个内存块缺点:针对于优点:实现

2020-07-24 19:57:50 294

原创 【Linux】进程间通讯---管道

一、进程间通讯:1、进程都是独立的个体,每个进程之间的数据是不共享的。2、fork之后,父子进程可以共享fork之前打开的文件描述符。例题:父进程给子进程发送“hello world”int main(){ int fd = open("a.txt",O_RDWR ); assert(fd != -1); if(pid == 0) { sleep(1);//保证父进程已经将字符串写入到文件中。 lseek(fd, 0, SEEK_SET

2020-07-22 19:08:51 85

原创 【Linux】---仿写bash程序

仿写bash程序:1、输出一些提示符信息:[用户名@主机名 当前工作目录],比如:[stu@host Desktop]$2、等待用户输入命令3、接收到命令,完成简单的解析也就是对命令进行简单分析:(1)没有输入命令;(2)内置命令,内置命令需要集成到bash,可以直接调用bash中的方法,比如cd、exit;(3)外置命令,外置命令是单独实现,可以先创建进程,然后子进程通过exec替换成用户输入的命令对应的程序,父进程如果在前台执行,父进程等待命令执行结束,父进程如果在后台执行,

2020-07-22 17:32:27 168

原创 【C++】---封装顺序表

封装顺序表:基础的数据结构有:顺序表、链表、栈、队列。这些数据结构我们都需要用到,但是在C语言中没有这样的库去供我们使用。但是C++中是有这样的库,也就是STL标准模板库中有一个组件是容器组件,容器组件中有一个顺序容器vector<int>就是来封装顺序表的,这样我们可以不用建立数据结构,可以直接使用这些数据结构。由于数组是定长的,所以在封装顺序表的时候我们用到了扩容机制:1、以倍数的形式开辟更大的空间2、旧数据拷贝到新的空间中3、旧空间释放4、指针指向新空间STL(标准模...

2020-07-22 10:29:37 320

原创 【C++】模板

模板:实现C++泛型机制,摆脱对类型的依赖模板的划分:1、函数模板2、类模板一、函数模板两个数相加:C语言:1、以宏函数的方法实现,通过文本替换,预编译阶段没有类型检查和安全检查,不安全2、用void* 泛型实现,[),如果操作不当,可能发生越界,不安全C++:1、函数重载2、函数模板template<typename T>//T是模板类型参数,T是任意类型,虚假类型T Sum(T a, T b){ return a+b;}int

2020-07-21 11:00:47 78

原创 【C++】类和对象

一、oop思想二、封装的特性:C++的三大特性:封装、继承、多态访问限定符:public:限定了成员的访问可以在任意位置访问 protected:限定了成员的访问只允许在本类和子类访问 private:限定了成员的访问只允许在本类访问封装:隐藏了对象的属性(成员变量)和实现细节,对外提供公有接口供函数调用四、类中6个默认的函数1、构造函数2、析构函数3、拷贝构造函数4、赋值运算符的重载函数5、取地址操作符的重载函数6、const修饰的取地址...

2020-07-16 23:44:42 199

原创 【C++】C和C++的区别

一、函数重载函数符号生成规则:C:只和函数名称有关C++:和函数原型有关,函数返回值+函数名+函数形式参数列表因此C语言不能函数重载,函数重载是C++的函数符号生成规则做支持;函数返回值如果不同,不能构成函数重载。函数重载三要素:同名构成重载 参数不同 同一作用域二、inline函数inline内敛函数:在函数的调用点代码直接展开(在编译阶段),内敛函数只能本文件可见inline函数的优点:没有开栈的清栈的开销,效率高inline函数的缺点:代码膨胀为代价,以空间换

2020-07-16 16:25:57 206

原创 【数据结构】---串的匹配算法--KMP算法

KMP算法:KMP也是字符串匹配算法,效率比BF算法高,因为主串不回退,KMP算法的核心是找到模式串回退的位置回退点的处理方式:如果已匹配部分主串的后缀和模式串的前缀刚好相同,回退的位置在失配前已匹配...

2020-07-15 12:00:14 201

原创 【数据结构】--串的匹配算法-BF算法

串(主串):一系列字符的有限集合。子串:从串上拿到一部分字符构成的串叫做子串。空串:不存在任何字符,是任意串的子串串的匹配:用模式串在主串匹配如图下所示,匹配成功,模式串在主串的位置指的是第一个字符对应的在主串的位置,也就是模式串在主串的第2个位置串的匹配算法--朴素算法:群举,把每种情况都罗列进行匹配,直到匹配成功,也称BF算法(1)用模式串和主串从第一个...

2020-07-15 12:00:01 385

原创 【数据结构】----串的相关操作

串:一系列有限字符的集合,通过char arr[]或者char*存储;串中存放的数据是以串为单位,不是以单个字符为单位串和字符串的区别:字符串:以“\0”结尾串:不是以“\0”结尾,有固定长度,通过len表示长度,通过位置和长度标识串串的分类:串分为(1)定长的串 ;(2)变长的串(1)定长的串结构#define MAXSIZE 10;struct String{ ...

2020-07-15 11:59:49 314

原创 【数据结构】--队列之链队列

链队:(1)以链表(带头结点的单链表)的形式实现队列先进先出的特征(2)对于队列,必须一端入队,一端出队上述两种方法均不能让链队的效率达到最高,所以需要对链表进行改进,方法是在尾部插入一个尾指针改进版本:最终我们选择改进版本的头部出,尾部入队来实现链队结构体设计:typedef int ElemType;typedef struct Node//链表结构...

2020-07-15 11:59:38 266

原创 【数据结构】--队列之循环队列

队列:先进先出(FIFO),队尾插入,队头删除队列的分类:顺序队列、链表 队列顺序队列:底层的数据结构是内存连续的,基于数组实现队列的先进先出队头为0,队尾为4的删除数据的时间复杂度为o(n),太高,因此我们一般不用,为了减低时间复杂度,我们一般使用循环队列来处理顺序队列,也就是在逻辑上将数组变成一个环。插入的操作:头指针front和尾指针rear开始同时指向0下标,每插入...

2020-07-15 11:57:33 421

原创 【数据结构】--栈之链栈

链栈:(1)基于链表(带头结点的单链表)实现栈先进后出的特征 (2)对于栈,必须同一个方向入栈和出栈 (3)对于链表,有头插、头删,尾插和尾删 时间复杂度:o(1)不需要循环遍历,比如判断一个数是否为10,if(a==10); o(n)需要循环遍历,循环的次数由系数决定,比如for循环,wh...

2020-07-15 11:57:19 364

原创 【数据结构】--栈之顺序栈

栈的结构特点:先进后出FILO一、顺序栈:以顺序表的形式来实现栈的特性,内存连续,用数组处理二、链栈:以链表的形式来实现栈的特性,内存不连续,用链表处理顺序栈:1、用栈顶指针(int top)来存储每个元素的下标,通过下表来标识唯一的内存单元2、栈的增删改查:(1)增加(压栈):插入一个元素top++ (2)删...

2020-07-15 11:57:08 534

原创 【数据结构】---顺序表

线性表:顺序表和链表顺序表:逻辑相邻,物理也相邻链表:逻辑相邻,物理不一定相邻不定长顺序表:函数头文件:#pragma once//预防头文件被重复使用typedef struct SqList{ int *elem;//保存动态内存的地址 int length;//有效数据个数 int listsize;//总格子数}SqList,*PSqList;#define INT_SIZE 10//初始化大小//初始化void InitSqList(PSq

2020-07-14 18:25:55 146

原创 习题--单链表的逆置

1、思路:(1)新开辟两个指针pcur和pnext,先让pcur指向第一个数据结点(2)把头结点置空,让头结点和数据结点分开(3)进入while循环,让pnext指向pcur的下一个结点 (4)从第一个数据结点开始遍历,把每个结点按照头插法插入单链表2、代码实现:List.h#pragma oncetypedef int ElemType;typedef...

2020-07-14 15:39:42 195

原创 【数据结构】--链表之静态链表

静态链表:(1)数组的形式实现链表的特征; (2)静态链表数据存储在堆上; (3)静态链表内存是连续的,普通链表内存是不连续的; (4)静态链表数组下标和游标域均可以标识。静态链表是提前预留的结点,一部分结点已经使用,另一部分结点没有使用,怎么区分已使用的结点和未被使用的结点?...

2020-07-14 15:39:08 130

原创 习题--求单链表的倒数第k个结点

1、思路:(1)定义两个指针指向头结点;(2)让其中一个指针向后移动k-1个结点;为了让两个指针之间的距离和倒数第k个节点到尾结点的距离保持一致(3)两个指针同时向后移动,直到一个指针指向尾结点,此时另一个指向的就是k结点。2、代码实现:(1)SeqList.h#pragma oncetypedef int ElemType;typedef struct Node{...

2020-07-14 15:38:54 81

原创 【数据结构】---链表之双向链表

双向链表:有两个指针域,前驱指针域(指向当前结点的前一个结点)和后继指针域(指向当前结点的下一个指针域)以及数据域。双向链表的结构:typedef int ElemType;typedef struct Node{ ElemType data; struct Node* prev; struct Node* next;}Node,*DPList;双...

2020-07-14 15:38:31 357

原创 【数据结构】--链表之不带头结点的单链表

不带头结点的单链表:没有头结点,但有一个头指针,存储第一个结点的地址唯一的起始: 头指针 唯一的结尾:最后一个结点的指针域NULL不带头结点的单链表的结构:typedef int ElemType;typedef struct Node{ ElemType data; struct Node* next;}Node,*pList...

2020-07-14 15:38:14 563

原创 【数据结构】----链表之单链表

链表:在逻辑上存储是连续的,在物理上存储是不连续的单链表:除了最后一个结点之外,每个结点都仅有一个直接后继; 单链表的每个结点,都包含一个数据域(存放数据)和一个指针域(地址唯一,存储下一个结点的地址来找到下一个结点)。 带头节点的单链表:除了存储数据元素之外的结点,多开辟一个节点,数据域不用于存储,其指针域用于存储第一个结点的地址。头结点和头指针的区别:...

2020-07-14 15:37:47 351

原创 【C++】虚拟地址空间及编译链接运行原理

一、虚拟地址空间1、操作系统分为32位操作系统和64位操作系统,操作系统的位数根据一次做多能处理的字节数来划分,32位操作系统代表操作系统一次做多能处理32个比特位的数据,也称作算术逻辑单元ALU的宽度,32位操作系统的内存是2^32=4G。2、实模式和保护模式实模式:A程序看到的地址都是物理地址,如果A是一个恶意程序,就可以通过指针+偏移随意调整,也可以跳转到其他程序,修改其他程序的指令或者数据,达到恶意篡改其他程序的目的,也就对于进程的安全保护来说非常的有害。保护模式: 80386以

2020-07-14 11:36:25 254

原创 【Linux】---利用信号解僵死进程问题

在之前我们通过在父进程中直接调用wait方法,会使父进程阻塞,等待子进程结束 ,来解决僵死进程的问题;现在我们可以利用信号来解决僵死进程的问题,下面我们就来看一下利用信号解决僵死进程的方法。利用信号解决僵死进程:子进程结束会给父进程发送信号SIGCHLD,当父进程收到SIGCHLD信号时,再调用wait方法;这样父进程在没有收到信号的时候可以做自己的事情,不会阻塞。父进程哪些代码能够保证是收到信号之后执行的:给SIGCHLD信号绑定一个信号处理函数(此函数会在收到SIGCHLD信号之后才会被

2020-07-10 12:55:36 95

空空如也

空空如也

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

TA关注的人

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