自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

ordeder的专栏

随缘,惜缘,不攀缘。

  • 博客(57)
  • 资源 (2)
  • 收藏
  • 关注

原创 Linux Malloc分析-从用户空间到内核空间

本文介绍malloc的实现及其malloc在进行堆扩展操作,并分析了虚拟地址到物理地址是如何实现映射关系。每当进程调用malloc,首先会在该堆缓冲区寻找足够大小的内存块分配给进程(选择缓冲区中的那个块就有首次命中和最佳命中两种算法)。如果freechunklist已无法满足需求的chunk时,那么malloc会通过调用系统调用brk()将进程空间的堆进行扩展,在新扩展的堆空间上建立一个新的chunk并加入到freelist中,这个过程相当于进程批量想系统申请一块内存(大小可能比实际需求大得多)。

2014-12-01 22:35:33 17997 2

原创 Linux 虚拟地址与物理地址的映射关系分析

3.1用户空间的映射:1. 用户空间的虚拟地址vaddr通过MMU(pgd,pmd,pte)找到对应的页表项x(即为物理地址)2. 页表项x的高20位是物理也好,物理页号index = x >> PAGE_SHIFT, 同理,index后面补上12个0就是物理页表的首地址。3. 通过物理页号,我们可以再内核中找到该物理页的描述的指针mem_map[index],当然这个指针是虚拟地址,page结构见上文。3.2内核空间虚拟地址的映射:内核空间与物理地址之间有直接的映射关系,而不需要向用户空

2014-11-30 23:20:10 22244

原创 Redis源码学习-AOF

1 AOF日常命令append:1.1. Redis执行文件事件:执行用户命令,并将该命令缓存于Server.aof_buf中{函数1}1.2. Redis执行时间时间的ServerCron:依据参数server.aof_flush_postponed_start,{函数4} 1.2.1. 将redisServer.aof_buf写入文件Server.aof_fd。 1.2.2. 该文件何时fsync到磁盘有三种机制: AOF_FSYNC_EVERYSEC 每秒调用

2014-09-14 18:06:29 3799

原创 Redis源码学习-NoSql复杂类型对象的hash管理(二:List)

Redis中list结构在dict中的存储方式(REDIS_ENCODING_LINKEDLIST)。

2013-11-24 16:34:09 2031

原创 Redis源码学习-NoSql复杂类型对象的hash管理(以set命令为例)

NoSql的核心是实现基于内存的K-V的快速查找。在Redis中,Hash结构就是实现k-v快速查找的核心结构,名为dict。此外,Redis的犀利之处是在于能够将整个复杂的数据类型(set,list...)打包存储。本文分析了Redis的复杂数据对象的存储方式。

2013-11-23 01:06:55 5341

原创 Redis源码学习-Master&Slave的命令交互

Redis中可以支持主从结构,本文主要从master和slave的心跳机制出发(PING),分析redis的命令行交互。在Redis中,server为每个连接建立一个redisClient数据对象,来描述对应的连接。其中,redisClient为命令交互设置了缓冲区。querybuf用于存储客户端送过来的命令,buf和reply是用于应答的缓冲。querybuf是在文件事件readQueryFromClient中被填充,每次填充的最大字节数默认为1024B。而应答缓冲区是由addReply()函数填充,并由

2013-11-13 23:07:44 5593 2

原创 Redis2.2.2源码学习——Server&Client链接的建立以及相关Event

在Server端和Client的通行是以文件事件进行管理的。Redis在initServer中就创建用于监听client连接请求的ipfd,并在该文件符上建立文件事件,用于处理客户端的连接请求。而且,事件的处理hander是创建cfd(accept),并在cfd上同样建立文件事件,用于读取客户端的具体命令。

2013-11-01 12:10:50 2856

原创 Redis2.2.2源码学习——信号的处理

Redis对信号的处理如下:1)忽略的信号:SIGHUP(终端session关闭)、SIGPIPE(管道错误)2)出错相关信号:SIGSEGV SIGBUS SIGFPE SIGILL 处理方式:触发段错误的处理函数中, 1.主要将错误信息写入日志 2.将该信号处理信号设置为默认,重新在本身发送该信号(执行信号的默认处理)3)进程结束信号:SIGTERM(该信号用于请求中止进程,kill命令缺省发送) 1.server.shutdown_asap = 1; 和程序出错信号相比,SI

2013-10-17 20:26:47 2847 2

原创 Redis2.2.2源码学习——dict中的hashtable扩容和rehash

dict是Redis的hash表结构,所有类型的元素都可以依据key值计算hashkey,然后将元素插入到dict的某个hash链上(采用拉链发解决hash冲突)。其中,dict的总hashtable的扩容是dict很重要的部分。Redis的“管家”函数serverCron会依据一定的算法(dict中的used与size的比值)判定是否开始进行hashtable的扩容。扩容之后,hashtalbe的长度将变长,那么hashtalbe的masksize与原来的makssize就不同了,那么计算出的hashke

2013-10-17 13:35:18 4896 2

原创 Redis2.2.2源码学习——aeEvent事件轮询

Version Redis2.2.2Redis的事件主要分为文件事件和定时器时间,作者对这两种事件处理的高端之处在于预先计算最近一个要超时的定时器距离当前的事件间隔,在这个时间间隔内调用poll函数处理文件事件,之后再处理定时器时间。/* File event structure */typedef struct aeFileEvent { int mask; ///* 文件事件类型 读/写 one of AE_(READABLE|WRITABLE) */ aeFilePro

2013-10-16 21:09:12 5440 2

原创 sigaction 使用

函数sigaction原型:int sigaction(int signo,const struct sigaction *restrict act, struct sigaction *restrict oact); @signo 信号编号 @act 要注册的信号动作 @oact 原信号动作参数 struct sigactionstruct sigaction{

2016-03-05 16:55:54 3011

原创 PHP到MySQL数据查询过程概述

本文概述了从PHP层发起mysql查询请求到mysql server 返回结果集的工作流程,并简单描述了各层可能涉及到的动作和组件。从全局把握整个交互过程。

2015-08-23 16:49:48 1662

原创 TCP带外数据(URG,MSG_OOB)

http://blog.csdn.net/ordeder/article/details/43243425

2015-01-29 09:47:29 1191

原创 TCP带外数据(URG,MSG_OOB)

为何不直接将一个字节的紧急数据放在紧急指针哪里呢?答:因为TCP数据包在ip层可能被拆包,成为多个数据段。一个包含紧急数据的数据包被拆成两个数据包,那么这两个包有的tcp头部有相同的紧急指针(和UGR)。如果将紧急数据直接放在紧急指针的内存处,那么将多出一个紧急数据!所以,不该将紧急数据放在TCP头部。 同时,在拆包后,对端将收到两个包,第一个包到达的时候就知道了UGR和紧急指针。如果紧急指针所指的位置已在该包的数据段中,那么紧急数据就到达了。否则,要等到第二个包到达的时候,才能去得到紧

2015-01-28 22:48:38 12770 1

原创 笔记 MFC 打开或者保存路径浏览对话框(CFileDialog)

//文件路径浏览对话框参考:http://blog.csdn.net/liuwumiyuhuiping/article/details/7348591void CMainFrame::OnFileCopySave() { // TODO: Add your command handler code here CString pzFullPath; CString pzNewBasePat

2015-01-25 20:05:30 1155

原创 Ubuntu 10.10 老版本源列表

deb http://old-releases.ubuntu.com/ubuntu/ maverick main restricted universe multiversedeb http://old-releases.ubuntu.com/ubuntu/ maverick-security main restricted universe multiversedeb http://ol

2014-11-01 16:50:00 2265

原创 Wait4 & Ptrace & 进程调试 & 子进程状态获取 笔记总结

实例http://hi.baidu.com/ordeder/item/4c31f93512e6524d3075a1b0Ptrace详解http://www.cnblogs.com/catch/p/3476280.htmlPtrahttp://blog.sina.com.cn/s/blog_4ac74e9a0100n7w1.html

2014-10-05 12:17:29 1368

原创 关于C中格式化输出的一些笔记

printf("%.*s",with,str);  “*” 是作

2014-08-25 18:47:53 1121

原创 PostGreSQL--内存上下文(内存池)

背景看了几个内存池的设计,如python,STL,基本上对内存的管理有两种结构:1.block,即内存的一个块,一般和内存页(pagesize)大小相关。2.内存分片,即在该内存块上分配要使用的内存空间。例如python的pyIntObject中使用到的缓冲池的实现: http://blog.csdn.net/ordeder/article/details/25343633

2014-06-17 15:53:34 4115 1

原创 C++面向对象—成员函数与成员变量的实现机制学习笔记(1)

《深度搜索C++对象模型》的一些学习纪要:一成员变量篇0. 类的编译中,先编译成员变量和成员函数的额声明,成员函数的定义在类声明结束后再处理;1. 类中,多个代码区块public或者private最终会被按区块统一,然后编译过程中,后定义的成员变量地址高于定义的成员变量;2. 静态变量在程序启动时初始化,存储的位置在于程序的全局数据段中;3. 继承中

2014-05-20 21:03:02 2101

原创 epoll之ep_insert()源码分析

参考:http://www.cnblogs.com/apprentice89/p/3234677.htmlep_insert()过程中涉及的数据结构及回调函数如下图所示:其中,红色部分回调函数构造了红色部分的结构体,黄色部分结构体主要由init_poll_funcptr和主函数ep_insert构造。具体源码表在下面,重点环节已标出,以后有空再完善吧~str

2014-05-11 00:14:45 3264 1

原创 面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析

如果C同时派生了基类A和基类B,那么C的对象的内存是如何分布的呢?基类指针pa和基类指针pb对这块派生类C对象的内存所存储的内容又做和解析?或者说pa和pb指向的地址是否是C对象的首地址呢?1.继承是按照类为整体进行组织的,且如果有继承虚函数,那么将有多余的一个虚函数表指针。2.基类指针指向派生类后,同样是按照指针强制转化原则来解析派生类对象的部分区块内容(指针截断)3.多继承中,各个基类的指针指向派生类后,各自基类指针指向的是派生类中与本身基类相关的派生类区块首地址。

2014-05-10 14:21:34 4335 1

原创 Python源码--整数对象(PyIntObject)的内存池

由于python中的整数对象记录的整数值是不可变的,所以在名字a的值不断变化的过程中,就就涉及到了多次对象的创建和销毁。所以python为整数对象申请空间进行了两种优化:优化1:为通用整数对象存储池优化2:为小整数对象构建特殊的缓冲 PyIntObject分为小整数对象[-5~257)及大整数对象。小整数对象在py启动过程中初始化,从而实现小整数对象的缓存,缓冲中的小整数对象在py运行期间不会被销毁。 大整数对象需要程序员动态申请,对象在运行过程中根据ob_refcnt引

2014-05-08 23:29:21 4274 4

原创 Python源码 -- C语言实现面向对象编程(基类&派生类&多态)

python是面向对象的解释性语言,然而python是通过C语言实现的,C语言怎么跟面向对象扯上了关系? C语言可以实现面向对象的性质?

2014-05-08 12:41:16 2569

原创 Win32 线程的创建&信号量临界资源&事件对象

背景:写了个程序,主要实现的功能为主线程创建两个子线程,之后主线程进入等待事件的循环。子线程1对临界资源cnt的值减2并输出cnt的值。子线程2对cnt的值加1并输出cnt的值,且当cnt为50的时候触发事件对象hend_even,子进程2退出。主线程收到hend_even后杀死子线程1,之后进入scanf阻塞。。。代码示例:#include #include DWORD WIN

2014-04-28 15:54:56 1579

原创 epoll()涉及到的两种wait队列分析

主要是等待队列的回调函数用处不同,1的回调是为了唤起处于等待事件而处于休眠的进程,2的回调是为了将epitem中的rdllink结构加入到ready list中。

2014-04-24 23:31:18 7143 1

原创 Linux-2.6 open()打开文件涉及的内核处理和数据结构分析

Linux-2.6 文件打开过程涉及数据结构分析:fd = open(path,flag,mode)1. 进程打开一个文件,需要消耗该进程的一个文件描述符fd,该fd是用来唯一标示打开的文件,也成为文件号。通过函数get_unused_fd_flags从根据fdtable返回一个空闲的fd,fd对应的task_struct->files[fd]空闲的。进程打开一个文件,需要消耗该进程的一个文件描述符fd,该fd是用来唯一标示打开的文件,也成为文件号。通过函数get_unused_fd_flags从根据

2014-04-24 16:28:55 3733

原创 基于信号驱动式IO的监听套接字(O_ASYNC,O_NONBLOCK)

背景Source: http://blog.csdn.net/ordeder/article/details/22733077(Unix网络编程卷1说明如下)设置套接字信号驱动式io(SIGIO)需要三个步骤:1.建立SIGIO信号的处理函数2.设置套接字的属主,即fcntl:F_SETOWN3.开启套接字的信号驱动是IO,即:fcntl:O_ASYNC引起套接

2014-04-01 14:55:30 3266

原创 Python 实现一个简单的http服务器

背景写一个python脚本,实现简单的http服务器功能:1.浏览器中输入网站地址:172.20.52.163:200142.server接到浏览器的请求后,读取本地的index.html文件的内容,回发给浏览器 代码实现server.py#!/usr/bin/pythonimport socketimport signalimport errnofrom time

2014-03-29 14:17:26 56860 5

原创 Python 简单数据备份脚本

手动备份 version 1#!/usr/bin/python#Filename: backup_v1.pyimport osimport timesource = ['/root/slp/NetWrokProgram/client','/root/slp/NetWrokProgram/server']dist = '/root/slp/NetWrokProgram/backu

2014-03-28 21:52:45 1679

原创 Linux 2.6 Alarm信号中断遇上函数阻塞

Unix网络编程 中提到,可以使用alarm + signal 机制产生信号,从而使程序从阻塞的函数调用中跳出,例子如下:服务进程使用阻塞的监听套接字进入监听,设置3s的alarm,确保3s内无客户端连接,看服务进程是否能在alarm触发后跳出accept阻塞;实践证明,Linux在处理完信号中断后,还会进入原有的阻塞代码中,而不是执行阻塞代码的下一条。

2014-03-25 21:27:02 3694

原创 服务器端预先创建子进程(work)同时监听服务端口和惊群现象

1.进程A在n端口上监听,即调用listen(listenfd,backlog);2.之后A调用fork产生子进程B,此时B拷贝了A的listenfd,该描述符使用的是相同的“文件表项”(具体参考 http://blog.csdn.net/ordeder/article/details/21716639)3.那么A进程和B进程将共享一个socket。多个服务进程同时阻塞在accept等待监听套接字已建立连接的信息,那么当内核在该监听套接字上建立一个连接,那么将同时唤起这些处于accept阻塞的服务进程

2014-03-21 15:45:15 4032

原创 进程调用fork与文件描述符的共享(fork,dump)

Linux的进程描述task_struct{}中有一个数组专门用于记录一打开的文件,其中文件描述符作为该数组的下标,数组元素为指向所打开的文件所创建的文件表项。如下图所示,文件表项是用于描述文件当前被某个进程打开后的状态信息,包括文件状态标志,记录当前文件读取的位移量(可以通过接口lseek设置),以及文件的i节点指针(i节点描述文件的具体信息,如:创建,修改时间,文件大小,文件存储的块信息)。进程调用fork后,打开的文件描述符进行拷贝,那么两个进程对文件描述符的操作有相关性吗?

2014-03-21 14:58:24 10278 4

原创 listen()函数中backlog参数分析

0. accept()函数不参与三次握手,而只负责从已建立连接队列中取出一个连接和服务程序的sockfd进行“映射”,并获取对端主机的ip信息(通过分片sk_buff);1. backlog参数决定了未完成队列和已完成队列中连接数目之和的最大值(从内核角度看,是否这个和就是等于sock->recv_queue ?);2. accept()函数调用,会从已连接队列中取出一个“连接”(可以是一个描述连接的数据结构,listensocket->sock->recv_queue[sk_buff] ? ),未完成

2014-03-19 19:57:50 29414 7

转载 ACCESS_ONCE()

http://wangcong.org/blog/archives/1941

2014-03-13 22:16:35 1404

原创 Posex信号量 实现进程间的同步(生产者&消费者)

Posex信号量sem实现多个线程的互斥,只需在进程空间定义好sem_t变量即可,因为各个线程是共享该sem_t变量。同理,如果sem要实现进程间的互斥,这个sem_t的变量就要在共享存储中定义,因为,两个进程对sem_t的操作必须是同一个地址空间的变量,才能实现信息同步,从而达到互斥的目的。而进程间的数据共享,用共享存储即可。

2014-03-10 22:35:33 3432

原创 函数调用过程-栈帧 和 进程的关系

程序中,一个函数是一个过程,这个过程可以分为包括传入参数、过程代码、返回三部分构成。由于一个函数过程需要用到内部变量、临时变量等,所以需要在进程空间的栈空间分配一段存储片段来存储函数过程中的这些参数,该内存片段即为栈帧。

2014-03-03 22:56:42 4020

转载 c++ *.h和*.cpp在编译中的作用

http://blog.sina.com.cn/s/blog_5e8715490100tbmq.htmlhttp://blog.163.com/wslngcjsdxdr@126/blog/static/16219623020121754150101/原文:http://blog.sina.com.cn/s/blog_5e8715490100tbmq.html

2014-03-03 12:13:40 2701

原创 socket 协议簇套接字地址和通用套接字地址

套接字的地址结构看着貌似很复杂,因为经常看到定义一个地址的时候用到struct sockaddr_in,而在bind中的地址参数是struct sockaddr。他们之间的关系是什么呢?

2014-02-16 13:42:29 4800

原创 进程的信号量&线程的互斥量

进程的信号量(semaphore)和线程的互斥量(mutex)本质上都是为了实现互斥,但是线程的mutex的api(pthread_mutex_xxx)相比进程的semaphore的api(semxxx())相比,简洁很多。本质上来说,semaphore是在内核空间,个进程通过系统调用来实现变量操作;而mutex是在用户进程空间定义的,从属于该进程的所有线程皆可访问,而pthread_xxx的接口

2014-02-15 16:21:52 1026

linux-1.2.13 网络协议栈源码

Linux1.2.13 网络协议栈源码。该版本源码小而全,适合初学者入门学习tcpip协议栈。

2015-01-30

树形文件系统--slp

操作系统课程设计:树形文件系统的实现,类unix。 本系统是树形目录,并且实现了磁盘的模拟存储。 本系统实现了目录与文件的创建和删除。 本系统内置微型的编辑器,实现文件的基本编辑于存档。

2012-06-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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