博客主页 所有文章 标签 关于我
img

Dxy

C++ / Linux / github

杜鑫源

个人站

欢迎来到我的个人站~


  • 博客主页
  • 所有文章
  • 标签
  • 关于我
  1. Tcp

    TCP 重传机制、滑动窗口、流量控制、拥塞控制相信大家都知道 TCP 是一个可靠传输的协议,那如何它是如何保证可靠的呢?为了实现可靠性传输,需要考虑很多事情,例如数据的破坏、丢包、重复以及分片顺序混乱等问题。如不能解决这些问题,也就无从谈起可靠传输。那么,TCP 是通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性传输的。今天,将重点介绍 TCP 的重传机制、滑动窗口、流量控制、拥塞控制。重传机制TCP 实现可靠传输的方式之一,是通过序列号与确认应答。在 TCP 中,当发...…

    2020-08-20
    阅读全文 »

  2. Redis 底层数据结构

    1.简单动态字符串(SDS)​ Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(SDS)的抽象类型,并作为Redis的默认字符串表示1.1.SDS 的定义​ 每个sds.h/sdshdr结构表示一个SDS值 Struct sdshdr{​ //记录buf数组中已使用的字节数量​ //等于SDS所保存字符串...…

    2017-12-12
    阅读全文 »

  3. Redis 概述

    1.概述​ Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。​ redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础...…

    2017-12-11
    阅读全文 »

  4. 分布式服务框架笔记 第一章 应用架构演进

    第一章 应用架构演进1.传统垂直应用架构(1)简介:​ 在2006年之前,业界比较流行的有LAMP架构,MVC架构,EJB企业架构LAMP:Linux+Apache+PHP(前后台界面和业务逻辑)+MySQL数据库(读写分离)MVC:Spring+Struts+iBatis/Hibernate+Tomcat​ 共性:垂直应用架构,技术单一,学习成本低,开发上手快,测试,部署,运维比较简单(2)面临的挑战:​ 1)复杂应用开发维护成本高,部署效...…

    2017-11-14
    阅读全文 »

  5. Vs下使用protocol buffer(c++)

    VS下使用Protocol buffer(C++)首先,给出官方的网址,各种官方资料都可以找到https://github.com/google/protobuf windows下使用VS进行Protocol buffer开发(C++)的基本步骤:1.下载代码包2.形成sln文件3.编译出需要的lib文件和protoc.exe(exe程序可以直接下载得到)4.编写.proto文件5.利用protoc.exe文件生成.c和.h文件6.在工程中添加相关资源(.c和.h文件以及lib库) 完...…

    2017-09-11
    阅读全文 »

  6. 分布式一致性算法-Raft

    1. 先介绍一下–PasoxPaxos算法是莱斯利·兰伯特(Leslie Lamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法。Leslie Lamport本人认为Paxos算法是简单的,但是广大群众公认Paxos算法非常复杂。Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑。2. Raft简介来自Stanford的新的分布式协议研究称为Raft,它是一个为真实世界应用建立的协议,主要注重协议的落地性和...…

    2017-08-08
    Raftalgorithm
    阅读全文 »

  7. Epoll

    epoll一.简介1.epoll接口 epoll接口非常简单,一共只有三个函数(1)int epoll_create(int size);创建一个epoll的句柄,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的,所以在使用完epoll后,必须调用close()关闭,否则可能导致fd...…

    2017-06-28
    阅读全文 »

  8. #if、#ifdef、#if defined()之间的区别

    #if的使用说明#if的后面接的是表达式#if (MAX==10)||(MAX==20) code...#endif 它的作用是:如果(MAX==10)   (MAX==20)成立,那么编译器就会把其中的#if 与 #endif之间的代码编译进去(注意:是编译进去,不是执行!!) #if defined()的适用#if后面接的是一个宏#if defined (x) ...code...#endif这个#if defined它不...…

    2017-05-15
    cgccsystem_macro
    阅读全文 »

  9. 数据结构总结 平衡二叉树(avl树)

    数据结构总结-平衡二叉树(AVL树)1.介绍​ 我们知道在二叉查找树中,如果插入元素的顺序接近有序,那么二叉查找树将退化为链表,从而导致二叉查找树的查找效率大为降低。如何使得二叉查找树无论在什么样情况下都能使它的形态最大限度地接近满二叉树以保证它的查找效率呢?​ 前苏联科学家G.M. Adelson-Velskii 和 E.M. Landis给出了答案。他们在1962年发表的一篇名为《An algorithm for the organization of information》的文章中...…

    2017-05-07
    阅读全文 »

  10. C++程序中如何避免死锁?

    死锁的产生未必因为“锁”虽然锁是产生死锁的一般原因,但也不排除死锁出现在其他地方。无锁的情况下,仅需要每个std::thread对象调用join(),两个线程就能产生死锁。这种情况下,没有线程可以继续运行,因为他们正在互相等待。这种情况很常见,一个线程会等待另一个线程,其他线程同时也会等待第一个线程结束,所以三个或更多线程的互相等待也会发生死锁。解决死锁的一些建议 避免嵌套锁 避免在持有锁时调用用户提供的代码(因为你并不清楚用户想要做什么) 使用固定顺序获取锁 使用锁的层次结构什么...…

    2017-05-05
    c++c++11threadmutexdead-lockgcc
    阅读全文 »

  11. c++ std::mutex

    今天,在这里分享一下std::mutex对比POSIX标准pthread_mutex回忆一下:繁琐的posix mutex初始化操作: pthread_mutex_t = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_init()初始化方式尤其是第二种初始化方式,用起来比较麻烦C++中mutex初始化方式:std::mutex my_mutex;C++中通过实例化std::mutex创建互斥量,通过调用成员函数lock()进行上锁,unlock(...…

    2017-04-17
    c++c++11threadmutexlock_guardgcc
    阅读全文 »

  12. c++ std::thread

    c++11标准库 - std::thread让我们先来说说c++标准库为我们提供的std::thread。与绝大多数标准库一样,std::thread在使用上与用法上相较于posix标准的多线程库更加方便易于接受。但是,有一些方面需要注意。1. C++’s most vexing parse问题在上一篇章我们对这个问题已做过讨论,再次不在赘述。2. std::thread用法上面的坑首先,我们编写了如下的代码:// FileNmae : my_thread.cpp#include <...…

    2017-04-14
    c++c++11threadthread_jointhread_detachgcc
    阅读全文 »

  13. C++'s most vexing parse

    C++中最令人头痛的语法解析:most vexing parse我们先来看一个例子:std::thread类。如同大多数C++标准库一样,std::thread可以用可调用(callable)类型构造,将带有函数调用符类型的实例传入std::thread类中,替换默认的构造函数。因此:我们可以写出如下的代码:class background_task{public: void operator()() const { do_something(); do_something...…

    2017-04-14
    c++c++11most_vexing_parsegcc
    阅读全文 »

  14. what is __builtin_expect?

    What is __builtin_expect?想一个问题。比方说一个函数的返回值为0的概率低于百万分之1,但是出于程序的稳健性考虑,我们必须对此返回值进行逻辑判断。否则程序可能会造成崩溃甚至非预期效果。ok,我们加上了if判断语句后,无疑加大程序的开销。GCC (version >= 2.96)提供了__builtin_expect给程序员使用,目的是为了将“分支转移”的信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降如果不明白上述内容,那么你可能见过...…

    2017-04-08
    c++c++11likely&unlikelygcc
    阅读全文 »

  15. What is C++11 POD?

    问题:什么是POD?POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与C兼容,可以使用比如memcpy()这类C中最原始的函数进行操作。C++11中把POD分为了两个基本概念的集合,即:平凡的(trival)和标准布局的(standard layout)trival POD通常一个平凡的类或者结构体需要满足以下定义: 拥有平凡的默认构造函数和析构函数。默认的意思就是由编译器为我们自动生成的,不许是我们自己定义的,但是由于C++11提供了defau...…

    2017-04-07
    c++c++11pod
    阅读全文 »

  16. C++11 '=default','=delete'

    问题:=delete与=\default有什么好处?1 =default的好处通常我们在开发中会遇到这种尴尬的情况:当我们自定义了一个构造函数。那么默认的构造函数、拷贝构造、移动拷贝构造函数。都不再自动生成。注意一点:自定义了析构函数,不会影响编译器自动生成默认的构造函数。当我们在class A中自定义了A(int param)构造函数时,再采用A a方式默认构造一个对象的时候,编译器会提示没有这样的构造方法。因此在C++11之前,我们需要手动构造一系列我们可能会需要的默认构造函数。非常的...…

    2017-04-07
    c++c++11=delete=default
    阅读全文 »

  17. Linux多线程服务端编程:第四章 C++多线程系统编程精要

    学习多线程编程面临的最大的思维方式的转变有两点: 当前线程可能随时会被切换出去,或者说被强占 多线程程序中事件的发生顺序不再有全局统一的先后关系。bool running = false;void threadFunc() { // note 1 while (running) { // get task from queue }}void start() { muduo::Thread t(threadFunc); t.start(); ...…

    2017-03-28
    c++c++11linuxthread
    阅读全文 »

  18. Linux多线程服务端编程:第三章 多线程服务器的适用场合与常用编程模型

    3.1 进程与线程线程的特点是共享地址空间,从而可以高效地共享数据,一台机器上的多个进程能高效地共享代码段,但不能共享数据。3.2 单线程服务器的常用编程模型高性能的网络程序中,使用的作为广泛的“non-blocking IO + IO multiplexing”这种模型,即Reactor模式。在高性能的网络程序中,使用的作为广泛的“non-blocking IO + IO multiplexing”这种模型中,程序的基本结构是一个事件循环,以事件驱动和事件回调的方式实现业务逻辑while...…

    2017-03-25
    c++c++11linuxthread
    阅读全文 »

  19. Linux多线程服务端编程:第二章 线程同步精要

    线程同步的四项原则: 最低限度共享对象,减少需要同步的场合。一个对象能不暴露给别的线程就不要暴露 使用高级的并发编程构件:TaskQueue、C、Producer-Consumer Queue、CountDownLatch等 使用底层同步原语时,只用非递归的互斥器,慎用读写锁,不用信号量 除了使用“automic”整数之外,不自己编写lock-free代码,也不用“内核级”同步原语2.1 互斥器使用互斥器的原则: 用RAII手法封装mutex的创建、销毁、加锁、解锁这四个操作。 ...…

    2017-03-25
    c++c++11linuxthread
    阅读全文 »

  20. Linux多线程服务端编程:第一章 线程安全的对象生命期管理

    编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生死不能由对象自身拥有的mutex(互斥器)来保护。如何避免对向析构时可能存在的race condition是C++多线程编程的基本问题。 答案:可以借助Boost库中的shared_ptr和weak_ptr完美解决。这是实现线程安全的Observer模式的必备技术。1.1 当析构函数遇到多线程C++要求程序员自己管理对象的生命期,这在多线程环境下显得尤为困难。当一个对象能被多个线程同时看到时,对象的销毁时机会变得模糊不清,...…

    2017-03-24
    c++c++11linuxthread
    阅读全文 »


1 / 2 更早 →
  • RSS
  • Email

Copyright © 杜鑫源 2020 Theme by dxyuan |

本站总访问量 次