其他
高并发高性能服务器是如何实现的
当在读这篇文章的时候,你有没有想过,服务器是怎么把这篇文章发送给你的呢?
说简单也简单,不就是一个用户请求吗?服务器根据请求从数据库中捞出这篇文章,然后通过网络发回去。
说复杂也复杂,服务器是如何并行处理成千上万个用户请求呢?这里面涉及到哪些技术呢?
这篇文章就来为你解答这个问题。
多进程
编程简单,非常容易理解 由于各个进程的地址空间是相互隔离的,因此一个进程崩溃后并不会影响其它进程 充分利用多核资源
各个进程地址空间相互隔离,这一优点也会变成缺点,那就是进程间要想通信就会变得比较困难,你需要借助进程间通信(IPC,interprocess communications)机制,想一想你现在知道哪些进程间通信机制,然后让你用代码实现呢?显然,进程间通信编程相对复杂,而且性能也是一大问题 我们知道创建进程开销是比线程要大的,频繁的创建销毁进程无疑会加重系统负担。
多线程
Event Loop:事件驱动
event 处理event的函数,这一函数通常被称为event handler
while(true) {
event = getEvent();
handler(event);
}
Event loop中要做的事情其实是非常简单的,只需要等待event的带来,然后调用相应的event处理函数即可。注意,这段代码只需要运行在一个线程或者进程中,只需要这一个event loop就可以同时处理多个用户请求。有的同学可以依然不明白为什么这样一个event loop可以同时处理多个请求呢?原因很简单,对于web服务器来说,处理一个用户请求时大部分时间其实都用在了I/O操作上,像数据库读写、文件读写、网络读写等。当一个请求到来,简单处理之后可能就需要查询数据库等I/O操作,我们知道I/O是非常慢的,当发起I/O后我们大可以不用等待该I/O操作完成就可以继续处理接下来的用户请求。事件来源:IO多路复用
至此,关于利用事件驱动来实现并发编程的所有问题都解决了吗?event的来源问题解决了,当得到event后调用相应的handler,看上去大功告成了。想一想还有没有其它问题?
问题:阻塞式IO
有的同学可能会问,如果不能发起阻塞式IO的话,那么该怎样进行IO操作呢?有阻塞式IO,就有非阻塞式IO。
非阻塞IO
基于事件编程的难点
更好的方法
总结
往期精选
看完这篇还不懂线程与线程池你来打我读取文件时,程序经历了什么?终于明白了,一文彻底理解I/O多路复用从小白到高手,你需要理解同步与异步