- 博客(34)
- 资源 (2)
- 收藏
- 关注
原创 Clean Code读书笔记
Clean Code读书笔记有意义的命名 名副其实 体现本意的名称 用名副其实的函数代替魔术数 避免误导 避免错误使用专有名词 堤防使用不同处较小的名称 拼写一致 做有意义区分 数字系命名区分存在误导 废话区分(info、data)等,名称不同,意思无区别 使用读得出来的名称 使用可搜索的名称 名称长短应与其作用域大小相对应 避免使用编码 匈牙利语标记法 ( 名称 +类型 ) 成员前缀 (m_前缀来标...
2021-02-22 10:18:43
198
原创 libevent源码分析--锁和多线程
写在前面: 这个源码是分析libevent-2.0.20-stable, 并非最新版本的libevent,作者并没有全看源码,在这里会推荐以下参考的一些网站,也欢迎大家在不足的地方提出来进行讨论。 libevent源码分析 libevent深度剖析1 libevent深度剖析2锁 libevent的内部实现不需要多线程,为此我们在libevent的源码中也看不...
2018-09-17 21:22:28
431
原创 libevnet源码分析(2) --内存分配
写在前面: 这个源码是分析libevent-2.0.20-stable, 并非最新版本的libevent,作者并没有全看源码,在这里会推荐以下参考的一些网站,也欢迎大家在不足的地方提出来进行讨论。 libevent源码分析 libevent深度剖析1 libevent深度剖析2 什么都没包装的内存管理 默认情况下,libevent 使用 C 库的内存管理函数在...
2018-09-13 19:05:25
247
原创 muduo源码学习笔记(2)
前言: 对于muduo库,我觉得,光Linux多线程上提到的一些实现,还是不够的,在base/里面,还有/net里面提供了很多不错的实现,值得去学习,暑假算是看看muduo的百分之八十的源码,并对其进行了一次实现,(剩下的在最近总结的时候,也会开始看看,并实现一遍),对于muduo库,简单谈谈自己对其实现的理解。日志缓存流LogStream 在muduo实现的基础日志类,一共用来三...
2018-09-12 21:23:05
1197
原创 libevent源码分析(1)
写在前面: 这个源码是分析libevent-2.0.20-stable, 并非最新版本的libevent,作者并没有全看源码,在这里会推荐以下参考的一些网站,也欢迎大家在不足的地方提出来进行讨论。 libevent源码分析 libevent深度剖析1 libevent深度剖析2在event2/event.h中定义了错误类型和错误的回调函数#define ...
2018-09-11 19:33:48
224
原创 muduo源码学习笔记(1)
前言: 对于muduo库,我觉得,光Linux多线程上提到的一些实现,还是不够的,在base/里面,还有/net里面提供了很多不错的实现,值得去学习,暑假算是看看muduo的百分之八十的源码,并对其进行了一次实现,(剩下的在最近总结的时候,也会开始看看,并实现一遍),对于muduo库,简单谈谈自己对其实现的理解。用RAII管理你的锁 Posix Thread内定义的一系列的mute...
2018-09-10 20:17:44
846
转载 (转)do {...} while (0) 在宏定义中的作用
如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子: 1 2 #define __set_task_state(tsk, state_value) ...
2018-09-10 20:16:22
131
转载 C++11开发中的Atomic原子操作
原文链接:https://www.cnblogs.com/the-tops/p/6347584.html?utm_source=itdadao&utm_medium=referral原子操作在多线程开发中经常用到,比如在计数器,序列产生器等地方,这类情况下数据有并发的危险,但是用锁去保护又显得有些浪费,所以原子类型操作十分的方便。原子操作虽然用起来简单,但是其背景远比我们想象的要复...
2018-07-28 18:02:18
544
原创 ftp关键技术五:限制链接数
通常在一些网站中,为了防止恶意大量的访问和超大量访问导致内存占满,会对单个链接的连接数和总链接数做出一个限制。 以本FTP服务端为例,假设每个客户链接,我们都需要两个进程来处理它,假设了一个客户需要分配总共1M的栈内存出来,1000个链接,接近1G的内存就没有了。另一方面,如果单个ip大量链接服务端,会占用大量的带宽、内存和文件句柄,实际上每个用户(ip)只需要两三个链接就可以解决问题,所...
2018-07-26 14:30:33
3954
原创 ftp关键技术四:空闲断开
首先提出一个问题,我们为什么需要空闲断开? 对于服务端而言,由于连接数和内存的限制,我们不可能对一个长时间处于不活跃的客户端,单独维护一个fd,一个进程/线程始终为其服务,fd单个进程上限默认值为1024,由于内存的限制,也不能无限制的分配出进程或者线程为其服务,这个时候我们就需要断开在规定时间内没有任何动作的客户端,腾出内存为其他客户端服务。第二个问题,我们要基于什么实现空闲断开呢?...
2018-07-26 14:29:20
1507
原创 ftp关键技术二:nobody进程创建和使用(一)
本文将从以下几个方面具体阐述nobody进程的前世今生 为什么需要nobody进程? 进程间通信的协议制定 为什么需要nobody进程(1)为什么要使用nobody进程和服务进程两个进程? 1.在PORT模式下,服务器会主动建立数据通道连接客户端,服务器可能就没有权限做这种事情,就需要nobody进程来帮忙。 Nobody进程会通过unix域协议(本机通信效率高) ...
2018-07-26 14:28:36
1879
原创 ftp关键技术二:nobody进程创建和使用(二)
本文将从以下几个方面具体阐述nobody进程的前世今生 如何给予nobody权限 nobody进程负责的任务以及实现 如何给予nobody权限先看看在系统中ftp服务器是如何工作的吧[root@VM_0_11_redhat ~]# ps -ef | grep miniftproot 6362 1 0 May13 ? 00:0...
2018-07-26 14:27:26
827
3
原创 漫谈io复用和高性能服务框架
前言:这篇博客可能会写的有点杂乱,毕竟是想到哪里写到哪里,至少算是一个总结性的文章。 一.IO复用的生 二.IO复用实现 三.统一事件源 四.Reactor模型 五.有限状态机一.IO复用的生 首先我们先说说不用IO复用时,我们所谓的并发服务器的极限。简单的想,我们可以用一个线程来负责一个链接,但是线程个数又不是可以无限增大的...
2018-07-26 14:23:38
227
原创 浅析线程安全的对象生命期的管理
1.前言:c++与其他面向对象语言不同,没有gc,c++要求程序员自己管理对象的生命,在并发编程环境下显得尤为困难。当一个对象能被多个线程同时看到时,那么对象的销毁时机就会变得模糊不清,可能出现多种竞争条件(race condition): 在即将析构一个对象时,从何知道别的线程是否正在执行该对象的成员。 如何保证在执行成员的函数期间,对象不会被另一个线程析构。 在调...
2018-07-26 14:22:24
261
原创 ftp关键技术一:账户验证
title: ftp关键技术一:账户验证对于Linux端的ftp服务的而言,账户即为Linux端的用户。一般步骤是:以root用户权限启动ftp服务获取客户端的验证信息从系统获取用户名对应的加密后的密码对客户端发过来的密码进行对应的加密,并对比如何验证是否以root用户启动服务?我们可以通过getuid()函数获取当前程序运行的uid。一般root用户的uid =0。所以可以通过以下方式验证是否...
2018-05-18 17:10:34
877
原创 记一次做ftp服务器项目,遇到的字节顺序的问题。
记一次做ftp服务器项目,遇到的字节顺序的问题。———(转)为什么需要htons(), ntohl(), ntohs(),htons() 函数ps:近期在做FTP服务器项目,遇到一个深坑,当你在系统中获得port的时候,对于linux系统而言,获得的port 是 unsigned short 类型的,在使用转化的时候,就应该使用htons()函数,而不是htonl(),因为这个问题,排查问题,排查了
2018-04-29 18:14:57
322
1
转载 关于ubuntu系统boot分区空间不足而又无法卸载旧内核的解决方法
关于ubuntu系统boot分区空间不足而又无法卸载旧内核的解决方法转载自 https://blog.youkuaiyun.com/xhw035/article/details/52422970 今天早上打开电脑,发现本人ubuntu 16.04系统提示boot分区不足,然后仔细查看,发现果然boot分区剩余0m.顿时不知所措,原来安装ubuntu系统都是按照网上视频教程里面所讲的,给boot...
2018-04-26 13:03:45
285
原创 从基本排序算法看时间复杂度
在介绍时间复杂度分析方法前,我们首先来明确下算法的运行时间究竟取决于什么。直观地想,一个算法的运行时间也就是执行所有程序语句的耗时总和。然而在实际的分析中,我们并不需要考虑所有程序语句的运行时间,我们应该做的是集中注意力于最耗时的部分,也就是执行频率最高而且最耗时的操作。也就是说,在对一个程序的时间复杂度进行分析前,我们要先确定这个程序中哪些语句的
2018-03-30 16:38:43
415
原创 github简单入门
github使用小小总结在这里并不讲述任何关于如何配置github的问题,这些东西,稍微百度一下就有,不具备写的价值。- question 1:如何创建一个新项目? 1.确认你本地的github已经配置完全(特别是密钥) ps:可以用 ssh -T git@github.com 来验证密钥是否配置好。 2. 在github官网上开启一个新的空白的项目库(可以选择配置re
2018-03-21 21:09:27
179
原创 浅谈UNIX网络编程system V IPC机制
一.System V IPC 的构成 1.system v消息队列 2.system v信号量 3.system v共享内存 我们把这三种工具统称为System V IPC的对象,每个对象都具有一个唯一的IPC标识符(identifier)。
2017-11-03 21:07:43
461
原创 浅谈 STL 中的空间配置器一点小小心得。
网上 其他很多博主,写了很多STL的解析,大致和书上讲的都差不多,最近学到了空间配置器这部分,我就谈谈在学习STL 中的小小心得吧,要是有不对的地方,请大家指出。首先看看下面这段代码,这中写法贯彻整个STL typedef size_t size_type; typedef _Ty* pointer; typedef const _Ty* const_pointer; t
2017-08-18 17:03:35
260
转载 C/C++ 内存布局详解(经典
最近看到了一篇非常好的写内存的博客,正好适用于刚入C++不久的我,转载过来,分享给大家。原帖网址http://blog.sina.com.cn/s/blog_60c8379d01015a96.html
2017-08-10 20:09:52
303
原创 C++实现大数运算 加法部分。
由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。大数运算主要有加、减、乘三种方法。所以我就打算做一个大数运算的项目。其中每个数字,是动态分配的字符串的形式进行存储和计算的。下面是每个数的类的组成class Bigint {public: Bigint() {} Bigi
2017-08-08 19:14:36
928
原创 C++实现身份证校验和归属地查询
描述:我国国标〖GB 11643-1999〗中规定:公民身份号码是18位特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。其校验码(最后一位)计算方法和步骤为:(1)十七位数字本体码加权求和公式S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和其
2017-07-30 15:56:51
1943
2
原创 多项式及其计算
昨天加上今天 想把之前学过的链表进行复习一遍 就花了一个下午加一个晚上的时间,把多项式及其计算做一下,然而让人遗憾的是 我一直想用string 来创建一个多项式 结果发现不行 ==Polynomial.h#includeusing namespace std;struct Term //多项式的节点定义{ double coef; //系数 int exp; //指
2017-07-28 19:46:42
858
原创 C++中关于无法无法解析外部错误的解决方案
首先 为什么写这个博客,前几日遇到了一个问题,就是在用类模板写堆的时候,出现了这个问题,当时花了好久,解决了那个问题,今天在看C++Primer Plus的时候在函数指针的时候,出现了相同的问题。下面上代码#includeusing namespace std;const double *f1(const double ar[], int n);const double *f2(cons
2017-07-27 14:50:47
2103
原创 LintCode周算法总结
实现赋值运算符重载函数,确保:新的数据可准确地被复制旧的数据可准确地删除/释放可进行 A = B = C 赋值class Solution {public: char *m_pData; Solution() { this->m_pData = NULL; } Solution(char *pData)
2017-07-25 17:11:24
295
原创 用三重指针实现HaffTree
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
2017-07-13 15:42:38
626
原创 从零开始学JAVA:从插入排序解析类执行过程(内存)
一.类的属性:1.属性(field),或者叫成员变量2.属性用于定义该类或该类对象包含的数据或者说静态属性3.属性的作用范围是整个类体4.**在定义成员变量时,可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化:数值:0、0.0字符:\u0000(Unicode编码中对应的0)boolean:false所有引用类型:null**5.属性定义格式:
2017-05-06 21:30:17
238
转载 从零开始学JAVA:java 静态导入 (import static) 详解
在Java 5中,import语句得到了增强,以便提供甚至更加强大的减少击键次数功能,虽然一些人争议说这是以可读性为代价的。这种新的特性成为静态导入。
2017-04-20 17:55:29
319
原创 java及andriod studio安装小结
第一步 下载JDK首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html,点击如下下载按钮:在下载页面中你需要选择接受许可,并根据自己的系统选择对应的版本,本文以Window 64位系统为例子下载后JDK的安装根据提示进行,还有安装JDK
2017-04-16 23:23:50
677
libevent_源码剖析
2018-07-26
STL_中文版.zip
2018-01-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人