自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Tanswer_

纸上得来终觉浅,绝知此事要躬行

  • 博客(101)
  • 资源 (4)
  • 收藏
  • 关注

原创 make 出现 OOM???

心情烦躁,随便翻翻博客,好久没更新了,来写篇水博,冷静一下。这周编译一个项目的时候,出现 error,如下:看到 cc1plus 被 killed 了,第一反应是不是因为 OOM killed 掉了,本来云服务器就只有 1G 内存。用 dmesg 看一下吧,果然:那怎么办,使用 swap 吧,需要开启一下,默认是关闭的。使用交换文件来做交换分区。// 先创建交换文件falloca...

2019-04-25 14:13:09 496

原创 Linux 系统 CPU 使用率简单分析

CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示。CPU 使用率为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机一来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。Linux 通过 /proc 虚拟文件系统,向用户空间提供了系统内部状态的信息,而 /proc/stat 提...

2018-12-14 21:59:45 3999

原创 Redis 客户端 Hiredis 简介

学习总结一下官方发布的C版本客户端 hiredis,了解hiredis 客户端大致实现细节。在理解代码之间需要了解通信协议的特点,我上一篇转载的文章已经有过介绍,大家可以去看一下。hiredis 提供了同步、异步访问,异步 API 需要与一些事件库协同工作,主要看一下同步API的实现。hiredis 与服务端通信的API比较简单,主要有这几个步骤:建立连接发送命令等待结果并处理...

2018-06-28 21:03:07 4971 1

转载 Redis 通信协议(protocol)

本文档翻译自: http://redis.io/topics/protocol 。Redis 协议在以下三个目标之间进行折中:易于实现可以高效地被计算机分析(parse)可以很容易地被人类读懂网络层客户端和服务器通过 TCP 连接来进行数据交互, 服务器默认的端口号为 6379 。客户端和服务器发送的命令或数据一律以 \r\n (CRLF)结尾。请求...

2018-06-28 17:41:22 9525

转载 Linux交换空间(swap space)

每次安装Linux的时候,都会要求配置交换分区,那么这个分区是干嘛的呢?不设置这个分区有什么后果?如果一定要设置,设置多大比较合适?本篇将试图回答这些问题并尽量覆盖所有swap相关的知识。下面的所有例子都在ubuntu-server-x86_64 16.04下执行通过什么是swap?swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说...

2018-06-23 18:18:46 15440

转载 DNS协议详解及报文格式分析

DNS协议详解及报文格式分析

2018-06-11 20:54:17 1032

转载 无锁队列的原理和实现

无锁队列的实现-coolshellCAS另一篇参考设计不使用互斥锁的并发数据结构锁粒度

2018-03-24 13:20:09 7619

原创 复合&继承关系下的构造和析构

继承关系下的构造和析构看一下测试代码:/* * @filename: Inheritance.cpp * @author: Tanswer * @date: 2018年01月31日 14:59:28 * @description: 测试继承关系下的构造和析构 */#includeusing namespace std;class Base

2018-01-31 16:25:55 748 1

原创 编写网络服务程序的常用编程模型

今天大概总结一下编写服务端程序常用的编程模型。参考UNP第三版第三十章和陈硕的muduo那本书,强烈建议仔细阅读。注意以下代码只是为了显式框架或者说编程模型,不是完整的程序,深夜写的比较任性,不要见怪。accept + read/write这个不是并发服务器,而是迭代服务器(iterative server)。 它一次服务一个客户。不适合长连接,适合 daytime 这种 write-

2018-01-25 02:32:20 1092 1

原创 Muduo网络库源码分析之TcpConnection Class

用于管理一个具体的 TCP 连接,比如消息的接收与发送,完成用户指定的连接回调 connectionCallback。TcpConnection 构造时接收参数有 TCP 连接的 sockfd,服务端地址 localAddr,客户端地址 peerAddr,并通过 Socket 封装 sockfd。并用 Channel 管理该 sockfd,向 Channel 注册可读、可写、关闭、出错回调函数

2018-01-17 15:04:45 850

原创 Muduo网络库源码分析之Acceptor和TcpServer

Acceptor用于 accept 一个 TCP 连接,accept 接受成功后通知 TCP 连接的使用者。Acceptor 主要是供 TcpServer 使用的,其生命期由后者控制。一个 Acceptor 相当于持有服务端的一个 socket 描述符,该 socket 可以 accept 多个 TCP 客户连接,这个 accept 操作就是 Acceptor 实现的。这里用到了一些封装好

2018-01-12 22:43:03 956

原创 C++智能指针的分析与使用

手动管理的弊端在简单的程序中,我们不大可能忘记释放 new 出来的指针,但是随着程序规模的增大,我们忘了 delete 的概率也随之增大。在 C++ 中 new 出来的指针,赋值意味着引用的传递,当赋值运算符同时展现出“值拷贝”和“引用传递”两种截然不同的语义时,就很容易导致“内存泄漏”。手动管理内存带来的更严重的问题是,内存究竟要由谁来分配和释放呢?指针的赋值将同一对象的引用散播到程序各

2018-01-11 23:39:30 3291 3

原创 Muduo网络库源码分析之对socket及其相关操作的封装

主要涉及到的类和实现文件有:Endian.h 提供了字节序转换的函数。Socket.h/Socket.cc socketfd 的封装,提供了绑定地址、开始listen、接受连接等操作,并可设置套接字选项。InetAddress.h/InetAddress.cc 套接字地址的封装,提供了多种方式初始化一个地址,还提供方法从地址中拿到 ip 和 port。SocketsOps.h/

2018-01-09 15:14:11 1199

原创 eventfd 的分析与具体例子

eventfd 介绍Linux 2.6.27后添加了一个新的特性,就是eventfd,是用来实现多进程或多线程的之间的事件通知的。接口#include int eventfd(unsigned int initval, int flags);这个函数会创建一个事件对象(eventfd object),返回一个文件描述符,用来实现进程或线程间的等待/通知(wait/notify

2018-01-08 23:22:55 6530 1

原创 Muduo网络库源码分析之定时器的实现

muduo 的定时器功能由三个 class 实现,TimerId、Timer 和 TimerQueue。TimerId 类它唯一标识一个 Timer 定时器。TimerId Class 同时保存Timer* 和 sequence_,这个 sequence_ 是每个 Timer 对象有一个全局递增的序列号 int64_t sequence_,用原子计数器(AtomicInt64)生成。

2018-01-07 15:41:05 1241

原创 Muduo网络库源码分析之Reactor模式的关键结构

本文分析一下Reactor模式的实现,关键是三个类:Channel、Poller、EventLoop。事件分发类 ChannelChannel 是 selectable IO channel,负责注册与响应IO事件,包括注册给Poller的 fd 及其监听的事件,以及事件发生了所调的回调函数。 每个Channel对象自始至终只负责一个 fd 的事件分发,封装了一系列该 fd 对应的操

2018-01-06 18:36:02 1420 1

原创 FastCGI 协议分析与C语言实现实例

考虑让我的 web server 增加对 PHP 的支持,这就要用到 php 解析器来将客户端请求的 php 文件解析为静态资源,再由我的 web server 将其返回到客户端,php-fpm 就可以来帮我们完成这个工作。可是我的 web server 如何与 php-fpm 通信呢? 接下来就是本文的主角:FastCGI 。FastCGI 实现与测试代码:https://github.com/T

2017-12-23 14:46:54 1922

原创 内存管理之用户空间

32 位的平台上,线性地址空间为固定的 4GB,并且由于采用了保护机制,Linux内核将这 4GB 分为两部分,线性地址较高的 1GB(0xC0000000 到 0xFFFFFFFF )为共享的内核空间;而较低的 3GB 为每个进程的用户空间。由于每个进程都不能直接访问内核空间,而是通过系统调用间接进入内核,因此所有的进程都共享内核空间。而每个进程都拥有各自的用户空间,各个进程之间不能互相访问彼此的

2017-12-10 14:47:55 1624

原创 [编译链接装载]之静态链接

链接器之所以存在或者产生,基本上是由于程序开发的模块化。这里讲的模块,主要是编译概念上的模块,通常他们按照功能划分,比如一个.c或者.cpp文件就是一个编译单元,就是一个模块,编译后就产生一个.o目标文件。为了最终生成一个可执行文件、静态库或者动态库,就需要把各个编译单元按照特定的约定组合到一起。这里特定的约定指的就是“目标文件格式”,它定义了目标文件、库文件和可执行文件的格式,这里组合这一过程就叫

2017-12-06 15:38:25 1143 1

原创 [编译链接装载系列]之聊聊目标文件与ELF格式

编译器编译源代码后生成的文件叫做目标文件,从结构上讲它是已经编译后的可执行文件格式,只是还没有经过链接,其中可能有些符号或有些地址还没有调整。它本身就是按照可执行文件格式存储的,跟真正的可执行文件在结构上稍有不同。目标文件的格式:现在 PC 平台流行的可执行文件格式主要是 Windows 下的 PE( Portable Executable,可移植可执行 ) 和 Linux 的 ELF( Execu

2017-12-04 20:58:14 1260

原创 内存寻址之分页机制

写在前面:分页机制完成线性地址到物理地址的转换 80x86 规定分页机制是可选的。分段和分页没有什么必然联系,分段可以说是 Intel 的 CPU 一直保持着的一种机制,而分页只是保护模式下的一种内存管理策略。想开启分页机制,CPU必须工作在保护模式,而工作在保护模式可以不开启分页。分页机制由控制寄存器 CR0 中的 PG 位启用,如PG=1则启用分页机制,把线性地址转换为物理地址;如果PG=0则直

2017-12-02 14:51:54 5303 2

原创 [Web Server](一)Tiny Web Server分析

写在前面: 计划写一个Web 服务器,在小组的群博上没有找到相关的文章,自己打算从开始记录下这个过程,一是整理清楚我的构建过程,二是也能让后面的同学做一下参考。CSAPP上网络编程那一章最后实现了一个小但是功能较齐全的Web 服务器,叫做TINY。因为只是知道HTTP协议的一些概念,还不太清楚一个Web服务器的工作流程和代码组织结构,而书上给出了 Tiny Server 的完整实现,代码非常短

2017-11-19 21:23:24 1923

原创 系统级 I/O与缓冲机制

从I/O,到缓冲区都会谈到。首先是所有语言都提供了执行I/O的较高级别的工具,例如ANSI C提供了标准I/O库,C++重载了<<和>>等,这些不依赖于系统内核,所以移植性强,而且这个缓冲区的分配长度和优化等细节都是代你处理好了。在Unix系统中,是通过使用有内核提供的系统级Unix I/O函数来实现这些较高级别的I/O函数的。

2017-11-16 19:52:35 1313

原创 TCP连接的关闭

多线程多进程关闭连接的区别首先来看看close和shutdown两个系统调用对应的内核函数:#define __NR_close 3 __SYSCALL(__NR_close, sys_close) #define __NR_shutdown 48 __SYSCALL(__NR

2017-11-02 11:47:30 3314

原创 TCP半连接与全连接队列及accept建立连接

我们知道当服务器绑定、监听了指定端口后,内核通常会为每一个LISTEN状态的socket维护两个队列:SYN队列(半连接队列):由/proc/sys/net/ipv4/tcp_max_syn_backlog指定,表示处于 SYN_RECV 状态的队列ACCEPT队列(全连接队列):由listen()函数的第二个参数 backlog 指定,内核硬限制由 net.core.somaxconn 限制,

2017-10-28 14:03:12 5406

原创 计算机网络之TCP连接的建立和终止

TCP提供一种面向连接的、可靠的基于流的服务。面向连接:在彼此交换数据之前必须先建立一个TCP连接,双方互相确认,仅有两方彼此通信。可靠:数据被分割成TCP认为最适合发送的数据块;TCP发出一个段后启动一个定时器,超时重传;TCP收到另一端的数据后,将回复一个确认;TCP将保持它首部和数据的校验和,以检测数据在传输过程中的任何变化;必要时TCP将对收到的数据进行重新排序;TCP还能提供流量控制。基于

2017-10-19 23:51:39 1794

原创 计算机网络之基础篇

什么是计算机网络?主机之间通过交换网络互连,交换节点一般是路由器或者交换机。什么是网络协议?为进行网络中的数据交换而建立的规则、标准或约定。协议的三要素是什么?语法、语义、时序计算机网络的结构?网络边缘:主机(端系统)、网络应用主机(端系统):运行网络应用程序客户/服务器(C/S)应用模型:客户发送请求,接受服务器响应对等(P2P)应用模型:不仅依赖专用服务器;对等实体之间直接进行通信接入网络

2017-10-19 20:56:07 2140 2

原创 Redis网络库源码浅解

Redis网络模型是一个使用IO多路复用、单线程、非阻塞的模型。这个模型的优点在于单线程不用考虑加锁,如果在单核环境上可以将效率发挥到最大。它没有那么庞大,代码一共2000多行,因此比较容易分析,学长推荐。 另外@浅墨学长拿出了redis网络部分的代码,设计了应用层协议,添加了应用层buffer,定义了服务器类型,完成了一个基于Redis网络模型的简易网络库,我fork了一份,然后跟着学长的博客

2017-08-12 16:43:52 1753

原创 [C++11]半同步半异步线程池实现与分析

线程池介绍服务器完成一项任务的时间可分为:T1:创建线程或进程时间;T2:执行任务时间;T3:销毁进程或线程时间。通常T1+T3的时间大于T2,线程池正是关注如何缩短T1和T3的时间。 线程池通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分一个预先创建的线程去处理任务,线程在处理完任务后还可以重用,不会销毁,继续等待下次任务的到开。这样能避免大量的线程创建和销毁操作,从而节省系统资

2017-08-11 16:03:45 1576

原创 [C++11]左值、右值、左值引用、右值引用小结

左值和右值左值:指表达式结束后依然存在的持久对象,可以取地址,具名变量或对象 右值:表达式结束后就不再存在的临时对象,不可以取地址,没有名字。 比如 int a = b + c;,a 就是一个左值,可以对a取地址,而b+c 就是一个右值,对表达式b+c 取地址会报错。C++11中右值又由两个概念组成:将亡值和纯右值。纯右值和将亡值在C++98中,右值是纯右值,纯右值指的是临时变量值、不跟对象关联

2017-08-09 21:37:30 2568

原创 PHP socket编程示例

写在前面:最级要开始写我们的项目了,是一个网络编程的项目,语言用C++,基于Socket通信,采用JSON数据交换格式,存数据用Mysql数据库。我们开始的困难是不知道如何处理客户端,组内都没有学写APP,如果是在终端下跑那就有太多限制了,感觉反而是加大了难度。 纠结了一会,突然想到能不能用PHP来写客户端,我学过一段时间PHP,目前还不太了解高阶的用法,前不久写了一个简单的订餐系统,用到

2017-07-19 15:14:50 1581 3

原创 【C++】jsoncpp的安装与使用

一、JSON的简单介绍 JSON(JavaScript Object Notation):JS对象表示法 是轻量级的文本数据交换格式;独立于语言,JSON解析器和库支持多种编程语言 json文件的文件类型是”.json”语法规则:数据在 名称/值对 中 名称在双引号中,后面写一个冒号,然后是值 值可以是:数字(整数或者浮点数)、string(在双引号中)、逻辑值(tr

2017-06-12 19:49:44 8184 3

原创 I/O知识点汇总

I/O设备分类:按使用特性 人机交互类外设:打印机、显示器、鼠标、键盘等 存储设备:磁盘、磁带、光盘等 网络通信设备:网络接口、调制解调器等按传输速率分类 低速设备:每秒几个到数百个字节(< KB/s),如键盘、鼠标 中速设备:每秒数千个字节至数万个字节,如激光打印机 高速设备:数百个千字节至千兆字节(>100 KB/s),如磁带机、光盘机信息交换的单位分类 块设备:信息的存取以

2017-06-03 14:45:34 2911 4

原创 C++操作Mysql数据库/Linux下

想用C++写项目,数据库是必须的,所以这两天学了一下C++操作Mysql数据库的方法。也没有什么教程,就是在网上搜的知识,下面汇总一下。 连接MySQL数据库有两种方法:第一种是使用ADO连接,不过这种只适合Windows平台;第二种是使用MySQL自己的C API函数连接数据库。我是在Linux平台下开发,所以就采用第二种方法,有很多Api函数,但是常用的就几个,我也是就用到其中的几个。API函

2017-05-28 23:28:44 3322 4

原创 OS进程调度及典型调度算法

进程调度的功能记录系统中的所有进程的状态、优先级数和资源的需求情况确定调度算法,决定将CPU分配给哪个进程多少时间分配处理机给进程,进行CPU现场的保护和移交调度的层次一个作业从提交开始直到完成,往往要经历以下三级调度,如图所示。作业调度。又称高级调度,.其主要任务是按一定的原则从外存上处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的

2017-05-03 21:11:07 4163 1

原创 PV原语小结及进程同步示例

信号量S的物理含义 S>0:表示有S个资源可用;S=0表示无资源可用;S<0绝对值表示等待队列或链表中的进程个数。信号量的初值应大于等于0。PV原语小结 通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问,它们在执行时是不可中断的。初始化可指定一个非负整数,即空

2017-05-02 21:22:06 6817 3

原创 【C++】尽可能使用const

请记住: 1. 将某些东西声明为const可帮助编译器侦测出错误用法。const 可被施加于任何作用域内的对象、函数参数、函数返回类型、成员函数本体。 2. 编译器强制实施bitwise constness,但编写程序时应该使用“概念上的常量性”。 3. 当 const 和 non-const 成员函数有着实质等价的实现时,令non-const 版本调用 const 版本可避免代码重复。

2017-04-30 18:04:51 1349 1

原创 预处理器、编译器、汇编、链接

预处理器(cpp)C/C++的预处理器是最低端的一种—–词法预处理器,主要是进行文本替换、宏展开、删除注释、把头文件内容包含进来这类简单工作。gcc -E选项可得到预处理后的结果,预处理结果会显示到屏幕上,如果需要保存,则得需要重定向,扩展名为 .i;C/C++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于C/C++语句(这也是定义宏时不要加分号的原因),语法检查

2017-04-30 12:28:46 1755 12

原创 【C++】尽量以const,enum,inline 替换 #define

尽量以const,enum,inline 替换 #define

2017-04-29 16:23:27 1557 3

原创 西邮Linux兴趣小组2017纳新免试题揭秘

声明今年的免试题按照关卡顺序依次是由小组15级成员何攀、楚东方、宫展京、杜肖孟、王一妃同学精心准备的(鼓掌),每个人总结了一下自己负责关卡的解法,我这里整理了一下,给出一套完整的免试题详解。文末附上小组前几年的免试题详解,感兴趣的同学可以参考着玩一下。Let’s go!第一关免试题链接:点此进入 ,进去之后会有如下页面映入眼帘:首先,我们看到的是一段代码(运行结果是 11,代表着我们小组成立 11

2017-04-28 20:46:50 2725 2

分布式实时处理系统 原理、架构与实现

分布式实时处理系统 原理、架构与实现,非常不错,值得推荐。

2018-04-10

Unix-Linux编程实践教程(高清).pdf

Unix-Linux编程实践教程(高清) PDF版

2017-03-28

汇编编译连接调试工具

学习汇编必备的工具,包括汇编代码的编译 连接 调试工具。主要是针对linux系统下学习汇编。

2016-12-02

Huffman树的C++模板类实现

哈夫曼树的C++模板类实现

2016-10-28

空空如也

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

TA关注的人

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