打算把 Windows 的 SSPI 集成到 SPServer/IOCP 的框架中,这样可以减少 SPServer 对第三方库的依赖。但是看了一下 SSPI 之后,望而生畏啊。对比 openssl ,SSPI 接口相当于与其中的 BIO 接口,并且比 BIO 接口更难用。找了几个例子来看,每个的代码基本上都是又长又难看,太多的错误判断了。最后还是直接在 windows 上用 openssl 算了。看了 openssl 在 windows 下的编译步骤,决定都是放弃自己编译的想法。在网上找了个已经编译好的版本,然后把原来在 linux 下的 openssl 插件在 vc 下编译,经过一轮调试,看 ...
http://www.sagemath.org:9001/GlennTarbox/DsageNg
There are 2 reasons for threading at high levels:
1. Blocking on code which you can't change
2. Can't figure out how to make it asynchronous
集成 IOCP 到 Libevent
完整的代码在
http://spserver.googlecode.com/files/libevent-1.4.4-iocp-3.zip
IOCP 是真正的异步 IO ,Libevent 提供的是一个 event-driven 的接口。
异步 IO 和 event-driven 的区别:
1.对于 event-driven,需要等待内核通知我们去启动一个IO操作,然后直接得到IO操作的结果
2.对于异步IO,我们可以随时无阻塞地启动 IO,然后由内核通知我们 IO 操作何时完成
要把 IOCP 集成到 libevent ,基本的思路是用 IOCP ...
原文
It may be possible to use IOCompletionPorts on Windows to implement apr_pollset_*. IOCPs
aare very scalable
but moving to IOCPs will require a complete rewrite of the apr_socket implementation on Windows.
And there is
the small matter of a simple technical issue that needs to be investigated. ...
IOCP 对于高并发的应用程序提供了良好的支持,使得开发高并发的应用程序的难度降低了很多。
IOCP 作为系统底层的 API ,保持了尽可能高的灵活性,对于很多复杂的情况,IOCP 也一样适用。
这种灵活性是一种双刃剑,对于复杂的情况,没有这种灵活性就没有办法完成工作。
但是对于简单的情况,这种灵活性就带来了额外的负担。
这里将要提到的这个服务器框架(spserver/iocp版),主要是针对以下的这几种典型的应用程序
1.echo/http 类型,server 不需要在多个 client 之间转发消息
2.chatroom 类型,server 在多个 client 之间转发消息
在使 ...
mysql 6 中关于网络层 IO 的设计,在下面这个链接中讲了大体的思路
http://forge.mysql.com/worklog/task.php?id=441
首先提到了目前的设计,one_thread_per_connect 模型。
引用
......
- A new thread is created to serve this socket. (Actually, with a
thread cache, it might reuse an existing thtread.)
......
In short: The above design does not scal ...
在参考了一些资料,并且尝试了几次之后,也逐渐想到了一个用来安全释放 IOCP 资源的办法。
http://groups.google.com/group/dev4server/browse_thread/thread/29a91064931a628e
接着发现有人已经把这种方案描述的很清楚了
http://blog.codingnow.com/2007/07/robust.html#comment-12142
对大家的讨论不置可否,但是使用ID代替指针确实在某些方面是有益处的。
而某些时候我们无法使用智能指针。举个例子,完成端口中
GetQueuedCompletionStatus( ...
看了 apache 的分析文章之后,觉得里面的图非常好地描述了 apache 的结构。也尝试用 visio 画一下 spprocpool 的结构。
对图中各个部分的说明:
1. MasterServer 通过 Fork 创建 ProcessManager ,ProcessPool 作为 ProcessManager 在 MasterServer 中的存根
2. 在 ProcessPool 和 ProcessManager 存在一个 ManagerPipe 管道
3. 当 MasterServer 需要更多的子进程的时候,MasterServer 通过 ProcessPool 对象向 Proc ...
http://developers.facebook.com/thrift/
Thrift is a software framework for scalable cross-language services development. It combines a powerful software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, and Ruby. Thrift was dev ...
suse linux 自带了 lkcd 安装包,安装之后,还有些配置项需要修改一下。
默认是使用 网络 方式,改成使用本地文件方式,记录一下
/etc/sysconfig/dump
DUMP_ACTIVE="1"
DUMPDEV="/dev/vmdump"
DUMPDIR="/var/log/dump"
DUMP_LEVEL="2"
DUMP_COMPRESS="2"
DUMP_FLAGS="0x80000000"
DUMP_SAVE="1"
PANIC_TIMEOUT="5"
BOUNDS_LIMIT=10
KEXEC_IMAGE=/boot/vmlinuz
KE ...
在为基于文本命令行协议的服务器(echo,smtp,pop,http一类的)增加 ssl 支持的时候,通常期望能够有一个 stelnet 工具,类似于平时用来测试文本命令行服务器的 telnet 工具,不过就要求 stelnet 能够支持 ssl 协议。一般来说,开发这类服务器,telnet 都是最基本的调试工具。有了这个 stelnet 工具之后,对于开发 ssl 的服务器有很大的帮助。
用 google search 了一下,发现有人准备做这个东西,但在 sf 上只有项目说明,还没有任何代码下载。接着就发现了下面这个链接
http://russell.rucus.net/blog/Gee ...
http://gceclub.sun.com.cn/solaris/819-7051-10.pdf
Fork-One 安全问题和解决方案
除了通常关注的问题(如锁定共享数据)以外,当只有fork() 线程处于运行状态时,还应
根据fork 子进程的操作来处理库。问题在于子进程中的唯一线程可能会尝试获取由未复制
到子进程中的线程持有的锁定。
大多数程序不可能遇到此问题。从fork() 返回后,大多数程序都会调用子进程中的
exec()。但是,如果程序在调用exec() 之前必须在子进程中执行操作,或永远不会调用
exec(),则子进程可能会遇到死锁。每个库编写者都应提供安全的解决方案,尽管提供 ...
http://blog.csdn.net/marcolu/archive/2004/08/02/59085.aspx
常用的应该就只有3个:worker|prefork|perchild
1. prefork:在功能上就是使用 Apache的运行方式,一个父进程,然后根据设置以及连接情况生成相应的子进程数。这种模式可靠性和健壮性都是最好的。但是在性能上,开销过大。达不到我们这些“吸血鬼”的要求了^_^。如果连接数过多的话,会导致我们无法远程登陆,一定要等到连接数下降后才能连接,这也是最让我头痛的事情。
2. worker:混合线程/进程的MPM。一个父进程,后面是带有线程的子进 ...
在这里看到关于 Mina based SMTP handler 的讨论,里面提到 mina 是 SEDA 的一个实现。
mina and SEDA
It uses non-blocking IO and is an implementation of the staged
event driven architecture (SEDA). SEDA makes it possible to have
thousands of concurrent network connections.
看到之后,忽然想到,half-sync/half-async 模式其实也可以看成是 ...
用 gdb debug c++ 程序,好多次遇到 Error while mapping shared library sections ,之前由于有其他的 debug 手段,因此就避开没有去追究是什么原因。今天遇到的问题没办法避开了,只能花时间来解决这个问题了。
很多时候为了做一些小实验或者尝试学习一套新的库,有关的动态链接库文件不会直接放到系统目录(诸如 /usr/lib)中,而只是在自己的 home 目录里面进行操作。并且通常为了方便,会把动态链接库文件和单元测试程序放到同一个目录中,同时把代表当前目录的 . 设置到 LD_LIBRARY_PATH 中,这样在很多情况下就不用额外设 ...
2007-03-16
half-sync/half-async 和 Leader/Followers 模式的主要区别
关键字: half-sync/half-async Leader/Followers
在 《POSA2》 一书中,关于这两个模式有两个很形象的比喻:
半同步/半异步(half-sync/half-async):
许多餐厅使用 半同步/半异步 模式的变体。例如,餐厅常常雇佣一个领班负责迎接顾客,并在餐厅繁忙时留意给顾客安排桌位,为等待就餐的顾客按序排队是必要的。领班由所有顾客“共享”,不能被任何特定顾客占用太多时间。当顾客在一张桌子入坐后,有一个侍应生专门为这张桌子服务。
领导者/追随者(Leader/Followers):
在日常生活中,领导者/追随者模式用于管理许多飞机场出租车候车台。在该用例中,出租车扮演“线程”角色,排在第一辆的出租车成为领导者,剩下的出租车成为追随者 ...
《unix网络编程》 Page42
每一个 TCP 套接口有一个发送缓冲区,我们可以用 SO_SNDBUF 套接口选项来改变这一缓冲区的大小。当应用进程调用 write 时,内核从应用进程的缓冲区中 copy 所有数据到套接口的发送缓冲区。如果套接口的发送缓冲区容不下应用程序的所有数据(或是应用进程的缓冲区大于套接口发送缓冲区,或是套接口发送缓冲区还有其他数据),应用进程将被挂起(睡眠)。这里假设套接口是阻塞的,这是通常的缺省设置。
Page161
客户可以设置 SO_LINGER 套接口选项,指定一个正的延滞时间。这种情况下,客户的 close 要直到它的数据和 FIN 已被 TCP 服务 ...
要实现一个并发的网络服务器,一个流行的做法是使用 one thread per connection 。
具体采用的模型可能是
《unix网络编程》 (第二版,中文版) 27.12 TCP预先创建线程服务器程序,主线程统一 accept 。
使用这种模型,有以下的好处:
1.可以很方便地把这个模型实现为一个与具体应用无关的 framework,
《unix网络编程》书上的代码稍加整理就已经是一个可重用的 server framework 了。
Page646 和 Page647 上面的代码,需要针对不同的应用做修改的,仅仅是 thread_main 函数中,对 web_child 的调用。 ...
An Architecture for Highly Concurrent Well-Conditioned Internet Services.pdf
SEDA 项目的相关论文
Page26
The use of helper processes in Flash and Harvest underscores the occasional need for an event-driven system to resort to blocking operations, either to reduce complexity or to make use of legacy interf ...
http://mail.jabber.org/pipermail/standards/2003-August/003950.html
The only way you can truly do reliable messaging is if the client that
receives the message sends back a confirmation that the message has
been received and processed.
it's still limited to server <-> client reliability, not e ...
http://monkeymail.org/archives/libevent-users/2006-October/000257.html
Passing data between event loops in multithreaded apps
http://www.weirdness.net/code/libevent
libevent - an event notification library
http://www.monkey.org/~provos/libevent/
http://www.monkey.org/~provos/libevent/event3.html
《unix网络编程》 (第二版,中文版)
27.4 TCP 迭代服务器程序
6.8 TCP 回射服务器程序(修订版)
6.11 TCP 回射服务器程序(再修订版)
Page 141 的代码去掉错误处理之后的大概流程如下
for( ; ; ) {
nready = select( maxfd + 1, &rset, NUL ...
http://wiki.apache.org/directory/MinaTutorialInChinese
如果想实现复杂的如LDAP这样的协议怎么办呢?它似乎是一个恶梦,因为IO层没有帮助你分离‘message解析’和‘实际的业务逻辑(比如访问一个目录数据库)’。MINA提供了一个协议层来解决这个问题。协议层将ByteBuffer事件转换成高层的POJO事件:
就像前面提到的,你只需撰写面向POJO的message而不是ByteBuffer的。ProtocolEncoder 将message对象解释成ByteBuffers以便IO ...
http://www.artima.com/articles/io_design_patterns3.html
System I/O can be blocking, or non-blocking synchronous, or non-blocking asynchronous [1, 2].
Blocking I/O means that the calling system does not return control to the caller until the operation is finished.
Most important, the call ...
http://blog.csdn.net/umbrella1984/archive/2006/10/06/1322890.aspx
epoll的使用
令人高兴的是,2.6内核的epoll比其2.5开发版本的/dev/epoll简洁了许多,所以,大部分情况下,强大的东西往往是简单的。唯一有点麻烦是epoll有2种工作方式:LT和ET。
LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你 的 ...
- 浏览: 79334 次

- 详细资料
搜索本博客
我的相册
vim
共 2 张
共 2 张
最近加入圈子
最新评论
-
集成 IOCP 到 Libevent
去找了 memcached for win32 的源代码,结果可以顺利编译,并且 ...
-- by iunknown -
集成 IOCP 到 Libevent
qiezi 写道GetQueuedCompletionStatusEx也支持超时 ...
-- by iunknown -
集成 IOCP 到 Libevent
GetQueuedCompletionStatusEx也支持超时,用它代替sel ...
-- by qiezi -
集成 IOCP 到 Libevent
linux/solaris上的aio有多种回调/通知方式,可能和libevent ...
-- by qiezi -
集成 IOCP 到 Libevent
SPServer是一个很不错的框架,受到启发,我用boost::asio实现了一 ...
-- by wow






评论排行榜