本帖最后由 VisualEleven 于 2012-06-19 14:44:35 编辑

解决方案 »

  1.   

    你想弄socket池还是线程池?不要创建太多的线程看你的描述,好像是要弄socket池吧。可以写一个单独的类,用于管理socket池。类中有用于存放socket的数组。类可以弄成单例模式。。需要的方法有:主要有(1)初始化,主要是预分配socket池(2)从里面取一个socket,(3)归还一个socket,(4)socket池大小的子增长方式。
      

  2.   

    <windows 网络与通信程序设计> 王艳平第四章
      

  3.   

    地址重定位
      在这之前我一直对地址重定位的细节不是很了解。以下文章摘自《操作系统原理DOS篇(第二版)》。是我目前看过的关于重定位的最好的文章。与大家分享一下。
      以下介绍程序是如何装入内存,从而变成在计算机内可执行的形式的。
      在用汇编语言或高级语言编写的程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合叫做“名字空间”。汇编语言源程序经过汇编,或者高级语言源程序经过编译,得到的目标程序是以“0”作为参考地址的模块,然后多个目标模块由连接程序连接成一个具有统一地址的装配模块,以便最后装入内存中执行。我们把目标模块中的地址称为相对地址(或逻辑地址),而把相对地址的集合叫做“相对地址空间”或简单地叫做“地址空间”。
      装配模块虽然具有统一的地址空间,但它仍是以“0”作为参考地址,即是浮动的。要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与地址有关的代码,这一过程叫做地址重定位。
      地址空间的程序和数据经过地址重定位处理后,就变成了可由CPU直接执行的绝对地址程序。我们把这一地址集合称为“绝对地址空间”或“存储空间”。
      地址重定位完成的相对地址转换成内存的绝对地址工作又称为地址映射(map)、按照重定位的时机,可分为静态重定位和动态重定位。
    一、静态重定位
      静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令。
      例如,一个以“0”作为参考地址的装配模块,要装入以100为起始地址的存储空间。显然,在装入之前要做某些修改,程序才能正确执行。例如,MOV EAX,[500]这条指令的意义,是把相对地址为500的存储单元内容1234装入EAX号累器。现在内容为1234的存储单元的实际地址为1500,即为相对地址(500)加上装入的地址(1000),因此,MOV EAX,[500]这条指令中的直接地址码也要相应地加上起始地址,而成为MOV EAX,[1500]。
      程序中涉及直接地址的每条指令都要进行这样的修改。需要修改的位置称为重定位项,所做的加实际装入模块起始地址修改中的块起始地址称为重定位因子。
      为支持静态重定位,连接程序在生成统一地址空间和装配模块时, 应产生一个重定位项表,连接程序此时还不知道装配模块将要装入的实际位置,故重定位表所给出的需修改位置是相对地址所表示的位置。
      操作系统的装入程序要把装配模块和重定位项表一起装入内存。由装配模块的实际装入起始地址得到重定位因子,然后实施如下两步:
      (1)、取重定位项,加上重定位因子而得到欲修改位置的实际地址;
      (2)、对实际地址中的内容再做加重定位因子的修改,从而完成指令代码的修改。
      对所有的重定位项实施上述两步操作后,静态重定位才完成,尔后可启动程序执行。使用过的重定位项表内存副本随即被废弃。
      静态重定位有着无需硬件支持的优点,但存在着如下的缺点:一是程序重定位之后就不能在内存中搬动了;二是要求程序的存储空间是连续的,不能把程序放在若干个不连续的区域内。二、动态重定位
      动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位。更确切地说,是在每次访问内存单元前才进行地址变换。动态重定位可使装配模块不加任何修改而装入内存,但是它需要硬件——定位寄存器的支持。
      程序的目标模块装入内存时,与地址有关的各项均保持原来的相对地址不进行任何修改。如MOV 1,[500]这条指令仍是相对地址500。当此模块被操作系统调度到处理机上执行时,操作系统将把此模块装入的实际起始起始地址减去目标模块的相对基地址,然后将其差值装入定位寄存器中。当CPU取得一条访问内存的指令时,地址变换硬件逻辑自动将指令中的相对地址与定位寄存器中的值相加,再依此和值作为内存绝对地址去访问该单元中的数据。
      由此可见,进行动态重定位的时机是在指令执行过程中,每次访问内存前动态地进行。采取动态重定位可带来两个好处:
      (1)、目标模块装入内存时无需任何修改,因而装入之后再搬迁也不会影响其正确执行,这对于存储器紧缩、解决碎片问题是极其有利的;
      (2)、一个程序由若干个相对独立的目标模块组成时,每个目标模块各装入一个存储区域,这些存储吉尔吉斯可以不是顺序相邻的,只要各个模块有自己对应的定位寄存器就行。
      动态重定位技术所付出的代价是需要硬件支持。 
      

  4.   

    200个子进程 LINUX下的? 虽然LINUX下的子进程消耗比WINDOWS下小,但是还是不如线程,就算线程 这种做法也够龌龊的
      

  5.   

    楼主可以参考ACE的前摄器模型,对您应该有帮助的
      

  6.   

    为啥不用多线程?lz是在Linux下?
      

  7.   

    进程池的方式也是一样的, 只是跟线程之间的通信手段不一样. 
    WINDOWS下面可以用消息来通知子进程做事, 也可以用SOCKET, PIPE等的方式来通知子进程做事, 子进程的数量控制, 可以通过SOCKET的连接, 或者句柄的检测等的方式来进行管理, 断开一个就创建一个等等.不过子进程暂时我知道的是只有是主进程分配工作的模式. 不知道存不存在让子进程去抢工作的模式. 
      

  8.   

    这个是企业级应用了,子进程方式安全性很高
    具体可以参考apache 的实现
    它就是子进程加线程的代表