常量折叠,
就是类似于c语言中的宏定义。
#define X 5
那么程序中任何出现X的地方都用5代替,X是不需要存储空间的,这叫宏展开。
对于c++中
const int X = 5;
那么,如果没对X取地址或其他用到X存储空间相关的操作,那么X是不分配储存空间的,编译期间直接进行常量折叠,把程序中的X均用5代替。
完成端口(Completion Ports )
首先来看看重叠I/O(Overlapped I/O):
重叠I/O(Overlapped I/O)机制允许发起一个操作,然后在操作完成之后接受到信息。对于那种需要很长时间才能完成的操作来说,重叠IO机制尤其有用,因为发起重叠操作的线程在重叠请求发出后就可以自由的做别的事情了。
在WinNT和Win2000上,提供的真正的可扩展的I/O模型就是使用完成端口(Completion Port)的重叠I/O。
接下来看看完成端口(Completion Ports )
其实可以把完成端口看成系统维护的一个队列,操作系统把重叠IO操作完成的事件通知放到该队列里,由于是暴露 “操作完成”的事件通知,所以命名为“完成端口”(COmpletion Ports)。一个socket被创建后,可以在任何时刻和一个完成端口联系起来。
惊群效应
同时唤醒多个等待线程。
pthread_mutex_lock( &qlock );
典型代码如下
while(true)
{
mutex_lock
newcliet=accept(listener)
mutex_unlock
while(true)
{
/*处理客户端任务直到客户端断开*/
}
}
就是类似于c语言中的宏定义。
#define X 5
那么程序中任何出现X的地方都用5代替,X是不需要存储空间的,这叫宏展开。
对于c++中
const int X = 5;
那么,如果没对X取地址或其他用到X存储空间相关的操作,那么X是不分配储存空间的,编译期间直接进行常量折叠,把程序中的X均用5代替。
完成端口(Completion Ports )
首先来看看重叠I/O(Overlapped I/O):
重叠I/O(Overlapped I/O)机制允许发起一个操作,然后在操作完成之后接受到信息。对于那种需要很长时间才能完成的操作来说,重叠IO机制尤其有用,因为发起重叠操作的线程在重叠请求发出后就可以自由的做别的事情了。
在WinNT和Win2000上,提供的真正的可扩展的I/O模型就是使用完成端口(Completion Port)的重叠I/O。
接下来看看完成端口(Completion Ports )
其实可以把完成端口看成系统维护的一个队列,操作系统把重叠IO操作完成的事件通知放到该队列里,由于是暴露 “操作完成”的事件通知,所以命名为“完成端口”(COmpletion Ports)。一个socket被创建后,可以在任何时刻和一个完成端口联系起来。
惊群效应
同时唤醒多个等待线程。
pthread_mutex_lock( &qlock );
while( /*判断条件*/ )所有进程都能监听同一个端口并accept连接,可以通过一个进程创建了listen socket,并fork同样进行listen/accept的子进程来实现。这里要考虑惊群效应,也就是说有连接到来,所有堵塞在监听socket上的进程可能都会被系统唤醒,但只有一个进程能够从tcp协议栈里获得连接。惊群效应引入了进程调度开销,解决办法是在accept上加锁。同时只有一个进程在调用accept.在获得连接后,该进程不再调用Accept,而是处理客户端业务,直到客户端退出,才重新回归调用accept。 Apache1.3.x使用的是类似的模式,可以从其http_main.c里看到。
{
pthread_cond_wait( &qready , &qlock );
}
例:
典型代码如下
while(true)
{
mutex_lock
newcliet=accept(listener)
mutex_unlock
while(true)
{
/*处理客户端任务直到客户端断开*/
}
}