自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

转载 分享一个好的基础库集合

https://github.com/wangzhione/structc

2019-03-02 11:57:01 192

原创 个人对网络编程中的一点思考

一、背景在高并发服务器模型中, 为了充分利用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语言中的typeof

http://blog.youkuaiyun.com/jhonguy/article/details/8424371

2014-03-05 16:27:12 711

原创 简单的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

转载 Linux线程池

http://blog.youkuaiyun.com/lmh12506/article/details/7753952

2014-03-04 14:06:23 404

转载 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关注的人

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