学习笔记
文章平均质量分 63
Poke-code
千里之行 始于足下
展开
-
课后笔记--程序的编译链接原理梳理
1.gcc test.c 经历了什么?// test.cc#include <stdio.h>int main(){ printf("gcc compilation link process."); return 0;} 有 预编译、编译、汇编、链接 四个步骤,下面逐一分析:预编译 也叫预处理阶段,主要操作有这几个:展开所以 #define 宏定义 ,进行文本替换删除所有的注释处理条件编译 #ifdef #endif原创 2021-06-21 21:31:30 · 146 阅读 · 1 评论 -
SGI STL二级空间配置器内存池源码剖析理解
背景空间配置器做什么事情?分离了对象的内存开辟和对象构造分离了对象的析构和内存空间的释放为什么要将内存开辟释放与对象的构造析构分离? 拿vector来举例,当pop_back()元素的时候,我们只想让最后面的这个元素析构,但是这个空间我还是需要的,如果底层直接调用了delete,那么这块空间就没了,不能说pop_back()后,vector的capacity也跟着减少。这样肯定是不行的。因此需要将对象的析构和内存空间的释放分开。为什么要引原创 2021-06-20 22:12:06 · 205 阅读 · 2 评论 -
分布式服务配置中心——Zookeeper初窥
在自己写rpc的时候,最开始提供服务的主机ip和端口都是在配置文件中写死的,也就是说服务的请求方通过读取配置文件能知道服务提供方的ip和端口,但是,在实际的远程方法调用框架中,不可能实现把所有的服务提供方的ip和端口号事先提供,因为每个客户端都保存的是一个静态的列表,一旦服务的提供者发生变化,比如某些机器down了,或者又新增了一些服务,客户端这边是根本不知道的。那么需要一个服务配置中心,我的服务请求方只需要知道服务配置中心的ip和port,然后在服务配置中心里通过我请求的方法来给我原创 2021-06-04 21:43:25 · 202 阅读 · 3 评论 -
RPC 框架梳理——RPC使用方的调用流程梳理
背景 myrpc是基于protobuf开发的远程调用框架,对于rpc服务,在proto文件中的定义如下: 经过protoc编译后,会生成两个类:UserServiceRpc 和 UserServiceRpc_Stub,在之前的文章中已经分析过,UserServiceRpc_Stub类是继承于UserServiceRpc,两者均继承于protobuf中是service这个基类,其中UserServiceRpc_Stub是供rpc访问的消费者(调用方)使用。原创 2021-05-22 15:47:24 · 509 阅读 · 0 评论 -
日志系统的设计的一些思考
背景 最近在写一个rpc框架,功能加多后,一些打印信息都在控制台上,显得很凌乱出现问题的时候也比较难找难以定位问题所在,于是考虑学习加入一个日志功能:可能出现的问题及解决思路1.写日志这个操作是磁盘I/O,本身速度慢,如果写日志这个操作直接是写入磁盘,那么这个时间花销就算在了业务执行过程中,会导致rpc的业务处理效率降低。 解决思路:中间加入一个队列,将写日志操作变成异步的2.有多个工作线程会写日志到队列中,另外会有一个专门的写日志线程将队列中的消原创 2021-05-21 14:08:45 · 200 阅读 · 0 评论 -
RPC 框架梳理——rpc框架对远程调用的处理流程梳理
背景 当rpc服务的发布方启动了rpc服务的发布节点后,rpc服务的提供方便进入阻塞状态,等待远程的rpc调用请求。 首先我们要梳理,在run中,rpc框架主要做了哪些事情。因为myrpc框架是基于木朵网络库开发的,所以网络部分使用了muduo的epoll+多线程。Run()主要工作就是提供rpc网络监听。 主要设置有新连接时的回调处理、设置有新消息(有rpc请求)时的回调处理。本文主要梳理当有rpc请求时的框架处理流程。有rpc原创 2021-05-20 08:34:02 · 392 阅读 · 0 评论 -
RPC 框架梳理——rpc服务在rpc框架上的注册流程梳理
背景 本地服务想要发布到rpc框架上,要首先本地定义proto文件,将要发布在rpc框架上的方法写入相应的service中。service UserServiceRpc{ rpc login(LoginRequest) returns(LoginResponse); rpc Register(RegisterRequest) returns(RegisterResponse);} 这里面定义了一个UserServiceRpc,里面包含两个方法lo原创 2021-05-19 19:42:34 · 671 阅读 · 2 评论 -
protobuf中RpcChannel的CallMethod方法的RpcController参数的探究
背景 我们知道在protobuf中定义了service UserServiceRpc后,经过protoc编译后,会生成两个类class UserServiceRpc 和 class UserServiceRpc_stub,UserServiceRpc 是继承于service基类,UserServiceRpc_stub是继承于UserServiceRpc 。UserServiceRpc是供给rpc服务发布者(生产者)使用,UserServiceRpc_stub是供给rpc服务的调用方原创 2021-05-18 16:08:16 · 715 阅读 · 1 评论 -
如何设计解析rpc请求,避免出现粘包问题
背景 对于远程调用的请求方,它的请求包含以下内容:服务的名称(请求的方法所在的类名称)、请求的方法名称、该请求方法的参数。由于请求方发来的数据是字符流,那么就涉及到接收方如何读取才能正确的解析各个部分数据。字符流的构成header_size(4个字节)+(service_name/method_name/args_size ) +args1.header_size: 数据头的长度即(service_name/method_name/args_size )的长度2.servic原创 2021-05-17 22:52:47 · 377 阅读 · 0 评论 -
redis消息队列实现跨服务器通信的梳理
定义用于操作redis消息队列的类——Redissubscribe:向redis指定的通道subscribe订阅消息,如服务器1中的client1登录上线了,其用户id为1,那么subscribe(1),即告诉消息队列,如果有channel为1 的消息,告诉我。流程梳理1.每个服务器启动后,其事务处理类ChatService的构造函数中,先注册一个回调函数,用来处理当其消息队列中有该服务器订阅频道的信息后的一系列操作(将该频道的信息发送给注册该回调的服务器上的用户)。2.当用户在该服务器登录上线后原创 2021-05-15 13:33:33 · 490 阅读 · 0 评论 -
ubuntu下编译安装protobuf
1.在github上克隆protobuf源码: git clone https://github.com/google/protobuf2.解压压缩包: unzip protobuf-master.zip3.安装所需要的工具:4.自动生成configure配置文件 5.配置环境:6.编译源代码:make7.安装:8.刷新动态库:...原创 2021-05-14 15:22:06 · 364 阅读 · 0 评论 -
跨服务器通信问题的思路——基于发布订阅的消息队列
问题背景 在我的聊天服务器项目中,尝试使用nginx的tcp负载均衡来提升多并发的能力,与此同时也带来了另一个问题。因为有了多台服务器,就必须要解决跨服务器通信的问题。 在服务器中有一个_userConnMap,用于存储当前在线用户及其TcpConnection问题解决思路&&步骤 假设当前处理client1业务的服务器是Chatserver1,处理client2业务的服务器ChatServer2。client2和client2是好友关原创 2021-05-14 08:49:46 · 405 阅读 · 0 评论 -
远程连接Linux mysql出错
关于linux mysql远程访问失败的坑问题描述思考有哪些原因导致的1.SQL服务器是否正常启动了2.是不是登录用户、密码、数据库名称错误3.是否是权限问题依次验证排查1.先检查mysql是否正常工作2.检查用户、密码以及数据库的名称是否正确问题描述 在搭建聊天服务器的时候,我是在vscode中远程连接我的ubuntu电脑。在ubuntu电脑上,事先配置了MySQL的环境,安装了mysql的开发包。因为ubuntu默认安装最新的mysql,但是初始的用户名和密码是自动生成的,所以自己修改了mysql的原创 2021-05-09 23:07:27 · 209 阅读 · 0 评论 -
volatile关键字
和const一样,volatile也是一种类型修饰符。下面是对比案例: int i =10; int j = i; //语句一 int k = i; //语句二 此时编译器对代码进行优化,因为在一、二两条语句中,i没有被赋值。这时候编译器就认为i的值没有发生变化,所以在语句一时从内存中取出i的值赋给j后,这个值并没有被丢掉,而是在语句二中继续用这个值给k赋值。即编译器不会生成出汇编代码重新从内存中取i的值。 volatile int i= 10; int j...原创 2020-06-16 13:50:20 · 114 阅读 · 0 评论 -
include的两种形式& CPP的搜索路径
#include"stdio.h" // 1.源文件所在路径 2.-I选项 所指定的路径 3.环境变量包含的路径 (C_INCLUDE_PATH) 4.预配置的路径(cpp -v)#include<stdio.h> //1.-I选项所指定的路径 2.环境变量包含的路径 3.预配置的路径以上两种方法的区别在于预处理器对于头文件的搜索(CPP也就是我们的预处理器)。需要注意的是,在不同的平台上预配置的路径是不同的,并且即使在同一平台下,把gcc装...原创 2020-06-13 16:46:39 · 690 阅读 · 0 评论 -
在Anaconda3下,切换环境,把python脚本打包成exe文件
背景介绍 本机用Anaconda安装有 python2和python3 的环境在命令行切换自己要使用的python版本 activaye py27安装pyinstaller输入pyinstaller,查看是否安装成功:测试能否打包成功 打开我们需要打包的python程序的路径: 输入命令如下:pyinstaller -F tfpic.py 之后便可以在该...原创 2019-10-25 17:42:02 · 2665 阅读 · 1 评论 -
C++ 编码规范总结
具有良好编码规范的代码就是在保证高质量完成需求的同时具备良好的可读性、可维护性。注释的编写规范文件头的注释 该部分主要涉及到作者名、文件名称、文件名称、生成日期等函数的注释 1.对于关键函数,必须写上注释,说明函数的用途。 2.对于函数中的特别参数,需要说明参数的目的,由谁负责释放等… 3.一般函数的注释要写在代码之前。 4.尚未完善的代码或需要进一步完善的代码,应加...原创 2019-10-14 10:18:49 · 147 阅读 · 0 评论 -
printf()函数的解析
printf函数是标准的C语言函数,包含在studio.h之中,是我们经常会用到的格式输出函数,最后一个字母“f”即为“format”格式之意。使用printf函数可以按照用户指定的格式把指定的数据显示到窗口中。int printf(“格式控制字符串”,输出表列);printf函数有一个比较特殊的用法是“格式字符串”,可用来指定输出格式,由格式字符串和非格式字符串两种组成。 其中格式...原创 2019-07-10 09:21:24 · 307 阅读 · 0 评论 -
显式创建Mat
Mat不仅是非常有用的图像容器类,也是一个通用的矩阵类 创建Mat对象可有以下方法:方法一:使用Mat()构造函数 例子如下:Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));在Mat类定义中该构造函数的原型为:Mat(int rows, int cols, int type,const Scalar& s);对于二维多通道图像,要...原创 2019-07-10 19:38:08 · 179 阅读 · 0 评论 -
图像的线性混合操作
线性混合操作是中二元的像素操作,公式如下:在实现时可以用OpenCV中的addWeighted()函数,函数原型如下:void(InputArray src1,double alpha,InputArrary src2,double beta,double gamma,outputArray dst,int dtype=-1);参数1:InputArray类型的src1,表示要加权的第...原创 2019-07-15 13:45:26 · 253 阅读 · 0 评论 -
OpenCV--分离颜色通道&多通道颜色混合
split() 通道分离用到split()函数,该函数用于将多个通道数组分离成几个单通道数组,该函数的C++版本有两个原型:void split(const Mat& src,Mat*mvbegin);void split(InputArray m, OutputArrayOfArrays mv); 第一个参数,InputArray类型的m或者是const Mat&...原创 2019-07-15 15:19:43 · 177 阅读 · 0 评论 -
从配置文件中读取数据--配置文件的创建,读取配置文件
有时候把一些参数写在配置文件中,当需要修改这些参数时只需要在配置文件中修改即可,所以掌握如何使用配置文件很重要。第一步:写配置文件 先了解配置文件的格式,ini文件由 节、键、值组成。[section] --------------section处填写节的名字键=值 ------------------键代表参数的名字,值为参数的值…实例如下所示:可以看到该配...原创 2019-07-18 15:24:01 · 559 阅读 · 0 评论 -
OpenCV中几个常用的绘图函数
通过一个小练习熟悉OpenCV中ellipse()函数、circle()函数,line()函数的使用。// #include<iostream>#include<opencv2/opencv.hpp>#include<opencv2/core/core.hpp>#include<opencv2/imgproc/imgproc.hpp>us...原创 2019-07-12 15:28:37 · 270 阅读 · 0 评论 -
C++中的文件操作
C++中的文件流类 在C++标准库中有三类可用于文件操作,称为文件流类:ifstream:用于从文件中读取数据ofstream:用于向文件中写入数据fstream:既可用于从文件中读取数据,又可向文件中写入数据 使用这三个类时,程序中需要包含fstream头文件,C++中各流类的关系如下图所示:open打开文件 在对文件进行读写操作之前,先要打开文件。通过打开文件,可以建立起...原创 2019-07-17 14:27:34 · 294 阅读 · 0 评论 -
临时对象作为线程参数
detach()函数:在有多个线程的程序中,使用此函数后,主线程就不用逐个等待子线程结束,一旦调用detach,与这个主线程相关联的thread对象便会失去与这个主线程的联系,此时子线程就会驻留在后台运行,子线程就相当于被C++运行时库接管了,当子线程执行完毕后,由运行时库负责处理线程的习惯资源。 范例如下:#include<iostream>#include<threa...原创 2019-08-06 19:06:43 · 182 阅读 · 0 评论 -
C++多线程之互斥量
在学习互斥量之前,我们要清楚什么情况下需要使用互斥量,第一个例子中有一段共享数据g_v,在main()函数中创建了10个线程,这10个线程的入口函数均为myprint(),在函数中打印出共享数据,代码如下:#include<map>#include<iostream>#include<thread>#include<list>#inclu...原创 2019-08-07 17:02:39 · 748 阅读 · 0 评论 -
protobuf在windows环境下的使用
在学习网络编程时,师兄给我提了个要求,让我用protobuf把字符串和图片打包发送,初次接触protobuf走了很多弯路,现在终于能够简单的使用,记录一下过程,希望能给遇到同样问题的同学一点帮助。 关于protobuf我就不多介绍了(我了解的也是皮毛,还在继续学习,哈哈哈哈哈~),使用环境:win10+VS2013,protobuf版本:2.6.1,文件已经上传到百度云,链接:https...原创 2019-08-28 17:07:18 · 374 阅读 · 2 评论 -
OpenCV学习笔记——对"opencv.hpp"的理解
背景在任意一个OpenCV程序中通过转到定义都能看到如“#include<opencv2/opencv.hpp>”等类似定义。解释 对代码的观察可以发现,opencv.hpp中已经包含了OpenCV各模块的头文件,如图像处理模块头文件“imgproc.hpp”、高层GUI图形用户界面模块头“highgui.hpp”、2D特征模块头文件“features2d.hpp”。 因此...原创 2019-07-09 16:38:52 · 954 阅读 · 0 评论