自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

柳阿九的博客

前途似海,来日方长。

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

原创 【项目】高并发内存池

简介 内存碎片——如下,在堆上分别按照16字节、8字节、16字节、4字节、8字节将该快内存申请走,白色区域是使用完之后释放回来的,但是蓝色区域的还没释放回来。此时空余的内存空间共有40字节,但是这个时候再想要申请大于16字节小于40字节的空间,却申请不出来。 内存碎片分为内碎片和外碎片。 内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的...

2021-09-19 21:38:13 517 1

原创 【Linux】几种典型的IO模型

几种典型的IO模型常见IO场景----输入和输出。读写文件 read/write/fread/fwrite 网络接收与发送 send/recv/sendto/recvfrom 上述两种场景都有一个共同点,就是最终都会和操作系统打交道IO过程等待数据 拷贝数据到用户空间阻塞IO1.当程序员在代码当中调用一个IO接口,如果内核还没有将数据准备好,IO接口就会阻塞等待,把这种IO的过程称之为阻塞IO2. IO调用的返回,预示着一定拿到了想要的数据非阻塞IO当程序员在代码.

2021-04-22 23:22:27 226

原创 【Linux】Ⅻ基础网络:数据链路层

以太网协议1. 来自网络层的ip数据报会交给递交给数据链路层的以太网协议;2. 网络层是负责数据从哪里来到哪里去,而数据链路层负责数据从链路当中的设备到相邻设备;以太网帧格式MAC地址:网卡绑定着,每一块网卡都有一个全球唯一的MAC地址。 目的地址:目的MAC地址 源地址:源MAC地址 类型:上层协议的类型 0800:ip协议 0806:ARP请求 0835:ARP应答、 数据:有效载荷,46~1500(MTU也就是1500字节),如果从网络协议栈传递下来的数.

2021-04-22 22:55:08 193

原创 【Linux】Ⅺ基础网络:网络层之IP协议

IP协议首部字段其他字段说明8位服务类型(Type Of Service):包括3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0);4位TOS分别表示:最小延时,最大吞吐吐量,最高可靠性,最小成本,这四者相互冲突,也就是说这四个中只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要。 16位标识:同一个数据包当中的不同分片具有同样的标识,本质上就是为了在接收方接受到数据的时候,可以成功找到属于同一个数据包的.

2021-04-22 22:40:33 201

原创 【Linux】Ⅹ基础网络:传输层之TCP协议

抓网络包:Linux:1.切换到root用户,使用tcpdump tcpdump-iany port[端口]-50-w 123.dat2.抓下来的结果,使用wrieshark打开,分析结果Windows:wireshark直接进行抓包TCP协议三大特性——面向连接,可靠传输,面向字节流面向连接TCP连接的本质,是在建立连接的三次握手时期,通信双方会协商很多连接当中的参数,例如:MSS,包序号对于TCP而言,如果不建立连接则不能够进行通信 对于TCP而言,建立连接的过.

2021-04-22 22:23:52 117

原创 【Linux】Ⅸ基础网络:传输层之UDP协议

认识端口使用端口(Port)来标记不同的网络进程 端口(Port)使用16比特位表示(0~2^16即65535) 知名端口:0~1023并不是说非知名端囗的就可以随意去使用了,常用软件在使用的端口如下:网络数据在传输过程当中的五元组信息,任何一个需要在网络当中传输的数据,都会具备五元组信息,否则网络就不会给转发——{源端口,目的端口,源ip,目的ip,协议}UDP协议1. 关于UDP协议的三大特点——无连接,不可靠,面向数据报无连接:是指在给对方发送消息的时候..

2021-04-22 22:04:15 198

原创 【Linux】Ⅷ基础网络:应用层之HTTP协议

自定义协议(TCP粘包问题) 自定制协议:就是在应用层对要传输的数据,进行数据格式的约定,消息的发送方和接收方都遵守该约定 自定制协议是工作在应用层,被程序员定义出来的协议对于应用层调用send接口,只是负责将数据放到TCP的发送缓冲区当中,至于TCP如何发送和之前应用层的发送规律没有任何关系; 3. TCP特性:面向字节流面向字节流好处是对于数据可以灵活的发送和接收,但是也带来了TCP粘包的问题,(对于消息的接收方而言,就不好区分,客户端应用层发送的每一条数据)比如第一次..

2021-04-22 21:52:34 310

原创 【Linux】Ⅶ基础网络:套接字

协议协议:1.协议是国家或者外交事务的一种规范2.沟通双发约定同一种语言来进行有效沟通网络协议:网络当中通信双方,采用同一种数据格式来进行有效通信网络协议簇:在网络当中不止一个协议,而是有很多个协议,我们讲这些很多个协议称之为协议簇。OSI七层参考模型——工业上并不常用,企业一般选择TCP/IP模型(物数网传会表应)OSI(Open System Interconnection,开放系统互连)七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;把网络从逻辑

2021-04-22 21:26:47 263 1

原创 【Linux】Ⅵ多线程

线程概念有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另外几个线程每个线程负责和一个网络主机通信。Linux当中是没有线程的概念的,而是将其称作轻量级进程:LWP,通俗的线程概念其实是C库(libc.so.6)当中的概念。在.

2021-04-16 23:59:57 219

原创 【Linux】Ⅴ进程信号

1. 同步与异步同步和异步关注的是消息通信机制(synchronous communication/ asynchronous communication)。 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。 换句话说,就是由调用者主动等待这个调用的结果。 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,..

2021-04-16 22:38:51 137

原创 【Linux】Ⅲ基础IO

C语言操作文件接口fopen——使用给定的模式 mode 打开 path 所指向的文件FILE*fopen(const char*path,const char*mode);path:待打开的文件(文件路径+文件名称)mode:以何种方式打开r:以只读方式打开,当文件不存在的时候,就会打开失败r+:以读写方式打开,当文件不存在的时候,就会打开失败w:以只写方式打开,如果文件不存在,则创建文件。如何文件存在,则会截断(清空)文件w+:以读写方式打开,如果文件不存在,则创建文

2021-04-16 22:07:32 114

原创 【Linux】Ⅳ进程间通信

为什么需要进程间通信?由于进程都拥有自己独立的进程虚拟地址空间,从而导致了进程的独立性,从而导致了封闭;通过进程间通信,可以让不同的进程之间很好地交换数据或者进程控制等。目前最大的进程间通信的技术是:网络管道管道本质上就是内核当中开辟的一段空间,这段空间也可以被称之为叫做缓冲区,这段空间是没有标识符的。1.从命令来看ps aux I grep test.c ——> 中 “|”就是管道。ps和grep是命令,同时也是程序。ps aux的输出结果,通过管道,传输给了gr.

2021-04-15 22:56:08 173

原创 【Linux】Ⅰ进程概念

冯诺依曼体系结构——现代计算机硬件体系结构计算机应该包含五大单元:输入设备:采集数据的,比如:键盘,网卡(接受网络中的数据) 输出设备:进行数据输出,比如:显示器,网卡(向网络中发送数据) 存储器:进行中间数据缓冲,比如:内存 运算器:进行数据运算,运算器+控制器 = 中央处理器CPU 控制器:进行设备控制所有的设备都是围绕存储器工作的。存储器实际上就是内存,为什么不是硬盘呢?硬盘的数据吞吐量太低了:机械--200MB/s内存的数据吞吐量:是机械硬盘的数十倍内存速度这么快,为

2021-04-15 22:49:49 353 1

原创 【Linux】Ⅱ进程控制

进程创建——fork与vfork的区别fork函数介绍#include <unistd.h>pid_t fork (void );描述:子进程是父进程的一个拷贝。具体说,子进程从父进程那得到了数据段和堆栈段,但不是与父进程共享而是单独分配内存。fork函数返回后,子进程和父进程都是从fork函数的下一条语句开始执行。(代码共享,数据独有,父子进程各有各的栈)由于子进程与父进程的运行是无关的,父进程可先于子进程运行,子进程也可先于父进程运行。vfork函数介绍#inclu

2021-04-15 22:32:03 81

原创 【Linux】基本开发工具

yum——软件包管理工具查看软件包:yum list安装软件包:yum install package_name搜索软件包:yum search package_name移除软件包:yum remove package_nameyum install gccyum search gcc//搜索制定软件包写代码相关工具:编辑器/编译器/调试器vim——代码编辑器1.模式实际有12种,常见的有三种-普通模式 插入模式 底行模式,所有的模式打开都是围绕普通模式切换的。vi

2021-04-15 00:24:11 189 1

原创 【Linux】指令与权限

格式---------- 命令名称 [功能选项] [操作对象]目录相关的命令mkdir 创建目录-p 多层递归创建目录,每一层目录不存在都会被创建eg:mkdir -p test/abc/bcdrmdir 删除空目录-p 多层空目录的递归删除eg:rmdir -p test/abc/bcdcd 改变当前所在路径(进入指定目录)~ 快速回到当前用户的家目录 - 快速回到上一次所在的路径ls 浏览目录--—(文件夹),列出目录下的文件信息ls w...

2021-04-15 00:20:53 329

原创 【数据结构】带头双向循环链表的实现

带头双向循环链表简介带头双向循环链表结构如下:带头双向链表的特点:空链表不是没有结点,而是有一个头结点的链表,此时头结点的前后指针都指向自己,且头结点中存储的元素非链表中的有效元素。带头双向循环链表的头删,是删除头结点的下一个结点,而非head结点。带头双向循环链表的尾删,无需遍历该链表去寻找最后一个结点,因为头结点指向的前一个节点就是最后一个结点。带头双向循环链表的定义及功能实现/////dclist.h#pragma once#include"commen.h"typedef

2021-02-09 22:31:34 216

原创 【数据库】MySQL数据类型

1.数据类型数据类型大小说明对应JAVA类型用途BIT[(M)]M指定位数,默认为1二进制位数,M范围从1-64,存储数值范围从0~2^M-1常用Boolean对应BIT,此时默认是一位,即只能存储0或者1整数值TINYINT1字节Byte小整数值SMALLINT2字节short大整数值INT4字节Integer大整数值BIGINT8字节Long极大整数值FLOAT(M,D)4字节单精度,M指定长度,D指定

2021-02-08 21:11:17 100

原创 【数据结构】单向循环链表的实现

不带头单向循环链表结构如下:其中,详细介绍不带头单向循环链表的排序功能的实现。以以下链表为例:第一步:将该单向循环链表分成只有一个结点的单向循环链表p和由剩下结点组成的一个单向不循环链表q。第二步:将p指向q链表要比较的第一个结点,q用来保存下一个结点,prev用来保存要插入位置的前一个节点的位置,cur用来保存要插入位置的结点。比较 1<2,并没有进入第二个while中,此时prev仍为NULL,故应该将结点头插进入该单向循环链表中,由于头插会改变头结点,而单向循环链表的尾结点会

2021-02-08 17:49:42 555 3

原创 【数据结构】不带头单向不循环链表的实现

不带头链表的功能实现如下:///////slist.h#pragma once#include"commen.h"#define ElemType inttypedef struct SListNode{ ElemType data; struct SListNode* next;}SListNode;//不带头结点的单链表typedef SListNode* SList;void SListInit(SList* phead);void SListDestroy(SLis

2021-02-04 16:40:33 105

原创 【其它】关于运算符+与>>的优先级分析

size_t SeqListBinarySearch(SeqList* pList, DateType val){ assert(pList != NULL); int low = 0, high = pList->_size - 1; while (low <= high) { int mid = low + (high - low)>>1; if (val < pList->base[mid]) high = mid - 1; else i

2021-01-31 21:39:07 1541 1

原创 【数据结构】顺序表的实现

顺序表主要实现模块如下//定义顺序表的结构#define SEQLIST_SIZE 8#define DateType inttypedef struct SeqList{ DateType* base;//指向数据的指针 size_t _capacity; size_t _size;}SeqList;void Swap(DateType* a, DateType* b){ DateType tmp = *a; *a = *b; *b = tmp;}bool IsFull(S

2021-01-31 18:34:27 203

原创 【其它】关于size_t与int之间的比较

关于size_t与int之间的比较void SeqListInsertByPos(SeqList* pList, size_t pos, DateType x){ assert(pList != NULL && pos <= pList->_size); if (IsFull(pList)) printf("顺序表已满,无法正常进行插入\n"); else { for (int i = pList->_size - 1; i >= pos; --i

2021-01-31 18:23:33 925

原创 【力扣】111. 二叉树的最小深度

题目是----给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。(说明: 叶子节点是指没有子节点的节点。)示例:给定二叉树 [3,9,20,null,null,15,7]返回它的最小深度 2。当看到这一题的标题时,我立马想到最大深度,当即就写下了如下代码:/** * Definition for a binary tree node. * st...

2020-03-13 22:31:01 138

原创 【Linux】基础指令

命令的格式:----------------- 命令名称 [功能选项] [操作对象]目录相关的命令ls 浏览目录–—(文件夹),列出目录下的文件信息eg:ls work/ //浏览work目录下面的文件-a 浏览所有文件(不忽略所有以.开头的文件)即查看隐藏文件eg: ls -a worspace-l 查看文件的详细信息也可以组合使用eg:ls -la work/...

2020-01-16 13:40:46 108

原创 【力扣】155. 最小栈

155.最小栈(力扣)具体代码如下:class MinStack {public: /** initialize your data structure here. */ MinStack() {} void push(int x) { if(st.empty() || x <= min.top()) ...

2019-10-21 23:14:33 97

原创 【力扣】202. 快乐数

(力扣)202.快乐数下面是我的代码:bool isHappy(int n){ int num = n; int flag = 0; while (num) { flag += pow((long double)(num % 10), 2); num /= 10; } if (flag == 1) return true; if (flag == 4) ret...

2019-10-20 14:51:47 1274

原创 【力扣】237. 删除链表中的结点

(力扣)237.删除链表中的结点下面是我的代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */typedef struct ListNode ListNode;void deleteNode(stru...

2019-10-20 14:02:20 126

原创 【C++】初级—类和对象之赋值运算符重载、取地址操作符重载和const修饰的取地址运算符重载

在上一篇中写到,一个类会产生的6种默认函数中的前三个默认函数:1.构造函数2.析构函数3.拷贝构造函数4.赋值运算符重载5.取地址操作符重载6.拷贝构造函数这次将着重讲解后三个函数。赋值运算符重载运算符重载~什么是运算符重载呢?~在构造函数中,曾提到过,C++将类型分为自定义类型和内置类型。而对于已经存在的运算符(==、+、-、*…)来说,它们其实只支持内置类型,并不支持自...

2019-09-18 21:30:43 844

原创 【C++】初级—类和对象之构造函数、析构函数、拷贝构造函数

一个空类(什么成员都没有)中,真的是什么都没有吗?并非如此,任何一个类在我们不写的情况下,都会产生以下 6 个默认成员函数:构造函数析构函数拷贝构造函数赋值运算符重载函数取地址操作符重载const 修饰的取地址操作符重载今天我们将着重讲述前三个。不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。构造函数与析构函数的使命非常明确,就象...

2019-08-07 17:30:04 216

原创 【C++】初级—与类和对象的初识

一、类的引入在C语言的学习中,有一种自定义类型的数据集合——结构体,但是在结构体中只存在一系列具有相同类型或不同类型的数据,并不能在里面自定义函数。如下:struct Student{ char _name[10]; int _age; int _height;};C++身为C语言的继承,它不仅可以定义结构体,而且可以在结构体中定义函数,而这种结构体的定义,在C++中更喜欢用 c...

2019-08-06 23:06:47 92

原创 【C++】初级—内联函数、关键字auto(C++11)与nullptr

内联函数(inline)inline是C++的关键字之一,用inline修饰的函数叫内联函数,内联函数,实际上是一种以空间换时间的做法,在遇到内联函数的时候,编译器会在此处将内联函数展开,而取消了函数压栈的开销,提高程序运行的效率。#include<iostream>using namespace std;inline int ADD(int x1,int x2)//内联函数...

2019-08-05 17:23:01 152

原创 【C++】初级—extern “C”与引用

extern “C”在上一篇博客中我们也提到,由于C++支持函数重载,而C语言不支持,因此函数被C++编译后在符号库中的名字是与C语言不同的;C++编译后的函数需要加上参数的类型才能唯一标定重载后的函数,而加上extern "C"后,是为了向编译器指明这段代码按照C语言的方式进行编译。所以可以用一句话来概括extern “C”的真实目的:实现C++与C的混合编程。extern "C" in...

2019-08-01 17:28:04 488

原创 【C++】初级—函数重载与名字修饰

函数重载—什么是函数重载呢?—函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。如下例:#include<iostream>using namespace std;int ADD(int a,int b){ return a + b...

2019-07-31 16:52:03 210

原创 【C++】初级—命名空间、输入输出与缺省参数

命名空间—命名空间是做什么的?—在很多时候,一个项目的完成是需要很多人分工合作才能完成的。但是每一个都有自己的命名习惯,可能缘分太深,大家就撞了名字。这时候,你说怎么办才好呢?总不能打一架,谁赢了听谁的吧!这就轮到了命名空间大展身手的时刻了。话不多说,上代码。void func()//这是小明自定义的函数{ cout<<"Hello World!"<<endl...

2019-07-31 16:14:59 137

原创 【数据结构】排序之选择排序与堆排序

在前面排序中,所了解的直接插入排序与希尔排序,都属于插入排序,而今天所要总结选择排序和堆排序则都属于选择排序。一、选择排序算法思想什么是选择排序呢?选择排序,就是在一组乱序的数组a[10]中(在这里我们以升序为例子来说),遍历第一遍选择出最小的,与a[0]交换位置,将最小的数,放到首位,接下第二次遍历,在选择出次小的,放到a[1]的位置上,就这样一直遍历到最大的元素出来,将其放到a[9]的...

2019-07-30 17:37:09 126

原创 【数据结构】排序之插入排序、希尔排序

关于插入排序算法思想第一步思想的引入第二步思想的深入以上的引入是为了能够对插入排序有一个更加深刻的理解。而所谓的插入排序,其实引用的就是上面的思想。下面是对插入排序算法思想更加详细的分析。具体实现void InsertSort(int* arr, int n)//升序{ for (int i = 0; i < n - 1; i++) //多趟插入排序(设第一个数...

2019-07-29 17:30:27 114

原创 【C】指针总结

一、指针的本质1.指针的概念:指针是一个用来存放地址的变量,而这个地址是一块内存空间的唯一标识。2.对指针大小的深层理解:指针的值,是指针本身存储的数值,这个值会被编译器当作一个地址对待。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一...

2019-05-04 22:35:39 185

原创 【C】strcmp、strcat、strstr、strchr总结

strcmp其函数原型为int strcmp(const void *str1,const void *str2)功能为 : 比较两个字符串若str1 > str2 ,返回值大于0若str1 < str2 ,返回值小于0若str1 < str2 ,返回值等于0strcat其函数原型为char *strcat(char *dest, const cha...

2019-05-04 14:14:06 864

原创 【C】操作符总结

操作符分为以下几类:一. 算术操作符+ - * / % (取模运算)其中%(取模运算符)的两个操作数必须是整数。而 /(除号运算符),若是左右两个操作符都是整型数,不管该结果是什么类型,结果都是个整数,小数点后原有的数会被默认舍去。栗子如下:#include<stdio.h>int main(){...

2019-04-13 10:25:40 211

空空如也

空空如也

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

TA关注的人

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