自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SSH配置免密登录 详解(踩坑无数总结)

之前在使用Ansible部署工具的时候,需要先配置好SSH免密登录,在配置时踩了很多的坑(按照很多文章的步骤并不能完全配置好免密登录),因此在踩完所有的坑之后,总结出来这篇文章。生成公钥、私钥对在中控机上,执行以下命令,然后一路回车即可。$ ssh-keygenGenerating public/private rsa key pair.Enter file in which to save the key (/home/work/.ssh/id_rsa): Enter passphrase (

2020-12-18 11:13:30 1040

原创 文件传输协议FTP、SFTP、SCP

今天在了解Ansible的时候看到了Ansible是基于SFTP协议进行文件传输的,就想了解下FTP协议与SFTP协议的区别,因为总结了这篇文章。应用层:HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页)DNS(Domain Name System)FTP(File Transfer Protocol)SFTP(SSH File Transfer Protocol,和FTP不一样)SCP(Secure copy,based on SSH)SSH (S

2020-12-14 15:11:26 1179

原创 vector 模拟实现

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<algorithm>#include<assert.h>#include<Windows.h>#include<string>using namespace std;namespace myvect...

2019-08-07 18:27:58 232

原创 vector详解-STL序列式容器

vector介绍首先,我们来看看C++标准库对 vector 的解释:vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数...

2019-08-07 10:48:16 270

原创 date日期类实现-C++

#include<iostream>#include<assert.h>#include<vector>using namespace std;class Date{public: //构造函数 Date(int year = 1900, int month = 1, int day = 1){ this->_year = year...

2019-08-05 11:29:30 249

转载 malloc / free 底层实现 详解

本文大致讲解一下linux下malloc的底层实现原理。首先malloc肯定是从堆中分配内存,而堆又在用户空间中占据什么位置?通过下面这张图可以看出来:很明显是32位系...

2019-07-30 13:16:21 1098

原创 STL源码剖析--空间配置器

空间配置器是最不需要介绍的东西,他总是隐藏在容器(container)的背后,默默工作,默默付出。allocator 之所以说是空间配置器而不是内存配置器,因为空间不一定是内存,也可以是磁盘或者其它辅助存储介质。空间配置器的标准接口allocator::allocator() default constructorallocator: :allocator (const allocato...

2019-07-29 18:21:18 163

转载 git基本使用 详解

目录1.版本控制版本控制系统分类2.什么是gitgit的工作原理和特点git配置git配置相关命令git 获取帮助3.git基础命令git文件生命周期git基础命令git历史相关命令git撤销命令git远程仓库命令git标签命令git小窍门4.Git 分支操作git远程分支分支变基——rebaserebase的好处r...

2019-07-23 15:08:05 266

原创 进程创建 及 进程终结

1.进程创建Linux中进程创建由 fork() 和 exec() 函数族实现。fork() 通过拷贝当前进程创建一个子进程。子进程与父进程的区别仅仅在于PID(每个进程唯一)、PPID(父进程的进程号,子进程将其设置为被拷贝进程的PID)和某些资源和统计量。exec() 函数负责读取可执行文件并将其载入地址空间开始运行。#include <unistd.h>extern c...

2019-07-22 18:55:34 199

原创 Linux 内核空间与用户空间

Linux 内核空间与用户空间 本文以 32 位系统为例介绍内核空间(kernel space)和用户空间(user space)。内核空间和用户空间对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的32次方)。也就是说一个进程的最大地址空间为 4G。操作系统的核心是内核(kernel),它独立于普通的应用程序,可以...

2019-07-22 17:30:32 141

原创 进程地址空间 及 页表 详解

进程地址空间:系统中每个用户空间进程所看到的内存。Linux操作系统采用虚拟内存技术,系统中的所有进程之间以虚拟方式共享内存。地址空间进程地址空间由进程可寻址的虚拟内存组成,内核允许进程使用这种虚拟内存中的地址。每个进程都有一个32位或64位的平坦地址空间,空间大小取决于体系结构。(平坦指一段独立的连续区间)内存地址是一个给定的值,要在地址空间范围之内。尽管一个进程可以寻址4GB(2^...

2019-07-21 10:32:27 2241

转载 从输入URL到页面展示的详细过程

其实从输入URL到页面展示在我们眼前所经历的过程其实还是非常复杂的,牵扯到的知识点也是非常的庞杂。其中很多知识都会有专门的学科去研究,所以这里只是简单地概括一下大致流程:1、输入网址2、DNS解析3、建立tcp连接4、客户端发送HTPP请求5、服务器处理请求 6、服务器响应请求7、浏览器展示HTML8、浏览器发送请求获取其他在HTML中的资源。下面是转载自https://www.cnblogs.c...

2019-05-07 21:44:53 1343

转载 前置++和后置++的区别

今天在阅读《google c++ 编程风格》的文档的时候,5.10. 前置自增和自减:有一句话引起了我的注意:对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符.,理由是 前置自增 (++i) 通常要比后置自增 (i++) 效率更高。于是我查了查前置++和后置++的区别。注意:...

2019-05-07 18:37:26 1135

原创 用命名管道 fifo 实现 server&client 通信

命名管道匿名管道 pipe 应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。命名管道是一种特殊类型的文件,它可见于文件系统。创建一个命名管道在命令行上创建,使用下面这个命令:$ mkfifo filename命名管道也可以从程序里创建,使用函数为int mk...

2019-05-07 14:17:24 605

原创 虚拟地址空间 及 页表 详解

虚拟地址空间进程地址空间由进程可寻址的虚拟内存组成,内核允许进程使用这种虚拟内存的地址。每个进程都有一个 32位或64位 的平坦地址空间,空间的大小取决于体系结构。(平坦指的是地址空间范围是一个独立的连续空间)一些操作系统提供了段地址空间,这种地址空间并非是一个独立的线性区域,而是被分段的,但现代 采用虚拟内存的操作系统通常都是用平坦地址空间。通常情况下,每个进程都有唯一的这种平坦地址空间。...

2019-05-06 13:24:03 6185

原创 僵尸进程 详解及代码实现

概念僵尸进程是一个比较特殊的状态。当子进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。只要子进程退出,父进程还在运行,但是父进程没有读取子进程状态,子进程进入僵尸状态。实现一个维持30秒的僵尸进程代码:/*这是一个30秒僵尸进程的示例代码 (严格来说,僵尸状态只能维持25秒)*/ #...

2019-05-05 20:23:38 866

原创 进程 详解及底层实现

1.进程概念进程是处于执行期的程序以及相关的资源的总称。线程是进程中活动的对象,内核的调度对象是线程。Linux下对线程和进程不作区分,线程是轻量级进程。进程在创建它的时刻开始存活。在Linux系统中,通常是调用 fork() 系统调用的结果,通过复制一个现有进程来创建一个全新的进程。fork系统调用从内核返回两次:一次回到父进程,另一次回到子进程。创建新的进程都是为了立即执行新的、...

2019-05-05 11:42:57 799 1

原创 二叉树的各种遍历详解--递归/非递归代码实现

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次,且仅被访问一次。二叉树的遍历方式常用的有四种:前序遍历、中序遍历、后序遍历和层序遍历。前序遍历前序遍历:简单来说就是:根->左->右。规则:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。递归实现://先序遍历,递归法void PrevO...

2019-04-21 17:57:30 434 1

转载 Markdown表格快速生成

在Markdown上写一个表格真是让人头疼的事情,写的不流畅还要担心格式。我为大家总结了以下三种方法,前两种大家或许司空见惯了,第三种是神器。。。一、md原生 | 水果 | 价格 | 数量 | | -------- | -----: | :----: | | 香蕉 | $1 | 5 | | 苹果 ...

2019-04-18 12:35:34 968

转载 CSDN-markdown编辑器语法——字体、字号与颜色

Markdown是一种可以使用普通文本编辑器编写的标记语言,通过类似HTML的标记语法,它可以使普通文本内容具有一定的格式。但是它本身是不支持修改字体、字号与颜色等功能的!  CSDN-markdown编辑器是其衍生版本,扩展了Markdown的功能(如表格、脚注、内嵌HTML等等)!对,就是内嵌HTML,接下来要讲的功能就需要使用内嵌HTML的方法来实现。字体、字号与颜色<font ...

2019-04-18 12:32:22 498

原创 空类和空结构体的大小

空类和空结构体在学习C语言和C++的过程中,我们可能都有一个问题,一个空类/空结构体的大小是多少呢?首先我们写代码来测试一下:#include<iostream>#include<stdio.h>struct test1 //空结构体{};class test2 //空类{}; ...

2019-04-18 12:26:34 865

原创 单例模式--详解及代码实现

某些类, 只应该具有一个对象(实例), 就称之为单例.在很多服务器开发场景中, 经常需要让服务器加载很多的数据 (上百G) 到内存中. 此时往往要用一个单例的类来管理这些数据。懒汉模式和饿汉模式饿汉模式:吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.懒汉模式:吃完饭, 先把碗放下, 然后下一顿饭用到这个碗了再洗碗, 就是懒汉方式.懒汉模式最核心的思想...

2019-04-09 17:46:57 293

原创 线程池---详解及代码实现

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

2019-04-09 17:32:43 1114

原创 生产者消费者模型---详解及代码实现

概念生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。321原则三种角色:生产者、消费者、仓库两种关...

2019-04-09 12:46:45 49102 11

原创 多线程编程---死锁详解

死锁概念死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所占用的不会释放的资源而处于一种永久等待状态。死锁的四个条件互斥条件:一个资源每次只能被一个执行流使用。请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不释放。不剥夺条件:一个执行流已获得的资源,在未使用完之前,不可强行剥夺。循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系...

2019-04-08 16:53:06 1148

原创 如何快速转载别人的博客 详解

一、在要转载的博客处右键点击检查/F12二、在Elements中寻找body标签,点击三角标,打开body标签三、在body中找div class=“container clearfix” id=“mainbox”,点击三角标,打开div标签四、在div标签中找到main,进而找到 class=“blog-content-box”五、在class=“blog-content-box...

2019-04-03 15:31:52 198

转载 如何理解HTTP协议的 “无连接,无状态” 特点?

HTTP 是一个属于应用层的面向对象的协议,HTTP 协议一共有五大特点:1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态。无连接无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原...

2019-04-03 15:05:02 248

转载 信号量、互斥锁,读写锁和条件变量的区别

原文地址:信号量、互斥锁,读写锁和条件变量的区别 作者:qqrilxk信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量是,也可以完成一个资源的互斥访...

2019-03-29 09:48:02 331

转载 线程同步:原子操作、锁、二元信号量、信号量、互斥量、临界区、读写锁、条件变量

原子操作共享数据(全局变量或堆变量)的自增(++)操作在多线程环境下会出现错误是因为这个操作(一条c语句)被编译为汇编代码后不止一条指令,因此在执行的时候可能执行了一半就被调度系统打断,去执行别的代码。我们把单指令的操作称为原子的(Atomic),因为无论如何,单条指令的执行是不会被打断的。为了避免出错,很多体系结构都提供了一些常...

2019-03-29 09:43:06 423

原创 引用和指针的区别和联系

一、引用的适用场景1.引用变量int a = 1;int& b = a;2.引用做函数的参数。函数中如果不需要对形参进行修改,最好在引用前加constvoid swap(int& left.int&right){ int temp = left; right = left; left = temp;}3.引用做函数的返回值。如果返回值出了函数的作用...

2019-03-19 16:10:41 204

原创 函数重载,函数重写(同名覆盖),函数重定义(同名隐藏)

三重-------函数重载,函数重写(同名覆盖),函数重定义(同名隐藏) 一、函数重载直接上图吧!概念:函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不...

2019-03-17 15:09:47 1993

转载 【C++】unordered_map,unordered_set,map和set的用法和区别

参考链接:https://blog.csdn.net/zjajgyy/article/details...

2019-03-16 18:03:23 716

转载 C++中STL常用容器的优点和缺点

我们常用到的STL容器有vector、list、deque、map、multimap、set和mu...

2019-03-16 17:52:54 161

原创 C语言中%d,%o,%f,%e,%x的意义

格式说明由“%”和格式字符组成,如%d%f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“%”字符开始的。不同类型的数据用不同的格式字符。&nbsp;格式字符有d,o,x,u,c,s,f,e,g等。&nbsp;如%d整型输出,%ld长整型输出,%o以八进制数形式输出整数,%x以十六进制数形式输出整数,%u以十进制数输出unsigned型数据(无符号数)。%c用来输出一...

2019-03-09 16:41:06 1441

转载 取消Linux下VIM的自动备份功能 Linux下文件名后面带有~ 解决方法

产生原因通过文本编辑器,如VIM打开文件,会生成一个相同文件名+波浪号的文件。这个带波浪号的文件是VIM的备份文件。解决办法**1.**删除方式可以通过以下命令删除目录下所有的这类备份文件:rm -fr .~2.永久解决方法1):取消vim自动备份的设置进入到vim的安装目录,一般为 /usr/share/vim/vim72如果有 .vimrc.vim 文件,查找到该文件...

2019-03-07 17:04:53 656

原创 【LeetCode】876. 链表的中间结点

题目描述给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 。(测评系统对该结点序列化表述是 [3,4,5])。 注意,我们返回了一个 ListNode 类型的对象 ans,这样: ans.val = 3, ans....

2019-03-04 17:53:29 93

原创 【LeetCode】21-合并两个有序链表

题目描述将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1-&gt;2-&gt;4, 1-&gt;3-&gt;4输出:1-&gt;1-&gt;2-&gt;3-&gt;4-&gt;4合并两个有序链表,首先创建一个头结点,然后根据两个链表的val大小插入新链表中,当一个链表结点为空时,跳出循环,将另一个链表的剩余所有节点接到新链表后...

2019-03-04 17:30:59 143

原创 归并排序讲解及代码实现

基本思想将待排序的元素序列分成两个长度相等的子序列,对每一个子序列排序,然后将他们合并成一个序列。合并两个子序列的过程称为二路归并int array[] = {21, 25, 49, 25, 16, 8, 31, 41};代码实现void _MergeSort(int *a, int left, int right, int *tmp){ if (left &amp;gt;= righ...

2019-03-04 16:16:29 3752 2

原创 快速排序讲解及代码实现

基本思想快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。代码实现第一种方法:左右指针法1.begin从最左边开始,end从最右边开始,用三数取中法设置...

2019-03-04 16:04:38 211

原创 冒泡排序讲解及代码实现

基本思想思路:将相邻两个数进行比较然后交换,一趟冒泡可以将最大的数放在最后。代码实现void BubbleSort(int* array, size_t n) //冒泡排序{ int i, j = 0; int temp = 0; for (i = 0; i &amp;lt; n; i++) { for (j = i + 1; j &amp;lt; n; ...

2019-03-04 15:13:50 273

空空如也

空空如也

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

TA关注的人

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