OpenSource
文章平均质量分 89
selfimpr1991
这个作者很懒,什么都没留下…
展开
-
【深度探索STL】空间配置器(一) 构造和析构
以STL运用的角度而言,空间配置器总是隐藏在一切组件的背后,但就STL 的实现角度而言,我们需要了解空间配置器,因为整个STL 的操作对象(所有数值,“value”语意)都存放在容器之内,而容器一定需要配置空间以置放数据。没必要重复造轮子,但我们知道这轮子背后如何运作,有利于我们更好地驾驭轮子。另一方面通过阅读源码可以学习大神的编程思想。一般而言,我们所习惯的C++ 内存配置操作和释放操作是这原创 2014-02-20 14:59:50 · 3632 阅读 · 0 评论 -
【深度探索STL】空间配置器(四) 内存基本处理
前面分别学习了:对象的构造和析构 :http://blog.csdn.net/wenqian1991/article/details/19545049空间配置器之第一级配置器:http://blog.csdn.net/wenqian1991/article/details/19566499空间配置器之第二级配置器:http://blog.csdn.net/wenq原创 2014-02-22 16:49:53 · 1757 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】socket 函数剖析
深度剖析网络协议栈中的 socket 函数,可以说是把前面介绍的串联起来,将网络协议栈各层关联起来。原创 2015-07-01 12:43:57 · 7026 阅读 · 4 评论 -
【Linux0.11 内核源码剖析】进程间通信——管道(pipe)
本文介绍IPC之管道通信机制的内部实现机制。首先概述管道通信,然后阐述管道的结构,之后通过剖析Linux 0.11内核源码来分析管道的内部实现机制,最后通过一个实例来阐述管道的应用。知其然,若知其所以然将有利于我们更好的应用它。原创 2015-06-03 11:58:18 · 2514 阅读 · 1 评论 -
TinyHTTPd--超轻量型Http Server源码分析
TinyHTTPd是一个超轻量型Http Server,使用C语言开发,全部代码不到600行,附带一个简单的Client,可以通过阅读这段代码理解一个Http Server的本质。源码下载链接http://sourceforge.net/projects/tinyhttpd/分析这段源码前,需要对网络协议,Unix编程,以及HTTP有一定的了解,这里假设大家对http有一定的了解,如果有时原创 2015-05-27 13:14:34 · 8324 阅读 · 7 评论 -
【Linux 内核网络协议栈源码剖析】sendto 函数剖析
前面介绍的函数基本上都是TCP协议的,如listen,connect,accept 等函数,这都是为可靠传输协议TCP定制的。对于另一个不可靠udp协议(通信系统其可靠性交由上层应用层负责),则主要由两个函数完成,sendto 和 recvfrom 函数。这里先介绍 sendto 函数。对于 udp 协议的介绍和编程实现请参考下文:UDP 客户/服务器简单 Socket 程序简要介绍下UD原创 2015-07-16 10:24:43 · 12758 阅读 · 5 评论 -
【Linux 内核网络协议栈源码剖析】recvfrom 函数剖析
继前篇介绍完sendto 数据发送函数后,这里介绍数据接收函数 recvfrom。一、应用层——recvfrom 函数对于这个函数有必要分析一下,先看看这个dup例子。服务器端中调用recvfrom函数,并未指定发送端(客户端)的地址,换句话说这个函数是一个被动函数,有点类似于tcp协议中服务器listen 之后阻塞,等待客户端connect。这里则是服务器端recvfrom后,等待客户端原创 2015-07-16 19:14:26 · 16408 阅读 · 0 评论 -
【深度探索 STL】hashtable(哈希表)
之前也学习过哈希表原创 2014-06-22 21:47:49 · 4265 阅读 · 0 评论 -
【深度探索STL】空间配置器(三) 第二级配置器
考虑到小型区块所可能造成的内存破碎问题,SGI 设计了双层级配置器,第一级配置器参见博文 http://blog.csdn.net/wenqian1991/article/details/19566499。这里则学习第二级配置器,第二级配置器的设计思想为:如果配置区块超过128 bytes,则移交给第一级配置器处理;如果配置区块小于128 bytes,则采用内存池管理(memory p原创 2014-02-21 20:13:50 · 3962 阅读 · 0 评论 -
【Linux内核数据结构】最为经典的链表list
很久之前研读过Linux的内核源码(后来终止了,水太深,吾辈驾驭不了),看到其中的内核数据结构,对链表的实现叹为观止,是迄今为止我见过的最为经典的链表实现(不是数据内嵌到链表中,而是把链表内嵌到数据对象中)。现在再来回顾这个经典的数据结构。链表代码在头文件中声明(推荐Source Insight,源码版本:Linux-2.6.32.61),其数据结构很简单有木有,直接就一个前后链表指针,前篇S原创 2015-03-21 18:18:26 · 11277 阅读 · 5 评论 -
【深度探索STL】详解 list
List 就是链表,这个我们在很久之前就学习过了单向链表,双向链表。之前对STL有过大概的剖析,但没涉及到链表,早几天使用到了STL中的,对其中的有些细节不明了,特意重新阅读了下源码,对STL中的List 加深一下理解。1、List 概述list 和 vector 是两个最常用的容器(序列式容器)。二者最显著的区别自然就是vector是连续线性空间,list则是不连续线性空间,相比于v原创 2015-03-21 14:10:57 · 3781 阅读 · 0 评论 -
【深度探索STL】关联式容器set和multiset
标准的STL关联式容器分为set(集合)和原创 2014-08-07 21:05:29 · 2686 阅读 · 0 评论 -
【深度探索STL】关联式容器map和multimap
map与multimap的区别等同于set 与multiset的区别。一、mapmap原创 2014-08-08 21:59:47 · 3329 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】数据包发送
release_sock 函数是在 sock.c中//如果对应的套接字正忙或被中断,则将数据包暂存到sock结构back_log队列中,这不能算被接收//数据包要插入receive_queue中才能算真正完成接收//release_sock函数则是从back_log中取数据包重新调用tcp_rcv函数对数据包进行接收void release_sock(struct sock *sk)原创 2015-07-06 10:53:12 · 4814 阅读 · 0 评论 -
【深度探索STL】特殊容器 string
体会string 的强大。这里就不同篇介绍string 了,只给出常用部分函数接口的内部实现。在应用string 的时候,只需要包含头文件<iostream> 就行了C++ 标准中string 类的特性与 vector<> 很相似,有以下几点区别:string 总会在末尾存放NULL 字符;string 需要借助 char_traits<>::assign,char_traits<>::copy 和char_traits<>::move 来复制元素,另外string 还额外提供了一些接口函数。stri原创 2014-08-11 21:00:10 · 1324 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】socket.c——BSD Socket层(1)
写在前面:本系列文章先把各个层对应的文件源码剖析一遍,最后再穿插起来,理清整个协议栈网络数据包的上下传送通道,从整体实现上进行把握。这里主要是介绍BSD socket层对应 socket.c 文件中的函数。原创 2015-06-18 12:59:44 · 6185 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】af_inet.c——INET Socket层(2)
前篇 socket.c 介绍的是BSD socket 层的函数。应用系统的函数调用如socket、bind、listen、accept、connect 等函数,将通过共同的入口函数 sys_socket 调用BSD socket层的对应系统调用函数,如sock_socket、sock_bind、sock_listen、sock_accept、sock_connect 等函数(socket.c)。从前面分析得知, sock_ 函数内部又将调用下一层的函数实现,而这些下层函数就是 af_inet.c 文件中定义原创 2015-06-18 21:43:31 · 3526 阅读 · 0 评论 -
【Linux 内核】内存管理(一)
对于内存管理,我们首先需要了解几个原创 2014-05-10 21:53:48 · 3468 阅读 · 1 评论 -
【Linux 内核网络协议栈源码剖析】ARP地址解析协议
ARP地址解析协议理论前篇参见ARP与RARP,这里则通过源码(Linux kernel 1.2.13;net\inet\arp.c)来剖析其内部原理及实现过程。原创 2015-07-09 20:54:20 · 6870 阅读 · 2 评论 -
【Linux 内核网络协议栈源码剖析】网络栈主要结构介绍(socket、sock、sk_buff,etc)
通过前面的分析,可以发现,网络协议栈中的数据处理,都是基于各类结构体,所有有关于网络栈中数据包的状态,地址,端口等信息都封装在对应的结构中,可以说,了解这些数据结构是理解网络栈源码的基础,这里我们就来了解下网络协议栈中的各类数据结构。1、socket该结构体socket 主要使用在BSD socket 层,是最上层的结构,在INET socket 层也会有涉及,但很少。/* *原创 2015-06-30 20:42:11 · 5701 阅读 · 0 评论 -
【深度探索STL】空间配置器(二) 第一级配置器
了解内存配置后的对象构造行为和内存释放前的对象析构行为后(参见博文:http://blog.csdn.net/wenqian1991/article/details/19545049 空间配置器--构造与析构),我们再来学习内存的配置与释放(定义在头文件 中)。其设计思想为:向 system heap 要求空间;考虑多线程 (multi-threads) 状态;考虑内存不足时的应变措施;原创 2014-02-21 00:46:06 · 3236 阅读 · 1 评论 -
【深度探索STL】详解 vector 内部机制
前面初步介绍了序列式容器 vector :初识序列式容器vector,这里试图通过简单剖析源码来了解 vector 的内部机制,参考资料:《STL 源码剖析》(侯捷)原创 2014-02-23 23:59:47 · 6092 阅读 · 2 评论 -
【深度探索STL】详解 traits 编程技法
迭代器是一种抽象的设计概念,定义为:提供一种方法,使之能够依序巡访某个容器所含的各个元素,而又无需暴露该容器的内部表达式。原创 2014-02-26 21:11:58 · 2268 阅读 · 0 评论 -
【深度探索 STL】【数据结构】详解红黑树(一)结构及插入
红黑树概述历史上 AVL 树流行的另一变种是红黑树()原创 2014-05-31 21:59:18 · 4699 阅读 · 3 评论 -
【Linux 内核】进程管理
进程与程序的区别:程序是静态的一段代码,是一些保存在非易失性存储器的指令的有序集合,没有任何执行的概念;进程是一个动态的概念,它是程序执行的过程,包括动态创建、调度和消亡的整个过程,换句话说,进程是程序执行时的一个实例,即它是程序已经执行到何种程度的数据结构的汇集,也就是正在执行的程序代码的实时结果,从内核的观点看,进程的目的就是担当分配系统资源(CPU时间,内存等)的基本单位,是资源分配的最小单原创 2014-04-19 13:35:30 · 2406 阅读 · 0 评论 -
【Linux 内核】进程调度
现在的操作系统都是多任务的原创 2014-05-05 21:34:54 · 1370 阅读 · 0 评论 -
【Linux 内核】内存管理(三)slab分配器
用户应用程序对内存的需求是频繁的和任意的,而伙伴算法作为一个基础内存管理算法,并不具备提供这种任意性的条件,因此还需要以伙伴算法为基础,实现另外的内存管理机制,为用户提供申请任意大小内存的可能,这里就介绍 slab 分配器。原创 2014-05-18 20:59:04 · 8335 阅读 · 2 评论 -
【Linux 内核】内存管理(二)伙伴算法
通常情况下,一个高级操作系统必须要给进程提供基本的、能够在任意时刻申请和释放任意大小内存的功能,就像malloc 函数那样,然而,实现malloc 函数并不简单,由于进程申请内存的大小是任意的,如果操作系统对malloc 函数的实现方法不对,将直接导致一个不可避免的问题,那就是内存碎片。原创 2015-05-27 21:33:18 · 16013 阅读 · 4 评论 -
TinyHTTPd 编译及 HTTP 浅析
继前文分析了TinyHTTPd源码。这里给出修改地方,然后运行下该项目。之后结合该开源项目介绍下 HTTP 涉及的部分。编译环境:Deepin Linux 2014.2,内核版本 Linux 3.13.0,GCC 4.8.2HTTP TinyHTTPd 是一个超轻量级的 HTTP Server。原创 2015-05-28 13:13:57 · 6827 阅读 · 4 评论 -
【Linux 1.0内核源码剖析】创建进程——fork.c
Linux1.0 内核源码,fork.c,主要介绍fork系统调用部分是如何创建一个新进程的,以及拷贝父进程几乎所有资源。 unix 系统通过 fork 系统调用创建一个进程,fork.c 的主要任务是为新的进程填写数据结构,相关步骤有:取得一个空闲内存页面来保存 task_struct找到一个空闲的进程槽(find_empty_process())为内存堆栈页 kernel_stack_page 取得另一个空闲的内存页面将父进程的 LDT 拷贝到子进程复制父进程的 mmap 信息给子进程sys原创 2015-06-04 21:26:42 · 7413 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】connect 函数剖析(二)
网络层——ip_build_header 函数前篇(跳跃有点大,记得理清思路找到被调用位置,参见connect(一))介绍的 tcp_connect 函数内部调用了 build_header函数,实则是ip层的 ip_build_header 函数,该函数的主要功能是创建合适的 mac和ip头部/* * This routine builds the appropriate hard原创 2015-07-07 15:14:03 · 2081 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】数据包接收(含TCP协议状态变换)
接前文connect 函数剖析(一)接收数据包函数,release_sock 函数是在 sock.c中,该函数是在 inet socket 层,其内部的数据结构为 sock 结构该函数被 tcp_connect 函数最后调用,用于接收数据包//如果对应的套接字正忙或被中断,则将数据包暂存到sock结构back_log队列中,这不能算被接收//数据包要插入receive_queue原创 2015-07-07 21:39:28 · 4922 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】accept 函数剖析
好,tcp 协议建立连接的几个函数到这,就还差个accept 函数,这里直接贴代码了,不再向前面那般赘述了。一、应用层——accept 函数该函数返回一个已建立连接的可用于数据通信的套接字。#include int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);//返回:非负描述子——成功,-1——原创 2015-07-07 21:55:56 · 4649 阅读 · 1 评论 -
【Linux 内核网络协议栈源码剖析】listen 函数剖析
listen 函数仅供服务器端调用,把一个未连接的套接字转换为一个被动套接字,指示内核应接受指向该套接字的连接请求。1、应用层——listen 函数#include int listen(int sockfd, int backlog);/*sockfd是bind之后的套接口描述字,第二个参数规定了内核应该为相应套接口排队的最大连接个数*/2、BSD Socket 层——sock_li原创 2015-07-01 18:48:15 · 2908 阅读 · 0 评论 -
【Linux 1.0内核源码剖析】执行程序——exec.c
父进程 fork的子进程的目的自然不是创建一个几乎与自己一模一样的进程。而是通过子进程调用 exec 函数簇去执行另外一个程序。exec() 系统调用必须定位该执行文件的二进制映像,加载并执行它。exec() 的Linux实现支持不同的二进制格式,这是通过 linux_binfmt 结构来达到的,其中内嵌了两个指向函数的指针,一个用于加载可执行文件,另一个用于加载库函数,每种二进制格式都实原创 2015-06-08 20:15:03 · 4587 阅读 · 0 评论 -
【Linux 内核网络协议栈源码剖析】bind 函数剖析
bind 函数主要是服务器端使用,把一个本地协议地址赋予套接字。1、应用层——bind 函数#include int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);/*sockfd是由socket函数返回的套接口描述字,第二个参数是一个指向特定于协议的地址结构的指针,第三个参数是该地址结构的长度*原创 2015-07-01 16:52:26 · 3379 阅读 · 1 评论 -
【Linux 内核网络协议栈源码剖析】connect 函数剖析(一)
TCP客户用 connect 函数来建立与 TCP 服务器的连接,其实是客户利用 connect 函数向服务器端发出连接请求。1、应用层——connect 函数#include int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);/*sockfd是由socket函数返回的套接口描述字,第原创 2015-07-02 09:17:03 · 5212 阅读 · 0 评论 -
本博客全文目录索引
本专栏博文索引(目录)涵盖:C/C++、STL、Data Structure、Algorithm、TCP/IP、Linux(Interface/Driver/Kernel)和 Projects。 C/C++ 详解C指针 C++对象模型 深度探索C++对象内存模型 深度剖析C++虚函数 详解C++类的静态成员和C语言中的static C++拷贝构造函数与赋值函数 详解C+原创 2016-01-26 18:34:02 · 7333 阅读 · 8 评论