“C/S架构系统应用过程中,会发生一个服务端程序服务众多客户端,用什么技术手段,提前解决服务阻塞问题的发生?”
曹志军意外地看着李洛,他不是在思考问题的答案,而是在惊讶他对‘编程’知识的认知程度,眼前这位十八九岁的小老板,根本就是个技术大佬,不然,怎么能知道着这种直达问题核心的技术难题。
“曹先生,你这么看着我做什么,这个问题应该不难吧!”李洛笑吟吟地看着直愣愣的曹志军,笑着问。
“这个问题不难解决,在服务器编程中有不少解决的方法,比:如多线程、多进程、复用IO,……等等。”曹志军缓过神来,摆正态度看着李洛,回答道。
“很好,那你能不说一说多线程怎么解决?在服务端accept和read都有阻塞程序!”李洛满意地一笑,接着问。
“嗯,解决思路是这样的,服务端同时处理多个客户端请求时,需要处理的情况有很多种,比如,新客户端等待与服务端建立连接,已连接客户端发送数据,已连接客户端断开连接等等情况,……,如果服务器采用轮询阻塞的方式运行,那么同一时刻只能处理一种情况,这时其他情况发生就要等待阻塞结束,……,可以通过锁,线程间通信,多个线程间同步等手段,实现分别处理工作,……。”曹志军思考了片刻,详细介绍道。
“这个模式可以解决,不过,用这种方式监听多个客户端,需要程序在用户态和内核态之间来回切换,浪费系统资源不说,客户端的请求也得不到及时的响应,当客户端数量增大时,查询效率直线下降,……,这个问题怎么解决?”李洛笑着点头,续集抛出一个问题。
认真听完李洛的提问,曹志军神情严峻,认真思考起来,再次感到对方的狠辣。
曹志军思考了十来分钟,不确定地回答:“使用多路复用技术,让内核阻塞监听每个客户端是否可读,……,达到减免用户态和内核态之间来回切换!”
李洛点了点头,赞同道:“不错的思路,不过,如果加入select的使用,你觉得怎么样,将服务端自身的socket也加入到select的监听列表中,当有新连接到达时,select会返回当前服务端socket处于活动状态,这时处理新连接即可,能避免多线程的挤压使用……,”
闻言,曹志军眼前一亮,忍不住赞叹道:“这个办法好,……。”
李洛微微一笑,看着兴奋的曹志军,再次抛出一个问题:“在系统使用过程中,server端会出现大量的假死连接,这个问题你是怎么解决的?”
曹志军眉头一皱认真思考起来,假死链接这个问题不常见,但是不能说没有/
c端可以断线重连s端,但是上一次的连接状态依然被s认为有效,并且得不到正确释放,……,具体造成的原因可以参考tcp/ip断开连接fin过程,如果觉得这种事发生的概率微不足道,不做任何处理,程序长时间运行后,会面临大量假死连接得不到正常释放,然后服务器越来越慢,IO处理效率越来越低。
这个问题怎么解决呢?
曹志军不由自主地陷入思考,抓着脑门,被这个问题难住了。
李洛笑呵呵地看着曹志军,有点喜欢他较真的性格,几次提问,已经能判断出曹志军的性格,而是不他的能力。
能力这种东西,后期通过努力的学习,都能获得提升,问题是个人的性格,能不能用心学习新技术,是否值得培养才是要不要招他的关键,曹志军目前为止的表现,还算合格。