自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网络层解析——IP协议、地址管理、路由选择

IP协议格式解析

2022-07-30 13:04:25 422

原创 malloc 和 空间配置器

二级空间配置器

2022-07-18 18:29:01 216 1

原创 传输层协议解析——UDP和TCP

协议解析协议格式协议特性编程影响UDP协议解析协议格式:首先我们来看看udp在文件(/usr/include/netinet/udp.h)中是如何组织数据的:可以观察到,一个完整的udp数据格式由下面几部分组成:16位源端-对端端口:描述通信双方16位报文长度:描述报文长度。 由于它是16位的,最多也是一个1111 1111 1111 111,即最大为65535 也就决定了,udp长度不能超过64k,一个udp报文的长度最多不能超过 64k-8 16位校验和:用于校验接收的数据是

2022-07-16 19:19:52 775 1

原创 应用层——典型协议解析

应用层典型协议解析: 自定制协议,基于TCP的http协议、https协议,基于udp的TFTP协议、DHCP协议、DNS协议、NFS协议

2022-07-09 20:50:08 1078

原创 套接字编程TCP篇

TCP通信编程TCP通信编程的流程:模拟服务端和客户端通信的过程:接口的使用:1.创建套接字:int socket(int domain,int type,int protocol)domain:地址域 AF_INET/AF_INET6type:SOCK_STREAM(TCP流式套接字) SOCK_DGRAM(UDP数据报套接字)protocol:IPPROTO_TCP IPPROTO_UDP返回socket操作句柄2.绑定地址信息:int bind(i

2022-06-09 17:38:07 1085

原创 套接字编程Udp篇

UDP通信编程udp通信编程的流程:模拟socket端口绑定过程:socket接口int socket(int domain,int type,int protocol);int bind(int sockfd,struct sockaddr* _addr,socklen_t len);ssize_t recvfrom(int sockfd,char *buf,int len,int flag,struct sockaddr *peer_addr,socklen_t *addrlen )s

2022-06-09 16:49:29 626

原创 网络的拓扑结构

网络的划分局域网(覆盖范围1km以内)城域网(覆盖范围20km以内)广域网(覆盖访问20km以上)IP地址ipv4: uint_32_tipv6: uint_8_t[16]用于在网络中唯一标识一台主机端口号unit16_t在一台主机上唯一标识一个进程。网络中的每条数据都带有两条信息:源端端口号/对端端口号IP地址和端口号搭配使用,表示一台主机上的哪一条数据,要发送到哪一台主机的哪一个进程上去。通信协议通信协议:数据格式约定通过网络中服务不同,使用的协议不同,划分了不同的协

2022-06-08 12:57:23 2330

原创 柔性数组成员

柔性数组成员typedef struct{ char a; double b; int c; char ptr[0]; //柔性数组成员 不占空间}Test;内存分析:优点一:void main(){ char str[] = "Hello Wrold"; Test* ptr = (Test*)malloc(sizeof(Test)+strlne(str)+1); if(NULL == ptr) { printf("Out of Memory!\n");

2022-04-23 17:22:26 201

原创 C++特性:多态、重写

多态概念通俗来说,多态就是多种形态,具体点就是去完成某种行为,不同的类去完成就会产生不同的形态。比如一个Active方法,包含了吃、走、爬、飞等行为,当调用这个方法,蜗牛就是爬,鸟就是飞。class Base{ virtual void fun(){} virtual Base* fun(){} //重载,也是重写的例外之一 virtual ~Base() //重写的例外之二}class D : public Base{ virtual void fun(){} /

2022-04-11 20:13:53 1186 1

原创 生产者与消费者模型的应用:线程池

生产者消费者模型生产者与消费者模型:大佬们针对典型的应用场景设计的解决方案生产者与消费者模型应用场景:有线程不断地产生数据,有线程不断地处理数据。数据的产生与数据的处理,如果放在同一个线程中完成,因为执行流只有一个,那么肯定是生产一个处理一个,处理完一个后才能生成一个。这样的依赖关系太强了,如果处理的比较慢,就会把程序的速度拖慢下来。因此将生产与处理放在不同的执行流中完成,那么生产和处理的线程如何实现通信呢?中间增加一个数据缓冲区(队列),作为中间的数据缓冲场所。产生线程只负责将数据放入缓冲区

2022-03-25 16:23:46 1542 2

原创 线程间通信:信号量

信号量信号量的本质就是一个计数器+pcb等待队列通过信号量可以实现同步和互斥,主要是同步同步的实现:通过自身的计数器对资源进行计数,并且通过计数器的资源计数,判断进程/线程是否符合访问资源的条件。互斥的实现:保证计数器的计数不大于1,就保障了资源只有一个,同一时间只有一个pcb可以访问临界资源,实现互斥。代码操作:1.定义信号量sem_t;2.初始化信号量:int sem_init(sem_t* sem,int pshared,unsigned int value); sem:定义一个信号

2022-03-25 14:39:39 1273

原创 进程间通信IPC:管道、共享内存和消息队列

进程间通信(IPC):进程间通信(IPC)是操作系统为用户提供的几种进程间的通信方式。主要因为进程间有独立性(每个进程都有自己的虚拟地址空间,访问的都是自己的虚拟地址,而不是直接访问物理内存),因此无法直接通信,所以才需要操作系统提供进程间的通信方式,实现进程间的通信。操作系统针对不同的通信场景提供了多种不同的通信方式:数据传输(管道/消息队列);数据共享(共享内存);进程控制(信号量);从unix而来的管道;systemV标准的共享内存、消息队列和信号量。管道:本质:内核中的一块缓冲区;多个进

2022-03-24 11:25:26 1934

原创 线程安全:互斥量与条件变量

线程安全线程安全:多个执行流对临界资源进行访问,但不会造成二义性线程安全的实现:同步:通过条件判断保证对临界资源访问的合理性互斥:通过同一时间对临界资源访问的唯一性实现临界资源访问的安全性互斥的实现:互斥锁互斥锁实现互斥的原理:互斥锁本身是一个只有0和1的的计数器,描述了一个临界资源当前的访问状态,所有执行流在访问临界资源之前都需要判断当前的临界资源是否可以被访问,如果不允许则让执行流进行等待,如果允许就可以让执行流访问临界资源,但是在访问期间需要将临界资源修改为不可访问状态,这期间如果其

2022-03-22 19:16:18 349

原创 代码风格:参数传递的方式

代码风格问题在实际写代码的过程中,函数参数的传递方式是我们经常需要考虑的问题,但是其实是很简单,但清楚这点和不清楚是两回事。int a 普通参数传递,可以在函数体中修改,形参,自动释放const int a 普通形参传递,不希望在函数体中修改,用的不多,实际意义不大int *a 传一个地址,可以对这块内存进行修改,修改之后,这块内存的数据也会发生改变。 输出型参数const int* a 表示对这块内存不改变,输出型参数int &a 引用是别名,还是一块空间,输入输出型参数

2022-03-22 17:10:43 312

原创 线程控制:线程退出、线程等待

线程退出我们来看下面这段代码,运行之后:为什么没有走进普通线程的循环,而是退出了呢?这就就要说的第一点:主线程main中return 0 退出的是进程,不是线程!线程退出接口:void pthread_exit(void* retval);谁调用谁退出,retval是退出返回值;使用pthread_exit()接口退出主线程,不会导致普通线程也退出。exit(0) 无论在主线程还是普通线程使用,都是退出进程。pthread_exit()在任意地方调用都可以退出一个线程,且谁调用谁

2022-03-21 16:44:49 1536

原创 线程控制:线程的创建

线程控制通过代码实现线程的创建/退出/等待/分离进行线程控制的接口代码,都来自库函数,也就是说,操作系统没有提供创建线程的接口,大佬们人为的使用库函数封装了一套线程库。这套封装的线程库函数,提供线程的各种操作。使用库函数创建一个线程(用户态),本质上是在内核中创建一个轻量化的进程来实现程序的调度。(pcb是一个task_struct结构体,存储在内核中,使用的是内核空间,想要访问pcb就得切换到内核态运行。)创建:int pthread_create(pthread_t* thread,co

2022-03-21 14:03:01 626

原创 多线程概念:线程的独有和共享

线程概念:在Linux内核中,实质上是没有线程这个概念的,也没有提供创建线程的接口;创建线程的接口,是通过库函数实现的,为了让pcb可以实现只调度完整代码中的某一或部分函数。可以理解为:进程是一个pcb集合,线程就是一个一个的进程执行流,各自同时分工,提高进程的效率。特点是:这个进程中的所有pcb共用一块虚拟地址空间,共用进程的大部分资源(程序运行时,操作系统为程序运行所分配的所有资源),所以这些pcb线程又被称为轻量级进程。而在Linux下,这些执行流又是通过pcb来实现的,所以可以抽象理解为线

2022-03-21 11:29:39 2402

原创 C++特性:继承

导语:C++是对C语言的优化和改进,C++之所以优秀的点在于它的特性:抽象、封装、继承和多态。本章总结继承的规则和特性,都是干货,与读者共同学习。继承作用代码的复用子类继承父类,可以理解为,将父类的代码拷贝一份到子类中,达到子类可以调用父类方法的目的。那为什么是可以理解而不是就是呢?是因为有几个东西是不可以拷贝的,比如,父类的拷贝和析构方法,友元和静态成员。友元关系是不能继承的,必须各是各的。静态成员是在类外初始化的,从定义到程序运行结束都一直存在,不是属于某一个类的。所以也不能拷贝。形

2022-03-20 20:23:14 374

原创 C++智能指针详解

注:源码剖析在代码注释展现了解智能指针头文件 #including< memory >版本 VC版本自动指针auto_ptr VS版本自动指针auto_ptr boost库的六种智能指针 局部指针: scoped_ptr、scoped_array 共享计数器指针: shard_ptr、scoped_array 弱指针: weak_ptr 侵入式引用计数指针: intrusive_ptr C++11参考boost实现的: we

2022-03-19 16:42:42 240

原创 C++内存管理,const、mutable、static、编译过程

回答问题可以的。变量修改的本质是存储空间中的数据被改变,我们通过变量名、指针等方式改变数据都是找到数据的存储位置,对存储空间进行操作。换句话说,空间的存储位置决定了一个变量能不能被修改。局部变量存放在栈区,程序运行完毕释放内存。而加了const修饰之后,,我们不可以使用变量名对这块内存进行修改,却可以通过其他方式对修改内存从而达到对变量的修改。全局变量存放在数据段,加const修饰之后,存放在只读数据段,是无法对内存进行操作的。所以一个数据能不能被修改,还是看它存放的位置。变量名和变量我们首

2022-03-16 21:38:52 2073

原创 仿函数、lambda表达式

仿函数c++中的很多算法方法都用到仿函数的传递,比如std中的sort方法,可以对一个数组中的元素进行排序,其中排序的规则可以自己制定,这个排序的规则就是通过仿函数传递的。int main(){ int array[] = {4,1,8,5,3,7,0,9,2,6}; // 默认按照小于比较,排出来结果是升序 std::sort(array, array+sizeof(array)/sizeof(array[0])); // 如果需要降序,需要改变元素的比较规则 std::sort(arra

2022-03-14 13:37:15 970

原创 引用、右值引用、万能引用、移动语义、完美转发

引用归纳一下引用的考点:1.概念引用是给已存在的变量取别名,与引用的变量公用同一块内存空间int &ra = a;对ra取地址,和对a取地址一样。2.特性1.定义时必须初始化2.一个变量可以有多个引用3.一单引用一个实体,就不能再引用其他实体。3.常引用记住一句话,权限只能缩小不能放大。普通变量是可读可写的,cont修饰的是只读的。4.效率(和传值相比)具体情况具体分析。返回值 传值和传引用函数的参数 传指针和传引用5.和指针的区别

2022-03-14 13:06:18 1408

原创 http和ftp协议的区别

项目中应用到ftp,将ftp的笔记上传一下。简单的说:HTTP是Hyper Text Transfer Protocol,超文本传输协议;面向网页的。FTP是File Transfer Protocol,文件传输协议;面向文件的。(soap的默认端口号8880,ftp的代理服务器的默认端口号是21)1.FTP(1)FTP比HTTP复杂FTP和HTTP一样都是Internet上广泛使用的协议,用来在两台计算机之间互相传送文件。相比于HTTP,FTP协议要复杂得多。复杂的原因,是因为FTP协议要用到

2022-03-13 13:19:26 9130

原创 结构体内存对齐

内存对齐规则普通结构体struct STUDENT{ char name[10]; int age; char sex; float score;}data;含有虚函数的类class Test{public: Test(){} virtual void func(){} virtual int* func1(){} ~Test(){}private: char a; int b; double c;}我们只要知道,类的成员才是类的,

2022-03-11 07:48:08 974

转载 Centos7下使用yum安装MariaDB

CentOS 6 或早期的版本中提供的是 MySQL 的服务器/客户端安装包,但 CentOS 7 已使用了 MariaDB 替代了默认的 MySQL。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。Linux下安装MariaDB官方文档参见:https://mariadb.com/kb/zh-cn/installing-mariadb-with-yum/全部删除

2022-03-09 09:47:40 236

转载 复杂指针解析

复杂指针解析因为C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:The right-left rule: Start reading the declaration from the innermost parentheses,

2022-03-07 17:54:03 334

原创 进程概念:操作系统与进程

冯诺依曼体系最早的就是这样,输入设备将数据交给CPU处理,然后给输出设备输出。CPU的数据处理速度是特别快的。主频(处理速度)大概2.5GHz。但这样的缺点就是,如果输入慢,CPU的性能就得不到最大的发挥,如果输出的慢了,CPU将大量的数据传给输出设备,就会造成数据堆积。这种数据的处理方式是不科学的。所以就进行了改进。在输入设备与CPU之间加入了存储器。其实质作用就是对数据进行缓冲。输入设备将数据交给存储器,CPU从存储器上读取数据进行处理,然后由存储器交给输出设备进行输出,这个存储器就是内存

2022-03-07 16:57:12 700

原创 解决:一、vs突然不能创建新的工程 二、git红色感叹号(版本控制角标)的消除

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-10-31 18:56:28 1740 4

原创 自定义类型(结构体、枚举、联合体)内存大小的计算方法

内存对齐为什么会存在内存对齐?大部分参考资料是这么说的:平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。 原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。总体来说, 结构体的内存对齐是那空间换取时间的做法。那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到: 让占用

2021-07-17 18:45:29 407

原创 C进阶库函数:字符串函数和内存函数的模拟实现

今天我学习了C语言常见的几种库函数,我们来模拟实现一下!字符串函数:strlen()strcpy()strcat()strcmp()strncpy()strncat()strstr()内存函数:memcpy()memmove()memcmp()memset()字符串函数函数细节代码内有详细的注释,望垂阅!这是下面函数的接口代码,可以参考运行:int main(){ ////////////////////////////////////////////////////

2021-06-19 16:28:58 124

原创 指针进阶:函数指针的应用场景

场景一:回调函数上一篇文章我们写了回调函数作为冒泡排序的比较规则来实现调用者的多样化要求,其实这就是C语言中函数指针应用广泛的一种场景链接放在下面啦,敬请垂阅:冒泡排序(进阶):运用回调函数,模拟实现库函数qsort场景二:转移表我们来实现一个简易的计算器://来做一个简易的计算器int add(int x, int y) { return x + y;}int sub(int x, int y) { return x - y;}int mul(int x, int y) {

2021-06-15 15:31:00 1138

原创 冒泡排序(进阶):运用回调函数,模拟实现库函数qsort

C 库函数 - qsort()声明:void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))参数说明:base -- 指向要排序的数组的第一个元素的指针。nitems -- 由 base 指向的数组中元素的个数。size -- 数组中每个元素的大小,以字节为单位。compar -- 用来比较两个元素的函数。描述:库函数qsort对数组进行排序callback

2021-06-15 14:21:27 352 1

原创 Linux系统内核及其权限

终端在Linux/unix世界里,终端是一个非常基本、重要的概念。那么终端到底是什么呢?终端——人与机器交互的接口;我愿意把计算机分成以下概念:计算机 = 主机 + 终端; 终端 = 输入设备 + 输出设备;人和机器是两个独立的实体,当人使用机器时,必须借助某种接口才能与机器交流信息。计算机的接口包括显示器、键盘、鼠标、扬声器、麦克风等。CPU、内存、硬盘、光驱、显卡、网卡等其他硬件属于主机。Linux/unix将这种实现人机交互的接口称为终端。系统结构内核系统内核是操作系统最基本的部

2021-06-05 10:41:15 769 5

原创 Linux基础指令

今天是我学习Linux操作系统的第一天,谨以此篇来回顾一下我上课所学习的内容。Linux系统下的目录结构Windows目录:在说Linux目录之前,我们有必要说一下我们常用的windows操作系统的目录。在windows下,我们可以直观的发现像这样的磁盘分区:其实这样的磁盘分区都有自己的根目录结构,这样形成了多个树并列的情况。Linux下目录在Linux操作系统下,我们并不能直观的看到一些文件夹和磁盘分区。但我们学习lLinux,,就应该知道它内部的结构。在Linux下,并没有像windo

2021-06-03 19:08:55 95 1

原创 交换与逆置,冒泡排序,字符串逆置,字符串左旋

逆置程序在C语言的学习中是非常常见的,今天我们就来整理一下到目前为止我们所见过的逆置程序。冒泡排序前面我们写过的冒泡排序就是最基础的啦,还记得吗?来看一下思想: 对一个数组内的所有元素进行排序, 设置两个索引i和j分别控制 比较的趟数 和 每一趟的比较 如果符合条件,就交换这两个数,一个循环嵌套下来,排序就完成啦具体的代码就不再呈现了,详细的可以看看之前的文章:冒泡排序牛客笔试题...

2021-05-31 19:37:10 324 1

原创 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)

题目喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)分析:我们来分析一下过程:20元买20瓶汽水,得到20个空瓶,钱花光了。 2020个空瓶全部换成汽水,得到10个空瓶 20/2=1010个空瓶全部换成汽水,得到5个空瓶 10/2=55个空瓶可以换2个汽水,剩余1个空瓶, 5%2=2 余1换完之后剩3个空瓶,可以换1个汽水,剩余1个空瓶

2021-05-23 21:51:08 2610

原创 打印菱形图案

题目:打印菱形题目内容:用C语言在屏幕上输出以下图案:思路:这道题的解决办法有很多,大多都是拆分法,这里捡一种我觉得最方便的方法作以介绍: 首先我们需要明白,这种图案形式打印的题目,都是一行一行打印出来的。 之后就是考虑如何做方便了。拆分: 我们将菱形拆分成 上三角 + 中间最长的部分 + 下三角 ,分别打印即可 仔细观察,每一行的图案由空格和星号组成,数一数对应行的空格数和星号数分别进行打印即可 找规律,我们发现,‘*’的数量是 2

2021-05-23 21:41:21 2253

原创 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:

题目5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:A选手说:B第二,我第三;B选手说:我第二,E第四;C选手说:我第一,D第二;D选手说:C最后,我第三;E选手说:我第四,A第一;比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。思路:[日本凶杀案](https://editor.csdn.net/md/?articleId=117200548)按照上一题的逻辑,我们仍然用题给的条件作为判断依据来分析: 用各位选手都说对了一半作为条件(0为假,1为真)

2021-05-23 21:25:38 1433 1

原创 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。

题目: 日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。思路:程序猿逻辑: 逐个分析, 如果A说了假话,BCD三人就说的是真话: 则凶手是A,凶手是C,凶手是D,C在胡说。

2021-05-23 21:18:32 877

原创 C-进阶 数据在内存中存储 知识点梳理

整形在内存中的存储变量与内存的关系:知识点梳理: 数据在所开辟的内存中是如何存储的? 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。 目的就是减少计算机的硬件成本 原码反码补码: 表示正数不用补码。对于负数才要补码。 原码是数的二进制,反码符号位不变其余为取反,补码为反码+1

2021-05-23 20:58:17 87

空空如也

空空如也

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

TA关注的人

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