- 博客(85)
- 收藏
- 关注
原创 集线器、交换机、路由器是如何转发包的
由于收到包的哪个端口就连着发送这个包的设备,所以只要将这个包的发送方MAC地址写入地址表,以后当收到发往这个地址的包时,交换机就可以将它发送到正确的端口了。信号到达网线接口部分,其中的PHY(MAU)模块和MAC模块将信号转换为数字信息,然后通过包末尾的FCS进行错误校验,如果没问题则检查MAC头部中的接收方MAC地址,看看是不是发送给自己的包,如果是就放到就收缓冲区,否则就丢弃这个包。接下来,转发模块会根据收到的包的IP头部中记录的接收方IP地址,在路由表中进行查询,以此判断转发目标。
2023-10-08 22:52:32
3334
3
原创 go语言使用grpc
gRPC是由Google开发的一款语言中立、平台中立、开源的远程过程调用( RPC)技术,主要用来解决性能损失的问题。gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建。它使用HTTP/2作为通信协议,使用Protocol Buffers作为序列化协议。
2022-09-25 16:26:27
925
原创 golang——slice避坑
如上代码,假设母切片占用内存8M,child切片是在parent基础上构造的占用内存1M,子切片和母切片共享同一块内存,当函数返回后,母切片已经不在使用,本该进行释放,但是由于和子切片公用一块内存未释放母切片,造成了7M的内存泄漏,正确做法应该是给子切片开辟空间,然后for循环将需要的数据从母切片拷贝到子切片上,然后返回子切片。golang的slice类似于c++的vector,都是有len和cap的,当len
2022-09-13 23:34:17
765
原创 golang协程原理
在最开始的时候,程序都是串行执行的,即一个程序执行完才能去执行下一个程序,这个时候也是没有多进程\线程的说法的。这种执行模式最大的缺点就是由于执行流程单一,当正在执行的程序阻塞时,cpu只能白白耗着,非常的浪费资源。为了解决这种问题,出现了多进程\线程。多进程\线程的出现提高了cpu的利用率,当正在执行的程序阻塞时,就可以切换另一个程序进行执行。但是进程的切换代价是比较高的,需要保存一个进程的程序执行上下文、程序计数器、打开的文件描述符……等一系列资源,然后切换到另一个进程。切换成本也是cpu资源的浪费。
2022-09-12 16:12:14
949
1
原创 JavaScript原型与原型链
原型与原型链原型显式原型与隐式原型原型链原型我们创建的每个函数都有一个 prototype(原型) 属性,这个属性是一个指向一个对象的指针,这个对象的用途是存储由该函数实例化出的所有对象所共享的属性和方法。在默认情况下,所有原型对象都会自动获得一个 constructor(构造函数) 属性,这个属性是一个指向 prototype 属性所在函数的指针举个例子,如下代码:func Person() { Person.prototype.name = "jack" Person.prototype.
2022-04-29 21:08:30
1922
原创 Vue路由
vue路由Vue-Router对SPA应用的理解路由的理解什么是路由路由分类路由的基本使用关于路由的注意点嵌套路由(多级路由)路由的query参数命名路由路由的params参数路由的props配置\的replace属性编程式路由导航缓存路由组件和路由有关的生命周期钩子路由守卫全局守卫独享守卫组件内守卫Vue-Routervue的一个插件库,专门用来实现 SPA应用对SPA应用的理解单页web应用(single page web application, SPA)整个应用只有一个完整的页面单击页
2022-04-24 10:53:44
1027
原创 Vue——vuex
Vuex概念搭建vuex环境vuex的基本使用四个map的用法模块化+命名空间概念在vue中实现集中式状态(数据)管理的一个 Vue 插件,对Vue应用中多个组件的共享状态进行集中式的管理,也是一种组件间通信的方式,且适用于任意组件间通信。搭建vuex环境创建文件:src/store/index.js//引入Vue核心库import Vue from 'vue'//引入Vueximport Vuex from 'vuex'//应用Vuex插件Vue.use(Vuex)//准备acti
2022-04-22 23:23:47
416
原创 Vue插槽
插槽概念父组件向子组件指定位置插入 html 结构,也可以适用于父子组件之间的通信分类:默认插槽具名插槽作用域插槽使用方式默认插槽<!-- 父组件中写法 --><son> <div> Your Profile </div></son><!-- 子组件中写法 --><template> <div> <!-- 定义插槽 --> <slot>
2022-04-22 21:55:57
606
原创 Vue组件
组件的使用Vue中使用组件的三大步骤:定义组件(创建组件)注册组件使用组件(写组件标签)如何定义一个组件?使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但也有点区别;区别如下:el不要写,为什么?—最终所有的组件都要经过一个vm的管理,由vm中的el决定服务哪个容器。data必须写成函数,为什么?——避免组件被复用时,数据存在引用关系。备注:使用template可以配置组件结构。如何
2022-04-19 23:51:39
344
原创 Vue数据检测原理
vue会监视data中所有层次的数据。如何检测?通过setter实现监视,且要在new Vue时就传入要监测的数据。对象中后追加的属性,Vue默认不做响应式处理如需给后添加的属性做响应式,请使用如下Vue.set(target.propertyName/index,value)或vm.$set(target,propertyName/index,value)如何检测数组中的数据?通过包裹数组更新元素的方法实现,本质就是做了两件事:调用原生对应的方法对数组进行更新。重新解析模板,进而
2022-04-19 23:13:51
634
原创 react、vue中的key的内部原理
虚拟DOM中key的作用:key是虚拟DON对象的标识,当状态中的数据发生变化时,Vue会根据【新数据】生成【新的虚拟DoN】,随后Vue进行【新虚拟DOM】与【旧虚拟DOM】的差异比较,比较规则如下:对比规则(1).旧虚拟DOM中找到了与新虚拟DOM相同的key:①若虚拟DOM中内容没变,直接使用之前的真实DOM !②若虚拟DOM中内容变了,则生成新的真实DON,随后替换掉页面中之前的真实DOM.(2).旧虚拟DOM中未找到与新虚拟DOM相同的key创建新的真实:DOM,随后渲染到到页面。.
2022-04-19 23:01:07
261
原创 golang——反射
反射基本概念反射规则反射API反射三定律反射优缺点优点缺点基本概念Go的反射基础是接口和类型系统。Go的反射借助了实例到接口的转换所使用的的数据结构,首先将实例传递给内部的空接口,实际上是将一个实例类型转换为接口可以表述的数据结构eface ,反射基于这个转换后的数据结构来访问和操作实例的值和类型。在Golang的实现中,每个interface变量都有一个对应的pair,pair中记录了实际变量的值和类型: (value, type)value是实际变量值,type是实际变量的类型。一个inte
2022-04-13 22:00:36
4847
2
原创 hexo搭建个人博客并部署github
环境准备首先要使用 hexo 搭建个人博客就要安装 hexo,安装 hexo 需要 “npm 包管理工具”。我们需要将博客部署到 github 上自然也需要安装 git提示:本文在搭建博客过程中会频繁使用命令行,windows用户使用管理员身份打开终端,mac用户打开终端切换到root用户安装 npm包管理工具npm包管理工具是安装 node.js 时附带安装的,所以要安装 npm 只需要安装 node.js 即可。安装 node.js:去node.js的官网 https://nodejs.or
2021-06-27 20:53:40
407
5
原创 设计模式之简单工厂模式
模式定义简单工厂模式(Simple Factory Pattern)定义为:简单工厂模式又称为静态工厂方法(Static Factory Method)模式,它属于类创建模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。模式结构简单工厂模式包含如下角色:Factory(工厂角色)工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂模式类可以被外界直接调用,创建所需的产品对象;
2021-04-20 21:10:12
378
原创 设计模式之单例模式
模式定义单例模式(Singleton Pattern)定义:单例模式确保一个类只有一个实例,而且自行实例化并向系统提供这个实例,这个类成为单例类,它提供全局访问的方法。单例模式的要点有三个:一个是这个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。 单例模式是一种对象创建型模式。单例模式又名单件模式或单态模式。模式分析单例模式只包含一个 Singleton(单例角色):在单例类得内部实现只生成一个实例,同时它提供一个静态得 getInstance()工厂方法,让客户
2021-04-18 11:08:42
198
原创 shell中的控制语句
shell中的控制语句条件测试语句文件测试字符串测试数值测试逻辑操作符if条件语句select语句case语句for语句类似于C语言的for循环语句while语句shell中的控制语句条件测试语句在shell中,用户可以使用测试语句来测定指定的条件表达式的条件的真和假。当指定条件为真,条件测试的返回值为 0,繁殖,条件测试的返回值为非 0值。条件测试的语法有两种,分别是 test命令和[]命令test命令语法格式如下:test expression其中,参数expression表示需要进行测.
2021-04-10 22:04:31
836
2
原创 shell的特殊字符
shell的特殊字符shell的通配符shell的元字符shell的转义符shell的特殊字符shell的通配符通配符说明*匹配任意多个字符串,在搜索文件时使用?匹配任意一个字符[list]匹配该字符组所限定的任何一个字符[!list]匹配除了字符组外所限定的任何一个字符[c1-c2]匹配c1-c2中的任何一个字符shell的元字符元字符说明=变量名=值,为变量赋值。注意“=”左右紧跟变量名和值,中间不要有空格.
2021-04-10 19:57:17
329
1
原创 shell简述以及shell中的变量
shell简述shell功能shell脚本的执行shell中的变量shell常见修改和查看环境变量的命令shell的系统变量shell的用户自定义变量shell中变量的数学运算shell简述shell功能shell主要有两个功能,一个是命令解释器;另一个是作为高级程序设计语言可以编出代码简洁、功能强大的程序。shell作为命令解释器的具体功能:它接收用户输入的命令,进行分析,创建子进程,由子进程实现命令所规定的功能,等子进程终止后,发出提示符。shell作为一种高级程序设计语言,它几乎有高级语言.
2021-04-10 17:36:45
669
2
原创 Redis 持久化
什么是持久化RDBAOFAOF 文件的写入AOF重写AOF重写触发方式自动触发手动触发混合持久化什么是持久化redis是一个内存数据库,所有的数据都存在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 redis的数据不会因为故障而丢失,这种机制就是 redis 的持久化机制。redis有两种持久化方式:一种为 RDB 方式(RDB保存某一个时间点之前的数据),另一种是 AOF 方式(AOF保存的是 redis 服务器端执行的每一条命令)。RDB 也叫做快照,是一次全量备份,快照是.
2021-03-30 20:18:03
141
3
原创 B树和B+树的简单了解
B树B树概念B树的插入B+树的简单介绍B+树的特性总结B树B树概念B树是一种平衡多叉树,。一棵M(M>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树,或者满足以下性质:根节点至少有两个孩子每个非根节点至少有 M/2 (上取整)个孩子,至多有M个孩子每个非根节点至少有 M/2 - 1(上取整)个关键字,至多有 M-1个关键字,并且以升序排列key[i] 和 key[i+1]之间的孩子节点的值介于 key[i],key[i+1]之间所有叶子节点都在同一层B树的插入插入过程总.
2021-03-11 11:10:36
480
2
原创 数据库的事务
什么是事务定义数据库事务是访问并可能更新数据库中各种数据项的一个程序执行单元组成一个数据库事务通常包含对数据库进行读或写的一个操作序列目的为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此操作相互干扰成功情况下: 能将数据从一种状态变为另外一种状态,并且能够持久化异常情况下:能将数据恢复到正常状态要能保证一致性,包含数据的一致性和约束的一致性
2021-03-04 11:32:37
322
2
原创 s1mple_cloud
简易云盘项目简介基于http协议实现本机与服务器之间文件的上传、下载、以及文件列表展示等功能。解决了网盘下载限速的问题。项目特点线程池多路转接套接字TCPHTTP流程设计搭建一个tcp服务器,接收客户端连接请求,建立连接基于多路转接模型进行总线事件监控,若有事件到来,则将描述符抛入线程池中线程池中的线程操作http协议格式请求数据解析http协议解析流程根据 \r\n\r\n 获取整个头部头部解析,得到 content-length,然后获取正文分析请求(请求方法
2021-02-19 20:40:43
159
原创 智能指针
为什么要使用智能指针?存在以下两个问题malloc 出来的空间,如果没有进行释放,存在内存泄漏的问题如果在 malloc 和 free 之间如果存在抛异常,那么还是有内存泄漏。这种问题就叫异常安全内存泄漏什么是内存泄漏,以及内存泄漏存在的危害什么是内存泄漏: 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费内存泄漏的危害: 长期运行的程序出现内存泄漏,
2020-10-26 09:58:45
157
2
原创 字符函数和字符串函数
size_t strlen(const char* str); 求字符串长度字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )参数指向的字符串必须要以 ‘\0’ 结束函数的返回值为size_t,是无符号的(特别注意用返回值相减然后与 0 比较大小)char* strcpy(char * destination, const char * source ); 字符串拷贝源字符串必须以 ‘\0’ 结束会将源字符串中的
2020-10-20 12:33:04
227
原创 多维数组初始化用到小括号
#include <stdio.h>int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) }; printf("%d\n",a[0][0]); printf("%d\n",a[0][1]); printf("%d\n",a[1][0]); return 0;}运行结果如下:为什么会是 1 3 5?因为这算是逗号运算符:优先级别最低,将两个以上的式子联接起来,从左到右逐个计算表达式,整个表达式的值为最后一个表达式的值。例如
2020-10-20 11:15:38
921
2
原创 Boost文档搜索
源码戳这里Boost 文档搜索是基于 boost 文档的一个站内搜索引擎,当用户在页面上输入查询词后,就能查询出相关 boost 的在线文档。具体搜索过程:对离线版本的 html 文档进行解析,并将解析结果放到一个文本文件中读取处理好文本进行分词以及权重计算等过程,构建出正排索引和倒排索引对查询词进行分词,根据查询词的分词结果进行倒排索引查找,将结果按照权重进行排序通过 HTTP 服务器搭载搜索页面提供服务整个项目分为四个模块:预处理模块、索引模块、搜索模块、服务器模块预处理模块输入
2020-10-10 18:45:39
497
1
原创 MySQL——增删改查
写在前面:数据库语句,每条语句都要以英文分号作为结尾数据库语句,不区分大小写数据库语句、表名、库名、字段名这些信息不能使用关键字,若非要使用,需要加上反引号(英文模式下 键盘ESC下边的按键)库的操作查看库:show databases;创建库:create database db_name;删除库:drop database db_name;使用库:use db_name;在创建库的时候,如果要创建的库的名字已经存在,就会报错,所以使用语句 create database if
2020-10-04 15:26:41
224
原创 协程实现网络服务器
对于操作系统而言,进程是最小的资源管理单元,线程是最小的执行单元。对于一个线程,在使用中,性能可能会受到以下因素的影响:涉及到线程阻塞状态和可运行状态之间的切换线程上下文的切换同步锁……所以引入协程——更加轻量级的线程。就像进程和线程的关系一样,一个进程可以拥有多个线程,一个线程可以拥有多个协程。协程是在用户态执行的,所以不会像线程切换那样消耗资源,使性能得到提升。可以说,线程是一个特殊的函数,这个函数可以在某个地方挂起,并且可以在挂起处继续运行。一个线程内可以由多个这样的特殊的函数在运行
2020-10-01 11:30:47
1066
2
原创 并查集
并查集原理在一些有N个元素的集合应用问题中,需要将N个不同的元素划分成一些不相交的集合。开始时,每一个元素自成一个单元素集合,然后按照一定的规律将归于同一组元素的集合合并。其间要反复查找一个元素在哪个集合中。适用于描述这一类问题的抽象数据类型称为并查集(Union find set)。实际上,并查集的存储是一个森林,每一个集合是一个树。观察数组融合规律,得出以下结论:数组的下标对应集合中元素的编号数组中如果为负数,负数代表根,数字代表该集合中的元素个数数组中如果为负数,代表元素双亲在数组中的
2020-09-01 21:21:40
153
原创 Linux下的典型IO模型以及IO多路复用
阻塞IO非阻塞IO信号驱动IO异步IO多路转接IOselect函数原型select执行过程socket就绪条件select的特点select的缺点pollpoll函数原型poll执行过程poll的优缺点epoll :Linux下最好用的多路转接模型epoll执行流程epoll工作原理epoll的工作方式epoll的优缺点多路转接模型进行服务器并发处理与多进程/多线程并发并行处理有什么区别?阻塞IO在内核将数据准备好之前,系统调用会一直等待。所有的套接字,默认都是阻塞方式。就像去钓鱼,鱼没有上钩,就一直.
2020-07-30 21:27:20
259
1
原创 C++11中的右值引用和lambda表达式
右值引用右值和左值是什么右值引用的概念\引用与右值引用完美转发lambda表达式语法规则函数对象右值引用右值和左值是什么普通类型的变量,有名字,可以取地址,都认为是左值。const修饰的常量,是左值如果表达式运行结果或单个变量是一个引用则认为是左值。如果表达式的运行结果是一个临时变量或者对象,认为是右值。需要注意的是int a = 10;这一句里边,a是左值,而10是右值并且是纯右值,因为10只是一个符号,没有具体的空间C++11对右值进行了严格的区分:C语言中的纯右值,比如:a+b.
2020-07-26 18:08:56
935
原创 数据链路层——以太网和ARP协议
以太网认识以太网认识MAC地址MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响APR协议什么是APR协议APR如何工作APR协议格式以太网认识以太网“以太网” 不是一种具体的网络,而是一种技术标准,既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等以太网帧格式:源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的proto:帧协议类型字段有三种值,分别对应IP、ARP、RAR.
2020-07-22 17:37:23
846
原创 网络层——IP协议
协议格式网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址协议格式4位版本号:指定IP协议的版本,对于IPv4来说,就是44位首部长度:标识IP报头的长度,最小20字节(固定报头),最大60字节(0~40的选项数据)8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。4位TOS分别表示:最小延时、最大吞吐量、最高可靠性、最小成本。这四者相互冲突,只能选择一个16位总长度:IP数据报整体占多少个字节16位标识:唯一的标识主机发送的报文。如果.
2020-07-22 11:46:00
325
原创 传输层——UDP协议和TCP协议
UDPUDP协议格式UDP协议特点UDP的缓冲区UDP注意事项基于UDP的应用层协议TCP协议TCP协议格式TCP协议特点TCP协议机制确认应答(ACK)机制超时重传机制连接管理机制滑动窗口机制拥塞控制机制延迟应答机制捎带应答机制UDPUDP协议格式UDP协议特点无连接: 知道对端的IP和端口号就直接进行传输, 不需要建立连接不可靠: 没有确认机制,没有重传机制,如果因为网络故障该段无法发到对方, UDP协议层也不会给应用层返回任何错误信息面向数据报: 不能够灵活的控制读写数据的次数和数量.
2020-07-21 15:07:47
549
原创 应用层——HTTP协议
HTTPURLurlencode和urldecodeHTTP协议格式HTTP请求HTTP响应HTTP的方法HTTP的状态码HTTP中常见的HeaderURL我们平时说的网址其实就是URL(统一资源定位符),在网络中唯一定位服务器上的某个资源,向指定服务器请求指定资源。urlencode和urldecodeurlencode(url编码):像?/这样一些字符已经被url做特殊意义理解了,所以就不能随便出现。如果某个参数中带有这一类字符,就要先进行转义。转义的规则: 将需要转码的字符转为16进制,
2020-07-20 20:00:38
395
原创 哈希
哈希概念在顺序结构或者平衡树中,找到一个元素要经过多次比较,在顺序结构中可能要经历O(N)次,在平衡树中也要经过 O(log2N)。而哈希则建立了一种映射关系,比如说在ASCII码中,小写字母’a’对应的ASCII码是97,'a’和97便是一种映射关系,通过这种映射关系,就能更快的找到一个元素。哈希冲突哈希中找到映射关系所使用的转换函数称为哈希函数,构造出来的结构称为哈希表。例如如下的哈希函数:hash(key) = key % capacity。不同的关键字通过相同的哈希函数计算出了相同的哈希
2020-07-19 11:59:14
365
原创 map和set
map和set和是关联容器,和vector、list之类的不同,map和set一次存两个值,存的是是一个键值对,对于map存的是<key,value>,对于set存的是<value,value> 。mapmap的构造函数map<type,type> m1;map<type,type> m2(m1.begin(),m1.end());map<type,type> m3(m2);map支持迭代器。map的接口bool empty(
2020-07-14 16:09:57
230
原创 AVL树
什么是AVL树首先AVL树是二叉搜索树,但是严格的控制高度,因为如果插入树的序列原本就是有序的,那二叉搜索树就近似于链表,查找效率极其低下,所以就引入AVL树并且满足下列条件。每个结点左右子树高度差不超过 1左右子树仍然满足上述条件由于严格的控制高度,所以AVL树的查找效率还是 O(log2N),如果有N个结点,就会把树的高度控制在O(log2N)AVL树的插入首先按照二叉搜索树的插入方式进行插入(如果为空直接插入作根节点,如果不为空,比当前结点大就到左子树,比当前结点小就到右子树,在合适的
2020-07-01 01:17:23
310
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人