- 博客(62)
- 收藏
- 关注
原创 用一个例子理解希尔排序
用一个例子理解希尔排序思想代码思想希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。可能这个样子说的话大家不太好理解,我不知道大家在上学的时候有没有老师用这种方法给大家排过队,就是让大家按一定范围报数,然后相同数字的人进行比较;其实希尔排序就是这样,把报相同数的人按高低进行排序,进行多次报数,且报数的范围越来越小,直到变成1的时候,就完全排好序了。话不多说,直接给大家上一波图。代码
2021-05-14 23:25:21
642
5
原创 原来直接插入排序这么简单(附完整代码)
原来插入排序这么简单(附完整代码)基本思想带哨兵位的插入排序二分插入排序完整代码基本思想做一件是之前我们总是要先知道我们做这件的核心思想,这样会让我们做事的效率得到有效的提高;现在我们来看看插入排序算法的实现思路:直接插入排序就是把待排序的记录按其关键码值的大小逐个插入到一个已经有序的序列中,指导所有的记录插入完为止,得到的一个新的有序队列。这就和我们现实生活中打扑克拍抓牌的时候是一样的,当我们拿到一张新的扑克牌的时候,会把它和我们手里已经拍好序的扑克做比较,找到它应该放在那里。于是我们就可以写出下
2021-05-13 23:21:27
2125
2
原创 C++:从结构体开始理解this指针
C++:从结构体开始理解this指针#include <iostream>#include <string>using namespace std;class student{public : void Init(string id,string name,int age) { id_ = id; name_ = name; age_ = age; } void print() { cout << id_ << endl
2021-05-03 15:19:59
2661
4
原创 C++:计算结构体和对象的大小
C++:计算结构体和对象的大小如何计算结构体的大小结构体的内存对齐为什么存在内存对齐如何计算一个对象的大小如何计算结构体的大小其实计算一个结构的大小的方法并不难,简单来说就是把结构体内的所有成员的大小相加就可以。但是,需要内存对齐那么究竟什么是内存对齐,又为什么要进行类型对齐呢?结构体的内存对齐结构体内存对齐主要有两个步骤:1.结构体各成员对齐.2.结构体总体对齐结构体内存对齐规则:1.结构体的第一个成员在存放在结构体偏移量为0的位置2.其他成员变量要对齐到某个数字(对齐数)的整数倍
2021-05-03 11:34:50
695
15
原创 C++:在代码中理解宏定义和内联函数
宏定义在C语言中,宏定义是比较常用的预处理指令,即使用“标识符”来表示“替换列表”中的内容。标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容。常见的宏定义主要有两种,即不太参数的宏定义和带参数的宏定义(宏函数)。不带参数的宏定义格式:#define 表示符 替换列表/*替换列表可以是数值常量、字符常量、字符串常量等,所以可以把故可以把宏定义理解为使用标识符表示一常量,或称符号常量。*/注意:1.#可以不在首行,但是在它前面只允许有空格
2021-04-29 11:46:17
523
7
原创 C++:单例模式以及一些常见的特殊类
C++:单例模式什么是单例模式单例模式饿汉模式二级目录三级目录什么是单例模式首先我们需要知道什么是设计模式,设计模式是软件开发人员在长期的软件开发过程中总结出来的在面临一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。这就有点类似于我们古代的《孙子兵法》一样,都是通过长期的经验总结出来的。那么使用设计模式的目的是什么呢?使用设计模式的目的:1.为了提高代码的可重用性2.让代码更容易被他人理解3.保证代码可靠性4. 设计模式使代码编写真正工程化5.
2021-04-23 22:42:50
351
5
原创 Linux:数据链路层——以太网协议、NAT协议、ARP协议和DNS协议
Linux:数据链路层——以太网协议以太网协议以太网帧格式MTU以及MTU对TCP、UDP、IP协议的影响MTU对TCP协议的影响六级标题以太网协议数据链路层:数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自物理层来的数据可靠地传输到相邻节点的目标机网络层。他的作用就是负责相邻设备的转发。以太网:以太网不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。以太网是当前应用最广
2021-04-15 22:52:41
1680
16
原创 Linux:网络层——IP协议
IP协议先来看看我从百度百科上摘下来的定义,了解一下IP简单的了解一下IP协议:IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。还有IP协议中的一些基本概念:主机:配有IP地址,但是不进行路由控制的设备
2021-04-12 13:23:07
416
5
原创 Linux:tcp协议——用这组图来了解确认应答机制、超时重传机制、滑动窗口机制、拥塞控制机制、延时应答机制和捎带应答机制
确认应答机制超时重传机制滑动窗口机制拥塞控制机制慢启动拥塞避免快重传快恢复延时应答机制和捎带应答机制
2021-04-07 21:17:31
1384
5
原创 Linux:TCP协议——四次挥手【图片+文字】
Linux:TCP协议——四次挥手【图片+文字】四次挥手四次挥手时客户端与服务端的状态转变理解为什么TIME_WAIT的时间是2MSL如果服务端或者客户端突然崩溃,会怎样四次挥手tcp协议的三次握手是通信双方建立连接的过程,而四次挥手其实就是通信双方断开连接时要经历的过程。而在通信双反断开连接时,无论是客户端先关闭(调用close函数,向服务端发送FIN),还是服务端先关闭(调用close函数,向客户端发送FIN)都要经历四次握手这个阶段。客户端:服务端:对于四次挥手,个人觉得和我们平时下班还
2021-04-05 17:52:12
1750
10
原创 Linux:TCP协议——三次握手【图片+文字】
Linux:TCP协议——三次握手【图片+文字】三次握手面向连接二级目录三级目录三次握手TCP协议:全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制。TCP协议段格式:源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;32位序号/32位确认号: 后面详细讲;4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 606位标志位:
2021-04-03 23:10:05
1662
12
原创 Linux:传输层——UDP协议
Linux:传输层——UDP协议传输层主要的工作端口UDP协议面向数据报UDP协议报头字段含义数据长度u_int16 tuh_ulen校验和u_int16_t uh_sum校验和的计算方式UDP缓冲区UDP的应用传输层主要的工作在开始介绍UDP协议之前,我们需要了解传输层是负责端(可以理解成端口)与端之间的传输的,不论是传输层协议中的UDP协议还是TCP协议,都是负责端口与端口之间的数据传输。“传输层只负责端口,不负责IP(IP是网络层在负责)”。端口端口号(Port)标识了一个主机上进行通信的不同
2021-03-31 23:26:26
1282
12
原创 Linux:使用cpp-httplib创建一个简单的服务器
这里写目录标题cpp-httplib下载步骤cpp-httplibcpp-httplib是一个header-only的跨平台HTTP/HTTPS服务器和客户端C++开源库,可以使用它来完成服务端和客户端,我们使用的时候只需要包含“httplib.h”这个头文件就可以了,非常方便。在Linux中使用cpp-httplib库时,只需要把它下载下来,然后在写代码时包含该头文件就可以了。下载步骤我们在可以进入gitee直接搜索cpp-httplib,点击第一个也可以直接点击我给大家找到的连接直接进入
2021-03-30 16:55:57
2227
4
原创 Linux:应用层——自定制协议和http协议
Linux:应用层——自定制协议和http协议自定制协议tcp的粘包问题hhttp协议urlurlencode和urldecodeHTTP数据包格式请求响应自定制协议自定制协议:自定制协议工作在应用层,被程序员定义出来的协议,又叫应用层协议,在应用层对要传输的进行数据格式的约定,消息的发送方和接收方都应要遵守约定。tcp的粘包问题简单的说这个问题的就是对于消息接收方来说不能准确的区分当前数据是那一次发送过来的数据。就比如加入现在服务端提供一个加法的功能,要求客户端提供两个数字和一个“+”这样的数据,
2021-03-29 20:14:27
636
2
原创 Linux:简单三步,教你解决ping:www.baidu.com:未知的名称或者服务
Linux:简单三步,教你解决ping:www.baidu.com:未知的名称或者服务1.在VMware Workstation中点开编辑,找到虚拟网络编辑器2.直接点击更改设置3.点击还原默认设置(耐心等待它卸载完又自动安装)刚才解决完Xshell不能连接虚拟机的问题后,又出现了一个新的问题,在ping主机的地址的时候就一直卡在这不动,按CTRL + Ct停止以后就说丢包率为100%而且在ping百度等网址的时候就说ping:www.baidu.com:未知的名称或者服务。在网上找了很多方法总结
2021-03-28 00:08:27
66726
31
原创 Xshell连接虚拟机时报错Could not connect to ‘192.168.115.133‘ (port 22): Connection failed.
Xshell连接虚拟机时报错Could not connect to ‘192.168.115.133’ (port 22): Connection failed.今天突然想把拨号连接换成宽带连接,结果问题就来了:用下Xshell连接虚拟机的时候一直说连接失败先后尝试了以下方法都没有解决问题1,重新启动CentOS2,重启VMWare3,防火墙问题:解决方案:(1)查看防火墙:service iptables status(2)先关闭防火墙:/etc/init.d/iptables sto
2021-03-27 23:32:17
4069
4
原创 Linux:从网卡中抓取数据包
Linux:从网卡中抓取数据包用到的工具Linux下抓包步骤1.切换到root用户2.使用tcpdump命令开始抓包3.启动程序,并发送数据(以一个但执行流TCP程序为例)4.结束抓包5.把刚才抓包的文件传到Windows系统Windows下抓包用到的工具windows:Wiresharklinux:tcpdump命令tcpdump -i any port [端口] -s 0 -w 名称Linux下抓包步骤1.切换到root用户2.使用tcpdump命令开始抓包3.启动程序,并发送数据(
2021-03-27 17:03:31
1708
1
原创 Linux:网络编程——TCP编程步骤以及多个版本的TCP代码
Linux:网络编程——TCP编程步骤以及多个版本的TCP代码TCP编程连接服务器监听接收新连接发送数据接收数据多个版本的TCP单执行流多进程多线程TCP编程TCP的编程步骤和UDP的有一定的差异,但是也有一些步骤是相同的,比如都需要创建套接字和绑定地址信息。下面我们就一起来看看TCP的编程步骤:客户端:创建套接字、绑定地址信息(不推荐)、连接服务器、发送数据、接收数据、关闭套接字服务端:创建套接字、绑定地址信息、监听、接收新连接、接收数据、发送数据、关闭套接字和UDP相比,TCP编程多了一些步骤
2021-03-25 22:52:12
478
原创 Linux:网络编程——UDP代码及其封装
Linux:网络编程——UDP代码及其封装UDP代码二级目录三级目录UDP代码客户端: #include <arpa/inet.h> #include <iostream> #include <string> using namespace std; int main() { int sockfd = socket(AF_INET,
2021-03-23 16:59:44
849
1
原创 Linux:网络编程——UDP编程的前期准备
Linux:网络编程——UDP编程的前期准备字节序TCP与UDP的区别UDP编程的流程1.创建套接字创建套接字的意义2.绑定地址信息(1)绑定ip和端口(2)函数3.UDP发送数据4.UDP接收数据5.关闭套接字字节序字节序是一个处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。分为大端字节序和小端字节序,对应大端机器和小端机器。大端字节序:即把数据的高字节放到低地址中小段字节序:高字节放到高地址中我们可以使用一串简单的代码来确定我们的机器是小端机器还是大端机器: #includ
2021-03-21 23:57:47
277
1
原创 Linux:初识网络
Linux:初识网络网络的的发展网络协议初识OSI七层模型TCP/IP五层(或四层)模型数据包封装和分用网络传输基本流程网络的的发展网络的发展经历了一个由简单到复杂的的过程,在之前的独立模式,计算机之间是相互独立,到后来网络互联把多台计算机连接在一起,完成数据共享,而后来的局域网LAN通过交换机和路由器把计算机连接在一起,使得计算机的数量增加了;广域网则将远隔千里的计算机都连接在一起。网络协议初识那么什么是协议的,其实协议有点类似于我们和某人约定用什么语言(比如汉语或者英语)来交流一样,如果我们约定
2021-03-20 19:16:25
194
1
原创 Linux:多线程——生产者与消费者模型
Linux:多线程——生产者与消费者模型二级目录三级目录代码:#include <stdio.h> #include <stdlib.h> #include <unistd.h&g
2021-03-15 22:30:29
312
原创 Linux:多线程——死锁以及使用gdb调试多线程程序时常用的命令
Linux:多线程——死锁以及使用gdb调试多线程程序时常用的命令死锁死锁产生的四个必要条件预防死锁使用gdb调试多线程程序时常用的命令死锁死锁:指在一组进程中的各个进程均占有不是放的资源,但因相互申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。情况一:当多个执行流使用同一个互斥锁的时候,有一个执行流获取到互斥锁之后,没有释放互斥锁,导致其他执行流都卡死在加锁的接口中的现象被称之为死锁。情况二:多个执行流,多个互斥锁的情况下,没一个执行流都占有一把互斥锁,但是都想申请对方的互斥锁,这种情
2021-03-14 23:54:57
314
原创 Linux:线程安全
Linux:线程安全从抢票说起二级目录三级目录从抢票说起我们先写一个程序来模拟一下抢票:创建4个线程(代表4个人),票数为100(全局变量int g_tickets = 100;),每个执行流执行之后g_tickets减一,代表抢到了票,后面打印出抢到了第几张票。#include <stdio.h> #include <pthr
2021-03-14 19:11:13
172
原创 Linux:线程控制
Linux:线程控制线程的创建二级目录三级目录线程的创建前面我们已经基本了解了线程的基本概念,接下来我们面临的问题就是是怎让创建一个线程了,在Linux中可以用pthread_create函数来创建线程.函数原型:#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
2021-03-09 22:22:04
377
1
原创 Linux:多线程简介
Linux:多线程线程概念线程的优缺点线程异常与用途进程与线程线程概念首先我们来回顾一下进程的概念:进程是指指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能而线程的概念为:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。下面的图片为我们展示了单线程与多线程.线程机制是现代编程技术中常用的一种抽象概念,该机制提供了在同一个程序内共享内
2021-03-08 21:49:58
154
原创 Linux:进程间通信——共享内存
Linux:进程间通信——共享内存原理共享内存的创建将共享内存附加到进程将共享内存和进程分离操作共享内存原理共享内存的原理是:在物理内存中开辟一段空间,这段物理内存的空间可以被不同的进程附加到自己的共享区中,附加的进程再通过操作共享区来实现数据的交换。共享内存的创建知道共享内存的原理以后,接下来我们要关心的问题是怎样创建一个共享内存,Linux中可以用shmget函数来创建共享内存。函数原型:#include <sys/shm.h>int shmget(key_t key,siz
2021-03-05 16:39:41
579
原创 Linux:进程间通信——命名管道
进程间通信——命名管道命名管道命名管道的创建命令创建函数创建特性命名管道和匿名管道一样,命名管道也是在内核中开辟的一段缓存区,不过和匿名管道不同的是,这段缓存区是有标识符的,这也就意味着不同的进程,不需要有亲缘关系,只需要通过标识符就能找到该缓冲区了。命名管道的创建命令创建命名管道可以从命令行上创建,命令行创建是使用下面这个命令:mkfifo filename"p"代表文件类型为管道文件注意:该文件是不支持直接写的,该文件的作用是通过它我们可以找到内核中的创建的缓冲区函数创建相关函数
2021-03-04 23:22:23
285
1
原创 Linux:进程间通信——匿名管道
Linux:进程间通信——匿名管道进程间通信匿名管道匿名管道的创建管道的读写规则进程间通信因为每一个进程都拥有自己的独立的进程虚拟地址空间,导致了进程的独立性。进程间的通信技术是为了让各个进程之间可以很好的交换数据或者进程控制而产生的。常用的进程间通信的方式有管道、共享内存、消息队列和信号量。匿名管道管道有分为匿名管道和命名管道两种,接下来主要介绍管道通信中的匿名管道。匿名管道就是指在内核中创建出来的一块没有标识符的一段缓冲区。匿名管道的创建在Linux系统中,可以用pipe函数来创建匿名管道
2021-03-03 23:06:39
383
5
原创 Linux:动态库和静态库
Linux:动态库和静态库概念概念动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码静态库:程序在编译的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库...
2021-03-02 20:34:36
394
原创 Linux:软硬链接
Linux:软硬链接软硬链接软连接硬链接:总结:软硬链接我们通过举例子来理解软硬连接。软连接首先我们先touch一个文件aaa向其中追加内容使用ln -s [源文件] [生成的软链接文件] 命令生成软连接bbb此时再看bbb里面的内容,和aaa里的内容是一样的然后我们在把源文件删除,用ll命令查看,发现bbb找不到源文件在向bbb中写入数据发现源文件又生成了,所以,删除的时候最好时软链接文件和源文件一起删除硬链接:同样以aaa为例子我们生成硬链接,此时aaa文件中的数据为
2021-02-27 18:36:58
190
原创 Linux:简单理解文件系统内附Linux内核设计与实现PDF下载地址
简单理解文件系统文件系统ext2文件系统文件的存储文件的获取文件系统文件存储的方式有线性存储和离散存储两种,线性存储可能会导致磁盘的利用率降低,产生磁盘碎片,离散存储方式会提高程序对磁盘的利用率,以下是Linux内核简设计与实现中关于文系统的一段话的一部分:文件通过目录组织起来。文件目录好比一个文件目录好比一个文件夹,用来容纳相关文件。因为目录也可以包含其他目录,及子目录,所以目录可以层层嵌套,形成文件路径。路径中的每一部分都被称作目录条目。“/home/wolfman/butter”是文件路径的一
2021-02-27 18:35:59
1866
4
原创 Linux:文件句柄泄漏问题
Linux:文件句柄泄漏问题产生原因进程中打开的文件数量产生原因文件句柄泄漏,也叫文件描述符泄漏,当我们打开一个文件,操作系统就会给程序分配一个文件描述符,如果在使用完成之后,没有及时的关闭文件,就会造成文件句柄泄漏的问题。进程中打开的文件数量在Linux中,一个进程中打开的最大文件数量可以用ulimit -a查看图中的open files 后面的1024为打开文件的最大数量,但是打开文件的最大数量是可以被更改的,在Linux中我们可以用ulimit -n[num]修改打开文件的最大数量。注意
2021-02-27 00:53:39
1538
原创 Linux:基础IO——复习C语言文件IO相关操作
Linux:基础IO——复习C语言文件IO相关操作1.C语言操作文件接口2.系统调用函数的操作文件接口三级目录1.C语言操作文件接口(1) fopen函数函数原型:FILE *fopen(const char *path,const char *mode);参数解释:path:待打开的文件(文件路径 + 文件名称)mode:以何种方式打开返回值:打开文件成功返回文件流指针,打开失败返回NULL打开方式:打开方式解释r以只读方式打开,当文件不存在的时候,就会打开失败
2021-02-26 17:14:04
300
2
原创 Linux:程序替换
Linux:程序替换程序替换替换原理替换方法函数规律程序替换程序替换简单的说就是重新加载另一个程序到内存中;然后将现有的一个pcb的内存得指针指得内存空间指向这个新得程序,则这个现有得pcb就跑去调度这个新的程序了替换原理用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前
2021-02-17 16:10:49
208
原创 Linux:进程等待
Linux:进程等待进程等待进程等待的两种方法1.wait方法`2.waitpid方法获取子进程status进程等待进程等待指的就是父进程等待子进程退出;为了获取退出子进程返回值;释放退出子进程所有资源;由此可以看出进程等待是非常重要的,前面我们说过,当子进程退出,如果父进程不管不顾,就可能使子进程成为僵尸进程,进而造成内存泄漏,而我们也知道僵尸进程非常难以处理,就算是kill-9也无法将它“消灭”,就像成为僵尸的人一样,对于我们来说他已经死了,不能再被杀死第二次了。而我们想知道父进程派给子进程的任务完
2021-02-17 00:33:48
203
原创 Linux:进程创建详解
Linux:进程创建详解进程创建1.fork函数写时拷贝调用失败的原因2.vfork函数进程终止正常退出的三种方法_exit和exit的区别进程创建现在我们已经知道进程的概念以及怎样创建一个进程,接下来我们来详细探索一下进程创建的细节。1.fork函数在Linux中fork函数可以从已存在的进程中创建一个新进程,新进程为子进程,原进程为父进程#include <unistd.h> //头文件pid_t = fork(void);//返回值有三种情况//pid_t = 0 表示子
2021-02-15 23:01:46
3589
原创 Linux:程序地址空间及常见页面置换算法
程序地址空间及常见页面置换算法研究背景以及定义虚拟内存操作系统中管理内存的三种方法:1.分段式2.分页式3.段页式缺页中段解决方法——页面置换算法1.最佳(Optimal)置换算法2.先进先出(FIFO)页面置换算法3.LRU(Least Recently Used)置换算法4.最少使用(Least Frequently Used,LFU)置换算法5.简单的Clock置换算法---最近未使用(NRU)算法研究背景以及定义环境:32为平台在了解程序地址空间之前我们需要知道:地址:内存地址------对
2021-02-14 20:12:33
683
原创 Linux进程状态以及僵尸进程于孤儿进程的产生
Linux进程状态简述Linux下的进程状态通过系统调用fork()创建子进程僵尸进程在了解了进程的基本概念以及进程的创建等概念以后,接下来我们需要了解进程的状态。那么什么是进程状态呢?简单的说进程状态就是把一个进程在不同的时间划分为不同的状态。它描述了一个进程在什么时间做什么样的事情。一般情况下进程有三种状态,就绪,运行,阻塞。状态名称描述就绪进程已经具备运行条件,但是CPU还没有分配过来,拿到时间片就可以运行执行进程占用CPU,并在CPU上运行阻塞进程因等待某
2021-02-04 16:29:44
113
原创 Linux环境变量及其设置
Linux环境变量及其设置环境变量常见环境变量有关环境变量的一般指令操作在代码中获取环境变量的三种方法环境变量概念:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。简单来说就是一个变量,用于存储系统的环境参数。作用:通过修改环境变量的值,灵活的配置系统运行环境参数(使系统环境配置更加灵活)常见环境变量PATH指定命令的搜索路径HOME指定用户的主要工作目录(即用户登录到Linux系统中时,默认的目录)SHEL
2021-02-04 16:29:01
207
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人