Abstract
The way at which a Web server handles I/O operations has a significant impact on its performance. On the one hand, servers that allow blocking for I/O operations are easier to implement, but exhibit less efficient utilization and limited scalability. On the other hand, servers that allow non-blocking I/O usually perform and scale better, but are not easy to implement and have limited functionality. In this thesis, we introduce the design of a self-adapting Web server architecture that has the ability to make decisions on how future I/O operations would be handled based on load conditions. The results obtained from our implementation of this architecture indicate that it is capable of providing competitive performance and better utilization than comparable non-adaptive Web servers on different load levels