- 博客(654)
- 资源 (4)
- 收藏
- 关注
转载 ARM C C++内存对齐
ARM 系列处理器是 RISC (Reducded Instruction Set Computing)处理器。很多基于ARM的高效代码的程序设计策略都源于RISC 处理器。和很多 RISC 处理器一样,ARM 系列处理器的内存访问,也要求数据对齐,即存取“字(Word)”数据时要求四字节对齐,地址的bits[1:0]==0b00;存取“半字(Halfwords)”时要求两字节对齐,地址的bit[
2014-05-27 14:52:20 2337 1
转载 Linux 高性能服务器编程——多线程编程
问题聚焦: 在简单地介绍线程的基本知识之后,主要讨论三个方面的内容: 1 创建线程和结束线程; 2 读取和设置线程属性; 3 线程同步方式:POSIX信号量,互斥锁和条件变量。Linux线程概述线程模型程序中完成一个独立任务的完整执行序列,即一个可调度的实体。分为内核线程和用户线程当进程的一个内核线程获得CPU的使用权时,它就加载并运行一个用户线程,可见,内核线程相当于用户
2014-05-23 15:43:02 2194
转载 Linux 高性能服务器编程——多进程编程
问题聚焦: 进程是Linux操作系统环境的基础。 本篇讨论以下几个内容,同时也是面试经常被问到的一些问题: 1 复制进程映像的fork系统调用和替换进程映像的exec系列系统调用 2 僵尸进程 3 进程间通信的方式之一:管道 4 3种System V进程通信方式:信号量,消息队列和共享内存fork系统调用定义:
2014-05-23 10:37:46 1859
转载 Linux 高性能服务器编程——I/O复用
问题聚焦: 前篇提到了I/O处理单元的四种I/O模型。 本篇详细介绍实现这些I/O模型所用到的相关技术。 核心思想:I/O复用使用情景:客户端程序要同时处理多个socket客户端程序要同时处理用户输入和网络连接TCP服务器要同时处理监听socket和连接socket,这是使用最多的场合服务器要同时可处理TCP请求和UDP请求服务器要同时监听多个端口主要技术:selectpolle
2014-05-22 11:23:21 1857
转载 Linux 高性能服务器编程——高性能服务器程序框架
问题聚焦: 核心章节。 服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论)。服务器模型C/S模型结构:特点:逻辑简单。工作流程:I/O复用技术:select,同时监听多个客户请求。优点:适合资源相对集中的场合。缺点:当访问量过大,可能所有客户都将得到很慢的相应。P2P模型结构:两种结构结构
2014-05-21 23:51:56 2180
转载 Linux 高性能服务器编程——Linux服务器程序规范
问题聚焦: 除了网络通信外,服务器程序通常还必须考虑许多其他细节问题,这些细节问题涉及面逛且零碎,而且基本上是模板式的,所以称之为服务器程序规范。 工欲善其事,必先利其器,这篇主要来探讨服务器程序的一些主要规范。概览:Linux服务器程序一般以后台程序的形式运行,后台进程又称为守护进程。Linux服务器程序一般以某个专门的非root身份运行。Linux服务器程序通常是可配置的,命令行或
2014-05-12 16:41:21 2282
原创 Linux 高性能服务器编程——高级I/O函数
重定向dup和dup2套接字socket:(ip, port),即IP地址和端口对,唯一地表示了使用该TCP通信的一端。
2014-05-12 15:36:15 5191 1
原创 Linux 高性能服务器编程——socket选项
socket选项函数功能:用来读取和设置socket文件描述符属性的方法函数:#include int getsockopt ( int sockfd, int level, int option_name, void* option_value, socklen_t* restrict option_len );int setsockopt ( int sockfd, int level,
2014-05-12 14:14:40 3238
转载 Linux 高性能服务器编程——Linux网络编程基础API
问题聚焦: 这节介绍的不仅是网络编程的几个API 更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系。 这节主要介绍三个方面的内容:套接字(socket地址)API,socket基础API,和网络信息API。套接字API套接字socket:(ip, port),即IP地址和端口对,唯一地表示了使用该TCP通信的一端。需要了解:主机字节序和网络字节序
2014-05-07 19:03:03 2309
转载 Linux 高性能服务器编程——TCP协议详解
问题聚焦: 本节从如下四个方面讨论TCP协议: TCP头部信息:指定通信的源端端口号、目的端端口号、管理TCP连接,控制两个方向的数据流 TCP状态转移过程:TCP连接的任意一端都是一个状态机 TCP数据流:两种主要类型:交互数据流,成块数据流 TCP数据流的控制:保证可靠传输和提高网络通信质量,两个方面:超时重传,拥塞控制1 TCP服务的特点传输层协议:TCP协议,
2014-05-04 17:32:27 2345
转载 Linux 高性能服务器编程——IP协议详解
1 IP服务特点TCP/IP协议族的动力,为上层协议提供无状态,无连接,不可靠的服务无状态:IP通信双方不同步传输数据的状态信息,因此IP数据包的发送、传输和接收都是无序的。 缺点:无序,不可靠 优点:简单、高效不可靠:不能保证IP数据报准确地到达接收端,它只是承诺尽最大努力。发送端(转发端)一旦检测到IP数据包发送失败(如存活时间过长,数据报不正确),就通知上层协议发送失败,
2014-05-04 15:01:57 1889
转载 Linux 高性能服务器编程——TCP/IP协议族
1 TCP/IP协议族体系结构数据链路层: 职责:实现网卡接口的网络驱动程序,一处理数据在物理媒介(如以太网、令牌环等)上的传输。 常用协议:ARP协议(地址解析协议),RARP协议(逆地址解析协议)——实现了IP地址和机器物理地址之间的相互转换。 寻址:使用物理地址(MAC地址)寻址一台机器。因此网络层必须先将目标机器的IP地址转化成其物理地址,才能使用数据链路层提供的服务。网
2014-05-04 13:12:12 1820
原创 sizeof(结构体)和内存对齐以及位域
Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成
2014-04-25 11:23:11 2249
原创 C++ 虚函数表 多重继承
上次研究的是单继承的情况,这次研究多重继承下的虚函数表的排列情况。 这次A,A1,A2,B这几个类的继承关系如下图: 各个类的声明如下:
2014-04-23 00:09:08 2314
原创 C++ 虚函数表 单继承
本文研究单继承情况下,c++对象的虚函数表的具体情况。 假设有两个类A,B, 其中B由A派生出来,A含有虚函数fun1,B含有虚函数fun2。
2014-04-22 23:35:41 1421
原创 私有继承
在C++编程语言中,在声明一个派生类时将基类的继承方式指定为private的称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class),其基类称为私有基类(private base class)。私有基类的公用成员和保护成员在私有派生类中的访问属性相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中
2014-04-22 10:36:22 1368
原创 C++ 中const作用
一、对const与#define的特点及区别的理解#define只是用来做文本替换的,#define常量的生命周期止于编译期,它存在于程序的代码段,在实际程序中它只是一个常数,一个命令中的参数,并没有实际的存在。const常量存在于程序的数据段,并在堆栈中分配了空间。const常量是一个Run-Time的概念,它在程序中确确实实存在着并可以被调用、传递。const常量有数据类型,而宏常量没有数据类
2014-04-16 23:05:33 1531
原创 如何连接宏参数
#include#define CONS(a,b) (int)(a##e##b)#define STR(s) #sint main(){ printf(STR(huawei)); printf("\n"); printf("%d\n",CONS(2,3)); return 0;}
2014-04-16 22:09:34 1411
转载 利用mmap /dev/mem 读写Linux内存
使用 hexedit /dev/mem 可以显示所有物理内存中的信息。 运用mmap将/dev/mem map出来,然后直接对其读写可以实现用户空间的内核操作。以下是我写的一个sample#include#include#include#include#include#includeint main(){ unsigned char * map_base; FILE
2014-04-03 19:33:19 2051
转载 Linux平台Cpu使用率的计算
proc文件系统/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为内核与进程提供通信的接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的。/proc目录中有一些以数字命名的目录,它们是进程目
2014-03-31 16:06:19 1605
转载 /proc/stat 详解
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。cat /proc/statcpu 65376847 362756 2405159 10834971593 3765180 93399 2395097 0cpu0 7680302 5263 111909 1355640955 47680
2014-03-31 15:55:40 8246 1
转载 syslog(),closelog()与openlog()--日志操作函数
为了满足某些目的,进行日志记录是很有必要的。 在典型的 LINUX 安装中,/var/log/messages 包含所有的系统消息,/var/log/mail 包含来自邮件系统的其它日志消息,/var/log/debug 可能包含调试消息。根据你的LINUX的版本,你可以在 /etc/syslog.conf 或者 /etc/syslog-ng/syslog-ng.conf 文件里检查你的系统
2014-03-25 11:20:34 2680
转载 Nagle算法
Nagle算法是以他的发明人John Nagle的名字命名的,它用于自动连接许多的小缓冲器消息;这一过程(称为nagling)通过减少必须发送包的个数来增加网络软件系统的效率。Nagle算法于1984年定义为福特航空和通信公司IP/TCP拥塞控制方法,这使福特经营的最早的专用TCP/IP网络减少拥塞控制,从那以后这一方法得到了广泛应用。Nagle的文档里定义了处理他所谓的小包问题的方法,这种问题指
2014-03-20 17:50:43 1200
转载 TCP_NODELAY详解
在网络拥塞控制领域,我们知道有一个非常有名的算法叫做Nagle算法(Nagle algorithm),这是使用它的发明人John Nagle的名字来命名的,John Nagle在1984年首次用这个算法来尝试解决福特汽车公司的网络拥塞问题(RFC 896),该问题的具体描述是:如果我们的应用程序一次产生1个字节的数据,而这个1个字节数据又以网络数据包的形式发送到远端服务器,那么就很容易导致网络由于
2014-03-19 12:33:23 2513
转载 Linux "零拷贝" sendfile函数中文说明及实际操作分析
Sendfile函数说明#include ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);sendfile()是作用于数据拷贝在两个文件描述符之间的操作函数.这个拷贝操作是内核中操作的,所以称为"零拷贝".sendfile函数比起read和write函数高效得多,因为read和write是要把数据拷贝到用户
2014-03-19 11:11:49 2086
转载 pdflush的工作原理
大家知道,在linux操作系统中,写操作是异步的,即写操作返回的时候数据并没有真正写到磁盘上,而是先写到了系统cache里,随后由pdflush内核线程将系统中的脏页写到磁盘上,在下面几种情况下,系统会唤醒pdflush回写脏页:1 、定时方式: 定时机制定时唤醒pdflush内核线程,周期为/proc/sys/vm/dirty_writeback_centisecs ,单位是(1/100
2014-03-18 11:17:18 1684
转载 proc/sys/net/ipv4/下各项的意义
/proc/sys/net/ipv4/icmp_timeexceed_rate这个在traceroute时导致著名的“Solaris middle star”。这个文件控制发送ICMP Time Exceeded消息的比率。/proc/sys/net/ipv4/igmp_max_memberships主机上最多有多少个igmp (多播)套接字进行监听。/proc/sys/net/ipv4/inet
2014-03-17 16:47:29 4971
转载 Linux系统调用--getrlimit()与setrlimit()函数详解
功能描述:获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。用法:#include int getrlimit(int resource, struct rlim
2014-03-14 17:36:38 1512
转载 定位多线程内存越界问题实践总结
最近定位了在一个多线程服务器程序(OceanBase MergeServer)中,一个线程非法篡改另一个线程的内存而导致程序core掉的问题。定位这个问题花了整整一周的时间,期间历经曲折,尝试了各种内存调试的办法。往往感觉就要柳暗花明了,却发现又进入了另一个死胡同。最后,使用强大的mprotect+backtrace+libsigsegv等工具成功定位了问题。整个定位过程遇到的问题和解决办法对于多
2014-03-14 16:57:09 2861
转载 Linux动态频率调节系统CPUFreq之三:governor
在上一篇文章中,介绍了cpufreq的core层,core提供了cpufreq系统的初始化,公共数据结构的建立以及对cpufreq中其它子部件提供注册功能。core的最核心功能是对policy的管理,一个policy通过cpufreq_policy结构中的governor字段,和某个governor相关联,本章的内容正是要对governor进行讨论。通过前面两篇文章的介绍,我们知道,governo
2014-02-19 13:59:47 1820
转载 Linux动态频率调节系统CPUFreq之二:核心(core)架构与API
上一节中,我们大致地讲解了一下CPUFreq在用户空间的sysfs接口和它的几个重要的数据结构,同时也提到,CPUFreq子系统把一些公共的代码逻辑组织在一起,构成了CPUFreq的核心部分,这些公共逻辑向CPUFreq和其它内核模块提供了必要的API,像cpufreq_governor、cpufreq_driver等模块通过这些API来完成一个完整的CPUFreq体系。这一节我们就来讨论一下核心
2014-02-19 13:46:41 2192
转载 Linux动态频率调节系统CPUFreq之一:概述
随着技术的发展,我们对CPU的处理能力提出了越来越高的需求,芯片厂家也对制造工艺不断地提升。现在的主流PC处理器的主频已经在3GHz左右,就算是智能手机的处理器也已经可以工作在1.5GHz以上,可是我们并不是时时刻刻都需要让CPU工作在最高的主频上,尤其是移动设备和笔记本电脑,大部分时间里,CPU其实工作在轻负载状态下,我们知道:主频越高,功耗也越高。为了节省CPU的功耗和减少发热,我们有必要根据
2014-02-19 11:28:09 2874
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人