1.TCP迭代服务器程序服务器
这种方式就是服务器同一时间只处理一个客户端的请求,这个请求处理完之后才转向下一个客户请求。固然这样的服务器程序比较少见,这就像一个公司只能一次处理一个客户,后面的客户只能等待,这样的话确定是不行的,效率过低 了,可是要是从进程控制角度来看这种方式是最快的,由于它没有执行进程控制,这是相对于后面讲的方式多进程而言的,啥意思呢,就是说一个公司里面当你只有一个销售员接待客户的时候,我对销售员的管理成本就没有了,当你是多个销售员对应多个客户的时候,虽然这个时候能够同时接待多个客户,可是老板对多个销售员的管理成本也要算进去,上面说的进程控制就是老板对多个销售员的管理。数据结构
2.TCP并发服务器程序,每一个客户一个子进程并发
这种方式呢,就是多个进程处理多个链接,每来一个新的链接,就当即建立(fork)一个新的子进程来处理这个链接,这种方式的问题是为每一个新链接现场fork一个子进程比较耗费cpu时间,操做系统在fork子进程时要作的事情不少的,首先须要复制父进程的相关数据结构,而后在初始化权限,调度器,文件系统,内存这一系列操做,因此建立一个子进程的开销是很大的,尤为是如今这个时代,繁忙的服务器天天的链接数能够达到数以百万计。socket
举例来讲这种方式就像你做为老板,每接一个项目就建立一个新的子公司,这个子公司的人员,桌椅板凳,各类工具都是新的,项目完成之后该子公司解散。tcp
3.TCP预先派生子进程服务器程序函数
这种方式就是在启动阶段预先建立多个子进程,当各个客户链接到来时,子进程就能够立刻为他们服务,而不是说当客户来的时候在建立好子进程为他们服务,这种方式优势就是没有了父进程fork的开销,缺点就是父进程必须在服务器启动阶段猜想须要预先建立多少子进程,并且父进程还要实时监控进程池中的进程数,当这个数字高于某个阈值时,须要终止多余的进程,当这个数字低于某个阈值时,须要建立新进程。工具
举例来讲:这就像老板预先建立了多个子公司,当来项目时,让建立好的子公司接项目就能够 了,而不是像第二种方式那样,来客户了,你再去建立子公司,可是做为老板你要全局把控,当你发现子公司的数量太多,已经远大于项目的数量,这时候你就要注销掉一部分公司,以节省开销,一样反过来,当你发现接的项目数不少,增加的速度不少,那么你就须要立刻在建立几个子公司来处理项目,要否则你的项目就接不到了,就挣不了钱,没法迎娶白富美,走上人生巅峰了。性能
而后咱们再说关于这种方式会发生的一个问题,这个问题就叫作"惊群",啥意思呢,就是说当来了一个新请求时,全部的进程都会被唤醒,可是最后只有一个进程能接到这个请求,这样就会致使性能受损。操作系统
举例来讲:当没有项目来的时候,全部的子公司都处于放假状态,全部人员都休息了,而后来了一个新的项目,全部的公司都得恢复到上班状态,可是其实到最后只有一个公司能接到这个项目,这样对于其余子公司员工来讲是否是有点烦,老子正在放假休息呢,而后你把我召回到了公司还没事情作,让我白跑一趟,交通费食宿费这些都属于浪费掉了,对应到操做系统来讲就是性能受损。线程
4.TCP并发服务器程序,每一个客户一个线程
这种方式就是每来一个客户请求,就建立一个线程,建立线程的开销要比建立进程的开销小多了,建立线程就是将各个结构的引用计数加一,建立栈等操做,相对比建立进程来讲开销要小不少了,这其实就像公司接项目的时候不是建立子公司,而是建立多个项目组,项目组能够共用公司的各类资源。
这里说一下accept的概念,accept是套接字(socket)中的一个函数,他是用来接收服务器中已完成链接队列里面的链接,也就是服务器会有一个队列专门用来存放已经三次握手完成的tcp链接,当这个队列有数据的时候,调用这个accept函数就会从队列头部拿出一个链接给应用程序处理。
5.TCP预先建立线程服务器程序,每一个线程各自accept
这种其实就是服务器启动阶段预先建立线程池,也就是多个线程以取代为每一个客户链接现场建立一个线程有性能加速效果,这种作法就像来了一个新项目,只有一个项目组接这个项目,其余项目组仍是作原来作的事情。
6.TCP预先建立线程服务器程序,主线程统一accept
这种方式就是在程序启动阶段建立一个线程池以后只让主线程调用accept并把每一个客户链接传递给池中某个可用线程,这就像有个全部项目组的总管,他负责接项目,来了项目之后,他去把这个项目分配给能够开发的项目组。
了解更多:https://www.toutiao.com/c/user/83293539887/#mid=1633933053814798