- 博客(68)
- 收藏
- 关注
原创 骑士特权基础架构建设
项目背景 重构做了很多,大部分情况是推翻重来,成本相当高,对于大部分小公司来说是不值得这样做的;在业务层面通过微改造,比如读写分离,拆服务和拆缓存等就可以满足当前的业务增长需求;老项目采用springcloud开源框架实现服务的治理,在项目启动阶段,为了快速上线,我们倾向使用开源框架搭建系统,快速满足业务需求;这种框架,对于绝大部分程序员来说只会用,一旦出了问题是非常被动的;随着业务的发展,量级上到一个档次之后,我们需要考虑系统的可维护性,信息安全和稳定性;在某种程度上需要升级底层架构确保服...
2021-07-27 16:56:58 1912 1
原创 常见的几种IO模型介绍
概览从底层到上层来看,IO主要分为两个阶段,第一个阶段为数据准备(等待)阶段,第二个阶段为数据拷贝阶段;第一阶段,从网卡上接收数据,第二个阶段将数据从kernel拷贝到用户态缓存;IO模型阻塞模型:应用程序调用系统调用,比如recvfrom,一直等到第一阶段和第二阶段都ok了才返回; 非阻塞模型:应用程序调用系统调用,比如recvfrom,非阻塞的,第一阶段没准备好,返回errorno=EWOULDBLOCK; 信号驱动模型:应用程序调用系统调用sigaction,注册SIGIO信号,当第一阶段
2021-05-10 13:56:38 203
原创 操作系统零拷贝详解
概念在没有cpu干预的情况下,执行的一个存储区向另外一个存储区拷贝任务;可以减少总线周期和内存带宽;普通I/O实现(4次用户态到内核态切换+4次拷贝) 应用程序调用系统调用read,进行第一次用户态到内核态上线文切换; 将磁盘文件加载到kernel buffer,进行第一次拷贝; 将kernel buffer的数据拷贝到用户态的user buffer中,进行第二次拷贝; read系统调用返回,进行第二次用户态到内核态上线文切换; 用户态应用程序调用write系统调用,进行第三次用户态
2021-05-07 10:17:02 222
原创 行文本文件实时分析器,流量统计数据采集
介绍因项目需要,最近采用inotify和IO多路复用技术,实现了一个轻量级的实时行文本文件内容提取的程序,主要目的是用来监控网关nginx的Access Log,并且对Access Log在本地进行实时解析,字段提取和上报的功能。该程序占用内存较小,在10k左右,最多占用1个核的资源,提供采样上报,全量/增量分析文本以及特定字段内容过滤等功能。该程序可以通过自定义connector插件将本地提取...
2019-12-04 21:24:34 394
原创 花生日记基础架构建设
简要介绍在工程中,我们采用protobuf V3和SpringBoot搭建服务化体系,我们需要一个基于protobuf协议的辅助工具提升效率。我们提供服务级别和方法级别的文档注解,在工程编译期间产生文档数据,利用这些文档数据生成在线文档和接口测试界面,同时提供在线协议编辑器,编译工具,打包和上传SDK到repository等,同时将中台自动化测试用例挂在daily loadbuild的task中...
2019-10-09 13:47:45 668
原创 分布式本地缓存的一种实现
源代码 JavaSDK:https://github.com/gilbertwang1981/string_local_cache.gitC++ Agent:https://github.com/gilbertwang1981/binary_log_agent.gitC++公共库:https://github.com/gilbertwang1981/commonlib4...
2017-08-11 22:18:57 6506 1
原创 分析linux共享内存的实现
Linux对共享内存的实现,在2.6采用了内存映射技术。对于内存共享,主要集中在三个内核函数,他们是do_shmat,sys_shmat和sys_shmdt。其中,sys_shmat调用了do_shmat最终实现了共享内存的attach。sys_shmdt实现了共享内存的detach和destroy。下面我主要对这三个函数的源码进行分析。在分析之前,首先介绍共享内存实现原理。 原理:
2009-07-04 21:03:00 16109
原创 linux 2.6 互斥锁的实现-源码分析
看了看linux 2.6 kernel的源码,下面结合代码来分析一下在X86体系结构下,互斥锁的实现原理。代码分析1. 首先介绍一下互斥锁所使用的数据结构:struct mutex { 引用计数器 1: 所可以利用。 小于等于0:该锁已被获取,需要等待 atomic_t count; 自旋锁类型,保证多cpu下,对等待队列访问是安全的。 spinlock_t wait_lock;
2009-07-02 21:51:00 10890 1
原创 GCC如何支持函数别名
通过使用以下关键字和语法,可以为函数申明别名。int __sctp_connectx(int fd, struct sockaddr *addrs, int addrcnt){ socklen_t addrs_size = __connectx_addrsize(addrs, addrcnt); if (addrs_size return addrs_size; return se
2009-04-23 16:28:00 1563
原创 Linux AIO机制
Linux的I/O机制经历了一下几个阶段的演进:1. 同步阻塞I/O: 用户进程进行I/O操作,一直阻塞到I/O操作完成为止。2. 同步非阻塞I/O: 用户程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。3. 异步事件阻塞I/O: 用户进程可以对I/O事件进行阻塞,但是I/O操作并不阻塞。通过select/poll/epoll等函数调用来达
2009-01-18 10:24:00 17715 4
原创 slab函数分析之free_block
下面分析一下slab对象回收的实现参数:1. slab对象所属的kmem_cache缓存2. slab对象数组3. 需要释放的对象数量4. 在NUMA环境下节点编号static void free_block(struct kmem_cache *cachep, void **objpp, int nr_objects, int node){ int i; struct kme
2009-01-02 13:19:00 2137
原创 slab函数分析之cache_alloc_refill
当array cache中没有可用的object的时候,需要批量从slab缓存中申请对象,这个时候该函数被调用。下面分析一下这个函数。static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags){ int batchcount; struct kmem_list3 *l3; struct array_cache *a
2009-01-02 11:57:00 4723
原创 slab函数分析之cache_grow
当向Slab缓存中提出对象申请的请求时,首先是找到相应的kmem_cache,然后从相应的array cache中分配slab对象。当array cache中没有对象可以分配的时候,会批量向slab缓存中提出对象申请来填满array cache,然后再从array cache中取出一个对象分配出去。如果从slab缓存中分配对象的时候,发现kmem_list3中半满和空闲链表中都没有节点可以供分配:
2008-12-31 23:41:00 1872 1
原创 Slab对象的分配和回收kmem_bufctl_t的用法
在这里我介绍一下Slab对象的分配和回收kmem_bufctl_t的用法,首先要说明的一点是Slab缓存的内存布局,Slab缓存分为两部分,一部分是用于管理Slab对象,另一部分是Slab对象本身,针对这两部分内容,Slab缓存的内存布局大概有两种:1. Slab对象同管理Slab对象的缓存一起存放。2. 分开存放。对于管理区分成2部分,一部分是描述Slab的数据结构,struct slab。
2008-12-29 23:36:00 2636
原创 Slab函数分析之kmem_cache_create函数
该函数用于创建Slab缓存。参数介绍:name: 缓存名字size: 对象的大小align:对齐flag:Slab标志位ctor:对象构造函数dtor:对象析构函数struct kmem_cache *kmem_cache_create (const char *name, size_t size, size_t align, unsigned long flags, void (*ctor)
2008-12-28 14:13:00 13300
原创 Slab代码分析之calculate_slab_order
计算Slab的Order,即该Slab是由几个页面构成static inline size_t calculate_slab_order(struct kmem_cache *cachep, size_t size, size_t align, unsigned long flags){ size_t left_over = 0; int gfporder; 首先从order为0开始尝试
2008-12-28 13:02:00 2364 1
原创 Slab对象数量计算函数
内核提供了计算一个Slab缓存的大小的函数,Slab缓存的内存布局分成以下两种:1. Slab缓存管理区在Slab内,即同对象存放在一起。2. Slab缓存管理区存放在单独的一片区域,即同对象分别存放。通过宏CFLGS_OFF_SLAB来区分。参数介绍:gfporder: Slab缓存大小为2^gfporder个页面buffer_size: 每个对象的大小align:对齐flags:CFLGS
2008-12-25 21:15:00 1371
原创 Linux kmalloc/kfree 源码解读
kmalloc/kfree用于划分和回收内核空间低区内存的方法。改组方法没有直接通过伙伴系统进行内存的划分,通过slab算法进行分配的。同时也为每个CPU提供一个阵列缓存,用于提高分配效率。下面对改组函数进行源码级的分析。内存分配static inline void *kmalloc(size_t size, gfp_t flags)1. 从Slab通用缓存中查找可用的
2008-12-16 20:21:00 9822
原创 Linux Buddy系统算法源码解析
在Linux引导起来之后,伙伴系统分配算法是和物理内存最底层的接口。所有内存分配函数,比如vmalloc/kmalloc最后都是通过伙伴算法对内存进行分配的。接下来我们将解读一下伙伴系统的分配和回收算法。伙伴系统模块提供了两个主要的接口给上层程序,他们是:1. 页面请求函数struct page * fastcall __alloc_pages(gfp_t gfp_ma
2008-12-14 22:12:00 6303
原创 Linux vmalloc/vfree函数实现解读
高端物理地址的分配采用vmalloc/vfree这组函数进行,什么是高端物理内存呢?我们知道Linux给内核预留了一部分虚拟地址空间,这部分虚拟地址如果能全部直接映射到物理地址空间就不存在高端内存。如果这部分内存有一部分不能直接映射到地址空间,那么这部分虚拟地址空间称为高端内存。因此,高端内存是虚拟地址空间中的概念。举个例子:如果你的物理内存为512M,那么就不存在高端内存的分配,如果你的物理地址
2008-12-14 11:38:00 1931
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人