自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(119)
  • 收藏
  • 关注

原创 服务器编程框架

虽然服务器程序种类繁多,但其基本框架都一样,不同之处在于逻辑处理。 该图既能用来描述一台服务器,也能用来描述一个服务器机群。 I/O处理单元是服务器管理客户连接的模块。它通常要完成以下工作:等待并接受新的客户连接,接收客户数据,将服务器响应数据返回给客户端。但是,数据的收发不一定在I/O处理单元中执行,也可能在逻辑单元中执行,具体在何处执行取决于事件处理模式。对于一个服务器机群来说,I/O处理单

2015-05-20 16:14:19 1106

原创 Linux系统日志

rsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志。用户进程是通过调用syslog函数生成系统日志的。该函数将日志输出到一个UNIX本地域socket类型(AF_UNIX)的文件/dev/log中,rsyslogd则监听该文件以获取用户进程的输出。内核日志在老的系统上是通过另外一个守护进程rklogd来管理的,rsyslogd利用额外的模块实现了相同的功能。内核日志由printk等

2015-05-19 21:08:23 672

原创 mmap函数和munmap函数

mmap函数用于申请一段内存空间。我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射到其中。munmap函数则释放由mmap创建的这段内存空间。它们的定义如下:#include <sys/mman.h>void* mmap(void* start, size_t length, int prot, int flags, int fd, off_t offset);int munma

2015-05-19 16:33:17 5136

原创 sendfile函数

sendfile函数在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝。sendfile函数的定义如下:#include <sys/sendfile.h>ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count);in_fd参数是待读出内容的文件

2015-05-19 15:18:36 3196

原创 getaddrinfo

getaddrinfo函数既能通过主机名获得IP地址(内部使用的是gethostbyname函数),也能通过服务名获得端口号(内部使用的是getservbyname函数)。它是否可重入取决于其内部调用的gethostbyname和getservbyname函数是否是它们的可重入版本。该函数的定义如下:#include <netdb.h>int getaddrinfo(const char* hos

2015-05-19 10:21:06 2545

原创 网络信息API

gethostbyname和gethostbyaddr gethostbyname函数根据主机名称获取主机的完整信息,gethostbyaddr函数根据IP地址获取主机的完整信息。gethostbyname函数通过先在本地的/etc/hosts配置文件中查找主机,如果没有找到,再去访问DNS服务器。#include <netdb.h>struct hostent* gethostbyname(c

2015-05-18 21:18:32 379

原创 SO_LINGER选项

SO_LINGER选项用于控制close系统调用在关闭TCP连接时的行为。默认情况下,当我们使用close系统调用来关闭一个socket时,close将立即返回,TCP模块负责把该socket对应的TCP发送缓冲区中残留的数据发送给对方。设置(获取)SO_LINGER选项的值时,我们需要给setsockopt(getsockopt)系统调用传递一个linger类型的结构体,其定义如下:#includ

2015-05-18 20:56:53 3478

原创 SO_RCVLOWAT和SO_SNDLOWAT选项

SO_RCVLOWAT和SO_SNDLOWAT选项分别表示TCP接收缓冲区和发送缓冲区的低水位标记。它们一般被I/O复用系统调用用来判断socket是否可读或可写。当TCP接收缓冲区中可读数据的总数大于其低水位标记时,I/O复用系统调用将通知应用程序可以从对应的socket上读取数据;当TCP发送缓冲区中的空闲空间(可以写入数据的空间)大于其低水位标记时,I/O复用系统调用将通知应用程序可以往对应的

2015-05-18 20:21:09 2229

原创 监听socket

socket被命名(与socket地址绑定)之后,还不能马上接受客户连接,我们需要使用如下系统调用来创建一个监听队列以存放待处理的客户连接:#include <sys/socket.h>int listen(int sockfd, int backlog);sockfd参数指定被监听的socket。backlog参数提示内核监听队列的最大长度。监听队列的长度如果超过backlog,服务器将不受理新

2015-05-18 09:38:22 373

原创 本地名称查询

一般来说,通过域名来访问Internet上的某台主机时,需要使用DNS服务来获取该主机的IP地址。但如果我们通过主机名来访问本地局域网上的机器,则可通过本地的静态文件来获得该机器的IP地址。Linux将目标主机名及其对应的IP地址存储在/etc/hosts配置文件中。当需要查询某个主机名对应的IP地址时,程序将首先检查这个文件。如果程序在/etc/hosts文件中未找到目标机器名对应的IP地址,它将

2015-05-17 21:17:07 429

原创 HTTP代理服务器的工作原理

在HTTP通信链上,客户端和目标服务器之间通常存在某些中转代理服务器,它们提供对目标资源的中转访问。一个HTTP请求可能被多个代理服务器转发,后面的服务器称为前面服务器的上游服务器。代理服务器按照其使用方式和作用,分为正向代理服务器、反向代理服务器、透明代理服务器。正向代理要求客户端自己设置代理服务器的地址。客户的每次请求都将直接发送到该代理服务器,并由代理服务器来请求目标资源。比如处于防火墙内的局

2015-05-17 20:52:58 4403

转载 TCP拥塞控制机制

原文地址:http://blog.sina.com.cn/s/blog_48ebca64010003t0.html研究TCP的拥塞机制,不仅仅是想了解TCP如何的精巧,更多的是领悟其设计思想,即在一般情况下,我们该怎样处理问题。一.拥塞的发生与其不可避免 拥塞发生的主要原因在于网络能够提供的资源不足以满足用户的需求,这些资源包括缓存空间、链路带宽容量和中间节点的处理能力。由于互联网的设计机制导

2015-05-17 19:19:32 838

原创 EPT和VPID简介

EPT(Extended Page Tables,扩展页表),它是针对内存管理单元(MMU)的虚拟化扩展。EPT降低了内存虚拟化的难度(与影子页表相比),也提升了内存虚拟化的性能。 在硬件EPT特性加入之前,影子页表(Shadow Page Tables)是从软件上维护了从客户机虚拟地址(Guest Virtual Address,GVA)到宿主机物理地址(Host Physical Addres

2015-05-11 17:07:52 5965

原创 内存配置

内存设置基本参数 在通过QEMU命令行启动客户机时设置内存大小的参数如下:-m megs #设置客户机的内存为megs MB大小默认的单位为MB,也支持加下“M”或“G”作为后缀来显式指定使用MB或GB作为内存分配的单位。如果不设置-m参数,QEMU对客户机分配的内存大小默认值为128MB。free命令显示的总内存是除去了内核执行文件占用内存和一些系统保留的内存之后能使用的内存。

2015-05-11 11:22:44 379

原创 CPU模型

每一种虚拟机管理程序(Virtual Machine Monitor,VMM或Hypervisor)都会定义自己的策略,让客户机看起来有一个默认的CPU类型。有的Hypervisor会简单地将宿主机中CPU的类型和特性直接传递给客户机使用,而QEMU/KVM在默认情况下会向客户机提供一个名为qemu64或qemu32的基本CPU模型。QEMU/KVM的这种策略会带来一些好处,如可以对CPU特性提供

2015-05-10 21:56:46 2755

原创 交换机工作原理

在SDN网络中,单纯负责网络数据高速转发的基础设备层设备被统一称作交换机。以OpenFlow交换机为代表的SDN基础设施层设备中,还对交换过程所需要的转发决策机制进行了进一步的抽象,将传统网络设备中的二层转发表、三层路由表机制进一步抽象为统一的流表(Flow Table)。 作用网络设备的转发平面,交换机需要具备的最根本功能,主要包括转发决策、背板、输出链路调度等。以交换机对三层数据报文的转发为例

2015-05-10 21:30:05 1611

原创 vCPU的概念

QEMU/KVM为客户机提供一套完整的硬件系统环境,在客户机看来其所拥有的CPU即是vCPU(virtual CPU)。在KVM环境中,每个客户机都是一个标准的Linux进程(QEMU进程),而每一个vCPU在宿主机中是QEMU进程派生的一个普通线程。在普通的Linux系统中,进程一般有两种执行模式:内核模式和用户模式。而在KVM环境中,增加了第三种模式:客户模式。vCPU在三种执行模式下的不

2015-05-10 11:30:21 24624

原创 网络虚拟化

网络虚拟化将虚拟机跟虚拟机之间的连接通过Tunnel技术来做,而且这些Tunnel运行于实际物理网络之上,也就是相当于分层的网络,底层的物理网络连接,实际业务通过Tunnel承载在物理网络之上,也就是所谓的Overlay。同时将Tunnel的终结点放在服务器上而不是放在边缘的物理接入交换机上。这样做一个最大的好处就是虚拟机之间的连接不依赖于物理网络设备(因为物理网络对于虚拟机来说是透明的)。网络虚拟

2015-05-10 11:11:02 640

原创 Controller

Controller是一个运行在独立的服务器上的软件程序,可以用各种不同的语言来实现,可以运行在不同的操作系统上。 Controller有很多个属性: (1)北向接口 每个Controller都有面向用户应用程序的编程接口,这种编程接口就是北向接口。北向接口的差异性可以很大。最简单、最传统的北向接口是CLI、SNMP,目前最流行的北向接口是REST API接口。

2015-05-08 21:52:50 841

原创 模块化设计的Linux

操作系统内核设计一直分为两个阵营:微内核和单内核。 单内核是两大阵营中一种较为简单的设计,指的是整个内核从整体上作为一个单独的大过程来实现,并且同时运行在一个单独的地址空间内。所有的内核服务都在这样一个大的内核空间运行,内核之间的通信可以简单地实现的函数调用 。这样的设计具有简单高效的特点。但是,如果使用单内核设计,每次对内核作出修改(比如增加或者删除驱动程序),都必须重新编译源代码,生成新的二进

2015-05-07 20:21:08 1438 1

原创 KVM功能概览

在KVM架构中,虚拟机实现为常规的Linux进程,由标准Linux调用程序进行调度。事实上,每个虚拟CPU显示为一个常规的Linux进程。需要注意的是,KVM本身不执行任何模拟,需要用户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序就是大名鼎鼎的QEMU。KVM的功能特性: (1)内存管理 KVM从L

2015-05-07 19:02:13 1653

原创 虚拟化技术

虚拟化是一个广义的术语,是指计算元件在虚拟的基础上而不是真实的基础上运行,是一个为了简化管理优化资源的解决方案。 一般的计算模型抽象成为一定的物理资源和运行于之上的计算元件,它们之间通过定义的物理资源接口进行交互。 虚拟化技术则是通过引入一个新的虚拟化层,对下管理真实的物理资源,对上提供虚拟的系统资源。在实际应用中,资源可以表现为各种各样的形式。例如,如果把操作系统及其提供的系统调用作用资源,那

2015-05-07 16:09:04 675

原创 云计算技术

1. Map/Reduce Map/Reduce是Google开发的编程模型,它是一种简化的分布式编程模型和高效的任务调度模型,用于大规模数据集(大于1TB)的并行运算。严格的编程模型使云计算环境下的编程十分简单。MapReduce模式的思想是将要执行的问题分解成Map(映射)和Reduce(化简)的方式,先通过Map程序将数据切割成不相关的区块,分配(调度)给大量计算机处理,达到分布式运算的效果

2015-05-07 15:12:41 519

原创 OpenFlow Controller和交换机工作流程

1. 系统初始化 交换机系统初始化的时候,一般都会有默认流表,默认流表里面有一条默认流表项。通常这条默认流表项的行为是丢弃所有报文或者将所有报文都送到Controller以便Controller进行处理,具体取决于厂商实现。2. 业务驱动Controller增加/删除/修改流表项 系统初始化完后,根据具体业务需求,Controller开始往交换机下发流表项,或者修改已经存在的流表项的属性,或者删

2015-05-07 10:40:40 2850

原创 Controller角色和选举

一台OpenFlow交换机可以同时连接到多个Controller,这些Controller之间是如何协作的呢?Controller有三种角色,分别是Master、Slave和Equal。 1. Master:一台交换机所连接到的所有Controller中,只能有一个Master,它对交换机拥有完全的操作权限。 2. Slave:一台交换机所连接到的所有Controller中,可以有多个Slave

2015-05-07 10:13:05 728

原创 OpenFlow Channel

OpenFlow Channel是指交换机跟Controller之间的连接通道,可以是带外管理通道,也可以是带内管理口(复用业务端口),现在常见的都是带外管理口,主要原因是简单,用带内口需要配置交换芯片和协议栈。 OpenFlow Channel连接可以是TCP连接,也可以是加密的TLS连接,由设备商或者用户自行决定用哪种。使用TCP/TLS连接主要是为了保证可靠性。如果交换机跟多个Control

2015-05-07 10:00:16 757

原创 Controller和交换机之间的消息

我们平时讲的OpenFlow南向接口,就是指Controller和交换机之间的标准消息接口。 Controller和交换机之间的消息分为三大类,分别是Controller-to-Switch消息、Asynchronous(异步)消息(也就是Switch-to-Controller消息)、Symmetric(对称)消息。Controller-to-Switch消息 这种类型的消息是从Con

2015-05-06 22:12:26 1732

原创 固有的不可移植的特性

为了支持低层编程,C++定义了一些固有的不可移植(nonportable)的特性。位域 类可以将其(非静态)数据成员定义成位域(bit-field),在一个位域中含有一定数量的二进制位。位域在内存中的布局是与机器相关的。位域的类型必须是整型或枚举类型。二进制位是否能压缩到一个整数中以及如何压缩是与机器相关的。 取地址运算符(&)不能作用于位域,因此任何指针都无法指向类的位域。通常情况下最好将位域

2015-05-06 16:59:09 564

原创 union:一种节省空间的类

当我们给union的某个成员赋值之后,该union的其他成员就变成未定义的状态了。分配给一个union对象的存储空间至少要能容纳它的最大的数据成员。 union不能含有引用类型的成员,除此之外,它的成员可以是绝大多数类型。在C++11新标准中,含有构造函数或析构函数的类类型也可以作为union的成员类型。为union的一个数据成员赋值会令其他数据成员变成未定义的状态。含有类类型成员的union

2015-05-06 15:24:14 988

原创 嵌套类

一个类可以定义在另一个类的内部,前者称为嵌套类(nested class)或嵌套类型(nested type)。嵌套类常用于定义作用实现部分的类。 嵌套类是一个独立的类,与外层类基本没什么关系。特别是,外层类的对象和嵌套类的对象是相互独立的。在嵌套类的对象中不包含任何外层类定义的成员;类似的,在外层类的对象中也不包含任何嵌套类定义的成员。外层类对嵌套类的成员没有特殊的访问权限,同样,嵌套类对外层类

2015-05-06 11:08:21 448

原创 类成员指针

成员指针(pointer to member)是指可以指向类的非静态成员的指针。一般情况下,指针指向一个对象,但是成员指针指示的是类的成员,而非类的对象。类的静态成员不属于任何对象,因此无须特殊的指向静态成员的指针,指向静态成员的指针与普通指针没有什么区别。 成员指针的类型囊括了类的类型以及成员的类型。当初始化一个这样的指针时,我们令其指向类的某个成员,但是不指定该成员所属的对象;直到使用成员指针

2015-05-05 19:49:46 487

原创 枚举类型

C++包含两种枚举:限定作用域的和不限定作用域的。C++11新标准引入了限定作用域的枚举类型(scoped enumeration)。定义限定作用域的枚举类型一般形式是:首先是关键字enum class(或者等价地使用enum struct),随后是枚举类型名字以及用花括号括起来的以逗号分隔的枚举成员(enumerator)列表,最后是一个分号:enum class open_modes { inp

2015-05-05 16:52:42 401

原创 运行时类型识别

运行时类型识别(runtime type identification, RTTI)的功能由两个运算符实现: 1. typeid运算符,用于返回表达式的类型。 2. dynamic_cast运算符,用于将基类的指针或引用安全地转换成派生类的指针或引用。dynamic_cast运算符 dynamic_cast运算符的使用形式如下所示:dynamic_cast<type*>(e);dynamic

2015-05-05 16:28:36 639

原创 new表达式与operator new函数

标准库函数operator new和operator delete的名字容易让人误解。和其他operator函数不同(比如operator=),这两个函数并没有重载new表达式或delete表达式。实际上,我们根本无法自定义new表达式或delete表达式的行为。 一条new表达式的执行过程总是先调用operator new函数以获取内存空间,然后在得到的内存空间中构造对象。与之相反,一条dele

2015-05-05 11:19:07 1217

原创 多重继承下的类作用域

在只有一个基类的情况下,派生类的作用域嵌套在直接基类和间接基类的作用域中。查找过程沿着继承体系自底向上进行,直到找到所需的名字。派生类的名字将隐藏基类的同名成员。 大多重继承的情况下,相同的查找过程在所有直接基类中同时进行。如果名字在多个基类中都被找到,则对该名字的使用将具有二义性。当一个类拥有多个基类时,有可能出现派生类从两个或更多基类中继承了同名成员的情况。此时,不加前缀限定符直接使用该名字将

2015-05-05 09:23:55 467

原创 多重继承

对于派生类能够继承的基类个数,C++没有进行特殊规定:但是在某个给定的派生列表中,同一个基类只能出现一次。派生类构造函数初始化所有基类 构造一个派生类的对象将同时构造并初始化它的所有基类子对象。派生类的构造函数初始值列表将实参分别传递给每个直接基类。其中基类的构造顺序与派生列表中基类的出现顺序保持一致,而与派生类构造函数初始值列表中基类的顺序无关。多重继承的派生类的拷贝与移动操作 与只有一个基类

2015-05-04 22:13:12 191

原创 重载与命名空间

与实参相关的查找与重载 对于接受类类型实参的函数来说,其名字查找将在实参类所属的命名空间中进行。这条规则对于我们如何确定候选函数集同样也有影响。我们将在每个实参类(以及实参类的基类)所属的命名空间中搜寻候选函数。在这些命名空间中所有与被调用函数同名的函数都将被添加到候选集当中,即使其中某些函数在调用语句处不可见也是如此。重载与using声明 using声明语句声明的是一个名字,而不是一个特定的函

2015-05-04 20:22:47 395

原创 友元声明与实参相关的查找

当类声明了一个友元时,该友元声明并没有使得友元本身可见。然而,一个另外的未声明的类或函数如果第一次出现在友元声明中,则我们认为它是最近的外层命名空间的成员。这条规则与实参相关的查找规则结合在一起将产生意想不到的效果:namespace{ class C { // 两个友元,在友元声明之外没有其他的声明 // 这些函数隐式地成为命名空间A的成员 friend

2015-05-04 17:23:57 500

原创 实参相关的查找与类类型

对于命名空间中名字的隐藏规则来说有一个重要的例外。这个例外是,当我们给函数传递一个类类型的对象时,除了在常规的作用域查找外还会查找实参类所属的命名空间。这一例外对于传递类的引用或指针的调用同样有效。 查找规则的这个例外允许概念上作为类接口一部分的非成员函数无须单独的using声明(using declaration)就能被程序使用。

2015-05-04 16:35:47 444

原创 命名空间

命名空间为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间是一个作用域。命名空间定义 一个命名空间的定义包含两部分:首先是关键字namespace,随后是命名空间的名字。在命名空间名字后面是一系列由花括号括起来的声明和定义。只要能出现在全局作用域中的声明就能置于命名空间中。每个命名空间都是一个作用域 命名空间中的每个名字都必须表示该空间内的唯一实体。定义在某个命名空

2015-05-04 11:30:07 662

空空如也

空空如也

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

TA关注的人

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