自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Hustle Everyday

Would you capture it or just let it slip?

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

原创 bthread(一) 前言

前言建议配合代码库看,一切以代码为准:https://github.com/apache/incubator-brpc/tree/master/src/bthread感受bthread为brpc的核心,设计的初衷其实是在充分利用cpu的情况下保证数据的局部性,在设计过程中遇到的各种问题戈大神团队参考了多种linux内核原语进行了重写和实现,其中比较核心的设计为每TaskGroup的_rq无锁队列的设计以及work stealing调度的各种逻辑实现,目的都是在尽可能少加锁的情况下实现线程调度的功

2021-04-01 01:35:25 410 3

原创 bthread(六) 小结

brpc内如何用的bthread以epoll为例举例,epoll线程跑在bthread里,io bthread是按需起的(只要有读、写事件来就起一个,对于一个fd只起一个读线程和线程),用户回调也是跑在bthread【Q1】如果在callback里阻塞整个worker,其他worker会偷过来运行,但是万一所有worker都被阻塞住,那就gg了。【Q2】如果在callback里发起brpc,只会阻塞当前bthread,底层的worker不受影响,他发现后就移出rq,这时,这个callback

2021-04-01 01:24:49 714

原创 bthread(五) 无锁队列rq的代码实现

基本介绍初始化时b=t=1,代表队列为空,load是取值,store是赋值,push是从队尾添加(b+1),pop是从对首弹出(正常是b-1,有竞争了t+1),steal是从对首偷(t+1)。所以,b=t时队列为空,b=t+1时队列有1个元素。竞争情况由于对于此队列的push和pop操作发生在一次流程的两个阶段,所以不会产生竞争,push和steal不需要对一个元素竞争那么竞争就发生在pop和steal以及steal和steal中。比如:当前只有一个bth在队列里,tg1想从rq里pop一个,t

2021-04-01 01:20:21 343

原创 bthread(四) bthread用户接口和代码执行路径

bthread用户接口bthread_t(类似pthread_t):64位int,前32位版本号防止ABA问题(释放后又重新被分配了,歧义),后32位为资源池(无全局竞争可O(1)访问的数组)中下标,可以很快地找到TaskMeta(里面有个变量就是这个bth的栈)起bth基本函数bthread_start_urgent &bthread_start_background 里面都是先判断g是否为空(是否运行在worker里),是的话运行start_xxx,不是运行start_from_n.

2021-04-01 01:19:07 726

原创 bthread(三) bthread数据结构

TaskControl base::atomic<size_t> _ngroup; TaskGroup** _groups;// TaskGroup对象指针的数组 base::atomic<int> _concurrency;// TC启动时的默认起的pthread数量,可以理解为bthread并发度数量,静态开关配置为9 std::vector<pthread_t> _workers;/...

2021-04-01 01:11:02 326

原创 bthread(二) 线程模型及bthread

线程模型pthread:1:1,一个内核线程里只有一个用户线程,作为独立的调度单元可以被调度到多个cpu上优点:多核扩展性好,起多个用户线程可以跑在多个cpu上 缺点:多个用户线程之间数据交互,互斥访问增加代码复杂度,即使用原子变量,当用户线程从cpu0切换到cpu1时,data要从L1 cache同步到其他cpu(锁住总线),所以起太多的pthread对于内核调度压力较大协程(改进):n:1,n个用户线程跑在一个内核线程(一个cpu)优点:无多线程竞争,写代码容易些,因为跑在一个cpu上,

2021-03-30 01:06:48 655

原创 Tinyhttpd学习

学习一个简易的http服务器开源代码,来源:https://github.com/EZLippi/Tinyhttpd由于该代码不能直接在linux上运行,需要进行一些修改,项目部署参考:tinyhttpd在Linux编译以及HTTP服务器的本质:tinyhttpd源码分析及拓展启动后可直接通过浏览器访问IP和端口号进行测试。经典图摘自:Tinyhttpd精读解析具体的代码也有很多人写过了,这里总结一下自己学到的东西。startup函数绑定监听套接字等操作非常常规,然后在accept接

2020-05-17 23:05:03 660 2

原创 敏捷开发

一、敏捷开发概念【传统瀑布式开发】因为需求经常改动,所以开发人员需要做增量交付、迭代式开发,并且能够持续发布。敏捷开发只是一种模式,以用户的需求进化为核心,强调适应性而非预见性。把一个大项目拆成多个互相联系的小项目,多个小项目可分别完成并独立运行,要保证主体软件随时可发布可交付给用户。敏捷就是一种科学地做事的方式!二、敏捷开发人员架构的划分部门→项目组→小团队(9-...

2020-05-02 01:08:41 410

原创 爬虫学习

目的虽然现在流行用python写爬虫方便很多,但还是想巩固一下自己的c++知识,linux环境中开发并测试。逻辑图代码https://github.com/ucasxzzzh/spider.git编写过程中知识点【解析URL函数】解析过程中用str.find()函数判断输入的 url 中是否存在 http:// 或 https://,再从其后找第一个 / 的位置...

2020-04-27 00:26:32 276

原创 初识RPC

RPC(Remote Procedure Call)远程过程(方法)调用,实现RPC这个概念有多种方式,“client访问server上的函数”。最开始为的就是满足分布式通信,根儿上是二进制数据传输 TCP/IP步骤演进V1 最简单的c/s通信,套接字等V2 相当于把网络和读写数据的活抽象到stub类里去做,程序员只调stub类提供的方法就行,屏蔽了网络的具体实现细节...

2020-04-22 23:21:02 274

原创 服务器相关

购买服务器http://211.159.159.45/利用 wordpress 搭建博客(参考:https://zhuanlan.zhihu.com/p/48872802)可写文章搭建 jupyter notebook(简单爬虫参考:https://zhuanlan.zhihu.com/p/29433134?utm_source=wechat_session)可练习写python...

2020-04-18 00:42:40 253 1

原创 KMP算法

KMP算法指的是字符串模式匹配算法,具体问题为在主串T中找到第一次出现完整子串P时的起始位置。目的:如果每次查到不匹配就从下一个开始查时间复杂度过高,利用子串相同的前后缀来优化查询匹配过程。手动计算的话next数组就是最大前缀后缀公共元素长度向右平移一格再减1。代码求解next数组最关键的一句话为当T[k] != T[j] 时令 k = next[k]这句话的意思若当前字符...

2020-04-13 23:46:32 100

原创 阻塞、非阻塞、同步、异步

阻塞与非阻塞I/O阻塞和非阻塞主要是指调用某个系统函数时,这个函数是否会导致我们的进程进入sleep()(卡住休眠)状态而言的。1、阻塞I/O调用一个函数,这个函数卡在这里等待一个事情发生,只有这个事情发生了,这个函数才会往下走,如阻塞函数accept()。这种阻塞并不好,效率很低,所以一般不会用阻塞方式来写服务器程序。2、非阻塞I/O:不会卡住,充分利用时间片,执行效率更...

2020-04-09 22:20:45 199

原创 信号与进程

信号一、基本概念进程间常用的通信手段,如kill掉一个worker进程,master进程就会立即启动一个新的worker进程,信号用来通知某一个进程发生了某个事情(突发事情),所以进程不知道什么时候收到信号,也就是说信号是异步发生的,也被称为软件中断。【信号如何产生】某个进程发给另一个进程或发给自己 由内核(操作系统)发送给某个进程(ctrl+c 或 kill 或 内存访问异常 ...

2020-04-01 00:32:42 217

原创 指针

this指针本质是一个函数参数,只是编译器隐藏起形式的,语法层面上的参数。this只能在成员函数中使用,全局函数、静态函数都不能使用this。 this在成员函数开始前构造,在成员的结束后清除。 this指针并不占用对象的空间。this相当于非静态成员函数的一个隐函的参数,不占对象空间。它跟对象之间没有包含关系,只是当前调用函数的对象被它指向而已。所有成员函数的参数,不管是不是隐含的,都不会占...

2020-03-29 23:36:01 388

原创 大端小端

小端:低地址低位,高地址高位!写个程序辨别系统是大端还是小端#include <iostream>using namespace std;union Test{ short value; char bytes[2];};int main(){ Test test_value; test_value.value = 0x1234;...

2020-03-29 01:10:08 118

原创 洗牌算法

非常惭愧知道的很晚。问题为:有一个大小为 100 的数组,里面的元素是从 1 到 100 按顺序排列,怎样随机的从里面选择 1 个数?最简单的方法是用rand()系统自动生成一个1-100的数,然后去数组找对应的位置即可。进一步,问题扩展为:有一个大小为100的数组,里面的元素是从 1 到 100 按顺序排列,怎样随机的从里面选择 50 个数?(注意数字不能重复!)...

2020-03-28 00:18:08 3577 1

原创 直接初始化与复制初始化

String s("abc")和String s = "abc"有什么区别呢?C++中的直接初始化指的是直接调用类的构造函数进行初始化(带括号的):String a; // 调用默认构造函数String a("hello"); // 调用参数为const char *类型的构造函数String b(a); // 调用拷贝...

2020-03-27 22:42:55 257

原创 Makefile

在linux上用makefile编译一个hello.c文件,可用gcc编译器。gcc hello.c -o hello只能编译一个文件,非常不方便!首先,创建文本文档,取名Makefile(无后缀),#是注释!第一层:显示规则目标文件 : 依赖文件[TAB]指令第一个目标文件是我的最终目标!(.c—预编译—.i—编译—.s—汇编—.o—链接—.exe的倒叙)...

2020-03-25 23:41:32 206

原创 Git小结

版本控制也就是版本迭代目前流行的工具有Git、Svn(Subversion)版本控制的分类本地版本控制 :v1、v2、v3集中版本控制(单点故障问题):SVN分布式版本控制(每个电脑都拥有全部代码!安全隐患!):GitGit历史:Bitkeeper不提供给linux社区,李纳斯·托沃兹(Linus Benedic Torvalds,1969)两周开发了Git!官网下...

2020-03-23 22:44:53 87

原创 初识计算广告

第一部分 认识商业化体系免费倾销+后向变现互联网三项可变现核心资产知名协会:iab、4A、ANA直观认识在线广告:目的与形式品牌触达(Brand Awareness):提升长时期内的转化率和利润直接效果(Direct Response):有短期内明确用户转换行为诉求投入产出比 Return on Investment ROI偏直接效果性广告形式:条幅广告(Ban...

2020-03-23 21:31:07 505

原创 二叉树非递归遍历

先序对于任一结点p:1)访问结点p,并将结点p入栈;2)判断结点p的左孩子是否不空先while循环直到空,这其间要输出根节点值(因为是先序);这之后,取栈顶结点并进行出栈操作,令 p = 栈顶元素的右孩子(如果不为空循环,如果为空证明遍历完毕,会再取栈顶元素);3)直到p为NULL并且栈为空,则遍历结束。class Solution {public: vector<...

2019-09-14 17:08:49 191 2

原创 【LeetCode】146. LRU缓存机制

题目描述运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制。它应该支持以下操作:获取数据 get 和写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近...

2019-09-10 17:53:48 136

原创 gdb调试

gcc-g 为了调试用的,可以生产一些调试信息,加-g 是为了gdb用,不然gdb用不了。-o output_filename确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out,运行的时候直接 ./a.out 就能运行代码。示例为:gcc filename.c -o filename-c 只...

2019-05-11 12:03:22 223

原创 常见的内存错误及对策

摘自:https://blog.csdn.net/u013457167/article/details/82814413常见内存错误1、内存尚未分配成功,却使用了它【解决办法】在使用内存之前检查指针是否为NULL,或者说,在使用指针之前一定要确保指针是有效的,即要进行指针有效性检验。如果指针p是函数的参数,那么在函数的入口使用assert(p != NULL) 进行检查,如果是用mal...

2019-05-09 17:32:11 326

原创 【面试】手写String类

类的构造函数、析构函数、拷贝构造函数、拷贝赋值运算符函数#include<cstring>#include<cstdio>class CMyString{public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(v...

2019-05-09 12:28:18 396

原创 栈和堆的区别

一、程序的内存分配方式不同栈区(stack):编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。 堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。二、申请方式不同stack 由系统自动分配,heap 需要程序员自己申请。 C 中用函数 ma...

2019-05-08 21:33:16 61353 5

原创 【LeetCode】377. 组合总和 Ⅳ

题目描述给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。示例:nums = [1, 2, 3]target = 4所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。因此输出为 7。思路本题...

2019-05-08 10:55:36 249

原创 类型转换

隐式类型转换系统自动进行的,如int a = 3 + 4.5;显示类型转换(强制类型转换)//c语言风格int k = 5 % (int)3.2;int p = 5 % int(3.2); //函数风格的强制类型转换int l = 5 % (int)"def"; //这样写编译不会报错,但结果肯定不对【c++】强制类型转换通用形式:强制类型转换名<目...

2019-05-07 17:13:25 217

原创 智能指针

定义将基本类型指针封装为类对象指针(这个类肯定是个模板,以适应不同基本类型的需求),并在析构函数里编写delete语句删除指针指向的内存空间。new出来的叫裸指针,智能指针对裸指针进行了包装,能够自动释放所指向的对象内存。//复习类模板template<typename T>class myclass{public: T size = 100;};//ma...

2019-05-07 12:25:21 543

原创 大数据处理相关

题目描述一个网站有100亿url存在一个黑名单中,每条url平均64字节。这个黑名单要怎么存?若此时随便输入一个url,你如何快速判断该 url 是否在这个黑名单中?题目解析这是一道经常在面试中出现的算法题。凭借着题目极其容易描述,电面的时候也出现过。不考虑细节的话,此题就是一个简单的查找问题。对于查找问题而言,使用散列表来处理往往是一种效率比较高的方案。但是,如果你在面试中回...

2019-05-06 21:17:11 264

原创 内存对齐

C++空类的内存大小为1字节,为了保证其对象拥有彼此独立的内存地址。非空类的大小与类中非静态成员变量和虚函数表的多少有关(如果有虚函数就+4字节,无论有几个,虚函数可以看做是一个4字节的非静态成员变量,而且应该也是看虚函数出现位置的)。值得注意的是,类中非静态成员变量的大小与编译器内存对齐的设置有关。成员变量在类中的内存存储并不一定是连续的。它是按照编译器的设置,按照内存块来存储的,这个内存块大...

2019-05-06 15:23:25 127

原创 安全相关

XSS与CSRF摘自:https://segmentfault.com/a/1190000007059639XSS:跨站脚本(Cross-site scripting,通常简称为XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。CSRF:跨站请求伪造(Cross-...

2019-05-06 11:10:48 150

原创 指针与引用区别

非空区别:在任何情况下都不能使用指向空值的引用。引用必须总是指向某个对象。不存在指向空值的引用意味着引用的代码效率比使用指针的效率要高。 合法性区别:使用引用前不需要检测它的合法性。指针总是被检测,防止其为空。 可修改区别:指针可以被重新赋值以指向另一个不同对象,但是引用总是在初始化时被指定了绑定的变量,以后不能改变,也就是不能被重新赋值,但是其内容可以改变。 应用区别:在以下情况下应该使用...

2019-05-05 21:29:27 113

原创 【面试】手写函数合集

strcpy函数作用:把src的字符串放到dst的位置。char* strcpy(char* dst, const char* src) //该函数是没有考虑重叠的{ assert(dst); //当函数返回值不是void时用assert方便一些 assert(src); char* res = dst; while((*dst++ = *s...

2019-05-05 16:49:48 333

原创 exit

exit与returnexit(exiitCode):这个表示整个程序终止执行,也就是说在整个程序中,只要调用 exit ,就结束,并且可以返回一个数值给调用这个程序的环境,环境就可以知道这个程序执行的结果。exit为C++的退出函数,声明于stdlib.h中,对于C++其标准的头文件为cstdlib。return:一般是函数返回的结果,这个结果可以是int类型、short类型、bool类...

2019-05-03 16:27:11 850 1

原创 数组与指针

摘自:https://blog.csdn.net/qq_22238021/article/details/79779574【注意事项】1、一个一维int数组的数组名实际上是一个int* const p类型,p指向第一个元素;2、一个二维int数组的数组名实际上是一个int (*const p)[n],p指向第一行;3、数组名做参数会退化为指针,除了sizeof,也就是说sizeo...

2019-04-30 20:58:31 429

原创 new与malloc

基本概念【c】malloc/free从堆中分配/释放内存(malloc=memory allocation,malloc和free是函数)//标准void *malloc(int NumBytes); //NumBytes为要分配的字节数void *free(void *FirstByte);//例int *p = (int *)malloc(sizeof(4));free(p...

2019-04-30 17:26:40 244

原创 volatile总结

volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,而且读取的数据立刻被保存。例如:...

2019-04-30 12:20:49 84

原创 【nginx】课程技术总结

完整项目:通讯框架+业务逻辑框架【项目内容】(1)项目是非常完整的多线程高并发服务器程序(2)按照包头+包体格式收,完美的解决了数据粘包的问题(3)根据收到的数据包来执行不同的业务逻辑(4)把业务处理产生的结果数据包正确的返回给客户端【用到的主要开发技术】(1)epoll高并发通讯技术,用的是水平触发模式【LT】,简单提及边缘触发模式【ET】(2)通过线程池技术处理...

2019-04-21 16:34:10 200

空空如也

空空如也

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

TA关注的人

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