- 博客(27)
- 收藏
- 关注
原创 个人对网络编程中的一点思考
一、背景在高并发服务器模型中, 为了充分利用CPU的硬件资源, 多进程/多线程模型是必不可少的。 在多进程/多线程模型中, 还要考虑尽量减少上下文切换、进程/线程切换、CPU核心调度切换、锁竞争等。二、多进程/多线程模型在多核时代,一般使用以下比较典型的多进程/多线程服务器模型。首先需要单线程listen一个端口并负责accept连接,当有新连接到来时,根据负载均衡原则唤...
2019-03-02 11:55:55
196
原创 Linux3.9中 SO_REUSEPORT 对高并发服务器的改进
背景在传统网络编程模型中,为了实现高并发的服务器, 通常采用的做法是Master进程创建一个Listen socket,然后fork出来N个worker进程,这N个worker进程同时侦听这个socket。然而这种模式仅仅是做到了进程级的可扩展性,即一个进程在忙时,其它进程可以介入帮忙处理,底层的socket句柄其实是同一个!简单点说,这是一个沙漏模型:这种模型在处理同一个sock...
2019-03-02 11:16:19
671
原创 C++网络编程模型
通常需要主线程、网络读写线程、业务工作线程(如写文件)首先主线程负责监听连接,accept后把client fd通过消息或管道发给网络读写线程。网络读写线程收到client fd后将其加入epoll,有读写事件后触发读写逻辑。可设计两个chunk queue list,一个正常的List,一个recycle list。比如每个chunk 8K大小,读到数据后写入chunk尾部。如果...
2019-01-29 17:30:12
750
原创 双链表
#ifndef __LIST_H__#define __LIST_H__#ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)#endif#ifndef container_of#define container_of(ptr, type, member) ({ ...
2019-01-29 17:01:36
119
转载 网络编程SO_REUSEADDR
1 发现问题 我在开发一个socket服务器程序并反复调试的时候,发现了一个让人无比心烦的情况:每次kill掉该服务器进程并重新启动的时候,都会出现bind错误:error:98,Address already in use。然而再kill掉该进程,再次重新启动的时候,就bind成功了。真让人摸不着头脑。难道一定要尝试两次才显得真诚?这不科学! 我的第一反应是kill进程的时候,并...
2018-08-09 16:08:38
448
转载 UML类图
2.1 类(Class) 在面向对象(OO) 编程中,类是对现实世界中一组具有相同特征的物体的抽象。2.2 接口(Interface) 接口是一种特殊的类,具有类的结构但不可被实例化,只可以被实现(继承)。在UML中,接口使用一个带有名称的小圆圈来进行表示。2.3、类图中关系(relation)在UML类图中,常见的有以下几种关系: 泛化(Generalizatio...
2018-08-08 09:36:30
129
原创 设计模式学习之策略模式(Strategy)
策略模式是指有一定行动内容的相对稳定的策略名称。—抽象策略角色: 策略类,通常由一个接口或者抽象类实现。—具体策略角色:包装了相关的算法和行为。—环境角色:持有一个策略类的引用,最终给客户端调用。应用场景:1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它...
2018-08-03 10:43:52
138
原创 hash table
#define HASH_TABLE_SIZE 14976001#define HASH_SEGMENT_SIZE 20#define HASH_ENTRY_EXPIRE_TIME (60*60*24*30) //30 days#define HASH_AUDIT_BKT_NUM_PER_TIME (HASH_TABLE_SIZE/239) //every 5 days finis
2017-09-28 10:57:58
289
转载 linux下查看系统socket读写缓冲区
一:linux下查看系统socket读写缓冲区大小配置:http://blog.youkuaiyun.com/herecles/article/details/81460171. tcp 收发缓冲区默认值[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 4
2017-09-15 14:10:35
20428
1
原创 socket同时读写问题
如果是多个线程同时写socket,那么在临界区里工作的线程为了保证数据包的完整发送,必须循环发送等待,直到数据都发送到系统缓冲区才能离开临界区。而这样就导致socket的行为与阻塞方式发送无异,发送效率因此而被限制。所以一个好的tcp socket处理框架,应该是只有一个线程来负责数据的收发,从而避免那些无穷无尽的同步问题。如果需要多个线程同时读访问或写访问同一个tcp socket,
2016-12-01 16:52:39
7524
转载 #pragma pack(n)和__attribute__((aligned(m)))的区别
#pragma pack(n)和__attribute__((aligned(m)))的区别:前 者告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大 时,按照n对齐,否则按照自然边界对齐;后者告诉编译器一个结构体或者类或者联合或者一个类型的变量(对象)分配地址空间时的地址对齐方式。也就是所,如 果
2016-08-25 10:32:42
446
原创 多线程编程时线程的唤醒方式
线程A和线程B,线程B可以认为消费者,而线程A可以认为生产者。线程B没有任务时便会睡眠。线程A有两种方式唤醒线程B:1. condition variable, 即线程B wait一个condition variable, 而线程A负责对这个condition调用notify()来唤醒线程B2. 利用pipe,线程B拥有pipe的读端,线程A拥有pipe的写端。 在任务空闲时线程B可以通
2016-06-08 14:26:29
874
原创 thread pool
/* * threadpool.h * * Created on: 2016年5月11日 * Author: qiangqaz */#ifndef THREADPOOL_H_#define THREADPOOL_H_#include typedef void (*CB_FUN)(void *);//task structuretypedef struct
2016-05-13 16:43:16
479
原创 LRU cache
/* * common.h * * Created on: 2015年8月17日 * Author: qiangqaz */#ifndef COMMON_H_#define COMMON_H_#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))typedef unsigned char u8;typedef u
2016-03-30 10:00:39
252
转载 TCP慢启动
在广域网,TCP报文可能要经过多个路由器和速率较慢的链路。如果发送方一开始就向网络发送多个报文段,则中间路由器的缓冲负担会立刻加重,很可能致使路由器缓存空间耗尽,引发丢包。
2014-10-29 15:54:36
432
转载 __attribute__机制介绍
http://blog.youkuaiyun.com/ithomer/article/details/6566739
2014-03-05 16:53:07
546
转载 linux内核中的min、max函数
http://blog.youkuaiyun.com/snowbabybw/article/details/6120780
2014-03-05 16:31:07
548
原创 简单的C/S socket编程-fork子进程方式处理任务
Client:#include #include #include #include #include #include #include #define SRV_PORT 9527#define MAX_BUF_LEN 1024void do_job(int);int main(int argc, char **argv){ int listenfd, conn
2014-03-04 15:54:57
1544
转载 红黑树
http://blog.youkuaiyun.com/eric491179912/article/details/6179908http://bbs.youkuaiyun.com/topics/350253651http://www.2cto.com/kf/201104/87324.htmlhttp://blog.chinaunix.net/uid-26575352-id-3061918.html
2014-03-04 15:35:22
465
转载 Linux双向循环链表的实现
http://blog.youkuaiyun.com/yaozhenguo2006/article/details/7621551
2014-03-04 14:55:24
411
原创 container_of与offsetof的原理
container_of是linux内核中使用非常频繁的一个宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。#define container_of(ptr, type, member) ({ \ const typeof(((type *)0)->member) * __mptr
2014-03-04 14:33:07
668
转载 epoll编程
前言本章节是用基本的Linux基本函数加上epoll调用编写一个完整的服务器和客户端例子,可在Linux上运行,客户端和服务端的功能如下:客户端从标准输入读入一行,发送到服务端服务端从网络读取一行,然后输出到客户端客户端收到服务端的响应,输出这一行到标准输出 服务端代码如下: 1 #include 2 #include /* basic s
2014-03-04 14:07:23
490
转载 epoll源码分析
当系统启动时,epoll进行初始化: 1 static int __init eventpoll_init(void) 2 { 3 mutex_init(&pmutex); 4 ep_poll_safewake_init(&psw); 5 epi_cache = kmem_cache_create(“eventpoll_epi”,sizeof(struc
2014-03-04 14:03:04
517
转载 LRU Cache的实现
Cache简介:Cache(高速缓存), 一个在计算机中几乎随时接触的概念。CPU中Cache能极大提高存取数据和指令的时间,让整个存储器(Cache+内存)既有Cache的高速度,又能有内存的大容量;操作系统中的内存page中使用的Cache能使得频繁读取的内存磁盘文件较少的被置换出内存,从而提高访问速度;数据库中数据查询也用到Cache来提高效率;即便是Powerbuilder的Dat
2014-03-04 14:00:33
549
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人