![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统
abel_qiu
在各种新奇技术的背后,是对计算机基础的理解与认知,在对计算机基础的认知背后是人的学习能力和思维能力,在思维能力背后,是我对这个世界的好奇心,在好奇心的背后是要变的更有智慧的万丈雄心。
展开
-
cacheline 优化
今天看rockdb的代码, 看到整个程序在分配内存和释放的内存的时候,并不是直接用的malloc 或者 new 等,而是使用cacheline_aligned_alloc,了解了一下相关原理,内存load到缓存的时候 ,是按照cacheline大小load到缓存的,所以进行分配内存的时候,尽量按照cacheline大小进行分配,这样访问一个结构体就是访问一个cacheline,这些细节可以使得程序...原创 2019-12-20 10:30:28 · 354 阅读 · 0 评论 -
对于RCU的衍生思考-- 设计一个线程安全的链表
只考虑单链表,直接对各种情况进行分析,对于Insert,需要关注的点在于,先要对new_node 进行初始化。且Insert的时候要加锁,意味着同时只有一个元素写链表。void InsertList(ListNode *new_node, ListNode* prev , ListNode *next) { new_node->next = next; wmb(); prev-&g...原创 2019-05-17 10:51:59 · 251 阅读 · 0 评论 -
对顺序锁的思考
今天读到顺序锁的概念,似乎对之前被问到的锁优化问题,有了一些新的理解,说不定可以用这个来解决。先定义一下顺序锁的数据结构吧.typedef struct { spinlock_t lock; // 用来锁住写,临界区只有一个写 int seq; //版本号控制,后续详解}seq_lock_t;说要顺序锁,可以分为读写两方。那么先来看写的一方是怎么做的?//锁操作如下void pt...原创 2019-05-16 13:49:47 · 136 阅读 · 1 评论 -
上线服务观察
上线一个服务需要观察的点有 1. 服务的内存使用情况是否正常 在做agent的时候,由于后期改了监控的逻辑,导致一部分内存泄漏,内存持续增长。 觉得观察的步骤是在程序上线几个周期,5分钟持续关注,如果一直上涨得思考,一天后也要一直关注5分钟,这时候如果不是很高一般问题不大,不过几天后也要看内存的增长情况,同时看看是否有错误日志。 2. 错误日志是否持续打印。 3. 查看程序原创 2017-06-05 17:00:06 · 248 阅读 · 0 评论 -
Http类
废话不多说,以后直接用这个/** cycle.cc** Created on : 2016.12.30* Author : qiulu*/#include "http_helper.h"bool HttpHelper::Init(Config *config){ m_Config = config; if (m_Config->isMember("report_u原创 2017-03-29 09:56:32 · 363 阅读 · 0 评论 -
HAproxy 和Agent的内存管理
今天读了agent的内存管理,其优势在于不用频繁地申请和释放内存,从而消耗时间,但是也有劣势在于内存只会增加,不会下降。那么下面来解读一下它的实现。一: 首先从基本架构来说,可以看到,在内存里面其实是由链表连接的pool。 每个pool包含了一个链表和size,链表内的每个项表示每个内存块,每个内存块的大小由size决定,。可以看下面的数据结构。一些重要的数据项已经用注释说明。struct po原创 2016-10-11 11:10:21 · 523 阅读 · 3 评论 -
C++查看环境变量
#include<stdio.h>#include<stdlib.h>extern char **environ;int main(){ int i = 0 ; for(i = 0 ; environ[i] ;i++) { printf("%s\n", environ[i]); }原创 2016-08-15 10:10:16 · 1912 阅读 · 0 评论 -
c++ mysql
1. 数据库连接MYSQL *mysql_real_connect(MYSQL *mysql, //在调用函数前,需定义并初始化这个变量 const char *host,//想要连接的数据库ip地址 const char *user, //连接的数据库的用户名原创 2016-08-25 15:14:17 · 328 阅读 · 0 评论 -
c++ 定时器实现
1. setitimer方法nginx 实现, 在这段代码中,定义了itimerval的数据结构,并设置这个数据结构的值,从而定时器的间隔时间,settimer的函数第一个参数表示经过timer就会触发sigalarm事件, 然后注册了信号sigalarm的事件,从而触发定时器signal(SIGALRM, printMsg); void printMsg(int num) { print原创 2016-09-12 15:27:26 · 2982 阅读 · 0 评论 -
share memory linux
共享内存的api和简单实现原创 2016-08-10 18:32:07 · 280 阅读 · 0 评论 -
nginx worker进程
1. ioctl一些参数#include <sys/ioctl.h>ioctl(int fd, int request, ...)fcntl(int fd, int request, ...)// fd 为需要对哪个文件描述符进行操作// 对fd进行操作的request//... 为参数在nginx 的创建worker 进程时有以下应用场景 1.将描述符设为非阻塞ioctl(s, FI原创 2016-08-16 16:40:01 · 769 阅读 · 0 评论 -
进程与线程(二)
一、用户态线程VS内核态线程用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。 内核线程: 由操作系统内核创建和撤销。内核维护进程及线程的上下文信息以及线程切换。一个内核线程由于I/O操作而阻塞,不会影响其它线程的运行。Windows NT和2000/XP支持内核线程原创 2015-05-20 12:56:30 · 475 阅读 · 0 评论 -
进程与线程(一)
一、创建进程在Linux系统中,只有fork()系统调用能够创建进程。调用fork()函数之后,父进程将寄存器和堆栈内的内容全部赋值给子进程的寄存器和堆栈。/* * fork_test.c * version 1 * Created on: 2015-5-18 * Author: wangth */#include #include int main () {原创 2015-05-19 22:23:10 · 498 阅读 · 2 评论 -
内存管理
虚拟内存产生原因:1.单纯的物理内存无法满足软件规模不断膨胀的需求。 2.内存交换技术(swaping)吞吐率上无法满足软件的速度需求。假设SATA硬盘的传输速率为10MBps/sec,那么换出1GB的内存需要10s的时间,换进1GB的内存又需 要10s的时间。 当sw原创 2015-05-26 17:05:28 · 484 阅读 · 0 评论