自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

要回杭州的李同学

愿你满腔孤勇终不被辜负

  • 博客(34)
  • 收藏
  • 关注

原创 链表排序问题

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next.

2021-12-26 16:58:23 597

原创 二分查找算法

二分查找基础普通解法int BinarySearch(int *array, int size, int value) { int low = 0, high = size - 1; while (low <= high) { int mid = low + ((high - low) >> 1); if (array[mid] == value) { return mid; } else if (array[mid] < value) { lo

2021-12-23 19:16:59 151

原创 基础排序算法

#include <iostream>#include <algorithm>using namespace std;void print(int *array, int size) { for(int i = 0; i < size - 1; i++) { cout << array[i] << " "; } cout << array[size - 1] << endl;}void BubbleSor.

2021-12-22 23:52:58 301

原创 C C++混编

本文主要针对工程代码中C和C++代码混编需要注意的一个点进行记录。示例代码结构如下:编译结果如下所示:[... demo]$ ./build.sh-- Configuring done-- Generating done-- Build files have been written to: /home/10260390@zte.intra/桌面/demo/build[ 33%] Building C object CMakeFiles/hello_world.dir/main.

2021-11-15 19:26:02 984

原创 为什么有了TCP心跳机制,还要设计应用层心跳?

摘自 知乎:https://www.zhihu.com/question/40602902/answer/209148428因为TCP协议中的SO_KEEPALIVE有几个致命的缺陷:keepalive只能检测连接是否存活,不能检测连接是否可用。比如服务器因为负载过高导致无法响应请求但是连接仍然存在,此时keepalive无法判断连接是否可用。 如果TCP连接中的另一方因为停电突然断网,我们并不知道连接断开,此时发送数据失败会进行重传,由于重传包的优先级要高于keepalive的数据包,因此k.

2021-05-23 00:14:33 515

转载 完全公平调度

CFS原理CFS定义了一种新的模型,它给运行队列中的每个进程都设置了一个虚拟时钟,即vruntime。如果一个进程被调度器投入运行,随着时间的增长,其vruntime将不断增大,而没有得到执行的进程vruntime则不会发生变化。调度器总是选择vruntime最小的那个进程来运行,这就是所谓的“完全公平”。为了区分不同优先级的进程,优先级高的进程vruntime增长相对较慢,因此可以得到更多的运行机会。CFS基本设计思路CFS思路很简单,就是根据各个进程的权重分配运行时间。进程的运行时间计算

2021-01-04 21:24:21 306 1

转载 C++运算符重载

C++一个很有意思的特性就是除了支持函数重载外还支持运算符重载,原因就是在C++看来运算符也是一个函数。比如一个 a + b 的加法表达式也可以用函数的形式:operator + (a, b)来表达。这里的operator +代表的就是加法函数。高级语言中的表达式和数学表达式非常相似,在一定的程度上通过运算符来描述表达式会比通过函数来描述表达式更加利于理解和阅读。一般情况下在重载某个运算符时最好要和运算符本身的功能相似,当然你也可以实现一个和运算符本身无关甚至相反的功能(比如对某个+运算符实现为相减)。运算

2020-12-30 22:48:02 863

原创 Redis对象

前一篇博文中介绍了简单动态字符串、双端链表、字典、整数集合、压缩列表等数据结构。然而Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种前面所介绍的数据结构。通过这五种不同类型的对象,Redis可以在执行命令前根据对象类型来判断一个对象是否可以执行给定的命令。使用对象的另一个好处就是,可以针对不同的使用场景为对象设置多种不同的数据结构实现,从而优化对象在

2020-07-23 22:32:54 116

原创 Redis数据结构

简单动态字符串 SDSstruct sdshdr { int len; // buf数组中已使用字节数 int free; // buf数组中未使用字节数 char buf[]; // 字节数组,数组大小为 len + free + 1};空间分配策略空间预分配1)对SDS进行修改后,若SDS的长度(len属性的值)小于1MB,则分配和len属性同样大小的未使用空间,即free = len;2)对SDS进行修改后,若SDS的长度(len属性的值)大于

2020-07-23 20:17:46 154

转载 ICMP协议

ICMP协议导入ICMP(Internet Control Message Protocol,因特网控制报文协议)是TCP/IP协议族的一个IP层子协议,用于在主机、路由器之间传递控制消息(控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息),这些控制消息虽然本身并不传输用户数据,但是对于用户数据的传递起着至关重要的作用。ICMP的主要功能包括:确认IP包是否成功送达目标地...

2020-06-26 14:52:35 1419

原创 网络是怎样连接的

2020-03-01 17:00:18 165

原创 字节对齐

字节对齐的细节与编译器的具体实现相关,一般来说需要满足以下3个准则:结构体首地址能被其最宽基本类型成员的大小所整除; 结构体每个成员相对于结构体首地址的偏移量都是该成员大小的整数倍,如有需要,编译器会在成员之间加上填充字节; 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最后一个成员后加上填充字节。...

2019-09-22 18:24:06 115

原创 运算符优先级 & 结合性

用法示例一列中,部分既可以使用左值也可以使用右值,同一写作rexp。上表中,lexp表示左值表达式,rexp表示右值表达式。关于左值和右值的区别,可以简单的认为:能取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值。...

2019-09-17 00:15:47 260

转载 Git常用命令

本文转载自简书《Git命令大全》,https://www.jianshu.com/p/93318220cdce,请求转载时原本作者未及时回复,后期若有任何问题请联系本人删博~git configGit共有3个配置文件:仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。全局配置文件:Mac 系统在~/.gitconfig,Windows 系统在 C:...

2019-09-15 16:58:52 323

原创 C和C++接口相互调用

在真实项目的开发过程中,可能会出现需要C和C++混合编程的情况,因此会不可避免地遇到C和C++接口相互调用的问题。然而,一个项目的编码开发需要经过预处理、编译、链接这几个阶段,通常,编译器会将.c或.cpp源文件看作是一个独立的编译单元来生成目标文件,编译完成后,链接器会将这些目标文件以及项目需要用到的其他库文件链接在一起得到一个最终的可执行文件(链接器是通过查找目标文件符号表中的符号名将各个目标...

2019-09-14 22:00:22 930

原创 extern "C"详解

导入最近看公司项目源码,发现每个C头文件中都包含 EXTERN_STDC_BEGIN 和 EXTERN_STDC_END 这两个宏,如:#ifndef __COMMUNICATION_H__#define __COMMUNICATION_H__#include "msg_buffer.h"EXTERN_STDC_BEGINvoid send(component *src, ...

2019-09-14 16:25:21 646

原创 #define与typedef

最近在看公司项目源码的时候发现很多以前没关注过的地方,其中#define和typedef就是非常典型的一处。举个例子,在使用它们创建新的类型名时,如#define BOOL int和typedef int BOOL;两者在使用时,如果声明的是两个BOOL类型的变量:BOOL a, b; 此时两者并无不同,本质上都声明了两个整型的变量a和b。然而,使用#define 和 type...

2019-09-14 10:56:22 134

原创 __FILE__、__LINE__、__FUNCTION__、__DATE__、__TIME__

__FILE__C/C++中的__FILE__用于指示本行语句所在源文件的文件名,举例如下:#include <iostream>using namespace std;int main(){ cout << __FILE__ << endl; return EXIT_SUCCESS;}使用g++编译运行得到的输出为:test.cpp...

2019-09-13 11:50:19 246

原创 空宏的作用

前段时间看公司项目源码,看到有些长相略微奇特的宏定义:#define __EFT_H__第二行里面宏定义是空的?空宏有什么作用?答案是用作标志!!!#ifndef __EFT_H__/* 代码段 */#else/* 代码段 */#endif如上面这段代码所示,空宏和普通宏定义其实是一样的,唯一的不同之处只是其定义内容为空。但是,我们可以通过判断这个宏定义是否在之前被...

2019-09-13 11:05:24 1047

原创 do{...} while(0)

前段时间看公司项目源码时,发现一个很有意思的地方,就是在很多宏函数定义里会出现do{...} while(0)。#define ASSERT_ARRAY_EQ(expect, actual) do { / ASSERT_EQ(sizeof(expect), sizeof(actual)); / for( size_t i = 0; i < sizeof(ex...

2019-09-13 10:48:51 190

原创 网络数据封装

本文以下图为例,对计算机网络中的数据封装进行一个简单的介绍。从图中可以看到,数据从发送端系统的协议栈向下,沿着中间的链路层交换机和路由器的协议栈上下,到达接收端系统的协议栈,并沿协议栈向上重构发送的数据。与端系统类似,路由器和链路层交换机也以多层次的方式组织它们的网络硬件和软件,不同的是,路由器和链路层交换机并不实现协议栈中的所有层次。如图所示,链路层交换机仅实现了协议栈的前两层,而路...

2019-06-14 10:49:13 2019

原创 网络延时的分类

在分组交换网络中,当分组从一个节点(主机或路由器)沿着通信链路到达后续节点(主机或路由器)时,该分组在沿途的每个节点上经历了几种不同类型的时延,包括处理时延、排队时延、传输时延和传播时延,这些时延的和就是节点总时延。下面我们以下图为例对以上提到的四种类型的时延进行介绍。假定一个分组从上游节点通过路由器A向路由器B发送,我们的目标是在路由器A处刻画节点时延。值得注意的是,路由器A具有通往...

2019-06-14 09:11:21 4403 2

转载 如何给女朋友解释为什么200M宽带,打王者荣耀还是会有460ms的延迟?

转载自:https://juejin.im/post/5c7c8b81f265da2dd218e858 感谢原作者~周末,我正在准备年度述职的PPT,女朋友在一旁打王者,突然她好像是越塔送了个人头,很不高兴的问我。大概过了10分钟左右,我听到了一声"Defeat",我知道,这锅是我的。网络带宽网络带宽(bandwidth)是指单位时间(一...

2019-06-13 17:16:32 4892

转载 带宽、宽带和网速

带宽的基本概念在通信领域,信号带宽指的就是该信号所包含的不同频率成份所占据的频率范围。注意,频带是相对基带而存在的概念,指经过调制后能在信道上进行传输通信的信号所占据的频率范围,一般我们也称通频带。而在计算机网络中,带宽是指网络中链路传输数据的能力,即单位时间内能够传输的数据量。注意,计算机网络中带宽和吞吐量的概念非常容易混淆,两者的区别如下:网络带宽:强调网络最大的数据传输速率,即数据传...

2019-06-13 14:26:57 5273

原创 公网IP与私网IP

自上世纪70年代基于TCP/IP开发出IPv4协议到如今已经有40余年了,由于历史原因,中国在国际上就IPv4发展的发言权不多,导致在IP地址的供需上严重失衡。据相关数据统计显示,截止到2002年8月,拥有13亿人口的中国只有约2502万个IPv4地址,其中B类地址仅有数百个,而A类地址则一个都没有,仅相当于美国一所大学的所拥有地址数(其实就算是制定IPv4的美国也没狗大户到为每台联网设备分配一个...

2019-06-12 22:57:04 2306

原创 IP地址及其分类(A、B、C类)

为了便于寻址以及层次化构造网络,每个IP地址均包含两个标识码,即网络号和主机号。同一个物理网络中的所有主机使用同一个网络号,而这个网络中的各个主机(如工作站、服务器、路由器)都有有一个局域网内唯一的主机号与之对应。因此IP地址的格式可以简单的表示为:IP地址::= {<网络号>,<主机号>}。早期,为了给不同规模的网络提供必要的灵活性,IP地址的设计者将IP地址空间划...

2019-06-12 16:38:10 17993

原创 共享式以太网和交换式以太网的区别

集线器在OSI模型中属于物理层,但由于集线器属于共享型设备,使得它在网络中的效率十分低下,非常容易产生广播风暴,因此在中大型的网络中通常看不到集线器的身影。而交换机则属于数据链路层,是一种基于MAC地址的、能够完成数据封装转发的网络设备。交换机可以“学习”MAC地址,并将其存放在内部的地址表中,通过在数据帧的始发者和接收者之间建立临时的交换路径,交换机可以将数据帧由源主机发往目的主机。在局域网中大...

2019-06-12 07:39:23 36262

转载 冲突域与广播域

冲突域是一种物理分段,指连接到同一导线上所有工作站的集合、同一物理网段上所有节点的集合或是以太网上竞争同一带宽节点的集合。冲突域表示冲突发生并传播的区域,这个区域可以被认为是共享段。在OSI模型中,冲突域被看作是OSI第一层的概念,连接同一冲突域的设备有集线器、中继器或其它简单的对信号进行复制的设备。其中,使用第一层设备(如中继器、集线器)连接的所有节点可被认为是在同一个冲突域内,而第二层设备(如...

2019-06-11 08:51:01 21743 13

转载 链路层交换机和路由器的区别

原文:https://blog.csdn.net/liebao_han/article/details/52859814 感谢原文作者~链路层交换机和路由器作为两种最为常见的联网中继设备(联网中继设备是指将联网设备相互连接起来所需要使用到的一些中间设备或中间系统),在网络连接中扮演着非常重要的角色。下图中(a)为链路层交换机,(b)为路由器。 ...

2019-06-11 08:37:47 5657 1

原创 TCP网络编程处理的三个半事件

TCP网络编程最本质的是处理三个半事件:连接建立:包括服务器端被动接受连接(accept)和客户端主动发起连接(connect)。TCP连接一旦建立,客户端和服务端就是平等的,可以各自收发数据。 连接断开:包括主动断开(close、shutdown)和被动断开(read()返回0)。 消息到达:文件描述符可读。这是最为重要的一个事件,对它的处理方式决定了网络编程的风格(阻塞还是非阻塞,如何...

2018-11-15 09:52:54 1805

转载 大并发服务器框架设计

转自:https://www.cnblogs.com/secondtonone1/p/7076769.html 基本的服务器框架都是C/S结构的,请求和响应的流程是这样的:这样的框架存在一个很严重的问题,当客户端大并发请求到来时,服务器需要进行大量的数据库操作。假设数据库最大连接数为1000个,此时如果有10000个请求访问应用服务器,那么应用服务器只能处理1000个请求,剩下99...

2018-11-14 11:49:16 144

原创 常见并发服务器模型

1. 循环式/迭代式服务器1)短连接(如果是长连接则需要在read与write之间增加一个循环,那样的话外层循环无法退出,接收不到其它连接请求,即只能服务一个客户端);2)单线程,无法充分利用多核CPU;3)不适合执行时间较长的服务(encode-&gt;compute-&gt;decode执行时间过长会影响其他客户端连接的响应速度)。2. 并发式(concurrent)...

2018-11-14 10:44:54 565

原创 面向对象编程 VS 基于对象编程

 本文通过一个简单的线程类对面向对象和基于对象两种不同的编程风格进行说明。 面向对象编程设计一个Thread基类,这个类中含有一个纯虚函数Thread::run(),然后在测试程序中派生一个子类,并在这个子类中重写run()方法。每一个线程对应一个Thread的子类。面向对象编程风格的Thread类图如下所示:具体代码如下:Thread.h#ifndef _T...

2018-11-13 19:01:03 800

原创 Muduo日志库

本文是笔者通过学习Muduo多线程网络程序开发库日志模块所做出的总结,文中大量引用了陈硕所著的《Linux多线程服务端编程:使用muduo C++网络库》以及luotuo44《muduo日志库学习》博客中的内容。此外,本文代码取自analogous_love的开源项目flamingo,笔者在此一并表示感谢。由于笔者接触多线程开发时间较短,文中所书难免有误,还请多多包涵~日志是服务器端...

2018-11-13 11:14:56 2549

空空如也

空空如也

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

TA关注的人

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