2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
答案二:
根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。所有其它区别都是由此而来的:
1。速度:线程产生的速度快,线程间的通讯快、切换快等,因为他们在同一个地址空间内。
2。资源利用率:线程的资源利用率比较好也是因为他们在同一个地址空间内。
3。同步问题:线程使用公共变量/内存时需要使用同步机制还是因为他们在同一个地址空间内。
网上的答案的 版本怎么想怎么都太学术了。我当时看到过一个比喻特别的好, 我就模仿者把它说下来哈,有错误希望支持哈:
多进程的服务器就好比是
立体的交通系统(立交桥)虽然说建造的时候花费比较大,消耗的资源比较多,但是真要是跑起来不会交通堵塞。但是汽车在上面跑,相互通信就是个很费事儿问题(进程间通信比较麻烦);多线程就好比是平面的交通系统,造价低,但是很容易交通堵塞,
但是也有好处同步的时候方便。
在网络服务器方面:
单进程 <多进程(单线程)<多进程(多线程)
在游戏方面的应用:
I、多线程服务器,玩家数据缓存和向DB的存储我们可以开一个线程单独去做,这样不会有什么大的问题。日志和网络上面说过可以很容易切割出去,主要就是对游戏逻辑的切割。
A:按场景分线程,一个线程管理若干个场景。这样配置灵活,一个线程可以管理若干个小场影,除非有个场景人多到一个CPU跑不下来,一般的游戏都会满足需求。缺点则是不在同一线程的Object在做逻辑交互时,必须用异步,如果用到了脚本,那么这里的复杂度和性能要值得注意。如果项目中出现单个服务器解决不鸟的问题(例如战场服务器),似乎就成了多线程多进程的庞大架构。
B:将某些功能切割到其它线程,例如Object的管理和查找,NPCAI的寻路,这种方式貌似在做逻辑需要分离到别的线程模块功能时有点麻烦,如果直接上锁等待肯定不是最好的方式,所以这些逻辑必须变成异步。
2、多进程服务器,其实这里的多进程和场景多线程改成了多进程。这里玩家数据缓存和向DB的存储我觉得用一个单独的DB服务器。多进程服务器可以在GameServer和GameClient之间加一个Gate,因为在跨服场景不需频繁断线连接。多进程服务器所有的通讯都依靠网络,有些逻辑必须有网络延迟的消耗。优点是配置灵活,在物理机器性能不够时可以通过扩充物理机器来解决
服务器还有有一个很蛋疼的问题就是过载: 下面介绍一下产生的原因和解决办法:
服务器过载:
原因是高优先级处理阶段对CPU的不公平抢占。所以,如果限制高优先级处理阶段对CPU的占用率,或者限制处理高优先级的CPU个数,都可以减轻或者消除收包活锁现象。具体的可以采用以下的方法:
方法一、采用轮询机制
为了减少中断对系统性能的影响,在负载正常的情况下采用“下半处理”的方法就非常有效,而在高负荷情况下,采用这个方法仍然会造成活锁现象,这时可以采用轮询机制。虽然这个方法在负载正常的情况下会造成资源的浪费和响应速度降低,但在网络数据频繁到达服务器时就要比中断驱动技术有效的多。
方法二、减低中断的频率
这里主要有两种方法:批中断和暂时关闭中断。批中断可以在超载时有效的抑制活锁现象,但对服务器的性能没有什么根本性的改进当系统出现接收活锁迹象时,可以采用暂时关闭中断的方法来缓和系统的负担,当系统缓存再次可用时可以再打开中断,但这种方法在接收缓存不够大的情况下会造成数据包丢失。
方法三、减少上下文切换
这种方法不管服务器在什么情况下对性能改善都很有效,这时可以采用引入核心级(kerne1—leve1)或硬件级数据流的方法来达到这个目的。核心级数据流是将数据从源通过系统总线进行转发而不需要使数据经过应用程序进程,这个过程中因为数据在内存中,因此需要CPU操作数据。
硬件级数据流则是将数据从源通过私有数据总线或是虽等DMA通过系统总线进行转发而不需要使数据经过应用程序进程,这个过程不需要CPU操作数据。这样在数据传输过程中不需要用户线程的介入,减少了数据被拷贝的次数,减少了上下文切换的开销。
在进行服务器处理的过程中,需要保证数据的正确处理,那么最重要的就是使用不同的数据处理模式进行运算。
在整个过程中,可能很多人对服务器的知识并不了解,那么应该如何进行Java开发服务器的线程处理呢,关于线程处理有哪些知识?下面广西北大青鸟为大家介绍关键服务器线程处理的简单知识。
1、BIO线程模型在JDK1.4中引入JavaNIO之前,所有基于Java的Socket通信都使用了同步阻塞模式(BIO)。
这种请求-响应通信模型简化了上层的应用程序开发上,但在具有性能和可靠性的情况下,存在一个巨大的瓶颈。
在一段时间里面,大型应用程序服务器主要是用C或C++开发的,因为它们可以直接使用操作系统提供的异步I/O或AIO功能。
当流量增加且响应时间延迟增加时,JavaBIO开发的服务器软件只能通过硬件的不断扩展来满足并发性和低延迟的情况,这极大地增加了企业的成本和群集大小。
系统的不断扩展,系统的可维护性也面临着巨大的挑战,只能通过购买性能更高的硬件服务器来解决问题,这将导致恶性循环的产生。
2、异步非阻塞线程模型从JDK1.0到JDK1.3,Java的I/O类库非常原始。
UNIX网络编程中的许多概念或接口未反映在I/O类库中,例如Pipe、Channel、Buffer和Selector等。
在发布JDK1.4的时候,NIO正式发布JDK作为JSR-51。
并且它还添加了一个java.nio包,为异步I/O开发提供了许多API和库。
3、RPC性能三原则影响RPC的性能主要有三大元素,其中主要为I/O模型、协议及线程。
I/O模型:使用什么样的通道传递给另一方,BIO,NIO或AIO发送数据,IO模型在很大程度上能够决定框架的性能。
协议:应该使用什么样的通信协议,Rest+JSON或基于TCP的专用二进制协议。
参加电脑培训的过程中发现,协议的选择不同,性能模型也不同。
内部专用二进制协议的性能通常可以比公共协议更好地设计。
线程:如何读取数据报?在执行读取后的编解码器的哪个线程中,如何分发编码消息,通信线程模型是不同的,并且对性能的影响也非常大。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)