完成端口总结(二)

C++最后都是要形成动态库的,以下是一些我认为比较重要的东西。欢迎探讨!

 

写这个库呢!中间涉及到一些最基本的东西主线程和线程并行、头文件互相引用循环问题。为什么要说呢,因为这些东西不但遇到了,还给自己造成很大的麻烦,所以记下来引以为戒!

并行就是线程在做一些事情,打个比方你父亲是主线程,他在做饭炒菜,你是副线程,叫你拿酱油,而他还在炒菜,你拿酱油给他后,他会把酱油放入到菜里面去,中间的过程就是一个并行的过程。

头文件互相引用循环问题,在Effective C++中(高效C++编程)34条说的要使头文件的依赖性降至最低。一个能可以减轻编译过程,二能防止互相引用死循环。具体过程是这样的compile(编译)他主要管的语法是否正确,调用关系是否存在,他要生成obj文件的,主要编译的是CPP,编译时需要把预编译中各种头文件扩展开来,如此头文件一旦互相引用,

这扩展就成为不断复制粘贴的死循环,当然编译器不会那么傻,他会直接告诉你某一个类无效。OK有问题自己找去。

书上解决方法就是:头文件中声明,cpp中预编译。这样的节省编译过程(虽然很短,那也是节省啊),二杜绝死循环。(很重要的一个概念啊)。

IOCP库需要是一个主线程和两个副线程,主线程就是main入口,副线程就是Accept_Thread,主要功能就是监听套接字是否有要接入的客户并且反馈给主线程。Work_Thread(工作线程,处理跟套接字有关的事件)他的多少和CPU有关,直接影响的是性能问题。主要思想就是利用完成端口关联套接字实现异步操作,主要靠内核来操作,有信号就内核帮助放进一个内核提供的队列里,然后及时工作线程主要干的工作。一个一个取出事件,根据重叠操作来处理对于的事件。

还有就是主要的一个定义问题,一个原则“依赖倒置原则”这是一个什么呢!这就是我们以后工作的主要目的起指明灯作用,一切的根源都是为实现它而做的。

因此根据“根据单一性原则”,我们应该做到的就是把模块精细化,就是基础打牢固,为将来组建大型平台,不至于一颗螺丝钉就导致他倒塌的问题出现。

一、 具体实现,“分清哪些线程在工作”

只有组线程在工作一个是Accept_thread,一组是Work_ThreadAccept_Thread的线程是监听端口,然后就是启动主线程下一步操作,接着就是关联套接字调用——》WSASendWSARead,这两个是主动线程,由程序员来控制操作。Work_Thread这一组线程是不断的关注内核内的队列是否有成员没有就阻塞。等待。

二、 关于这个性能处理问题,这个库主要是实现的是串型操作,就是执行完一个判断完成再去执行下一个,而不是不断的执行。主要考虑的是“时序”问题。网络这种东西,不可靠性太高,如果是一个EXE文件,很大,一次性全部传输完,可能需要发送100个包,这样你能确保服务器发送的顺序和客户端接收的顺序完全一样吗,当然可以做标号处理,然后客户端再整合,这样处理一样的麻烦,不过是客户麻烦而已,我们本着顾客是上帝的想法来完成工作,就不能把难题抛给上帝啦,当然特殊情况特殊处理,这里主要是用串型,发一个确定一个,这样,客户也是一个一个连着接收,顺序有保证。

三、 服务器这东西,每天要处理庞大的数据,并且每星期的工作时间固定,如此就要确保他的稳定性。现在要考虑断开流程。

这流程是这样的,一个客户在连接中,服务器又连接又发送中,突然丫的客户那停电了,如此客户就中断啦,那么我们这么操作呢,首先ReadSend都要停下下来吧,对应断开这个信息都应该进入内核队列吧!这两操作都涉及到时一个Client对象,一个出列后进入OnDisConnect操作,就销毁了Client,但是下一个过来怎么吧!如此这问题就只能靠智能指针来解决了!(继续熟悉智能指针)(重点)

四、 这一次终于涉及到里面的东西了:内存。

     这么长时间都不这么涉及内存,涉及也就是newdelete,大型的程序,一定涉及到复杂的内存操作,考虑的要全面,再说服务器这东西每天上下的人很多,内存管理不好,一定会崩掉的,比如内存碎片、内存分配不足(这里一是说的内存不够了,二是说内存有但是连续的那么大的,都是断续分开的)

这就涉及到内存池问题,一、避免内存碎片的产生,只不过可能会浪费一些内存。

二、内存定位,内存泄露以后,可以直接操作去查找那个内存没回收。

三、内存池,就是先申请处一块内存,然后把内存分成几个层次,每个层次中的内存块大小相同,方便你使用。用完后不用还给系统,直接还给我就行,还的问题有服务器负责。

你可能感兴趣的:(api,服务器,内存泄露,智能指针,内存分配,winsock)