当前位置:文档之家› C++多态的实现原理

C++多态的实现原理

C++多态的实现原理
C++多态的实现原理

C++多态的实现原理

1. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。

2. 存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。

3. 多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。

4. 多态用虚函数来实现,结合动态绑定。

5. 纯虚函数是虚函数再加上= 0。

6. 抽象类是指包括至少一个纯虚函数的类。

纯虚函数:virtual void breathe() = 0;即抽象类!必须在子类实现这个函数!即先有名称,没内容,在派生类实现内容!

我们先看一个例子:

[cpp] view plaincopy

1. #include

2.

3. using namespace std;

4.

5. class animal

6. {

7. public:

8. void sleep()

9. {

10. cout<<"animal sleep"<

11. }

12. void breathe()

13. {

14. cout<<"animal breathe"<

15. }

16. };

17. class fish:public animal

18. {

19. public:

20. void breathe()

21. {

22. cout<<"fish bubble"<

23. }

24. };

25. void main()

26. {

27. fish fh;

28. animal *pAn=&fh; // 隐式类型转换

29. pAn->breathe();

30. }

注意,在例1-1的程序中没有定义虚函数。考虑一下例1-1的程序执行的结果是什么?

答案是输出:animal breathe

我们在main()函数中首先定义了一个fish类的对象fh,接着定义了一个指向animal 类的指针变量pAn,将fh的地址赋给了指针变量pAn,然后利用该变量调用pAn->breathe()。许多学员往往将这种情况和C++的多态性搞混淆,认为fh实际上是fish类的对象,应该是调用fish类的breathe(),输出“fish bubble”,然后结果却不是这样。下面我们从两个方面来讲述原因。

1、编译的角度

C++编译器在编译的时候,要确定每个对象调用的函数(要求此函数是非虚函数)的地址,这称为早期绑定(early binding),当我们将fish类的对象fh的地址赋给pAn时,C++编译器进行了类型转换,此时C++编译器认为变量pAn保存的就是animal对象的地址。当在main()函数中执行pAn->breathe()时,调用的当然就是animal对象的breathe函数。

2、内存模型的角度

我们给出了fish对象内存模型,如下图所示:

我们构造fish类的对象时,首先要调用animal类的构造函数去构造animal类的对象,然后才调用fish类的构造函数完成自身部分的构造,从而拼接出一个完整的fish对象。当我们将fish类的对象转换为animal类型时,该对象就被认为是原对象整个内存模型的上半部分,也就是图1-1中的“anima l的对象所占内存”。那么当我们利用类型转换后的对象指针去调用它的方法时,当然也就是调用它所在的内存中的方法。因此,输出animal breathe,也就顺理成章了。

正如很多学员所想,在例1-1的程序中,我们知道pAn实际指向的是fish类的对象,我们希望输出的结果是鱼的呼吸方法,即调用fish类的breathe方法。这个时候,就该轮到虚函数登场了。

前面输出的结果是因为编译器在编译的时候,就已经确定了对象调用的函数的地址,要解决这个问题就要使用迟绑定(late binding)技术。当编译器使用迟绑定时,就会在运行时再去确定对象的类型以及正确的调用函数。而要让编译器采用迟绑定,就要在基类中声明函数时使用virtual关键字(注意,这是必须的,很多学员就是因为没有使用虚函数而写出很多错误的例子),这样的函数我们称为虚函数。一旦某个函数在基类中声明为virtual,那么在所有的派生类中该函数都是virtual,而不需要再显式地声明为virtual。

下面修改例1-1的代码,将animal类中的breathe()函数声明为virtual,如下:

[cpp] view plaincopy

1. #include

2.

3. using namespace std;

4.

5. class animal

6. {

7. public:

8. void sleep()

9. {

10. cout<<"animal sleep"<

11. }

12. virtual void breathe()

13. {

14. cout<<"animal breathe"<

15. }

16. };

17.

18. class fish:public animal

19. {

20. public:

21. void breathe()

22. {

23. cout<<"fish bubble"<

24. }

25. };

26.

27. void main()

28. {

29. fish fh;

30. animal *pAn=&fh; // 隐式类型转换

31. pAn->breathe();

32. }

大家可以再次运行这个程序,你会发现结果是“fish bubble”,也就是根据对象的类型

调用了正确的函数。

那么当我们将breathe()声明为virtual时,在背后发生了什么呢?

编译器在编译的时候,发现animal类中有虚函数,此时编译器会为每个包含虚函数的类创建一个虚表(即vtable),该表是一个一维数组,在这个数组中存放每个虚函数的地址。对于例1-2的程序,animal和fish类都包含了一个虚函数breathe(),因此编译器会为这两个类都建立一个虚表,(即使子类里面没有virtual函数,但是其父类里面有,所以子类中也有了)如下图所示:

那么如何定位虚表呢?编译器另外还为每个类的对象提供了一个虚表指针(即vptr),这个指针指向了对象所属类的虚表。在程序运行时,根据对象的类型去初始化vptr,从而让vptr正确的指向所属类的虚表,从而在调用虚函数时,就能够找到正确的函数。对于例1-2的程序,由于pAn实际指向的对象类型是fish,因此vptr指向的fish类的vtable,当调用pAn->breathe()时,根据虚表中的函数地址找到的就是fish类的breathe()函数。

正是由于每个对象调用的虚函数都是通过虚表指针来索引的,也就决定了虚表指针的正确初始化是非常重要的。换句话说,在虚表指针没有正确初始化之前,我们不能够去调用虚函数。那么虚表指针在什么时候,或者说在什么地方初始化呢?

答案是在构造函数中进行虚表的创建和虚表指针的初始化。还记得构造函数的调用顺序吗,在构造子类对象时,要先调用父类的构造函数,此时编译器只“看到了”父类,并不知道后面是否后还有继承者,它初始化父类对象的虚表指针,该虚表指针指向父类的虚表。当执行子类的构造函数时,子类对象的虚表指针被初始化,指向自身的虚表。对于例2-2

的程序来说,当fish类的fh对象构造完毕后,其内部的虚表指针也就被初始化为指向fish 类的虚表。在类型转换后,调用pAn->breathe(),由于pAn实际指向的是fish类的对象,该对象内部的虚表指针指向的是fish类的虚表,因此最终调用的是fish类的breathe()函数。要注意:对于虚函数调用来说,每一个对象内部都有一个虚表指针,该虚表指针被初始化为

本类的虚表。所以在程序中,不管你的对象类型如何转换,但该对象内部的虚表指针是固定的,所以呢,才能实现动态的对象函数调用,这就是C++多态性实现的原理。

总结(基类有虚函数):

1. 每一个类都有虚表。

2. 虚表可以继承,如果子类没有重写虚函数,那么子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。如果基类有3个虚函数,那么基类的虚表中就有三项(虚函数地址),派生类也会有虚表,至少有三项,如果重写了相应的虚函数,那么虚表中的地址就会改变,指向自身的虚函数实现。如果派生类有自己的虚函数,那么虚表中就会添加该项。

3. 派生类的虚表中虚函数地址的排列顺序和基类的虚表中虚函数地址排列顺序相同。

这就是C++中的多态性。当C++编译器在编译的时候,发现animal类的breathe()函数是虚函数,这个时候C++就会采用迟绑定(late binding)技术。也就是编译时并不确定具体调用的函数,而是在运行时,依据对象的类型(在程序中,我们传递的fish类对象的地址)来确认调用的是哪一个函数,这种能力就叫做C++的多态性。我们没有在breathe()函数前加virtual关键字时,C++编译器在编译时就确定了哪个函数被调用,这叫做早期绑定(early binding)。

C++的多态性是通过迟绑定技术来实现的。

C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。

虚函数是在基类中定义的,目的是不确定它的派生类的具体行为。

例:

定义一个基类:class Animal//动物。它的函数为breathe()//呼吸。

再定义一个类class Fish//鱼。它的函数也为breathe()

再定义一个类class Sheep //羊。它的函数也为breathe()

为了简化代码,将Fish,Sheep定义成基类Animal的派生类。

然而Fish与Sheep的breathe不一样,一个是在水中通过水来呼吸,一个是直接呼吸空气。所以基类不能确定该如何定义breathe,所以在基类中只定义了一个virtual breathe,它是一个空的虚函数。具本的函数在子类中分别定义。程序一般运行时,找到类,如果它有基类,再找它的基类,最后运行的是基类中的函数,这时,它在基类中找到的是virtual标识的函数,它就会再回到子类中找同名函数。派生类也叫子类。基类也叫父类。这就是虚函数的产

生,和类的多态性(breathe)的体现。

这里的多态性是指类的多态性。

函数的多态性是指一个函数被定义成多个不同参数的函数,它们一般被存在头文件中,当你调用这个函数,针对不同的参数,就会调用不同的同名函数。例:Rect()//矩形。它的参数可以是两个坐标点(point,point)也可能是四个坐标(x1,y1,x2,y2)这叫函数的多态性与函数的重载。

类的多态性,是指用虚函数和延迟绑定来实现的。函数的多态性是函数的重载。

一般情况下(没有涉及virtual函数),当我们用一个指针/引用调用一个函数的时候,被调用的函数是取决于这个指针/引用的类型。即如果这个指针/引用是基类对象的指针/引用就调用基类的方法;如果指针/引用是派生类对象的指针/引用就调用派生类的方法,当然如果派生类中没有此方法,就会向上到基类里面去寻找相应的方法。这些调用在编译阶段就确定了。

当设计到多态性的时候,采用了虚函数和动态绑定,此时的调用就不会在编译时候确定而是在运行时确定。不在单独考虑指针/引用的类型而是看指针/引用的对象的类型来判断函数的调用,根据对象中虚指针指向的虚表中的函数的地址来确定调用哪个函数。

数字测图原理和方法

《数字测图原理与方法》教学实习任务书 南京师范大学地理科学学院 2010年11月

一、前言 《数字测图原理与方法》教学实习是该课程教学的重要组成部分,是巩固和深化课堂所学知识的必要环节。通过实习培养学生理论联系实际、分析问题与解决问题的能力以及实际动手能力,使学生具有严格认真的科学态度、实事求是的工作作风、吃苦耐劳的劳动态度以及团结协作的集体观念。同时,也使学生在业务组织能力和实际工作能力方面得到锻炼,为今后从事测绘工作打下良好基础。 实习地点:南京师范大学仙林校区老北区。 实习时间:2010年11月16日-12月21日(共5周)。 实习成绩考核方面:实习态度、协作精神、观测记录、实习报告。 二、实习目的 1、熟练掌握全站仪的使用,掌握水平角、垂直角、距离的观测,坐标量测,数据记录与整理计算; 2、掌握水准仪的使用和水准测量记录与计算; 3、掌握数字测图的基本要求和成图过程; 4、掌握用全站仪进行小地区大比例尺数字测图的数据采集和计算机地形绘图的方法; 5、掌握测绘实习报告的编写。 三、实习任务 在为期五周的时间里,各小组测绘两幅 1:500比例尺的数字地形图。具体任务如下: 1、布设图根控制导线,进行图根平面控制测量和图根水准高程控制测量,完成导线和水准路线的近似平差计算,得到碎部测量所需的控制点的平面和高程坐标,要在实习报告中提供平面控制测量和高程控制测量的平差计算表格。 2、进行数字测图的碎部数据采集(地物和地貌),在KeyStone(开思)环境下,依据地形图图式的要求,小组内各自完成两幅1:500比例尺的数字地形图的制作,并将两幅1:500地形图进行拼接成更大图幅的1幅地形图。

JAVA线程池原理333

在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销 2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。 线程池工作原理:

线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。 线程池的替代方案 线程池远不是服务器应用程序内使用多线程的唯一方法。如同上面所提到的,有时,为每个新任务生成一个新线程是十分明智的。然而,如果任务创建过于频繁而任务的平均处理时间过短,那么为每个任务生成一个新线程将会导致性能问题。 另一个常见的线程模型是为某一类型的任务分配一个后台线程与任务队列。AWT 和 Swing 就使用这个模型,在这个模型中有一个 GUI 事件线程,导致用户界面发生变化的所有工作都必须在该线程中执行。然而,由于只有一个 AWT 线程,因此要在 AWT 线程中执行任务可能要花费相当长时间才能完成,这是不可取的。因此,Swing 应用程序经常需要额外的工作线程,用于运行时间很长的、同 UI 有关的任务。 每个任务对应一个线程方法和单个后台线程(single-background-thread)方法在某些情形下都工作得非常理想。每个任务一个线程方法在只有少量运行时间很长的任务时工作得十分好。而只要调度可预见性不是很重要,则单个后台线程方法就工作得十分好,如低优先级后台任务就是这种情况。然而,大多数服务器应用程序都是面向处理大量的短期任务或子任务,因此往往希望具有一种能够以低开销有效地处理这些任务的机制以及一些资源管理和定时可预见性的措施。线程池提供了这些优点。 工作队列 就线程池的实际实现方式而言,术语“线程池”有些使人误解,因为线程池“明显的”实现在大多数情形下并不一定产生我们希望的结果。术语“线程池”先于Java 平台出现,因此它可能是较少面向对象方法的产物。然而,该术语仍继续广泛应用着。 虽然我们可以轻易地实现一个线程池类,其中客户机类等待一个可用线程、将任务传递给该线程以便执行、然后在任务完成时将线程归还给池,但这种方法却存在几个潜在的负面影响。例如在池为空时,会发生什么呢?试图向池线程传递任务的调用者都会发现池为空,在调用者等待一个可用的池线程时,它的线程将阻塞。我们之所以要使用后台线程的原因之一常常是为了防止正在提交的线程被阻塞。完全堵住调用者,如在线程池的“明显的”实现的情况,可以杜绝我们试图解决的问题的发生。 我们通常想要的是同一组固定的工作线程相结合的工作队列,它使用 wait() 和

数字测图原理与方法

数字测图原理与方法 一、比例尺的概念及比例尺的分类。 比例尺:图上长度与相应的实地水平长度之比,称为该图的比例尺。 比例尺的分类 ①小比例尺:1:25万、1:50万、1:100万 ②中比例尺:1:2.5万、1:5万、1:10万 ③大比例尺:1:500、1:1000、1:2000、1:5000、1:1万 二、白纸测图与数字测图的基本概念。 (1)白纸测图:传统的地形测量是利用测量仪器对地球表面局部区域内的各种地物、地 貌(总称地形)的空间位置和几何形状进行测定,以一定的比例尺并按图式符号绘 制在图纸上,即通常所称的白纸测图。 (2)数字测图:广义地讲,生产数字地图的方法和过程就是数字测图。数字测图实质上 是一种全解析机助测图方法。它以计算机为核心,在相关输入输出设备的支持下,对地形空间数据进行采集、存贮、处理、输出和管理。 三、什么是大比例尺数字地图? 贮存在数据载体(磁带、磁盘或光盘)上的数字形式的大比例尺地图。 四、大比例尺数字地图的特点。 (1)以数字形式表示地图的内容。 (2)具有良好的现势性。 (3)以数字形式贮存的1:1的数字地图,不受比例尺和图幅的限制。 (4)具有较高的位置精度且精度均匀。 (5)为与空间位置有关的信息系统提供基础数据。 (6)地图的建立需要较大的费用和较长的时间。 (7)读写需要相应的软硬件的支持。 五、数字测图技术特点。 (1)精度高 (2)自动化程度高、劳动强度小 (3)更新方便、快捷 (4)便于保存与管理 (5)便于应用 (6)易于发布和实现远程传输 六、数字测图系统的工作过程及作业模式。 数字测图(digital surveying and mapping,简称DSM)系统是以计算机为核心,在外连输入输出设备硬、软件的支持下,对地形空间数据进行采集、输入、成图、绘图、输出、管理的测绘系统。 大比例尺数字测图分为三个阶段:数据采集、数据处理和地图数据的输出。 广义地理解数字测图系统:采集地形数据输入计算机,由机内的成图软件进行处理、成图、显示,经过编辑修改,生成符合国标的地形图,并控制数控绘图仪出图。 七、数字测图的数据采集方式有哪几种? ①地面数字测图法 ②地图数字化法 ③数字摄影测量法

线程池的原理与实现详解

线程池的原理与实现详解 https://www.doczj.com/doc/5d17643206.html,/article/41375.htm2013下面利用C 语言来实现一个简单的线程池,为了使得这个线程池库使用起来更加方便,特在C实现中加入了一些OO的思想,与Objective-C不同,它仅仅是使用了struct来模拟了c++中的类,其实这种方式在linux内核中大量可见 一. 线程池的简介 通常我们使用多线程的方式是,需要时创建一个新的线程,在这个线程里执行特定的任务,然后在任务完成后退出。这在一般的应用里已经能够满足我们应用的需求,毕竟我们并不是什么时候都需要创建大量的线程,并在它们执行一个简单的任务后销毁。 但是在一些web、email、database等应用里,比如彩铃,我们的应用在任何时候都要准备应对数目巨大的连接请求,同时,这些请求所要完成的任务却又可能非常的简单,即只占用很少的处理时间。这时,我们的应用有可能处于不停的创建线程并销毁线程的状态。虽说比起进程的创建,线程的创建时间已经大大缩短,但是如果需要频繁的创建线程,并且每个线程所占用的处理时间又非常简短,则线程创建和销毁带给处理器的额外负担也是很可观的。 线程池的作用正是在这种情况下有效的降低频繁创建销毁

线程所带来的额外开销。一般来说,线程池都是采用预创建的技术,在应用启动之初便预先创建一定数目的线程。应用在运行的过程中,需要时可以从这些线程所组成的线程池里申请分配一个空闲的线程,来执行一定的任务,任务完成后,并不是将线程销毁,而是将它返还给线程池,由线程池自行管理。如果线程池中预先分配的线程已经全部分配完毕,但此时又有新的任务请求,则线程池会动态的创建新的线程去适应这个请求。当然,有可能,某些时段应用并不需要执行很多的任务,导致了线程池中的线程大多处于空闲的状态,为了节省系统资源,线程池就需要动态的销毁其中的一部分空闲线程。因此,线程池都需要一个管理者,按照一定的要求去动态的维护其中线程的数目。 基于上面的技术,线程池将频繁创建和销毁线程所带来的开销分摊到了每个具体执行的任务上,执行的次数越多,则分摊到每个任务上的开销就越小。 当然,如果线程创建销毁所带来的开销与线程执行任务的开销相比微不足道,可以忽略不计,则线程池并没有使用的必要。比如,FTP、Telnet等应用时。 二. 线程池的设计 下面利用C语言来实现一个简单的线程池,为了使得这个线程池库使用起来更加方便,特在C实现中加入了一些OO的思想,与Objective-C不同,它仅仅是使用了struct来模拟

《管理学原理与方法》周三多--第六版

第一篇 第一章管理与管理学 第一节人类的管理活动 一:人类活动的特点(目的性、依存性、知识性) 二:管理的必要性 三:管理的概念 第二节管理的职能与性质 一:管理的职能(计划、组织、领导、控制、创新) 二:管理的自然属性 三:管理的社会属性 第三节管理者的角色与职能 一:管理者的角色(人际角色、信息角色、决策角色) 二:管理者的职能 罗伯特卡次的研究,管理者必须具备三种技能:(技术技能、人际技能、概念机能)第四节管理学的对象与方法 一:管理学的研究对象 二:管理学的研究方法 (一)归纳法(二)试验法(三)演绎法 第二章管理思想的发展 第一节中国传统管理思想 一:中国传统思想形成的社会文化背景 二:中国传统管理思想的要点 第二节西方传统管理思想 一:西方早期管理思想的产生 1:亚当斯密《国富论》1776(英国) 2:查理巴贝奇(英国) 3:罗伯特。欧文(英国的空想主义家) 二:科学管理理论的产生和发展(19世纪末20世纪初) (一)“泰罗”的科学管理理论——科学管理之父 亨利。甘特:布雷斯及他的妻子: (二)对“泰罗制”的评价 (三)法约尔的“组织管理理论” 第三节西方现代管理思想的发展 一:行为科学学派 霍桑试验: 1:需求层次理论——马斯洛 2:双因素理论——赫茨伯格 3:X、Y理论 4:Z理论——威廉。大内 二:“管理科学”学派 三:“决策理论”学派 四:对现代管理理论的思考 五:新经济时代管理思想的变革

(一)管理思想的创新 (二)管理原则的创新 (三)经营目标创新 (四)经营战略创新 (五)生产系统创新 (六)企业组织创新 第三节中国现代管理思想的发展 一:中国现代管理思想形成的历史背景 (一)中国官僚资本企业和民族资本企业的管理 (二)我国革命根据地公营企业的管理 (三)全面学习西方的管理模式 (四)探索中国现在管理模式 二:社会主义经济管理体制改革 (一)由国内管理向国际化管理转化 (二)由科学管理向信息化管理转化 (三)由首长管理向人性化管理转化 (四)由政府管理向民营化管理转化 (五)由封闭式实体管理向开放式虚拟管理转化 第三章管理的基本原理第一节管理原理的特征 一:管理原理的主要特征 二:研究管理原理的意义 第二节系统原理 一:系统的概念 二:系统的特征 三:系统原理要点 第三节人本原理 一:职工是企业的主体 二:有效管理的关键是职工参与 三:现代管理的核心是使人性得到最完美的发展 四:管理是为人服务的 第四节责任原理 一:明确每个人的职责 二:职位设计和权限委任要合理 三:奖惩要分明,公正而及时 第五节效益原理 一:效益的概念 二:效益的评价 三:效益的追求 第四章信息化管理 第一节信息与信息化 一、信息的含义 二、信息化的内涵 三、信息化的影响

操作系统精髓与设计原理课后答案

操作系统精髓与设计原理课后答案 第1章计算机系统概述 1.1列出并简要地定义计算机的四个主要组成部分。 主存储器,存储数据和程序;算术逻辑单元,能处理二进制数据;控制单元,解读存储器中的指令并且使他们得到执行;输入/输出设备,由控制单元管理。 1.2定义处理器寄存器的两种主要类别。 用户可见寄存器:优先使用这些寄存器,可以使机器语言或者汇编语言的程序员减少对主存储器的访问次数。对高级语言而言,由优化编译器负责决定把哪些变量应该分配给主存储器。一些高级语言,如C语言,允许程序言建议编译器把哪些变量保存在寄存器中。 控制和状态寄存器:用以控制处理器的操作,且主要被具有特权的操作系统例程使用,以控制程序的执行。 1.3一般而言,一条机器指令能指定的四种不同操作是什么? 处理器-寄存器:数据可以从处理器传送到存储器,或者从存储器传送到处理器。 处理器-I/O:通过处理器和I/O模块间的数据传送,数据可以输出到外部设备,或者从外部设备输入数据。 数据处理:处理器可以执行很多关于数据的算术操作或逻辑操作。 控制:某些指令可以改变执行顺序。 1.4什么是中断? 中断:其他模块(I/O,存储器)中断处理器正常处理过程的机制。 1.5多中断的处理方式是什么? 处理多中断有两种方法。第一种方法是当正在处理一个中断时,禁止再发生中断。第二种方法是定义中断优先级,允许高优先级的中断打断低优先级的中断处理器的运行。 1.6内存层次的各个元素间的特征是什么? 存储器的三个重要特性是:价格,容量和访问时间。 1.7什么是高速缓冲存储器? 高速缓冲存储器是比主存小而快的存储器,用以协调主存跟处理器,作为最近储存地址的缓冲区。1.8列出并简要地定义I/O操作的三种技术。 可编程I/O:当处理器正在执行程序并遇到与I/O相关的指令时,它给相应的I/O模块发布命令(用以执行这个指令);在进一步的动作之前,处理器处于繁忙的等待中,直到该操作已经完成。 中断驱动I/O:当处理器正在执行程序并遇到与I/O相关的指令时,它给相应的I/O模块发布命令,并继续执行后续指令,直到后者完成,它将被I/O模块中断。如果它对于进程等待I/O的完成来说是不必要的,可能是由于后续指令处于相同的进程中。否则,此进程在中断之前将被挂起,其他工作将被执行。 直接存储访问:DMA模块控制主存与I/O模块间的数据交换。处理器向DMA模块发送一个传送数据块的请求,(处理器)只有当整个数据块传送完毕后才会被中断。 1.9空间局部性和临时局部性间的区别是什么? 空间局部性是指最近被访问的元素的周围的元素在不久的将来可能会被访问。临时局部性(即时间局部性)是指最近被访问的元素在不久的将来可能会被再次访问。 1.10开发空间局部性和时间局部性的策略是什么? 空间局部性的开发是利用更大的缓冲块并且在存储器控制逻辑中加入预处理机制。时间局部性的开发是利用在高速缓冲存储器中保留最近使用的指令及数据,并且定义缓冲存储的优先级。 第2章操作系统概述

数字测图原理与方法知识点考研总结

数字测图原理与方法知识点考研总结 文件编码(GHTU-UITID-GGBKT-POIU-WUUI-8968)

数字测图原理与方法 一、名词解释 1、大地水准面:把一个假象的、与静止的平均海水面重合并向陆地延伸且包围整个地球的特定重力等位面称为大地水准面。 2、视准轴:物镜光心与十字丝交点的连线称为视准轴。 3、系统误差:在相同的观测条件下,对某一量进行一系列的观测,如果出现的误差在符号和数值大小都相同,或按一定的规律变化,这种误差称为“系统误差”。 4、偶然误差:在相同的观测条件下,对某一量进行一系列的观测,如果误差出现的符号和数值大小都不相同,从表面上看没有任何规律性,这种误差称为“偶然误差”。 5、方位角:由直线一端的基本方向起,顺时针方向至该直线的水平角度称为该直线的方位角。方位角的取值范围是0°~360°。 6、危险圆:待定点P 不能位于由已知点A 、B 、C 所决定的外接圆的圆周上,否则P 点将不能唯一确定,故称此外接圆为后方交会的危险圆。 7、全站仪:全站仪是全站型电子速测仪的简称,它集电子经纬仪、光电测距仪和微处理器于一体。 8、等高距:地形图上相邻两高程不同的等高线之间的高差,称为等高距。

9、数字测图系统:是以计算机为核心,在硬件和软件的支持下,对地形空间数据进行数据采集、输入、处理、输出及管理的测绘系统,它包括硬件和软件两个部分。 10、数字地面模型(DTM ):是表示地面起伏形态和地表景观的一系列离散点或规则点的坐标数值集合的总称。 11、数字高程模型(DEM ):数字高程模型DEM ,是以数字的形式按一定结构组织在一起,表示实际地形特征空间分布的模型,是定义在 x 、y 域离散点(规则或不规则)上以高程表达地面起伏形态的数字集合。 二、简答题 1、实际测绘工作中,一般采用的基准面和基准线各是什么 大地水准面和铅垂线是测量外业所依据的基准面和基准线;参考椭球面和法线是测量内业计算的基准面和基准线。 2、角度观测的主要误差来源(种类)有哪些 1)仪器误差:(1)水平度盘偏心差(2)视准轴误差(3)横轴倾斜误差(4)竖轴倾斜误差;2)仪器对中误差;3)目标偏心误差;4)照准误差与读数误差;5)外界条件的影响。 3、何谓视差如何消除视差 如果目标像与十字丝平面不重合,则观测者的眼睛作移动时,就会发觉目标像与十字丝之间有相对移动,这种现象称为“视差”。 消除视差的方法为:先转动目镜调焦螺旋,使十字丝十分清晰;然后转动物镜调焦螺旋,使目标像十分清晰;上下(或左右)移动眼睛,如

java深入理解线程池

深入研究线程池 一.什么是线程池? 线程池就是以一个或多个线程[循环执行]多个应用逻辑的线程集合. 注意这里用了线程集合的概念是我生造的,目的是为了区分执行一批应用逻辑的多个线程和 线程组的区别.关于线程组的概念请参阅基础部分. 一般而言,线程池有以下几个部分: 1.完成主要任务的一个或多个线程. 2.用于调度管理的管理线程. 3.要求执行的任务队列. 那么如果一个线程循环执行一段代码是否是线程池? 如果极端而言,应该算,但实际上循环代码应该算上一个逻辑单元.我们说最最弱化的线程池 应该是循环执行多个逻辑单元.也就是有一批要执行的任务,这些任务被独立为多个不同的执行单元.比如: int x = 0; while(true){ x ++; } 这就不能说循环中执行多个逻辑单元,因为它只是简单地对循环外部的初始变量执行++操作. 而如果已经有一个队列 ArrayList al = new ArrayList(); for(int i=0;i<10000;i++){ al.add(new AClass()); } 然后在一个线程中执行: while(al.size() != 0){ AClass a = (AClass)al.remove(0); a.businessMethod(); } 我们说这个线程就是循环执行多个逻辑单元.可以说这个线程是弱化的线程池.我们习惯上把这些相对独立的逻辑单元称为任务. 二.为什么要创建线程池? 线程池属于对象池.所有对象池都具有一个非常重要的共性,就是为了最大程度复用对象.那么 线程池的最重要的特征也就是最大程度利用线程. 从编程模型模型上说讲,在处理多任务时,每个任务一个线程是非常好的模型.如果确实可以这么做我们将可以使用编程模型更清楚,更优化.但是在实际应用中,每个任务一个线程会使用系统限入"过度切换"和"过度开销"的泥潭. 打个比方,如果可能,生活中每个人一辆房车,上面有休息,娱乐,餐饮等生活措施.而且道路交道永远不堵车,那是多么美好的梦中王国啊.可是残酷的现实告诉我们,那是不可能的.不仅每个人一辆车需要无数多的社会资源,而且地球上所能容纳的车辆总数是有限制的. 首先,创建线程本身需要额外(相对于执行任务而必须的资源)的开销.

《管理学原理与方法》

《管理学原理与方法》

《管理学》――原理与方法 周三多(第四板)——复旦大学出版社 第一章管理与管理学 第一节人类的管理活动 一:人类活动的特点 1:目的性 人类正是在为实现预期目的的活动中,在不断地劳动,思考,谋划,设计和组织管理的过程中,逐步进化的。 2:依存性: 人类的目的性来源于对外部环境和人类自身的相互依存关系。 3:知识性 人类能从过去的实践中学习,从前人的经验中学习,并能把学到的知识加以记忆,积累,分析和推理,从而形成人类独有的知识体系。 二:管理的必要性 1:资源短缺将是一种长期的经济现象,如何将有限的资源进行合理的利用,则是管理必须解决的问题。2:科学技术是阻碍生产力的原因之一,实践证明只有通过有效的发展,才能使科学技术真正转化为生产力。 3:高度专业划的社会分工是现代化国家和现代企业的的基础,协调各种关系需要管理。 4:实现社会企业的长期发展,需要靠全体成员的共同努力。 5:近几年来,以计算机技术为基础,信息网络,互联网等在中国各行各业中得到了空前迅速的应用和普及。 三:管理的概念 管理是社会组织中,为了实现预期的目标,以人为中心进行的协调活动。这一表述包含了以下五个观点a:管理的目的是为了实现预期的目标 b:管理的本质就是协调 c:协调必定产生在社会组织当中 d:协调的中心是人 e:协调的方法是多样的,需要定性的理论和经验 ,也需要定量的专门技术 第二节管理的职能与性质 一:管理的职能 许多新的管理论和管理学实践已一再证明:计划、组织、领导、控制、创新这五种管理职能是一切管理活动最基本的职能。 (一)计划 计划:制定目标并确实为达成这些目标所必需的行动。组织中所有的管理者都必须从事计划活动。(二)组织 根据工作的要求与人员的特点,设计岗位,通过授权和分工,将适当的人员安排在适当的岗位上,用制度规定各个岗位的职责和上下左右的相互关系,形成一个有机的组织结构,使整个组织协调运转——这就是组织的职能 组织目标决定着组织的具体形式和特点 (三)领导 指导人们的行为,通过沟通增强人们的相互理解,统一人们的思想和行动,激励每个成员自觉地为实现组织目标而共同努力。 (四)控制

普元EOS工作流引擎设计原理

EOS工作流引擎工作原理 作者:Gocom注册用户dogreet(李国生) 1. 工作流基础知识 ……略 2. EOS工作流引擎工作原理 本文是我在工作之余写的一点我对EOS工作流的了解,我的理解不一定全是对的,可能会与引擎的真正的面目有出入。所以只能提供给大家一点参考。 2.1. EOS工作流引擎核心调度算法 EOS工作流最重要的组成部分是它的核心调度算法,在我们没有深入研究它的工作原理之前我们认为它的工作原理是在工作项,活动和流程实例对象上加了一些标志位来驱动流程的运转。认为其引擎完全是个由数据库来驱动流程的引擎(安徽二期的工作流平台好象就是以库表来驱动流程的运转),其实它是由事件来驱动流程运转的引擎,数据库只是把引擎运转前后的状态持久化。在我近来在工作之余对其引擎的工作原理进行跟踪才弄明白在EOS帮助文档上介绍的“事件驱动”的工作流引擎。 2.1.1. EOS工作流引擎的事件类型

以上的每个事件都是原子的不可分割的。其中一系列事件的集合通过EOS引擎事件调度机制实现我们平时在工作中经常遇到的如启动流程,结束工作项等等。(在事件类型类中EOS定义了29种事件,但在事件工厂类中EOS定义了26种类型。) 1.1.1. EOS工作流事件调度机制 EOS事件的调度服务是在工作流引擎初始化时通过服务工厂类加载到内存中(ServiceFactory.initEventService())。用户可以通过服务工厂类(ServiceFactory)取得JVM的唯一事件服务实例进行事务调度。所有的事件程序入口都是事件类(EventService),这个类其实是个接口,其有两个实现类,一个是单线程的实现类SingleThreadEventService (在实现代码中其实不是单线程,而是单例的对象),一个是多线程的实现类MulThreadThreadSvc,(其实现方式不在这里详细说明,多线程的类后面又跟了一大堆的线程池实现代码),在事件服务类中有一个属性类是WFEventDisposer,这个类包含了事

数字测图原理及方法试题库及其答案

东北大学数字测图原理与方法题库 2013~2014学年度第二学期东北大学期末复习资料 数字测图原理与方法备考题库2014.5 一、概念题(本大题共66小题,其中()为补充容) 1. 测绘学: 测绘学是以地球形状、大小及地球表面上的各种地物的几何形状和地貌的形态为研究对象,并研究如何将地面上的各种地物、地貌测绘成图及将设计、规划在图纸上的各种建筑物放样于实地的有关理论与方法的一门科学。 2. 地球椭球体:在测绘工作中选用的用来代替地球形状作为测量基准面的一个非常接近水准面、并且可用数学式表达的几何形体。 3. 地球椭球:代表地球形状和大小的旋转椭球。 4. 参考椭球:与某个区域如一个国家水准面最为密合的椭球称为参考椭球。 5. 参考椭球定位:确定参考椭球面与水准面的相关位置,使参考椭球面在一个国家或地区最佳拟合,称为参考椭球定位。 6. 水准面:水准面中与平均海水面相吻合并向大陆、岛屿延伸而形成的闭合曲面,称为水准面。 7. 坐标系:把地面上的点沿着椭球面法线方向投影到椭球面上并用经纬度来表示其位置的坐标系叫坐标系。 8. 体:水准面所包围的地球形体,叫体。 9. 高程:地面点到水面的铅垂距离,称为该点的绝对高称,或称海拔。 10. 地物:地球表面的一切物体(包括自然地物和人工地物)统称为地物。 11. 地貌: 地貌是指地表面高低起伏的形态。 12. 视差:由于物像没有和十字分划板重合,当人眼相对十字分划板相对移动时物像也和十字分划板相对移动,这种现象叫视差。 13. 照准部偏心差:是指照准部旋转中心与水平度盘分划中心不重合,指标在度盘上读数时产生的误差。 14. 照准误差:是指视准轴偏离目标与理想照准线的夹角。(即视准轴不垂直于仪器横轴时产生的误差) 15. 竖盘指标差:(由于竖盘水准管或垂直补偿器未安到正确位置,使竖盘读数的指标线与垂直线有一个微小得角度差x,称为“竖盘指标差”。)因竖直度盘指标线偏离了正确而使竖直角与正确值产生的差异被称为竖盘指标差。 16. 水准尺的零点差:(从理论上讲,水准尺的零分划线应正好与尺底面重合;但事实上由于制造质量和长期使用,两者往往不相重合。)水准尺底面与零分划线不重合,称为水准尺零点误差。 17. 望远镜的视准轴:望远镜物镜中心与十字丝焦点的连线称为视准轴。 18. 坐标方位角:将坐标北顺时针转至某直线的夹角称为该直线的坐标方位角,以α表示(0~360°)。 19. 子午线收敛角:除中央子午线及赤道上的点以外任何一点的真北方向N与坐标北X都不重合。两者之间的夹角称为该点的子午线收敛角,以γ表示。且当坐标北偏于真北以东时,γ为正,当坐标北偏于真北以西时,γ为负。 20. 磁偏角:磁北与真北两者之间的夹角称为磁偏角,以δ表示。且当磁北偏于真北以东时,δ为正,当磁北偏于真北以西时,δ为负。 21. 真误差:观测值与其真值之差,称为真误差。 22. 系统误差:在相同的观测条件下,对某个固定量进行多次观测,如果观测误差在符号及

山东科技大学2019年《811数字测图原理与方法》考研专业课真题试卷

一、简答题(每题8分,共80分) 1、地形测量学主要包括哪些内容? 2、测量工作中常用坐标系有哪几个?请指出属于地心坐标系有哪些? 3、根据现行的国家基本比例尺地形图分幅和编号规定,请说明1:100万比例尺地形图的图幅是如何划分,编号如何规定? 4、地球曲率和大气折光对水准测量有何影响?如何抵消或削弱该两项影响? 5、经纬仪的主要轴线需要满足哪些条件? 6、试述自动全站仪自动目标识别与照准的过程。 7、常用的交会测量方法有哪几种?并分别简要说明。 8、简述网络RTK 系统的组成以及各部分的作用。 9、简述GPS 控制测量的观测步骤。 10、大比例尺数字测图进行野外数据采集需要得到哪些数据和信息? 二、测量内业计算(1~2每题10分,3~4每题15分,共50分) 1、地质普查外业中精确丈量某一段距离,6次测量的距离值分别为:L 1=283.534m ,L 2=283.549m ,L 3=283.522m ,L 4=283.528m ,L 5=283.551m ,L 6=283.532m 。(要写出用到的计算公式) 试求:(1)该距离的算术平均值;(2)该距离的观测值中误差;(3)该距离的算术平均值中误差。 2、某勘探工程需要布设一个钻孔P ,如图2-1。 其设计坐标为???==m y m x P P 218477733566808,已收集到设 计钻孔附近的测量控制点A 的坐标为: ???==m y m x A A 218478733566708,AB 边的方位角为"30'20225O AB =α。采用极坐标法进行钻孔放 样时,请问放样钻孔点位P 时所需的放样元素有哪些?并计算出这些放样数据。A P B N 图2-1钻孔位置示意图

Tomcat线程池实现简介

Tomcat线程池实现简介 目前市场上常用的开源Java Web容器有Tomcat、Resin和Jetty。其中Resin从V3.0后需要购买才能用于商业目的,而其他两种则是纯开源的。可以分别从他们的网站上下载最新的二进制包和源代码。 作为Web容器,需要承受较高的访问量,能够同时响应不同用户的请求,能够在恶劣环境下保持较高的稳定性和健壮性。在HTTP服务器领域,Apache HTTPD的效率是最高的,也是最为稳定的,但它只能处理静态页面的请求,如果需要支持动态页面请求,则必须安装相应的插件,比如mod_perl可以处理Perl脚本,mod_python可以处理Python脚本。 上面介绍的三中Web容器,都是使用Java编写的HTTP服务器,当然他们都可以嵌到Apache 中使用,也可以独立使用。分析它们处理客户请求的方法有助于了解Java多线程和线程池的实现方法,为设计强大的多线程服务器打好基础。 Tomcat是使用最广的Java Web容器,功能强大,可扩展性强。最新版本的Tomcat(5.5.17)为了提高响应速度和效率,使用了Apache Portable Runtime(APR)作为最底层,使用了APR 中包含Socket、缓冲池等多种技术,性能也提高了。APR也是Apache HTTPD的最底层。可想而知,同属于ASF(Apache Software Foundation)中的成员,互补互用的情况还是很多的,虽然使用了不同的开发语言。 Tomcat 的线程池位于tomcat-util.jar文件中,包含了两种线程池方案。方案一:使用APR 的Pool技术,使用了JNI;方案二:使用Java实现的ThreadPool。这里介绍的是第二种。如果想了解APR的Pool技术,可以查看APR的源代码。 ThreadPool默认创建了5个线程,保存在一个200维的线程数组中,创建时就启动了这些线程,当然在没有请求时,它们都处理“等待”状态(其实就是一个while循环,不停的等待notify)。如果有请求时,空闲线程会被唤醒执行用户的请求。 具体的请求过程是:服务启动时,创建一个一维线程数组(maxThread=200个),并创建空闲线程(minSpareThreads=5个)随时等待用户请求。当有用户请求时,调用threadpool.runIt(ThreadPoolRunnable)方法,将一个需要执行的实例传给ThreadPool中。其中用户需要执行的实例必须实现ThreadPoolRunnable接口。ThreadPool 首先查找空闲的线程,如果有则用它运行要执行ThreadPoolRunnable;如果没有空闲线程并且没有超过maxThreads,就一次性创建minSpareThreads个空闲线程;如果已经超过了maxThreads了,就等待空闲线程了。总之,要找到空闲的线程,以便用它执行实例。找到后,将该线程从线程数组中移走。接着唤醒已经找到的空闲线程,用它运行执行实例(ThreadPoolRunnable)。运行完ThreadPoolRunnable后,就将该线程重新放到线程数组中,作为空闲线程供后续使用。 由此可以看出,Tomcat的线程池实现是比较简单的,ThreadPool.java也只有840行代码。用一个一维数组保存空闲的线程,每次以一个较小步伐(5个)创建空闲线程并放到线程池中。使用时从数组中移走空闲的线程,用完后,再“归还”给线程池。ThreadPool提供的仅仅是线程池的实现,而如何使用线程池也是有很大学问的。让我们看看Tomcat是如何使用ThreadPool的吧。 Tomcat有两种EndPoint,分别是AprEndpoint和PoolTcpEndpoint。前者自己实现了一套线

《数字测图原理与方法》题库及其答案

数测试题库 一、填空题 (一)测量学基础知识(1-120题) 1.地面点到铅垂距离称为该点的相对高程。 2.通过海水面的称为大地水准面。 3.测量工作的基本内容是。 4.测量使用的平面直角坐标是以为坐标原点, 为x轴,以 为y轴。 5.地面点位若用地理坐标表示,应为和绝对高程。 6.地面两点间高程之差,称为该两点间的。 7.在测量中,将地表面当平面对待,指的是在范围内时,距离测量数据不至于影响测量成果的精 度。 8.测量学的分类,大致可分为。 9.地球是一个旋转的椭球体,如果把它看作圆球,其半径的概值为km。 10.我国的珠穆朗玛峰顶的绝对高程为m。 11.地面点的经度为该点的子午面与所夹的角。 12.地面点的纬度为该点的铅垂线与所组成的角度。 13.测量工作的程序是。 14.测量学的任务是。 15.直线定向的标准方向有。 16.由方向顺时针转到测线的水平夹角为直线的坐标方位角。 17.距离丈量的相对误差的公式为。 18.坐标方位角的取值范围是。 19.确定直线方向的工作称为 ,用目估法或经纬仪法把许多点标定在某一已知直线上的工作 为。 20.距离丈量是用误差来衡量其精度的,该误差是用分子为的 形式来表示。 21.用平量法丈量距离的三个基本要求是。 22.直线的象限角是指直线与标准方向的北端或南端所夹的角,并要标注所在象限。 23.某点磁偏角为该点的方向与该点的方向的夹角。 24.某直线的方位角与该直线的反方位角相差。 25.地面点的标志,按保存时间长短可分为。 26.丈量地面两点间的距离,指的是两点间的距离。

27. 森林罗盘仪的主要组成部分为 。 28. 某直线的方位角为123°20′,则它的正方位角为 。 29. 水准仪的检验和校正的项目有 30. 水准仪主要轴线之间应满足的几何关系为 31. 由于水准仪校正不完善而剩余的i 角误差对一段水准路线高差值的影响是 成正比的。 32. 闭和水准路线高差闭和差的计算公式为 。 33. 水准仪的主要轴线有 、 、 、 。 34. 水准测量中,转点的作用是 ,在同一转点上,既有 ,又有 读数。 35. 水准仪上圆水准器的作用是使仪器 ,管水准器的作用是使仪器 。 36. 通过水准管 与内壁圆弧的 为水准管轴。 37. 转动物镜对光螺旋的目的是使 影像 。 38. 一般工程水准测量高程差允许闭和差为 或 。 39. 一测站的高差 ab h 为负值时,表示 高, 低。 40. 用高差法进行普通水准测量的计算校核的公式是 。 41. 微倾水准仪由 、 、 三部分组成。 42. 通过圆水准器内壁圆弧零点的 称为圆水准器轴。 43. 微倾水准仪精平操作是旋转__________使水准管的气泡居中,符合影像符合。 44. 水准测量高差闭合的调整方法是将闭合差反其符号,按各测段的__________成比例分配或按_________成比例分 配。 45. 用水准仪望远镜筒上的准星和照门照准水准尺后,在目镜中看到图像不清晰,应该_____________螺旋,若十 字丝不清晰,应旋转_________螺旋。 46. 水准点的符号,采用英文字母_______表示。 47. 水准测量的测站校核,一般用______法或______法。 48. 支水准路线,既不是附合路线,也不是闭合路线,要求进行_______测量,才能求出高差闭合差。 49. 水准测量时,由于尺竖立不直,该读数值比正确读数________。 50. 水准测量的转点,若找不到坚实稳定且凸起的地方,必须用______踩实后立尺。 51. 为了消除i 角误差,每站前视、后视距离应___________,每测段水准路线的前视距离和后视距离之和应_____ _____。 52. 水准测量中丝读数时,不论是正像或倒像,应由________到________ ,并估读到________。 53. 测量时,记录员应对观测员读的数值,再________一遍,无异议时,才可记录在表中。记录有误,不能用橡皮擦拭, 应__________。 54. 使用测量成果时,对未经_______的成果,不能使用。

线程池原理 C++实现

线程池原理及创建(C++实现) 时间:2010‐02‐25 14:40:43来源:网络 作者:未知 点击:2963次 本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关。另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量。文章的最后,我们给出一个 本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关。另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量。文章的最后,我们给出一个简单示例程序,通过该示例程序,我们会发现,通过该线程池框架执行多线程任务是多么的简单。 为什么需要线程池 目前的大多数网络服务器,包括Web服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。 传统多线程方案中我们采用的服务器模型则是一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出,这就是是“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态。 我们将传统方案中的线程执行过程分为三个过程:T1、T2、T3。 T1:线程创建时间 T2:线程执行时间,包括线程的同步等时间 T3:线程销毁时间

那么我们可以看出,线程本身的开销所占的比例为(T1+T3) / (T1+T2+T3)。如果线程执行的时间很短的话,这比开销可能占到20%‐50%左右。如果任务执行时间很频繁的话,这笔开销将是不可忽略的。 除此之外,线程池能够减少创建的线程个数。通常线程池所允许的并发线程是有上界的,如果同时需要并发的线程数超过上界,那么一部分线程将会等待。而传统方案中,如果同时请求数目为2000,那么最坏情况下,系统可能需要产生2000个线程。尽管这不是一个很大的数目,但是也有部分机器可能达不到这种要求。 因此线程池的出现正是着眼于减少线程池本身带来的开销。线程池采用预创建的技术,在应用程序启动之后,将立即创建一定数量的线程(N1),放入空闲队列中。这些线程都是处于阻塞(Suspended)状态,不消耗CPU,但占用较小的内存空间。当任务到来后,缓冲池选择一个空闲线程,把任务传入此线程中运行。当N1个线程都在处理任务后,缓冲池自动创建一定数量的新线程,用于处理更多的任务。在任务执行完毕后线程也不退出,而是继续保持在池中等待下一次的任务。当系统比较空闲时,大部分线程都一直处于暂停状态,线程池自动销毁一部分线程,回收系统资源。 基于这种预创建技术,线程池将线程创建和销毁本身所带来的开销分摊到了各个具体的任务上,执行次数越多,每个任务所分担到的线程本身开销则越小,不过我们另外可能需要考虑进去线程之间同步所带来的开销。 构建线程池框架 一般线程池都必须具备下面几个组成部分: 线程池管理器:用于创建并管理线程池 工作线程: 线程池中实际执行的线程

《数字测图原理与方法》题库及其答案

数测试题库 一、填空题 (一)测量学基础知识(1-120题) 1.地面点到铅垂距离称为该点的相对高程。 2.通过海水面的称为大地水准面。 3.测量工作的基本内容是。 4.测量使用的平面直角坐标是以为坐标原点,为x轴,以为y轴。 5.地面点位若用地理坐标表示,应为和绝对高程。 6.地面两点间高程之差,称为该两点间的。 7.在测量中,将地表面当平面对待,指的是在范围内时,距离测量数据不至于影响测量成果的精度。 8.测量学的分类,大致可分为。 9.地球是一个旋转的椭球体,如果把它看作圆球,其半径的概值为 km。 10.我国的珠穆朗玛峰顶的绝对高程为 m。 11.地面点的经度为该点的子午面与所夹的角。 12.地面点的纬度为该点的铅垂线与所组成的角度。 13.测量工作的程序是。 14.测量学的任务是。 15.直线定向的标准方向有。 16.由方向顺时针转到测线的水平夹角为直线的坐标方位角。 17.距离丈量的相对误差的公式为。 18.坐标方位角的取值范围是。 19.确定直线方向的工作称为,用目估法或经纬仪法把许多点标定在某一已知直线上的工作为。 20.距离丈量是用误差来衡量其精度的,该误差是用分子为的 形式来表示。 21.用平量法丈量距离的三个基本要求是。 22.直线的象限角是指直线与标准方向的北端或南端所夹的角,并要标注所在象限。 23.某点磁偏角为该点的方向与该点的方向的夹角。 24.某直线的方位角与该直线的反方位角相差。 25.地面点的标志,按保存时间长短可分为。 26.丈量地面两点间的距离,指的是两点间的距离。 27.森林罗盘仪的主要组成部分为。 28.某直线的方位角为123°20′,则它的正方位角为。 29.水准仪的检验和校正的项目有

IOCP 原理 代码

Windows I/O完成端口 2009-10-30 10:51 WINDOWS完成端口编程 1、基本概念 2、WINDOWS完成端口的特点 3、完成端口(Completion Ports )相关数据结构和创建 4、完成端口线程的工作原理 5、Windows完成端口的实例代码 WINDOWS完成端口编程 摘要:开发网络程序从来都不是一件容易的事情,尽管只需要遵守很少的一些规则:创建socket,发起连接,接受连接,发送和接收数据,等等。真正的困难在于:让你的程序可以适应从单单一个连接到几千个连接乃至于上万个连接。利用Windows完成端口进行重叠I/O的技术,可以很方便地在Windows平台上开发出支持大量连接的网络服务程序。本文介绍在Windows平台上使用完成端口模型开发的基本原理,同时给出实际的例子。本文主要关注C/S结构的服务器端程序,因为一般来说,开发一个大容量、具有可扩展性的winsock程序就是指服务程序。 1、基本概念 设备---指windows操作系统上允许通信的任何东西,比如文件、目录、串行口、并行口、邮件槽、命名管道、无名管道、套接字、控制台、逻辑磁盘、物理磁盘等。绝大多数与设备打交道的函数都是CreateFile/ReadFile/WriteFile 等,所以我们不能看到**File函数就只想到文件设备。 与设备通信有两种方式,同步方式和异步方式:同步方式下,当调用ReadFile这类函数时,函数会等待系统执行完所要求的工作,然后才返回;异步方式下,ReadFile这类函数会直接返回,系统自己去完成对设备的操作,然后以某种方式通知完成操作。 重叠I/O----顾名思义,就是当你调用了某个函数(比如ReadFile)就立刻返回接着做自己的其他动作的时候,系统同时也在对I/0设备进行你所请求的操作,在这段时间内你的程序和系统的内部动作是重叠的,因此有更好的性能。所以,重叠I/O是在异步方式下使用I/O设备的。重叠I/O需要使用的一个非常重要的数据结构:OVERLAPPED。 2、WINDOWS完成端口的特点 Win32重叠I/O(Overlapped I/O)机制允许发起一个操作,并在操作完成之后接收信息。对于那种需要很长时间才能完成的操作来说,重叠IO机制尤其有用,因为发起重叠操作的线程在重叠请求发出后就可以自由地做别的事情了。在WinNT和Win2000上,提供的真正可扩展的I/O模型就是使用完成端口(Completion Port)的重叠I/O。完成端口---是一种WINDOWS内核对象。完成端口用于异步方式的重叠I/0情况下,当然重叠I/O不一定非得使用完成端口不可,同样设备内核对象、事件对象、告警I/0等也可使用。但是完成端口内部提

相关主题
文本预览
相关文档 最新文档