自定义博客皮肤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)
  • 收藏
  • 关注

原创 【NDK 交叉编译PROJ三方库】java调用c++动态库

1.java调用c++动态库 2.交叉编译jron三方库

2023-01-13 16:03:05 291

原创 【core】protobuf debugstring()接口core

protobuf core问题

2022-10-20 13:23:29 830

原创 【读书笔记】linux/unix系统编程

第三张 系统编程概念与用户空间函数调用相比,最简单的系统调用会产生比较大的打开,因为为了执行系统调用,系统需要临时切换到核心态,发生中断,此外,内核还需要验证系统调用的参数,用户内存和内核内存之间的数据需要传递// 如果代码里有pidof()需要,可以换一种方式实现while true:do local pid_s = `pidof super`fisleep 5done// 改进的程序local pid_s = `pidof super`while true:do if [

2022-04-29 14:15:23 639

原创 【c 结构体数组用法】

#include <iostream>#include <cstdio>#include <cstdlib>using namespace std;typedef struct { int a; short b[2];} Test2;typedef struct Test1{ int a; char b[3]; Test2 c; struct Test1 *d; } Test1;int main() { Test1 x = {1

2022-04-27 19:24:11 164

原创 【读书笔记】c和指针

第三章1.作用域1.代码作用域 , {}2.文件作用域,头文件3.原型作用域,函数传参4.函数作用域,goto2.链接属性external,外部链接,外部源文件也可以访问。staic修饰完,external变为internalinternal,内部链接,本源文件内有效none3.存储类型1.普通内存2.运行时堆栈3.硬件寄存器1.代码外声明的变量 -> 静态存储。生命周期:程序一直运行就一直存在,而不是每次代码块开始时创建,代码执行完销毁2.static关键

2022-02-27 15:56:47 857

原创 c++ 重构知识点

一、静态转为动态二、早绑定转变为晚绑定绑定:将函数体和函数调用关联起来早绑定,在程序运行之前(也就是编译和链接时)迟绑定发生在运行时,基于不同类型的对象。当一种语言实现迟绑定时,必须有某种机制确定对象的具体类型然后调用合适的成员函数。例子class Animal{public: virtual void sleep() //虚函数 { cout << "Animal sleep!" << endl; } void breath() { co

2021-09-06 19:01:39 400

原创 socket编程总结

server.c和client.c通信问题1:如果client发送空内容,server会一直接受 进入阻塞状态。可以用多进程解决。问题2:端口占用问题?可以调用setsockop,把close时间设置为0,把linger时间延长

2020-11-24 17:09:09 98

原创 多线程服务器编程 muduo c++ 总结

第三章 多线程试用场景和编程模型事件驱动,大致框架:while (!done) { int timeout_ms = max(100, getNextTimeCallback()); int retval = ::poll(fds, nfds, timeout_ms); if (retval < 0) { 处理错误,回调用户的error handler } else { 处理到期的timers,回调用户的timer handler

2020-11-24 17:07:05 192

原创 effective c++总结

条款7【为多态基类声明virtual析构函数】1.如果类不是用作基类或者具备多态性,则不该声明virtual析构函数2.多态的基类需要声明一个virtual析构函数。如果基类析不加vritual,则析构不了子类对象class base {public: base(){ cout << "base class constructor" << endl; } ~base(){ cout << "base class destructor" <

2020-11-24 17:04:06 137

原创 tds协议解析

我最近的需求:用wireshark抓tds报文,解析出user和passwd字段。通过偏移量找字段,user和passwd都是用UCS2LEThis document attempts to cover the TDS protocol for:TDS Version Supported Products4.2 Sybase SQL Server < 10 and Microsoft SQL Server 6.55.0 Sybase SQL Server >= 107.0 Micros

2020-07-15 19:08:13 4536 1

原创 TCP和UDP

TCPTCP有连接,传输的数据,无差错、不丢失、不重复、并且按序到达。面向字节流的,没头没尾拥塞控制,它意识到包丢弃了或者网络的环境不好了,就会根据情况调整自己的行为,看看是不是发快了,要不要发慢点。有状态服务,通俗地讲就是有脑子的,里面精确地记着发送了没有,接收到没有,发送到哪个了,应该接收哪个了,错一点儿都不行。UDPUDP继承IP特性,基于数据报,一个个发,一个个收UDP报头,源端口和目的端口...

2020-07-01 13:55:31 122

原创 Kafka学习笔记

1.Kafka简介Apache Kafka是一款开源的消息引擎系统。维基百科的定义,消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息,实现松耦合的异步式数据传递。通俗来讲,就是系统A发送消息给消息引擎系统,系统B从消息引擎系统中读取A发送的消息。消息引擎系统要设定具体的传输协议,即我用什么方法把消息传输出去,常见的方法有2种:点对点模消息引擎系统要设定具体的传输协议,即用什么方法把消息传输出去,常见的方法有2种:点对点模型;发布/订阅模型。Kafka同时支持这两种消息引擎模型。

2020-06-18 21:49:37 161 1

原创 linux下gdb单步调试例子

例子:1. 要调试的程序[root@localhost telnetctl]# gdb mtx 2. 设置参数(gdb) set args telnet.cap -p -w result.mtd -t 1 --cpu_affi="rc(2);dx(3);sp(15)" --fxplug="./ptlidt.so" --cxfplug="./tcpcfx.so" --snaplug="./telnetctl.so" --fxparam="./tcpcfx.so(-T 10 --silent 12)

2020-06-12 14:53:45 190

原创 路由协议(RIP、OSPF)

路由器和网关关系:路由器是一台设备,它有五个网口或者网卡,相当于有五只手,分别连着五个局域网。每只手的 IP 地址都和局域网的 IP 地址相同的网段,每只手都是它握住的那个局域网的网关。任何一个想发往其他局域网的包,都会到达其中一只手,被拿进来,拿下 ## 标题MAC 头和 IP 头,看看,根据自己的路由算法,选择另一只手,加上 IP 头和 MAC 头,然后扔出去。静态路由在路由器上,配置一条一条规则MAC 地址只要过网关,就必定会改变,因为已经换了局域网。两者主要的区别在于 IP 地址是否改变。

2020-06-08 10:40:00 362

原创 git:xshell下管理github

本地上传代码git init,执行完系统会多一个.git文件git add 文件名git config --global user.name “用户名”,git config --global user.email"邮箱"git commit,在vim里加一行init 文件名git commit -m “init 文件名”git statue,查看状态;git log打印日志git remote add origin xxx,上传源git push -u origin master,传

2020-06-04 12:46:12 627 1

原创 范式

范式(NF)可以理解为,一张数据表的设计结构需要满足的某种设计标准的级别。数据库的范式设计越高阶,冗余度就越低,同时高阶的范式一定符合低阶范式的要求。超键:能唯一标识元组的属性集叫做超键。候选键:如果超键不包括多余的属性,那么这个超键就是候选键。主键:用户可以从候选键中选择一个作为主键。外键:如果数据表 R1 中的某属性集不是 R1 的主键,而是另一个数据表 R2 的主键,那么这个属性集...

2020-03-30 18:22:39 137

原创 索引

什么是索引?数据库中的所以,好比是一本书的目录,可以快速进行特定值的定位和查找,从而加快查询效率索引不是万能的,在有些情况下使用索引反而会让效率变低在数据比较少的情况下,比如不到1000行,就不需要创建索引的在数据重复度大,比如高于10%的时候,也不需要对这个字段使用索引(比如性别男女比例失调的除外 ,100万行查找50w行,一旦创建索引就得先行问50w次索引,然后在访问50w次数据表,...

2020-03-29 01:27:39 139

原创 Linux内存的工作(malloc,brk系统调用和mmap系统调用)

只有内核才能直接访问物理内存。进程怎么访问内存?Linux内核给每一个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的,这样进程就很方便的可以访问虚拟内存虚拟内存空间的内部又被分为内核空间和用户空间,不同字节(也就是单个cpu指令可以处理数据的最大长度)的处理器,地址空间的范围也不同,比如常见的32位和64位系统过这里可以看出,32 位系统的内核空间占用 1G,位于最高处,剩下...

2020-02-22 11:24:11 3050 2

原创 linux高性能服务器--笔记

tcp/ip主要协议上层协议使用下层协议提供的服务1.数据链路层主要实现网卡接口的网络驱动程序,处理数据的传输。主要是是arp协议。网络层使用ip寻址一台机器,而数据链路层通过mac地址寻址,2.网络层主要实现数据包的选路和转发,核心是ip协议,数据包根据目的ip地址,然后根据路由表不停寻找下一跳路由器,把数据包交给路由器来转发。icmp协议,是ip协议的补充,主要检测网络连接(pin...

2020-02-13 00:31:25 899

原创 vm15.5虚拟机安装mac15操作系统(支持Xcode)

一、准备工作VMWare 12 Pro百度云:https://pan.baidu.com/s/1TfimZ92ofJdrhcHts2iPIAUnlocker补丁工具百度云:https://pan.baidu.com/s/1L5xWNO7urAHEyrGo-I27SwMac OS X懒人版安装光盘映像百度云:http://pan.baidu.com/s/1jI78s4Y密码:drbh一...

2020-02-06 12:41:53 3038 1

原创 linux学习笔记

网络故障排除命令检查网络的连通性ping,目标主机是否畅通traceroute,路由追踪mtr,检测中间数据包nslookup,查看域名数据包问题:telnet,端口tcpdump,针对网络层、协议、主机、网络或端口的过滤查看服务出现的问题:netstat,监听范围ss,查看连接信息...

2020-02-05 10:54:26 211

原创 AC自动机算法

AC自动机算法,全称是Aho-Corasick算法。Trie树跟AC自动机之间的关系,就像单串匹配中朴素的串匹配算法,跟KMP算法之间的关系一样,只不过前者针对的是多模式串而已。AC自动机实际上就是Trie树之上,加了类似KMP的next数组,只不过此处多的next数组是构建在树上罢了。AC自动机的构建,包含两个操作:(1):将多个模式串构建成Trie树;(2):在Trie树上构建失败指针...

2020-02-02 22:59:07 441

原创 剑指offer

1.找出数组中重复的数字时间复杂度O(n),空间复杂度O(1)遍历数组,如果该数字不等于该下标元素数字 并且该数字在该下标,那么交换该数字和该下标位置元素然后再遍历一遍,当该数字等该下标元素值 并且该数字在该下标,那么返回该数字。2.找出数组中重复的数字(不修改原数组)时间复杂度O(nlogn),空间复杂度O(1)二分:以数值作为mid,如果大于mid的值出现次数大于mid 那么可以确...

2020-02-02 16:19:03 271

原创 Trie树

Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。通过一个下标与字符一一映射的数组,来存储子节点的指针构建好 Trie 树后,在其中查找字符串的时间复杂度是 O(k),k 表示要查找的字符串的长度。...

2020-01-30 23:30:30 77

原创 平均负载

平均负载:系统处于可运行状态和不可终端状态的平均进程数,也就是平均活跃进程数,和cpu使用率没有直接关系。假设我们在一个单 CPU 系统上看到平均负载为 1.73,0.60,7.98,那么说明在过去 1 分钟内,系统有 73% 的超载,而在 15 分钟内,有 698% 的超载,从整体趋势来看,系统的负载在降低。不可中断状态实际上是系统对进程和硬件设备的一种保护机制。通常当平均负载高于 CPU...

2020-01-29 11:13:50 180

原创 字符串匹配,BM 算法

BM 算法包含两部分,分别是坏字符规则(bad character rule)和好后缀规则(good suffix shift)。1.坏字符规则按照模式串下标从大到小的顺序,倒着匹配的。没有匹配的字符叫作坏字符(主串中的字符)。拿坏字符 c 在模式串中查找,发现模式串中并不存在这个字符,可以将模式串直接往后滑动三位,再从模式串的末尾字符开始比较。这个时候,坏字符 a 在模式串中是存在...

2020-01-28 20:26:59 206

原创 字符串匹配 — BF,RK算法

BF 算法,暴力匹配算法,每次往后移一位RK 算法,通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的。但是需要遍历子串中的每个字符,算法整体的效率并没有提高提高哈希算法二十六进制来表示一个字符串:把...

2020-01-28 16:42:20 183

原创 深搜和广搜

图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。图有两种主要存储方法,邻接表和邻接矩阵。今天我会用邻接表来存储图。...

2020-01-27 18:15:54 137

原创 图解HTTP读书笔记

1. 第一章1.tcp/ip分层应用层:为用户提供应用服务,比如HTTP,FTP传输层:对上层应用层提供网络连接,进行数据传输(实现进程到进程之间的通信),(报文打上标记序号和端口号)。TCP/UDP网络层:处理网络上流动的数据包,规划传输路径( 实现主机到主机之间的通信.)(增加mac地址)。ip链路层:处理连接网络的硬件部分,包括控制操作系统,硬件设备。路由器,交换机物理...

2020-01-07 14:09:59 158

原创 自制HTTP服务器

在开始编写高性能 HTTP 服务器之前,先要构建一个支持 TCP 的高性能网络编程框架设计需求这个 TCP 高性能网络框架需要满足的需求有以下三点。采用reactor模型,可以灵活使用poll/epoll作为事件分发实现必须支持多线程,从而可以支持单线程单reactor模型,可以支持多线程主-从reactor模式,可以将套接字上的I/O事件分离到多个线程上封装读写操作到Buffer对象...

2020-01-01 15:34:17 1123

原创 异步I/O

阻塞 / 非阻塞 VS 同步 / 异步阻塞I/O第一种是阻塞 I/O。阻塞 I/O 发起的 read 请求,线程会被挂起,一直等到内核数据准备好,并把数据从内核区域拷贝到应用程序的缓冲区中,当拷贝过程完成,read 请求调用才返回。接下来,应用程序就可以对缓冲区的数据进行数据解析。非阻塞I/O非阻塞的 read 请求在数据未准备好的情况下立即返回,应用程序可以不断轮询内核,直到数据准备好...

2019-12-31 13:56:30 383

原创 epoll、多线程模型

如何切换epollevent_loop.c 文件的 event_loop_init_with_name 函数是关键,通过宏 EPOLL_ENABLE 来决定是使用 epoll 还是 poll 的。struct event_loop *event_loop_init_with_name(char *thread_name) { ...#ifdef EPOLL_ENABLE yol...

2019-12-29 12:35:01 972

原创 子线程使用poll处理连接I/O事件

在发起连接请求的客户端非常多的情况下,单 reactor 线程既分发连接建立,又分发已建立连接的 I/O,有点忙不过来,在实战中的表现可能就是客户端连接成功率偏低。可以将 acceptor 上的连接建立事件和已建立连接的 I/O 事件分离,形成所谓的主 - 从 reactor 模式。主 - 从reactor模式核心思想:主反应堆线程只负责分发Acceptor连接建立,已连接套接字上的I/O事...

2019-12-28 16:08:36 422

原创 使用poll单线程处理I/O事件

通过使用 poll、epoll 等 I/O 分发技术,可以设计出基于套接字的事件驱动程序,从而满足高性能、高并发的需求。事件驱动模型,也被叫做反应堆模型(reactor),或者是 Event loop 模型。这个模型的核心有两点。它存在一个无限循环的事件分发线程,或者叫做 reactor 线程、Event loop 线程。这个事件分发线程的背后,就是 poll、epoll 等 I/O 分发技术...

2019-12-28 10:33:23 663

原创 阻塞I/O和线程模型

进程切换上下文的代价是比较高的,所以线程是比较轻量级的模型线程(thread)是运行在进程中的一个“逻辑流”,现代操作系统都允许在单进程中运行多个线程。线程由操作系统内核管理。每个线程都有自己的上下文(context),包括一个可以唯一标识线程的 ID(thread ID,或者叫 tid)、栈、程序计数器、寄存器等。在同一个进程中,所有的线程共享该进程的整个虚拟地址空间,包括代码、数据、堆、共享...

2019-12-24 21:22:29 140

原创 阻塞I/O和进程模型

父进程和子进程fork 函数实现的时候,实际上会把当前父进程的所有相关值都克隆一份,包括地址空间、打开的文件描述符、程序计数器等,就连执行代码也会拷贝一份,新派生的进程的表现行为和父进程近乎一样,就好像是派生进程调用过 fork 函数一样。为了区别两个不同的进程,实现者可以通过改变 fork 函数的栈空间值来判断,对应到程序中就是返回值的不同。if (fork() == 0) { do_ch...

2019-12-24 15:11:24 209

原创 C10K,高并发设计模型

C10K 问题:如何在一台物理机上同时服务 10000 个用户?这里 C 表示并发,10K 等于 10000。操作系统层面文件句柄每个客户端连接都代表一个文件描述符,一旦文件描述符不够用了,新的连接就会被放弃,报错:Socket/File:Can't open so many files在 Linux 下,单个进程打开的文件句柄数是有限制的,没有经过修改的值一般都是 1024。$ul...

2019-12-21 20:56:40 303

原创 epoll

本质上 epoll 还是一种 I/O 多路复用技术, epoll 通过监控注册的多个描述字,来进行 I/O 事件的分发处理。不同于 poll 的是,epoll 不仅提供了默认的 level-triggered(条件触发)机制,还提供了性能更为强劲的 edge-triggered(边缘触发)机制。epoll使用epoll_createepoll_create() 方法创建了一个 epoll 实...

2019-12-21 11:07:23 90

原创 非阻塞I/O

非阻塞 I/O 配合 I/O 多路复用,是高性能网络编程中的常见技术。阻塞 VS 非阻塞阻塞I/O完成某个操作时,应用程序会被挂起,等内核完成操作。内核将CPU时间切换给其他有需要的进程,网络应用程序此时得不到CPU时间。比方说书店买书,告诉老板(内核)想要的书,然后你一直等着,老板就会去找,可能会去全城其他书店找。此时就好像书店老板在这里”阻塞“了。非阻塞I/O,当应用程序完成某个...

2019-12-20 21:31:39 336

原创 poll,I/O多路复用

select的I/O 多路复用技术,通过描述符集合来表示检测的 I/O 对象,通过三个不同的描述符集合来描述 I/O 事件 :可读、可写和异常。缺点是:所支持的文件描述符个数有限,linux系统,select默认最大值为1024。poll函数介绍普遍使用的 I/O 多路复用技术,和select 相比,它和内核交互的数据结构有所变化,另外,也突破了文件描述符的个数限制。int poll(str...

2019-12-19 11:02:57 156

空空如也

空空如也

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

TA关注的人

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