自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 网页版群聊系统

项目简介应用技术

2019-08-18 10:16:01 2824

原创 AI语音助手

项目简介

2019-08-08 11:08:22 2332

原创 进程间通信(system V共享内存)

一、共享内存的原理首先在物理内存中开辟一段空间,然后利用内核级页表和进程的地址空间建立映射关系,当把数据写入共享内存时,即可完成进程间通信。二、共享内存的特点共享内存是system V进程间通信过程中速度最快的共享内存没有同步与互斥机制,需要用户自己完成共享内存的生命周期随内核,只要不删就一直在先看一幅图:所以建立共享内存可分为四步: 1.在物理内存中开辟一段空间 2.虚拟...

2019-08-20 18:44:08 351

原创 进程间通信(管道)

在介绍进程间通信之前,我们首先要理解进程间通信是什么?为什么需要进程间通信?这是两个最基础的概念,下面我将详细介绍。一、进程间通信是什么?简单而言,就是让不同的进程看到同一份资源,这里的资源一般是指某一块内存。二、为什么需要进程间通信?在实际中,多个进程需要协同工作,但是进程是独立的,所以就有了进程间通信。三、进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享...

2019-08-20 12:17:37 244

原创 理解Linux下的inode

在讲inode之前,首先要明白为什么会有inode ?inode是用来干啥的?带着这两个问题,我将开始讲述我理解的inode 。设想一个场景,在windows下,创建一个新的文件,这个文件都包含哪些信息?最基本的包含文件属性和文件数据,而文件属性包括文件大小、创建时间、文件类型…数据就是我们在文件中写入的东西,那在Linux下也是一样的,创建一个文件也需要创建这些东西,但是又牵扯到属性和数据分离...

2019-08-16 18:19:26 261

原创 进程的程序替换以及exec类的函数测试

在介绍进程的程序替换时,我们首先得明白为什么要进行程序替换??程序替换是创建一个新的进程吗??替换了哪些东西??搞清楚这三点是至关重要的!!!一、为什么要进行程序替换以及替换了哪些东西调用用fork()函数创建子进程,子进程以父进程为模板,把父进程的PCB、地址空间、代码等都拷贝了一份,那子进程再去执行和父进程一模一样的程序又有什么意义呢?所以进行程序替换,将硬盘上的代码和数据替换到进程物理内...

2019-08-12 21:43:39 217

原创 子进程退出,父进程为什么要等待?

在模拟实现之前,我们首先看一下以下几点一、父进程为什么要等待?1、僵尸进程,造成内存泄漏2、父进程得管理子进程,所以父进程派给子进程的任务完成的如何,我们都需要知道,如,子进程运行完成,运行结果对还是不对,或者是否正常退出3、父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息二、等待的方法wait方法pid_t wait(int *status);返回值:成功返回被等待...

2019-08-12 16:03:12 1754

原创 进程终止 exit和_exit的区别

一、进程退出的三种场景代码运行完毕,结果正确代码运行完毕,结果错代码异常终止(不需要再看退出码)二、进程常见退出方法(利用echo $?可以查看最近一个进程的退出码)从main函数返回调用exit_exit注意:return :在main函数中调进程退出exit/_exit:在任何地方调进程都会退出三、exit 和 _exit的不同首先看一个例子:调用_exit函...

2019-08-12 14:16:04 965 1

原创 【leetcode】n皇后(DFS+回溯)

题目描述:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。题解:需要注意的是题目中的皇后之间不相互攻击,指的是所有皇后不能出现在同行、同列、以及各个“对角线”解题思路:此题用...

2019-08-11 21:11:49 150

原创 Linux下的环境变量

在讲环境变量之前,先看一个测试用例:编译代码之后,生成了可执行程序a.out,我们每次运行的时候都要**./a.out**运行,而直接输入,却告诉命令找不到;但是为什么ls之类的系统命令可以直接运行呢?这就和环境变量强相关了。环境变量是由操作系统提供的,可以查找系统命令在系统中的所在路径。而且在系统中通常具有全局属性,可以被子进程继承下去。我们自己的命令之所以运行不了,是因为没有添加到系...

2019-08-03 18:17:15 260

原创 漫画图解正反代理

点击连接:https://mp.weixin.qq.com/s/D6HLGuUgXB4xoc7_cfJBew总结:正向代理:更靠近客户端,客户想访问外网服务器,直接把任务丢给代理服务器,让代理服务器去拿信息,对于外网服务器而言,并不知道真正访问它的客户IP。反向代理:靠近服务器,客户想访问外网,自己去访问,但是访问到的却是外网的代理服务器,类似于租房的二房东,对于客户而言,并不知道真...

2019-08-02 09:55:33 545

原创 NAT技术如何解决IP地址不足的问题

IP地址是4字节的,所以一共有2的32个次方个左右,即43亿左右,而每个主机都需要一个IP地址,难道43亿主机都能接入网络吗?并不是的!实际上,由于一些特殊的IP地址的存在,数量远不足43亿,另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址。所以现在有三种方法解决IP地址不足问题,此处我详细介绍NAT技术。DHCP动态分配IP地址:只给接入网络的设备分配I...

2019-07-31 19:26:21 6748

原创 http协议如何解决粘包问题

在讲粘包问题之前,首先得明白这个包是应用层的数据包。当数据在传输层时,由于TCP是面向字节流的,所以它看到的数据是按照顺序一个个放在缓冲区中的,而对于应用层而言,看到的只是一连串的数据,那么应用层该从哪里读数据,读到哪合适呢?因此就有了粘包问题。所以要避免粘包问题,就得明确两个包之间的边界:对于定长的数据包,保证每次都按固定的大小读取即可;对于变长的包,可在包头的位置,约定一个包总长度的...

2019-07-31 15:29:30 9858 1

原创 【UDP】浅析UDP协议

UDP和TCP都是传输层协议,但是UDP相对而言比较简单,没有TCP丰富的机制,下面我将从以下几个部分介绍UDP:一、UDP协议端的格式16位UDP长度,表示整个数据报(首部+数据)的长度如果检验和出错,就会直接丢弃该报文(注意只检验报头)二、UDP的特点三、UDP的缓冲区对于UDP而言,是没有真正意义上的发送缓冲区的,它会将封装好的报文调用sendto直接交付给内核,由内核...

2019-07-30 16:04:49 245

原创 初识五种高级IO模型

在谈五种高级IO之前,首先我们要明白,站在用户层面:IO = 等 + 数据拷贝(读写数据),读/写分为两步:等数据就绪,然后再读。高级IO模型,大类可分为同步和异步两种,需要注意的是,这里的同步不等同于线程的同步,本文会做详细说明,大家一定不要混淆!以下IO在介绍的时候,都以钓鱼为例。一、同步IO阻塞IO在内核将数据准备好之前,系统调用会一直等待,所有的套接字,默认都是阻塞方式。例...

2019-07-29 19:47:02 231

原创 【TCP】拥塞控制

拥塞控制----衡量网络状态前面我们讲了TCP可以通过滑动窗口批量发送数据包来提高性能,但是试想一下,如果网络特别拥堵,刚开始就发送了大量数据,就会导致丢包,进而触发重传机制等等,可以说是雪上加霜啊!鉴于此问题,TCP引入慢启动机制,开始先发少量的数据探探网络情况,然后再决定按照多大的速度传输数据。在谈慢启动机制之前,我们先谈一下拥塞窗口,==发送端开始发数据的时候,会将拥塞窗口的大小设置为...

2019-07-25 18:21:22 292

原创 【TCP】流量控制 TCP首部窗口大小

我们都知道每一个TCP连接都在内核中有接收缓冲区和发送缓冲区,但这些缓冲区的大小都是有限的,如果发送端发送数据太快,接收端来不及处理,接收缓冲区被打满,这时如果发送端再继续发送数据包,就会造成丢包,继而引起重传等等一系列反应,降低了数据包的传输效率。因此TCP支持根据发送端的处理能力,来决定发送端的速度,这个机制就叫做流量控制。接收端将自己的接收缓冲区的大小放入TCP首部的窗口大小字段,通过...

2019-07-25 17:35:27 1466

原创 【TCP】滑动窗口 快重传

在讲TCP的三大窗口之前,我们先来谈一下接收缓冲区和发送缓冲区,为什么会有这两个缓冲区呢?试想一下,若没有缓冲区,数据在两台主机之间直传一、TCP协议段中的16位窗口大小由于TCP是全双工的,所以客户端和服务器建立连接之后,双方会有自己的接收缓冲区和发送缓冲区,TCP协议段中的16位窗口大小是自己的接收缓冲区中剩余空间的大小。...

2019-07-24 12:22:09 191

原创 listen的第二个参数详解

之前对于listen的第二个参数的理解,只是停留在它代表服务器缓冲区队列的大小层面上,具体并没有详细研究过,一次偶然的tcp实验,发现了很大的bug。当服务器端没有调用accept函数时,此时3个客户端同时连接服务器,用netstat查看服务器状态,但是当启动第4个客户端时,发现客户端状态正常,服务器出现了SYN_RECV状态,而不是ESTABLISHED状态,如下图所示:这是因为,Linux...

2019-07-21 19:54:30 1371

原创 牛客网求和

题目描述:输入两个整数 n 和 m,从数列1,2,3…n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来。这道题一开始就是懵圈的,看了大神的解题思路,递归用的很巧妙,虽然看了很久才看明白。。。。主要思路就是递归和vector相结合。如下是详细代码以及部分代码解释:...

2019-07-18 21:15:22 211

原创 应用层协议http

之前谈到协议的时候,只是简单的理解成一种约定,但是socket api的接口在读写数据时,都是按照字符串的方式来发送接收的,如果我们要传输一些结构化的数据又该怎么办呢?由此就有了序列化和反序列化,即在发送数据时结构化的数据按照一个规则转化成字符串,接收到数据的时候再按照相同的规则把字符串转化成数据。这种在一端发送时构造的数据,在另一端接收时能够正确的解析,我们将其称为应用层协议。下面我将介绍应...

2019-07-16 10:37:24 282

原创 HTTP协议get和post的区别详解

http协议属于应用层协议,底层当然是基于tcp协议实现的,对于http协议的方法,主要有**增删查改(put、delete、get、post)**这几个,当然还有head(获得报文首部)、options(询问支持的方法)等方法,本文我主要介绍get和post的方法以及它们的区别,至于其他方法相信大家都挺容易理解的,这里我就不一一介绍了。对于get和post的区别与用法可以先简单的这样理解:g...

2019-07-13 21:02:48 213

转载 socket常用API详解

一、socket概述socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。二、...

2019-07-11 18:13:35 3651

转载 堆与栈的区别

一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(...

2019-07-10 17:29:50 101

原创 跳台阶和变态跳台阶

1、跳台阶题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路分析:一只青蛙跳台阶有两种选择,要么跳一级,要么跳两级,所以可以列举出以下几种情况:台阶级数 跳法1 12 23 34 ...

2019-07-02 14:39:24 418

原创 牛客网 数根(to_string)

首先来看一下to_string函数官方认证原型:函数使用方法很简单,就是把一个数字转换为一个字符串,返回值为string 对象。今天是在牛客网刷题时,需要把一个字符串转为数字,然后再转为字符串,刚开始直接将数字加了‘0’,发现并不可以,参考大佬的算法,接触到了to_string函数,下面介绍一下这道题:题目描述:数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这...

2019-07-01 19:36:45 493

原创 认识线程

一、线程基本概念对于线程基本概念的理解,可以记住这几句话:1、线程是在进程内部进行的2、线程是在进程地址空间运行的3、Linux没有真正意义上的线程,是用进程模拟的4、进程是承担分配系统资源的基本实体,线程是调度的基本单位下面以一幅图简单的描述一下线程上图中的多个PCB相当于线程,每个PCB只执行进程PCB的一部分,对于CPU而言,看到的是4个PCB,但对于进程而言,只有1个PCB...

2019-06-24 10:50:30 319

原创 查找两个字符串a,b中的最长公共子串。

题目描述:查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。首先找到a和b中最短的那个字符串。这道题我觉得最巧妙的解法是利用了substr截取a中的字符串,每截取一部分就去b中查找,若在b中,就把最长的字符串保存起来。另外需要注意的是find函数返回的是size_t类型的值,需要强转成int类型的。具体代码如下:#include <iostr...

2019-06-12 09:58:18 1241

原创 牛客网:倒置字符串

题目描述:将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I这道题我想到两种方法:1、从后往前遍历字符串,以空格分割,找到每个单词,然后再遍历每个单词,将单词逐个链到新字符串上,注意需要将第一个单词单独处理,具体代码如下:#include <iostream>#include <string>...

2019-05-24 13:28:26 321

原创 C++异常基础知识点

一、C语言传统的处理错误的方式1、终止程序:例如assert,但是这种处理异常的方式太粗暴,如果发生内存错误,除0错误时就会终止程序。2、返回错误码:这种错误需要程序员自己去查找对应的错误。例如系统很多库的接口函数都是通过把错误码放到error中,表示错误。3、C标准库中setjmp和longjmp来处理异常,但是这种方式不常用,了解即可。二、C++异常概念异常是一种处理错误的...

2019-05-15 20:26:52 226

原创 三种方法统计map中的元素个数

利用map可以统计元素个数,下面主要介绍这三种方法:1、利用find函数统计每一个元素出现的次数void test_map2(){ string strs[] = { "苹果", "香蕉", "草莓", "苹果", "香蕉", "香蕉", "香蕉", "苹果", "香蕉", "草莓" }; map<string, int> countmap; //利用find统计每一...

2019-05-08 12:28:09 30191 2

原创 map和multimap的用法详解

一、map的文档总结1、map是关联式容器,它按照key值比较存储,默认是小于;2、在map中,键值key通常用于唯一的标识元素,而值value中存储与此键值key关联的内容;键值key和value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起,为其取别名为pair;3、map中的元素是键值对;4、map中的key是唯一的,并且不能...

2019-05-08 12:11:51 29037 3

原创 C++范围for详解

范围for是遍历方式中的一种,以前在遍历的时候,经常会用到范围for,但对它的使用原理并不是很清楚,下面将对其做详细的介绍。以一段代码为例:int main(){ string strs[] = { "苹果", "香蕉", "草莓", "橘子" }; for (const auto& e : strs) { cout << e << " ";...

2019-05-07 20:05:06 2814 2

转载 C++中 pair 和 make_pair 的用法

参见大佬博客:https://blog.csdn.net/weixin_42825576/article/details/81571419另外我再补充一点:pair是二元组类模版,make_pair实际上是创建二元组的函数模版,在C++中,函数模版可省略参数,make_pair也是利用这一特性。...

2019-04-25 11:20:42 3638

原创 二叉搜索树的基本特征和模拟实现

一、二叉搜索树的定义二叉搜索树又称二叉排序树,它或者是一颗空树,或者是一棵排序树,它具有如下性质:1、若它的左子树不为空,则它的左子树的所有节点的值都小于根节点的值2、若它的右子树不为空,则它的右子树的所有节点的值都大于根节点的值3、它的左右子树也都是二叉搜索树二、二叉树的主要操作分析1、二叉树的插入a.若二叉树为空,则直接插入,然后返回trueb.若二叉树不为空,按照二叉搜索树的...

2019-04-24 18:43:15 813

原创 set和multiset的用法详解

一、set文档介绍1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访...

2019-04-16 21:00:12 6317

原创 leetcode13---罗马数字转整数

题目描述:罗马数字包含以下七种字符:I,V,X,L,C,D和M。字符 数值I 1V 5X 10L 50C 100D 500M 1000通常情况下,罗马数字中小的数字在大的数字...

2019-04-10 20:27:14 98

原创 操作系统如何搞管理?

前面关于操作系统的博客已经介绍了它的定义,简单来说,操作系统就是一款搞管理的软件。下面将介绍一下操作系统是如何管理的。首先要牢记一句话,操作系统搞管理的时候都是先描述再组织。为了容易理解,引入班主任管理学生的例子来讲一下管理,班主任要管理一个班的学生,学生的信息是一份很庞大的数据,如果一项一项去统计,难免会有些冗余,而且需要更新时也不容易更新,这时我们就会想到为什么不用结构体(struct...

2019-04-10 17:28:25 346

原创 初识冯诺依曼体系结构

在日常生活中,我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都在底层遵守冯诺依曼体系结构。下面通过一幅图来看一下冯诺依曼体系的框架图:上图需要注意的是,中央处理器(CPU)对外设(输入或输出设备)发送的只是一个控制信号,并不是直接去访问它们。截至目前,我们所认识的计算机,都是由一个个的硬件组成1、输入设备:包括键盘、鼠标、扫描仪、写板等;2、中央处理器(C...

2019-04-10 16:53:01 616

原创 OS(操作系统)概念

操作系统的定义操作系统是一款软硬件资源管理的软件。需要注意的有以下几点:1、操作系统扮演的是管理者,管理者拥有决策权2、硬件扮演的是被管理者,管理者是根据被管理者的数据进行相关决策的3、设备驱动扮演的是管理决策执行者,管理者和被管理者并不直接沟通,所以管理者(操作系统)和被管理者(软硬件)之间必须得有一个执行者角色(设备驱动)以上是关于操作系统的说明,需要明确操作系统是...

2019-04-08 20:08:47 2955

空空如也

空空如也

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

TA关注的人

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