自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

RTC hacker

WebRTC/MCU/Video Client/Video CallCenter/SBC/SoftSwitch

  • 博客(1)
  • 资源 (65)
  • 收藏
  • 关注

原创 freeswitch 高级主题之 提高系统并发

freeswitch 出身时就以高性能著称,尤其是在做为sip 媒体服务器时,但是具体性能根据实际使用环境差异很大,经常有人问freeswitch性能有多高,这是一个很难回答的问题因为一个小的使用差异就会导致性能差别很大,比如dialplan是否执行了脚本语言? 用的什么语言都对性能影响很大,笔者曾经在dialplan里面用perl 操作数据库,结果性能很差,最后换成 lua,解决了问题。下面

2016-03-30 11:03:29 9792 3

名企笔试相关(IT类)

近期许多外企国企都要进行笔试了,在论坛上整理了这些公司的笔经以及相关资料,并汇总供大家下载,希望对大家的笔试面试能有所帮助。并祝福所有参加笔试面试的同学们一切顺利! Cisco笔试题 (cable develop) ZZ 发信人: khadgar (快乐的大宝宝), 信区: Job 标题: cisco笔试题(原创) 发信站: 我爱南开站 (2006年07月31日10:12:20 星期一) cisco笔试题2006-7-30 职位:cable develop 选择题60道60分钟,答对1分,打错扣.5,不答没分,其中网络40道,c语言20道网络以路由协议(rip,ospf等),ip地址(子网,多播),vlan等为主c则有很多指针的内容下面列几道我还记着的: 已知多播ip地址是xxx.xxx.xxx.xxx,对应的mac是多少? 默认路由有什么用处? utp的长度限制是多少? const int a=5; const int *p; p=&a; *p=10; 现在a是多少?这个题就是考常量指针和指针常量 编程题12道,90分钟,100分每题列出题干,卷子上的提示和我答的要点,希望大家指正,注意不能出现中文,只能用 e文和c代码回答下面先列出题目,大家有兴趣可以做一个半小时再和我答的比比,估计都会比我高 更多求职信息,请访问 www.hiall.com.cn 3 名企笔试 更多求职信息,请访问 www.hiall.com.cn 4 ******************************************************************* 1.(5分)写一个函数复制n个字节void memmove(void *dest,void *src,int n) 提示:dest和src可能有重叠2.(5分)列出static的用法3.(10分)reverse string void reverse_str(char *str) 提示:可以用strlen,尽量少占用存储器,原地翻转4.(5分)比较链表和数组5.(5分) int add(int x,int y) { return x+y; } int a=1,b=2; int c=add(a,b); 改为用函数指针表示6.(5分)32位的x 1)测试第11位on还是off 2)使第10位on 3)使第10和14位off 7.(10分)检查你所用的系统是big endian还是little endian 注意对0x8000000地址以上要读写安全(这句话我不明白什么意思) 8.(5分)计算一个字节中1的个数9.(5分)用putchar打印一个4byte的int 10.(10分)测试3次投掷硬币都是正面,画出状态机,写代码11.(15分)单向链表翻转,用递归和非递归方法提示: struct node { int item; struct node_t *next; } node_t; 12.(15分)双向链表降序排序*******************************************************************

2009-12-04

46家公司笔试题.pdf 包括 C C++

46家著名公司笔试题目 包括 华为 中兴 索尼 联想 普天 等等 知名公司 Sony笔试题 1.完成下列程序 * *.*. *..*..*.. *...*...*...*... *....*....*....*....*.... *.....*.....*.....*.....*.....*..... *......*......*......*......*......*......*...... *.......*.......*.......*.......*.......*.......*.......*....... #include <stdio.h> #define N 8 int main() { int i; int j; int k; --------------------------------------------------------- | |2.完成程序,实现对数组的降序排序 #include <stdio.h> void sort( ); int main() { int array[]={45,56,76,234,1,34,23,2,3}; //数字任//意给出 sort( ); return 0; } void sort( ) { ____________________________________ | | | | |-----------------------------------------------------| } 3.费波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他 华为笔试题 1.请你分别画出OSI的七层网络结构图和TCP/IP的五层结构图。 2.请你详细地解释一下IP协议的定义,在哪个层上面?主要有什么作用?TCP与UDP呢? 3.请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的? 4.请问C++的类和C里面的struct有什么区别? 5.请讲一讲析构函数和虚函数的用法和作用。 6.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的? 7.8086是多少位的系统?在数据总线上是怎么实现的? 联想笔试题 1.设计函数 int atoi(char *s)。 2.int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是多少? 3.解释局部变量、全局变量和静态变量的含义。 4.解释堆和栈的区别。 。。。。。 。。。

2009-12-04

C 语言嵌入式系统编程修炼.rar

C 语言嵌入式系统编程修炼之一:背景篇 C 语言嵌入式系统编程修炼之二:软件架构篇 。。。。。。。。。。。。。。。。。。。

2009-04-01

C++名家精华.chm

C++大师的对话,包括各种高难话题如下: 1 auto_ptr再回忆 2 空引用 3 起源 4 谁的代码更易于移植? 5 通过任何其他名字 6 Virtually Yours 7 方形尖塔 8 访问限制 9 重定向 10 关于操纵器的对话 11 根源 12 Abstract Factory, Template Style 13 怎样持久化一个对象

2009-04-01

c C++算法大全详解(付代码)

算法大全(C,C++) 一、 数论算法 1.求两数的最大公约数 function gcd(a,b:integer):integer; begin if b=0 then gcd:=a else gcd:=gcd (b,a mod b); end ; 2.求两数的最小公倍数 function lcm(a,b:integer):integer; begin if a<b then swap(a,b); lcm:=a; while lcm mod b>0 do inc(lcm,a); end; 3.素数的求法 A.小范围内判断一个数是否为质数: function prime (n: integer): Boolean; var I: integer; begin for I:=2 to trunc(sqrt(n)) do if n mod I=0 then begin prime:=false; exit; end; prime:=true; end; B.判断longint范围内的数是否为素数(包含求50000以内的素数表): procedure getprime; var i,j:longint; p:array[1..50000] of boolean; begin fillchar(p,sizeof(p),true); p[1]:=false; i:=2; while i<50000 do begin if p[i] then begin j:=i*2; while j<50000 do begin p[j]:=false; inc(j,i); end; end; inc(i); end; l:=0; for i:=1 to 50000 do if p[i] then begin inc(l);pr[l]:=i; end; end;{getprime} function prime(x:longint):integer; var i:integer; begin prime:=false; for i:=1 to l do if pr[i]>=x then break else if x mod pr[i]=0 then exit; prime:=true; end;{prime} 二、图论算法 1.最小生成树 A.Prim算法: procedure prim(v0:integer); var lowcost,closest:array[1..maxn] of integer; i,j,k,min:integer; begin for i:=1 to n do begin lowcost[i]:=cost[v0,i]; closest[i]:=v0; end; for i:=1 to n-1 do begin {寻找离生成树最近的未加入顶点k} min:=maxlongint; for j:=1 to n do if (lowcost[j]<min) and (lowcost[j]<>0) then begin min:=lowcost[j]; k:=j; end; lowcost[k]:=0; {将顶点k加入生成树} {生成树中增加一条新的边k到closest[k]} {修正各点的lowcost和closest值} for j:=1 to n do if cost[k,j]<lwocost[j] then begin lowcost[j]:=cost[k,j]; closest[j]:=k; end; end; end;{prim} B.Kruskal算法:(贪心) 按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。 function find(v:integer):integer; {返回顶点v所在的集合} var i:integer; begin i:=1; while (i<=n) and (not v in vset[i]) do inc(i); if i<=n then find:=i else find:=0; end; procedure kruskal; var tot,i,j:integer; begin for i:=1 to n do vset[i]:=[i];{初始化定义n个集合,第I个集合包含一个元素I} p:=n-1; q:=1; tot:=0; {p为尚待加入的边数,q为边集指针} sort; {对所有边按权值递增排序,存于e[I]中,e[I].v1与e[I].v2为边I所连接的两个顶点的序号,e[I].len为第I条边的长度} while p>0 do begin i:=find(e[q].v1);j:=find(e[q].v2); if i<>j then begin inc(tot,e[q].len); vset[i]:=vset[i]+vset[j];vset[j]:=[]; dec(p); end; inc(q); end; writeln(tot); end; 2.最短路径

2009-04-01

Linux_C函数详细解析.pdf

isalnum(测试字符是否为英文或数字) 相关函数 isalpha,isdigit,islower,isupper 表头文件#include<ctype.h> 定义函数int isalnum (int c) 函数说明 检查参数 c是否为英文字母或阿拉伯数字,在标准c中相当于使用 (isalpha( c )|| isdigit( c ))做测试。 返回值 若参数 c为字母或数字,则返回TRUE,否则返回NULL( 0 )。 附加说明 此为宏定义,非真正函数。 范例 /* 找出str 字符串中为英文字母或数字的字符*/ #include

2009-04-01

58家公司面试题目.pdf

58家著名公司笔试题目大牛公司面试题目,带解答,经典。

2009-03-22

C案例分析-开发综合程序

经过基本的编程训练后,我们已经能编写解决小问题的程序,对程序的开发也有了初步 的认识,还掌握了C 语言的基本语法,这一过程确确实实令我们感到欣喜,有点计算机可以 完成自我任务的成就感。但是,对于程序设计而言,学习C 的步伐不应该停留于此。我们最 终的目的应该是掌握开发大型综合程序的方法,即遵循软件工程的开发步骤和结构化程序设 计思想,用C 语言开发出解决复杂问题的大型综合程序。 首先介绍软件工程的概念,然后通过一个具体的案例讲述如何在综合程序的开发中应用 软件工程的思想和方法。

2009-03-22

C# 五子棋(课程设计+包含详细设计文档)

C# 开发的五子棋游戏,包含详细设计过程文档。课程设计+包含详细设计文档

2008-11-27

java设计模式迷你手册(普通下载).chm

Factory Method Adapter_Class Interpreter Template Method 对象 Abstract Factory Builder Prototype Singleton Adapter_Object Bridge Composite Decorator Facade Flyweight Proxy Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor 概览

2008-11-22

QQ的架构讨论.doc

1.登录时的负载如何解决的 2.服务器主要作哪些事,负载如何解决 3.数据库负载如何解决

2008-11-22

陈意云(高教2005)编译原理习题精选与解析.pdf

陈意云(高教2005)编译原理习题精选与解析.pdf

2008-11-22

2009年C#面试题库.rar

该找工作了,天天到处奔波,最让人伤心的是求职未果,真的,还未步入职业生涯,我已经身心疲倦了,好累!我现在求职的状态就是高不成低不就,与专业无关的职业很多,但我不想去做,因为我觉得我在其他行业中找不到乐趣,也体现不了我的价值,而专业方面的职业也有,但是有好多机会都与我擦肩而过,由于知识面的狭窄,我很难通过笔试那一关。在网上看了很多招聘信息,有很多职位我都望而生畏,其本质原因就是我的知识面不广,实践经验不够丰富。最近的半个月,我就像无头苍蝇,到处乱撞,现在我非常需要静下心来仔细思考一下! 对于找工作,我是不是也应该换个角度去考虑呢?总结屡面屡败的原因,最核心的就是两方面的问题,一是笔试,二是实践经验。个人认为笔试最重要,如果笔试成绩排在前面,在随后的面试中,压力就非常小。现在市面上有流行的程序员面试宝典,JAVA程序面试宝典,可惜不知为什么,错误太好,而且覆盖面不广,这里我将近半年参加的笔试、面试题,以及一些资料上的经典题目进行汇总,整理为120多个。

2008-11-20

700多个API函数的详细介绍.rar

本帮助文件由陈国强个人整理后出版,内容全摘自网络。版权归实际作者所有。 为了让网友们能更好的阅读和管理Windows API 函数,于是我为大家将网上的资料整理成一个帮助文件。让查阅API 函数变的更简单,容易,也更有效。 本帮助文件中的Windows API 函数大约有774个,共分十二大类,基本上包括了大部分的常用和非常用的Windows API 函数。

2008-11-20

精华游戏算法整理(经典)

算法一:A*寻路初探 From GameDev.net 译者序:很久以前就知道了A*算法,但是从未认真读过相关的文章,也没有看过代码,只是脑子里有个模糊的概念。这次决定从头开始,研究一下这个被人推崇备至的简单方法,作为学习人工智能的开始。 这 篇文章非常知名,国内应该有不少人翻译过它,我没有查找,觉得翻译本身也是对自身英文水平的锻炼。经过努力,终于完成了文档,也明白的A*算法的原理。毫 无疑问,作者用形象的描述,简洁诙谐的语言由浅入深的讲述了这一神奇的算法,相信每个读过的人都会对此有所认识(如果没有,那就是偶的翻译太差了-- b)。 原文链接:http://www.gamedev.net/reference/articles/article2003.asp 以下是翻译的正文。(由于本人使用ultraedit编辑,所以没有对原文中的各种链接加以处理(除了图表),也是为了避免未经许可链接的嫌疑,有兴趣的读者可以参考原文。 会者不难,A*(念作A星)算法对初学者来说的确有些难度。 这篇文章并不试图对这个话题作权威的陈述。取而代之的是,它只是描述算法的原理,使你可以在进一步的阅读中理解其他相关的资料。 最后,这篇文章没有程序细节。你尽可以用任意的计算机程序语言实现它。如你所愿,我在文章的末尾包含了一个指向例子程序的链接。 压缩包包括C++和Blitz Basic两个语言的版本,如果你只是想看看它的运行效果,里面还包含了可执行文件。 我们正在提高自己。让我们从头开始。。。 序:搜索区域 假设有人想从A点移动到一墙之隔的B点,如下图,绿色的是起点A,红色是终点B,蓝色方块是中间的墙。 [图1] 你 首先注意到,搜索区域被我们划分成了方形网格。像这样,简化搜索区域,是寻路的第一步。这一方法把搜索区域简化成了一个二维数组。数组的每一个元素是网格 的一个方块,方块被标记为可通过的和不可通过的。路径被描述为从A到B我们经过的方块的集合。一旦路径被找到,我们的人就从一个方格的中心走向另一个,直 到到达目的地。 这些中点被称为“节点”。当你阅读其他的寻路资料时,你将经常会看到人们讨论节点。为什么不把他们描述为方格呢?因为有可 能你的路径被分割成其他不是方格的结构。他们完全可以是矩形,六角形,或者其他任意形状。节点能够被放置在形状的任意位置-可以在中心,或者沿着边界,或 其他什么地方。我们使用这种系统,无论如何,因为它是最简单的。 开始搜索 正如我们处理上图网格的方法,一旦搜索区域被转化为容易处理的节点,下一步就是去引导一次找到最短路径的搜索。在A*寻路算法中,我们通过从点A开始,检查相邻方格的方式,向外扩展直到找到目标。 我们做如下操作开始搜索: 1,从点A开始,并且把它作为待处理点存入一个“开启列表”。开启列表就像一张购物清单。尽管现在列表里只有一个元素,但以后就会多起来。你的路径可能会通过它包含的方格,也可能不会。基本上,这是一个待检查方格的列表。 2,寻找起点周围所有可到达或者可通过的方格,跳过有墙,水,或其他无法通过地形的方格。也把他们加入开启列表。为所有这些方格保存点A作为“父方格”。当我们想描述路径的时候,父方格的资料是十分重要的。后面会解释它的具体用途。 3,从开启列表中删除点A,把它加入到一个“关闭列表”,列表中保存所有不需要再次检查的方格。 在这一点,你应该形成如图的结构。在图中,暗绿色方格是你起始方格的中心。它被用浅蓝色描边,以表示它被加入到关闭列表中了。所有的相邻格现在都在开启列表中,它们被用浅绿色描边。每个方格都有一个灰色指针反指他们的父方格,也就是开始的方格。 [图2] 接着,我们选择开启列表中的临近方格,大致重复前面的过程,如下。但是,哪个方格是我们要选择的呢?是那个F值最低的。 路径评分 选择路径中经过哪个方格的关键是下面这个等式: F = G + H 这里: * G = 从起点A,沿着产生的路径,移动到网格上指定方格的移动耗费。 * H = 从网格上那个方格移动到终点B的预估移动耗费。这经常被称为启发式的,可能会让你有点迷惑。这样叫的原因是因为它只是个猜测。我们没办法事先知道路径的长 度,因为路上可能存在各种障碍(墙,水,等等)。虽然本文只提供了一种计算H的方法,但是你可以在网上找到很多其他的方法。 我们的路径是通过反复遍历开启列表并且选择具有最低F值的方格来生成的。文章将对这个过程做更详细的描述。首先,我们更深入的看看如何计算这个方程。 正 如上面所说,G表示沿路径从起点到当前点的移动耗费。在这个例子里,我们令水平或者垂直移动的耗费为10,对角线方向耗费为14。我们取这些值是因为沿对 角线的距离是沿水平或垂直移动耗费的的根号2(别怕),或者约1.414倍。为了简化,我们用10和14近似。比例基本正确,同时我们避免了求根运算和小 数。这不是只因为我们怕麻烦或者不喜欢数学。使用这样的整数对计算机来说也更快捷。你不就就会发现,如果你不使用这些简化方法,寻路会变得很慢。 既然我们在计算沿特定路径通往某个方格的G值,求值的方法就是取它父节点的G值,然后依照它相对父节点是对角线方向或者直角方向(非对角线),分别增加14和10。例子中这个方法的需求会变得更多,因为我们从起点方格以外获取了不止一个方格。 H 值可以用不同的方法估算。我们这里使用的方法被称为曼哈顿方法,它计算从当前格到目的格之间水平和垂直的方格的数量总和,忽略对角线方向。然后把结果乘以 10。这被成为曼哈顿方法是因为它看起来像计算城市中从一个地方到另外一个地方的街区数,在那里你不能沿对角线方向穿过街区。很重要的一点,我们忽略了一 切障碍物。这是对剩余距离的一个估算,而非实际值,这也是这一方法被称为启发式的原因。想知道更多?你可以在这里找到方程和额外的注解。 F的值是G和H的和。第一步搜索的结果可以在下面的图表中看到。F,G和H的评分被写在每个方格里。正如在紧挨起始格右侧的方格所表示的,F被打印在左上角,G在左下角,H则在右下角。 [图3] 现在我们来看看这些方格。写字母的方格里,G = 10。这是因为它只在水平方向偏离起始格一个格距。紧邻起始格的上方,下方和左边的方格的G值都等于10。对角线方向的G值是14。 H 值通过求解到红色目标格的曼哈顿距离得到,其中只在水平和垂直方向移动,并且忽略中间的墙。用这种方法,起点右侧紧邻的方格离红色方格有3格距离,H值就 是30。这块方格上方的方格有4格距离(记住,只能在水平和垂直方向移动),H值是40。你大致应该知道如何计算其他方格的H值了~。 每个格子的F值,还是简单的由G和H相加得到 继续搜索 为了继续搜索,我们简单的从开启列表中选择F值最低的方格。然后,对选中的方格做如下处理: 4,把它从开启列表中删除,然后添加到关闭列表中。 5,检查所有相邻格子。跳过那些已经在关闭列表中的或者不可通过的(有墙,水的地形,或者其他无法通过的地形),把他们添加进开启列表,如果他们还不在里面的话。把选中的方格作为新的方格的父节点。 6,如果某个相邻格已经在开启列表里了,检查现在的这条路径是否更好。换句话说,检查如果我们用新的路径到达它的话,G值是否会更低一些。如果不是,那就什么都不做。 另一方面,如果新的G值更低,那就把相邻方格的父节点改为目前选中的方格(在上面的图表中,把箭头的方向改为指向这个方格)。最后,重新计算F和G的值。如果这看起来不够清晰,你可以看下面的图示。 好了,让我们看看它是怎么运作的。我们最初的9格方格中,在起点被切换到关闭列表中后,还剩8格留在开启列表中。这里面,F值最低的那个是起始格右侧紧邻的格子,它的F值是40。因此我们选择这一格作为下一个要处理的方格。在紧随的图中,它被用蓝色突出显示。 [图4] 首先,我们把它从开启列表中取出,放入关闭列表(这就是他被蓝色突出显示的原因)。然后我们检查相邻的格子。哦,右侧的格子是墙,所以我们略过。左侧的格子是起始格。它在关闭列表里,所以我们也跳过它。 其 他4格已经在开启列表里了,于是我们检查G值来判定,如果通过这一格到达那里,路径是否更好。我们来看选中格子下面的方格。它的G值是14。如果我们从当 前格移动到那里,G值就会等于20(到达当前格的G值是10,移动到上面的格子将使得G值增加10)。因为G值20大于14,所以这不是更好的路径。如果 你看图,就能理解。与其通过先水平移动一格,再垂直移动一格,还不如直接沿对角线方向移动一格来得简单。 当我们对已经存在于开启列表中的4个临近格重复这一过程的时候,我们发现没有一条路径可以通过使用当前格子得到改善,所以我们不做任何改变。既然我们已经检查过了所有邻近格,那么就可以移动到下一格了。 于 是我们检索开启列表,现在里面只有7格了,我们仍然选择其中F值最低的。有趣的是,这次,有两个格子的数值都是54。我们如何选择?这并不麻烦。从速度上 考虑,选择最后添加进列表的格子会更快捷。这种导致了寻路过程中,在靠近目标的时候,优先使用新找到的格子的偏好。但这无关紧要。(对相同数值的不同对 待,导致不同版本的A*算法找到等长的不同路径。) 那我们就选择起始格右下方的格子,如图。 [图5]

2008-11-19

76经典道算法题及解答

76经典道算法题及解答(欢迎下载我的其他资源)

2008-11-19

组件技术综合资料库.chm

chm格式 COM,COM+,DCOM,ATL,ActiveX,DLL等等技术汇集 有关ActiveX, COM, DCOM, COM+, ATL,OLE等资料一

2008-10-31

.Net 多线程详解

.doc 格式 详细解析多线程技术 基础篇 • 怎样创建一个线程 • 受托管的线程与 Windows线程 • 前台线程与后台线程 • 名为BeginXXX和EndXXX的方法是做什么用的 • 异步和多线程有什么关联 WinForm多线程编程篇 • 我的多线程WinForm程序老是抛出InvalidOperationException ,怎么解决? • Invoke,BeginInvoke干什么用的,内部是怎么实现的 • 每个线程都有消息队列吗? • 为什么Winform不允许跨线程修改UI线程控件的值 • 有没有什么办法可以简化WinForm多线程的开发 线程池 • 线程池的作用是什么? • 所有进程使用一个共享的线程池,还是每个进程使用独立的线程池? • 为什么不要手动线程池设置最大值? • .Net线程池有什么不足? 同步 • CLR怎样实现lock(obj)锁定? • WaitHandle是什么,他和他的派生类怎么使用 • 什么是用双锁实现Singleton,为什么要这样做,为什么有人说双锁检验是不安全的 • 互斥对象(Mutex)、事件(Event)对象与lock语句的比较 什么时候需要锁定 • 只有共享资源才需要锁定 • 把锁定交给数据库 • 了解你的程序是怎么运行的 • 业务逻辑对事务和线程安全的要求 • 计算一下冲突的可能性 • 请多使用lock,少用Mutex

2008-10-31

若干c语言作品.chm

.chm格式的C语言编写的若干作品

2008-06-17

程序设计经验杂谈.chm

chm格式的,内容很多。

2008-06-17

微软面试之中国将帅问题

微软的一道面试题!值得研究!

2008-05-13

C/C++面试题目及解答.doc

看看格式,再看看大小,应该看出它的含金量,200多页吧,不多。<br>部分:<br>1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?<br>答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员--虚拟函数表指针是在运行期--也就是构造函数被调用时进行初始化的,这是实现多态的关键.<br><br>2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个 <br>字符存到新文件的第一个字符,以此类推。<br><br>3.main主函数执行完毕后,是否可能会再执行一段代码?(朗讯的一道笔试题)<br>答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行;<br>如果你需要加入一段在main退出后执行的代码,可以使用atexit()函数,注册一个函数。 <br> 语法: <br> #include <stdlib.h> <br> int atexit(void (*function")(void)); <br> #include <stdlib.h> <br> #include <stdio.h> <br> void fn1( void ), fn2( void ), fn3( void ), fn4( void ); <br> int main( void ) <br> { <br> atexit( fn1 ); <br> atexit( fn2 ); <br> atexit( fn3 ); <br> atexit( fn4 ); <br> printf( "This is executed first.\n" ); <br> } <br> void fn1() <br> { <br> printf( "next.\n" ); <br> } <br> void fn2() <br> { <br> printf( "executed " ); <br> } <br> void fn3() <br> { <br> printf( "is " ); <br> } <br> void fn4() <br> { <br> printf( "This " ); <br> } <br>结果:<br>This is executed first. <br> This is executed next. <br><br>4.一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? <br>在子类的空间里,有没有父类的这个函数,或者父类的私有变量? (华为笔试题)<br>答案:只要基类在定义成员函数时已经声明了virtue关键字,在派生类实现的时候覆盖该函数时,virtue关键字可加可不加,不影响多态的实现。子类的空间里有父类的所有变量(static除外)。<br><br>5.给一个字符串、例如 “ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。<br> 用C/C++语言写一函数完成该算法,给出复杂度<br><br>6.对序列1、1、2、3、5、8、13。。。。 是Fab..数列<br> 2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质<br>给出k,返回第k小的Fab..质数<br><br>7.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币<br>重的结论。<br><br>8.完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数有什么区别<br>,你喜欢使用哪个,为什么?<br>答案:这些函数的区别在于 实现功能 以及 操作对象 不同。<br>1.strcpy 函数操作的对象是 字符串,完成 从 源字符串 到 目的字符串 的 拷贝 功能。<br>2.snprintf 函数操作的对象不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现(字符串或基本数据类型)向字符串的转换功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。<br>3.memcpy 函数顾名思义就是 内存拷贝,实现 将一个 内存块 的内容复制到另一个 内存块 这一功能。内存块由其首地址以及长度确定。程序中出现的实体对象,不论是什么类型,其最终表现就是在内存中占据一席之地(一个内存区间或块)。因此,memcpy 的操作对象不局限于某一类数据类型,或者说可 适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于 memcpy 函数等长拷贝的特点以及数据类型代表的物理意义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。<br><br>对于字符串拷贝来说,用上述三个函数都可以实现,但是其实现的效率和使用的方便程度不同:<br>• strcpy 无疑是最合适的选择:效率高且调用方便。<br>• snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。<br>• memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度 + 1),还会带来性能的下降。其实 strcpy 函数一般是在内部调用 memcpy 函数或者用汇编直接实现的,以达到高效的目的。因此,使用 memcpy 和 strcpy 拷贝字符串在性能上应该没有什么大的差别。<br>对于非字符串类型的数据的复制来说,strcpy 和 snprintf 一般就无能为力了,可是对 memcpy 却没有什么影响。但是,对于基本数据类型来说,尽管可以用 memcpy 进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下 memcpy 几乎不被使用。memcpy 的长处是用来实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。<br>9.变量的声明和定义有什么区别?<br>10.请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:<br>#include <stdio.h><br>#include <stdlib.h><br><br>int main(void)<br>{<br> char a[30];<br> char *b = (char *)malloc(20 * sizeof(char));<br> printf("%d\n", sizeof(a));<br> printf("%d\n", sizeof(b));<br> printf("%d\n", sizeof(a[3]));<br> printf("%d\n", sizeof(b+3));<br> printf("%d\n", sizeof(*(b+4)));<br> return 0 ;<br>}<br><br>12.请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。<br> a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请给出该题的至少一个不同解法。<br>第一种unsigned int TestAsOne0(char log) <br> { <br> int i; <br> unsigned int num=0, val; <br> for(i=0; i<8; i++) <br> { <br> val = log >> i; //移位<br> val &= 0x01; //与1相与<br> if(val) <br> num++; <br> } <br> return num; <br> } <br>第二种unsigned int TestAsOne1(char log) <br> { <br> int i; <br> unsigned int num=0, val; <br> for(i=0; i<8; i++) <br> { <br> val = (~log) >> i; //反码? <br> val &= 0x00; //与0相与<br> if(!val) <br> num++; <br> } <br> return num; <br> } <br> b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。<br>int Invert(char *str) <br>{ <br>int num=0; <br>while(*str!='\0') <br>{ <br>int digital=*str-48; <br>num=num*10+digital; <br>str=str+1; <br>} <br>return num; <br>} <br> c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。<br>void IntToCharChange(int num, char* pval) <br> { <br> char strval[100]; <br> int i, j; <br> int val0 = 0; <br> int val1 = 0; <br> <br> val0 = num; <br> for(i=0; i<100; i++) <br> { <br> val1 = val0 % 10; //取余<br> val0 = val0 / 10; //取整<br> strval[i] = val1 + 48; //数字—字符 <br> if(val0 < 10) <br> { <br> i++; <br> strval[i] = val0 + 48; <br> break; <br> } <br> } <br> for(j=0; j<=i; j++) //倒置<br> { <br> pval[j] = strval[i-j]; <br> } <br> pval[j] = '\0'; <br> }<br> d)请编写一个 C 函数,该函数将一个字符串逆序。<br>void AntitoneValue(char* father, char* child) <br> { <br> int i; <br> char source[100]; <br> int j = 0; <br> <br> while(father[j]) //放入source,[j]为长度<br> { <br> source[j] = father[j]; <br> j++; <br> if(j > 99) <br> { <br> return; <br> } <br> } <br> source[j] = '\0'; <br> <br> for(i=0; i<j; i++) <br> { <br> child[i] = source[j-i-1]; //反序<br> } <br> child[i] = '\0'; <br> } <br><br>e)请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。<br>int search(char *cpSource, int n, char ch) //起始地址,搜索长度,目标字符<br>{<br>int i;<br>for(i=0; i<n && *(cpSource+i) != ch; ++i);<br>return i;<br>}<br> f)请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。<br>int ChildString(char*p) //自己写<br> { <br> Char *q=p;<br>int stringlen=0, i=0,j=1,len=0,maxlen=1; <br>while(*q!=’\0’) //不能用strlen,求得长度stringlen<br>{<br> Stringlen++;<br>q++;<br>}<br> while( i< Stringlen ) <br> { <br> if(*(p+i)==*(p+j)&&j< Stringlen) <br> { <br> len++; //统计子串长度<br> i++;<br> j++; <br> } <br> else <br> { <br> if(len>maxlen) //统计最大子串长度<br> { <br> maxlen=len+1; <br> len=0;<br> } <br> else {<br> len=0;<br> } <br> i++;<br> j++;<br> <br> } <br> } <br> return maxlen; <br>} <br>给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件<br><br>……<br>……<br>……<br>……

2008-05-12

经典C/C++面试题目大汇总(全附答案).doc

doc格式,60多页吧,几百道题吧,都有答案吧,看好在下!部分:1.求下面函数的返回值(微软)int func(x) { int countx = 0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999。 答案:8思路:将x转化为2进制,看含有的1的个数。2. 什么是“引用”?申明和使用“引用”要注意哪些问题?答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。3. 将“引用”作为函数参数有哪些特点?(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。4. 在什么时候需要使用“常引用”? 如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;例1int a ;const int &ra=a;ra=1; //错误a=1; //正确 例2string foo( );void bar(string & s); 那么下面的表达式将是非法的:bar(foo( ));bar("hello world"); 原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const 。5. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!注意事项:(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 (2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。(4)流操作符重载返回值申明为“引用”的作用:流操作符<>,这两个操作符常常希望被连续使用,例如:cout << "hello" << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。 赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。例3#i nclude int &put(int n);int vals[10];int error=-1;void main(){put(0)=10; //以put(0)函数值作为左值,等价于vals[0]=10; put(9)=20; //以put(9)函数值作为左值,等价于vals[9]=20; cout<<vals[0]; cout<<vals[9];} int &put(int n){if (n>=0 && n<=9 ) return vals[n]; else { cout<<"subscript error"; return error; }} (5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。6. “引用”与多态的关系?引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。例4Class A; Class B : Class A{...}; B b; A& ref = b;7. “引用”与指针的区别是什么?指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。此外,就是上面提到的对函数传ref和pointer的区别。8. 什么时候需要“引用”?流操作符<>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。以上 2-8 参考:http://blog.csdn.net/wfwd/archive/2006/05/30/763551.aspx9. 结构与联合有和区别?1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。 2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。10. 下面关于“联合”的题目的输出?a)#i nclude union{int i;char x[2];}a;void main(){a.x[0] = 10; a.x[1] = 1;printf("%d",a.i);}答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)………………

2008-05-12

h264 硬件解码

h264 编码,解码,三星代码,可测是代码。

2012-05-29

h264 编码,解码

h264 硬件编解码,文件。编码,解码。

2012-05-29

h264 lib 库

samsung 、h264 硬接 库 文件。sec mef .

2012-05-29

fsdfaaaaafsdfsdf

sdf asdffdddddddddddddddddddddddddddddddddsd fsd f

2012-05-29

libratry encode

libratry encode.

2012-05-29

hard codec

doubango hard codec lib

2012-05-28

lib库

lib库

2012-05-11

tcp server

simple tcp server bbbbbbbbbbbbbbbbbbbbbbbbbb

2011-09-30

封装的一个工具链,借鉴asterisk服务器

借鉴asterisk sip 服务器 实现一个工具连。

2011-09-28

专家级多线程技术指南 .pdf

高级多线程 一个用指南,多线程开发者必备资料

2011-07-30

memcached 分析 .pdf

memcached 技术分析,不错的一份分析。

2011-07-30

Android 2.3 指导

android 2.3 系统各个模块的使用指导。

2011-07-30

Android AudioTrack 分析 pdf

Android AudioTrack 分析,从理论及代码角度分析 android audioTrack framework 层。

2011-07-30

若干 经典算法 的探讨及C语言实现.chm格式

属实的经典算法,chm格式 部分题目如下: BLOWFISH B-P算法(二) B-P算法(三) DES数据加密标准 DES算法 DSA算法 ElGamal算法 Kohonen的SOFM(自组织特征映射) LAM(线性联想记忆)算法 LZW 压缩算法 MD5算法 PGP的安全性(一) PKCS #7 RSA算法 SSL是怎样工作的? Ternary Search Trees 产生组合的非递归算法 大整数的乘法 对LZW算法的改进及其在图象无损压缩中的应用 复数快速傅立叶变换算法 加密算法与密钥管理 经典加密算法在VB中的实现(1)- Rsa 经典加密算法在VB中的实现(2)- MD5 经典加密算法在VB中的实现(3)- RC4 经典加密算法在VB中的实现(4)- DES 经典字符串HASH函数测试 离散的Hopfield算法 秘密天窗加密方法C++源程序 浅谈图像压缩算法 求全排列的非递归算法 如何实现DES算法 神经元网络 LVQ(学习矢量量化)算法 神经元网络的经典B-P算法1 神经元网络的经典B-P算法2 神经元网络的经典B-P算法3 实数快速fft变换算法 实数快速fft算法二 使用ASP加密算法加密你的数据 手写体数据变换成像素位图的算法 算法网站 图形图像压缩存储技术 我的毕业论文的一部分算法 线性规划的单纯型算法vb实现 行程编码算法RCL 一个堆栈模块(C++实现) 一个关于网络路由选择的算法 一个圆周率的算法 有监督学习的前馈网络 自适应共振理论(ART) 最短路径算法

2009-12-04

全面介绍Windows内存管理机制及C++内存分配实例

本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。 本文目的: 对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。 本文内容: 本文一共有六节,由于篇幅较多,故按节发表。 1. 进程地址空间 1.1地址空间 · 32|64位的系统|CPU 操作系统运行在硬件CPU上,32位操作系统运行于32位CPU上,64位操作系统运行于64位CPU上;目前没有真正的64位CPU。 32位CPU一次只能操作32位二进制数;位数多CPU设计越复杂,软件设计越简单。 软件的进程运行于32位系统上,其寻址位也是32位,能表示的空间是232=4G,范围从0x0000 0000~0xFFFF FFFF。 · NULL指针分区 范围:0x0000 0000~0x0000 FFFF 作用:保护内存非法访问 例子:分配内存时,如果由于某种原因分配不成功,则返回空指针0x0000 0000;当用户继续使用比如改写数据时,系统将因为发生访问违规而退出。 那么,为什么需要那么大的区域呢,一个地址值不就行了吗?我在想,是不是因为不让8或16位的程序运行于32位的系统上呢?!因为NULL分区刚好范围是16的进程空间。 · 独享用户分区 范围:0x0001 0000~0x7FFE FFFF 作用:进程只能读取或访问这个范围的虚拟地址;超越这个范围的行为都会产生违规退出。 例子: 程序的二进制代码中所用的地址大部分将在这个范围,所有exe和dll文件都加载到这个。每个进程将近2G的空间是独享的。 注意:如果在boot.ini上设置了/3G,这个区域的范围从2G扩大为3G:0x0001 0000~0xBFFE FFFF。 · 共享内核分区 范围:0x8000 0000~0xFFFF FFFF 作用:这个空间是供操作系统内核代码、设备驱动程序、设备I/O高速缓存、非页面内存池的分配、进程目表和页表等。 例子: 这段地址各进程是可以共享的。 注意:如果在boot.ini上设置了/3G,这个区域的范围从2G缩小为1G:0xC000 0000~0xFFFF FFFF。 通过以上分析,可以知道,如果系统有n个进程,它所需的虚拟空间是:2G*n+2G (内核只需2G的共享空间)。 1.2地址映射 · 区域 区域指的是上述地址空间中的一片连续地址。区域的大小必须是粒度(64k) 的整数倍,不是的话系统自动处理成整数倍。不同CPU粒度大小是不一样的,大部分都是64K。 区域的状态有:空闲、私有、映射、映像。 在你的应用程序中,申请空间的过程称作保留(预订),可以用VirtualAlloc;删除空间的过程为释放,可以用VirtualFree。 在程序里预订了地址空间以后,你还不可以存取数据,因为你还没有付钱,没有真实的RAM和它关联。 这时候的区域状态是私有; 默认情况下,区域状态是空闲; 当exe或DLL文件被映射进了进程空间后,区域状态变成映像; 当一般数据文件被映射进了进程空间后,区域状态变成映射。 · 物理存储器 Windows各系列支持的内存上限是不一样的,从2G到64G不等。理论上32位CPU,硬件上只能支持4G内存的寻址;能支持超过4G的内存只能靠其他技术来弥补。顺便提一下,Windows个人版只能支持最大2G内存,Intel使用Address Windows Extension (AWE) 技术使得寻址范围为236=64G。当然,也得操作系统配合。 内存分配的最小单位是4K或8K,一般来说,根据CPU不同而不同,后面你可以看到可以通过系统函数得到区域粒度和页面粒度。 · 页文件 页文件是存在硬盘上的系统文件,它的大小可以在系统属性里面设置,它相当于物理内存,所以称为虚拟内存。事实上,它的大小是影响系统快慢的关键所在,如果物理内存不多的情况下。 每页的大小和上述所说内存分配的最小单位是一样的,通常是4K或8K。 · 访问属性 物理页面的访问属性指的是对页面进行的具体操作:可读、可写、可执行。CPU一般不支持可执行,它认为可读就是可执行。但是,操作系统提供这个可执行的权限。 PAGE_NOACCESS PAGE_READONLY PAGE_READWRITE PAGE_EXECUTE PAGE_EXECUTE_READ PAGE_EXECUTE_READWRITE 这6个属性很好理解,第一个是拒绝所有操作,最后一个是接受收有操作; PAGE_WRITECOPY PAGE_EXECUTE_WRITECOPY 这两个属性在运行同一个程序的多个实例时非常有用;它使得程序可以共享代码段和数据段。一般情况下,多个进程只读或执行页面,如果要写的话,将会Copy页面到新的页面。通过映射exe文件时设置这两个属性可以达到这个目的。 PAGE_NOCACHE PAGE_WRITECOMBINE 这两个是开发设备驱动的时候需要的。 PAGE_GUARD 当往页面写入一个字节时,应用程序会收到堆栈溢出通知,在线程堆栈时有用。 · 映射过程 进程地址空间的地址是虚拟地址,也就是说,当取到指令时,需要把虚拟地址转化为物理地址才能够存取数据。这个工作通过页目和页表进行。 从图中可以看出,页目大小为4K,其中每一项(32位)保存一个页表的物理地址;每个页表大小为4K,其中每一项(32位)保存一个物理页的物理地址,一共有1024个页表。利用这4K+4K*1K=4.4M的空间可以表示进程的1024*1024* (一页4K) =4G的地址空间。 进程空间中的32位地址如下: 高10位用来找到1024个页目项中的一项,取出页表的物理地址后,利用中10位来得到页表项的值,根据这个值得到物理页的地址,由于一页有4K大小,利用低12位得到单元地址,这样就可以访问这个内存单元了。 每个进程都有自己的一个页目和页表,那么,刚开始进程是怎么找到页目所在的物理页呢?答案是CPU的CR3寄存器会保存当前进程的页目物理地址。 当进程被创建时,同时需要创建页目和页表,一共需要4.4M。在进程的空间中,0xC030 0000~0xC030 0FFF是用来保存页目的4k空间。0xC000 0000~0xC03F FFFF是用来保存页表的4M空间。也就是说程序里面访问这些地址你是可以读取页目和页表的具体值的(要工作在内核方式下)。有一点我不明白的是,页表的空间包含了页目的空间! 至于说,页目和页表是保存在物理内存还是页文件中,我觉得,页目比较常用,应该在物理内存的概率大点,页表需要时再从页文件导入物理内存中。 页目项和页表项是一个32位的值,当页目项第0位为1时,表明页表已经在物理内存中;当页表项第0位为1时,表明访问的数据已经在内存中。还有很多数据是否已经被改变,是否可读写等标志。另外,当页目项第7位为1时,表明这是一个4M的页面,这值已经是物理页地址,用虚拟地址的低22位作为偏移量。还有很多:数据是否已经被改变、是否可读写等标志。 1.3 一个例子 · 编写生成软件程序exe 软件描述如下: Main () { 1:定义全局变量 2:处理函数逻辑(Load 所需DLL库,调用方法处理逻辑) 3:定义并实现各种方法(方法含有局部变量) 4:程序结束 } 将程序编译,生成exe文件,附带所需的DLL库。 · exe文件格式 exe文件有自己的格式,有若干节(section):.text用来放二进制代码(exe或dll);.data用来放各种全局数据。 .text 指令1:move a, b 指令2:add a, b … .data 数据1:a=2 数据2:b=1 … 这些地址都是虚拟地址,也就是进程的地址空间。 · 运行exe程序 建立进程:运行这个exe程序时,系统会创建一个进程,建立进程控制块PCB,生成进程页目和页表,放到PCB中。 数据对齐:数据的内存地址除以数据的大小,余数为0时说明数据是对齐的。现在的编译器编译时就考虑数据对齐的问题,生成exe文件后,数据基本上是对齐的,CPU运行时,寄存器有标志标识CPU是否能够自动对齐数据,如果遇到不能对齐的情况,或者通过两次访问内存,或者通知操作系统处理。 要注意的是,如果数据没有对齐,CPU处理的效率是很低的。 文件映射:系统不会将整个exe文件和所有的DLL文件装载进物理内存中,同时它也不会装载进页面文件中。相反,它会建立文件映射,也就是利用exe本身当作页面文件。系统将部分二进制代码装载进内存,分配页面给它。 假设分配了一个页面,物理地址为0x0232 FFF1。其中装载的一个指令虚拟地址为0x4000 1001=0100 0000 00 0000 0000 01 0000 0000 0001。一个页面有4K,系统会将指令保存在低12位0x0001的地址处。同时,系统根据高10位0x0100找到页目项,如果没有关联的页表,系统会生成一个页表,分配一个物理页;然后,根据中10位0x0001找到表项,将物理地址0x0232 FFF1存进去。 执行过程: 执行时,当系统拿到一个虚拟地址,就根据页目和页表找到数据的地址,根据页目上的值可以判断页表是在页文件中还是在内存中; 如果在页文件中,会将页面导入内存,更新页目项。读取页表项的值后,可以判断数据页文件中还是在物理内存中;如果在页文件中,会导入到内存中,更新页表项。最终,拿到了数据。 在分配物理页的过程中,系统会根据内存分配的状况适当淘汰暂时不用的页面,如果页面内容改变了(通过页表项的标志位),保存到页文件中,系统会维护内存与页文件的对应关系。 由于将exe文件当作内存映射文件,当需要改变数据,如更改全局变量的值时,利用Copy-On-Write的机制,重新生成页文件,将结果保存在这个页文件中,原来的页文件还是需要被其他进程实例使用的。 在清楚了指令和数据是如何导入内存,如何找到它们的情况下,剩下的就是CPU不断的取指令、运行、保存数据的过程了,当进程结束后,系统会清空之前的各种结构、释放相关的物理内存和删除页文件。 其他章节请看本人博客的Windows内存管理及C++内存分配实例(二)(三)(四)(五)和(六)。 2. 内存状态查询函数 3. 内存管理机制--虚拟内存 (VM) 4. 内存管理机制--内存映射文件 (Map) 5. 内存管理机制--堆 (Heap) 6. 内存管理机制--堆栈 (Stack) 。。。。。。 。。。。。。。。。。。。。。 。。。。。。。。。。。。。。

2009-12-04

CSDN 论坛 算法 精华 chm 格式

总结的 CSDN论坛上 经典 算法 ,做成chm格式,便于查阅,部分内容如下: del_c_sharp的大难题 图论:最短路径? M个人围成一圈,从第一个人开始依次从1到N循环报数 two too small 问题,关于排序 博弈树问题:对角棋游戏算法问题 分治法求大数乘法的问题 怎样确定“圆”的周长? 。。。。。。。。。。。

2009-12-04

各种算法的C语言实现

各种经典算法的实现 算法大全(C,C++) 数论算法 1.求两数的最大公约数 2.高精度减法 3.高精度乘以低精度 4.高精度乘以高精度 七 进制转换 1.任意正整数进制间的互化 。。。。。。。。。。。。

2009-12-04

空空如也

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

TA关注的人

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