怎么理解并发多进程服务和多线程服务器 并发服务器的实现如何选择多进程,多线程还是IO复用

\u9ad8\u5e76\u53d1nginx\u670d\u52a1\u5668\u662f\u591a\u8fdb\u7a0b\u8fd8\u662f\u591a\u7ebf\u7a0b

\u3000\u3000Nginx\u4f1a\u6309\u9700\u540c\u65f6\u8fd0\u884c\u591a\u4e2a\u8fdb\u7a0b\uff1a\u4e00\u4e2a\u4e3b\u8fdb\u7a0b(master)\u548c\u51e0\u4e2a\u5de5\u4f5c\u8fdb\u7a0b(worker)\uff0c\u914d\u7f6e\u4e86\u7f13\u5b58\u65f6\u8fd8\u4f1a\u6709\u7f13\u5b58\u52a0\u8f7d\u5668\u8fdb\u7a0b(cache loader)\u548c\u7f13\u5b58\u7ba1\u7406\u5668\u8fdb\u7a0b(cache manager)\u7b49\u3002Nginx\u4e3b\u8981\u901a\u8fc7\u201c\u5171\u4eab\u5185\u5b58\u201d\u7684\u673a\u5236\u5b9e\u73b0\u8fdb\u7a0b\u95f4\u901a\u4fe1\u3002\u4e3b\u8fdb\u7a0b\u4ee5root\u7528\u6237\u8eab\u4efd\u8fd0\u884c\uff0c\u800cworker\u3001cache loader\u548ccache manager\u5747\u5e94\u4ee5\u975e\u7279\u6743\u7528\u6237\u8eab\u4efd\u8fd0\u884c\u3002

\u3000\u3000\u5728\u5de5\u4f5c\u65b9\u5f0f\u4e0a\uff0cNginx\u5206\u4e3a\u5355\u5de5\u4f5c\u8fdb\u7a0b\u548c\u591a\u5de5\u4f5c\u8fdb\u7a0b\u4e24\u79cd\u6a21\u5f0f\u3002\u5728\u5355\u5de5\u4f5c\u8fdb\u7a0b\u6a21\u5f0f\u4e0b\uff0c\u9664\u4e3b\u8fdb\u7a0b\u5916\uff0c\u8fd8\u6709\u4e00\u4e2a\u5de5\u4f5c\u8fdb\u7a0b\uff0c\u5de5\u4f5c\u8fdb\u7a0b\u662f\u5355\u7ebf\u7a0b\u7684\uff1b\u5728\u591a\u5de5\u4f5c\u8fdb\u7a0b\u6a21\u5f0f\u4e0b\uff0c\u6bcf\u4e2a\u5de5\u4f5c\u8fdb\u7a0b\u5305\u542b\u591a\u4e2a\u7ebf\u7a0b\u3002Nginx\u9ed8\u8ba4\u4e3a\u5355\u5de5\u4f5c\u8fdb\u7a0b\u6a21\u5f0f\u3002

\u4ea7\u751f\u8fdb\u7a0b\u7684\u5f00\u9500\u8981\u6bd4\u7ebf\u7a0b\u7684\u5f00\u9500\u66f4\u5927\u3002\u5982\u679c\u4f60\u7684\u670d\u52a1\u5668\u8fde\u63a5\u7684\u5ba2\u6237\u7aef\u7684\u6570\u91cf\u6bd4\u8f83\u5c11\uff0c\u90a3\u4e48\u8fdb\u7a0b\u548c\u7ebf\u7a0b\u5728\u6548\u7387\u65b9\u9762\u7684\u5dee\u522b\u611f\u89c9\u5e76\u4e0d\u5927\u3002\u5982\u679c\u6570\u91cf\u5f88\u5927\uff0c\u6bd4\u59821000\uff0c\u751a\u81f3\u66f4\u591a\uff0c\u5982\u679c\u4f60\u7528\u8fdb\u7a0b\uff0c\u90a3\u4e48\u54cd\u5e94\u5b8c1000+\u7684\u5ba2\u6237\u7aef\u8fde\u63a5\u5c31\u4f1a\u53d8\u5f97\u5f88\u6162\uff0c\u56e0\u4e3a\u4f60\u8981\u628a\u8d44\u6e90\u590d\u52361000\u591a\u4efd\uff1b\u4f46\u662f\u7528\u7ebf\u7a0b\uff0c\u5b83\u4eec\u5171\u4eab\u540c\u4e00\u4e2a\u8fdb\u7a0b\u91cc\u7684\u8d44\u6e90\uff0c\u5c31\u4e0d\u9700\u8981\u82b1\u90a3\u4e48\u5927\u7684\u5f00\u9500\u53bb\u54cd\u5e94\u5ba2\u6237\u7aef\u7684\u8fde\u63a5\u3002

1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
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操作数据。这样在数据传输过程中不需要用户线程的介入,减少了数据被拷贝的次数,减少了上下文切换的开销。

  • 濡備綍閫氫織鍦鐞嗚В澶氱嚎绋嬩笌澶氳繘绋鍛?
    绛旓細CPU鎶婂涓换鍔℃斁鍒颁笉鍚岀殑鏃堕棿娈靛鐞嗭紝鍏跺疄鏄妸浠诲姟鍒嗘垚澶氫釜鑺傜偣锛堟椂闂存锛夎CPU鐨勶紙绾跨▼锛夊悓鏃跺鐞!浠庤屽姞蹇簡澶勭悊閫熷害锛(姣斿浣犺鐨勭數褰辫В鐮佸悗)淇濆瓨鍦ㄧ紦瀛橀噷锛屾寜搴忔挱鏀!鍏充簬杩涚▼锛屽彲浠鐞嗚В涓猴紝鍚屾椂鎵撳紑浜嗗涓▼搴忥紝姣斿浣犲悓鏃舵墦寮浜嗘瓕鏇诧紝鍜岀數褰憋紝鎴栬呭悓鏃惰繕鍦ㄦ祻瑙堝叾瀹冧粈涔!灏辨槸澶氫釜杩涚▼!涓汉鐞嗚В锛屼粎渚...
  • 鍏充簬鎿嶄綔绯荤粺鐨澶氱嚎绋嬪杩涚▼璇︾粏瑙i噴,绁炴潵,涓嶇绛旀鏄鍒惰繕鏄矘璐寸殑閮...
    绛旓細澶氳繘绋锛屽氨鏄悓鏃舵湁澶氫釜杩涚▼鍦ㄨ繍琛 澶氱嚎绋锛屽氨鏄悓鏃舵湁澶氫釜绾跨▼鍦ㄨ繍琛 瀵逛簬鍗曟牳澶勭悊鍣ㄦ潵璇达紝澶氱嚎绋嬩粠寰涓婃槸涓鏉′竴鏉℃墽琛岀殑锛屾瘡涓嚎绋嬮兘浼氳鍒嗗壊鎴愪竴灏忔鏃堕棿鐗囷紝鎸夌収鎶㈠崰寮忕嚎绋嬭皟搴︽潵鎵ц锛涘浜庡鏍稿鐞嗗櫒鏉ヨ锛屽绾跨▼浠庡井瑙備笂鏄骞跺彂鐨勶紝瀵逛簬鍙屾牳澶勭悊鍣ㄨ岃█锛屽畠鑳藉悓鏃舵墽琛屼袱鏉$嚎绋嬨備竴涓繘绋嬩細鏈...
  • 鍦╳indows绯荤粺閲岄潰,鍒板簳浠涔堟槸澶氫换鍔,鍜屽杩涚▼,澶氱嚎绋鏈変粈涔堝尯鍒...
    绛旓細锛堟湰鏂囦腑 锛孋pu 鍧囨寚鍗曟牳鍗绾跨▼ 澶勭悊鍣級Cpu 瀹冧竴涓懆鏈燂紙CPI锛夊彧鑳芥墽琛屼竴鏉℃寚浠わ紝瀹冩棤娉曞悓鏃舵墽琛屾墍鏈夌▼搴忕殑鎸囦护銆傞偅鎬庝箞鍔烇紵鎼炶绠楁満鐨勫伐绋嬪笀灏辨兂浜嗕竴涓姙娉曪紝璁╀笉鍚岀▼搴忕殑鎸囦护杞祦鎵ц銆侫绋嬪簭涓殑鎸囦护琚獵pu鎵ц浜嗭紝灏卞埌 B绋嬪簭涓殑鎸囦护琚墽琛 鈥︹︹︺杩涚▼銆戞垜浠彲浠鐞嗚В涓涓繘绋嬪氨鏄竴涓▼搴忥紝...
  • 澶氱嚎绋嬪拰澶氳繘绋鍒嗗埆鏄粈涔堟剰鎬?
    绛旓細澶氳繘绋锛屽氨鏄悓鏃跺彲浠ュ鐞嗗嚑涓▼搴忕殑鎰忔濄傝澶氱嚎绋锛屽垯姣旇緝澶嶆潅锛氫究濡備綘鎵撳紑涓涓猈INAMP锛岄偅涔圕PU灏变細鎵цWINAMP绋嬪簭锛岀劧鍚庝綘闅忓嵆鍙堝弻鍑绘墦寮鍙慠EALONE锛岄偅涔堬紝浣滀负浼樺厛绋嬪簭锛孋PU浼氭殏鏃舵х殑鏆傚仠WINAMP鐨勮繍琛岋紝杞屾墽琛屼紭鍏堟潈楂樼殑REALONE绋嬪簭锛岃繖涓彨鍋氬崟绾跨▼銆傝屽绾跨▼鍒欏悓锛屽悓鏃跺紑鍚涓▼搴忥紝澶氫釜绋嬪簭骞惰...
  • 澶氫换鍔,澶氱嚎绋,澶氳繘绋鐨勮緝鏄鐞嗚В璇存硶鍜屽尯鍒
    绛旓細1銆澶氱嚎绋鏄敤鏉ユ彁楂樻晥鐜囥佸苟琛屽鐞嗘彁锛屽彲浠ヨ繘琛屽紓姝ュ鐞嗘暟鎹2銆佷竴涓换鍔″彲浠ヨ澶氫釜绾跨▼鎵ц锛岃繖灏卞ソ姣旓紝涓杞︾爾澶村涓汉涓璧锋潵甯繖銆傝繖鏍锋晥鐜囦細鎻愰珮寰堝銆3銆澶氳繘绋瀹為檯灏辨槸鍦ㄦ墽琛屽涓换鍔★紝澶氫釜浠诲姟鍙堝彲浠ヨ澶氫釜绾跨▼鎵ц瀹屾垚銆傝繖鏍峰氨鏈夊姪浜庢彁楂樻晥鐜 ...
  • 楹荤儲瑙i噴涓涓媗inux涓杩涚▼鍜岀嚎绋鏈変粈涔堝尯鍒拰鑱旂郴,linux涓澶氱嚎绋鍜...
    绛旓細鍥犱负浣犳病鎻愰棶linux涓嬫槸鎬庝箞绠$悊杩涚▼鍜岀嚎绋鐨勬墍浠ユ垜灏变笉鍥炵瓟浜嗭紝杩欎釜闂鎴戝缓璁綘杩樻槸鐪嬬湅銆婄鍏斿厰鐨勬晠浜嬨嬮噷闈㈣鍒颁簡linux鏄庝箞绠$悊杩涚▼鍜岀嚎绋嬬殑銆傛尯骞介粯鐨勬瘮鎴戣寰楄繕濂姐備綘绗簩涓棶棰樿瀹炶瘽鎴戝洖绛斾笉浜嗕綘锛佹垜鎯充綘鐜板湪杩炶繘绋嬪拰绾跨▼杩樻病鐞嗚В绗簩涓綘鏇寸悊瑙d笉浜嗕簡浣犺瀵逛笉锛熸垜鐚滅殑鍏跺疄浣犵敤C/C++涓嶇鏄...
  • 鏈嶅姟鍣,浣跨敤澶氳繘绋 涓 澶氱嚎绋 璇烽棶鏈変粈涔堝尯鍒
    绛旓細鍘熷洜璇风湅涓婇潰瀵规瘮銆5锛夐兘婊¤冻闇姹傜殑鎯呭喌涓嬶紝鐢ㄤ綘鏈鐔熸倝銆佹渶鎷挎墜鐨勬柟寮 鑷充簬鈥滄暟鎹叡浜佸悓姝モ濄佲滅紪绋嬨佽皟璇曗濄佲滃彲闈犳р濊繖鍑犱釜缁村害鐨勬墍璋撶殑鈥滃鏉傘佺畝鍗曗濆簲璇ユ庝箞鍙栬垗锛屾垜鍙兘璇达細娌℃湁鏄庣‘鐨勯夋嫨鏂规硶銆備絾鎴戝彲浠ュ憡璇変綘涓涓夋嫨鍘熷垯锛氬鏋澶氳繘绋嬪拰澶氱嚎绋閮借兘澶熸弧瓒宠姹傦紝閭d箞閫夋嫨浣犳渶鐔熸倝銆佹渶鎷挎墜鐨...
  • 澶氱嚎绋嬩笌澶氳繘绋鐨勬瘮杈
    绛旓細鍙兘鍒嗛厤缁欎竴涓繘绋嬶紝浠ヤ究杩愯杩欎釜杩涚▼銆傛垜浠氬父浣跨敤鐨勮绠 鏈轰腑鍙湁涓涓 CPU 锛屼篃灏辨槸璇村彧鏈変竴棰楀績锛岃璁╁畠涓蹇冨鐢紝鍚屾椂杩愯澶氫釜杩 绋锛屽氨蹇呴』浣跨敤骞跺彂鎶鏈傚疄鐜板苟鍙戞妧鏈浉褰撳鏉傦紝鏈瀹规槗鐞嗚В鐨勬槸 鈥滄椂闂寸墖杞 杞繘绋嬭皟搴︾畻娉 鈥濓紝瀹冪殑鎬濇兂绠鍗曚粙缁嶅涓嬶細鍦ㄦ搷浣滅郴缁熺殑绠$悊涓嬶紝鎵鏈夋鍦ㄨ繍 琛岀殑杩涚▼...
  • 浠涔堟槸杩涚▼,浠涔堟槸绾跨▼,浠涔堟椂鍊欑敤绾跨▼
    绛旓細1.杩涚▼鏄寚鍦ㄧ郴缁熶腑姝e湪杩愯鐨勪竴涓簲鐢ㄧ▼搴忥紱绾跨▼鏄郴缁熷垎閰嶅鐞嗗櫒鏃堕棿璧勬簮鐨勫熀鏈崟鍏冿紝鎴栬呰杩涚▼涔嬪唴鐙珛鎵ц鐨勪竴涓崟鍏冦2.鐩稿杩涚▼鑰岃█锛岀嚎绋嬫槸涓涓洿鍔犳帴杩戜簬鎵ц浣撶殑姒傚康锛屽畠鍙互涓庤繘绋涓殑鍏跺畠绾跨▼鍏变韩鏁版嵁锛屼絾鎷ユ湁鑷繁鐨勬爤绌洪棿锛屾嫢鏈夌嫭绔嬬殑鎵ц搴忓垪銆3.澶氱嚎绋閫傚簲浜骞跺彂鐜鐨勯渶姹傘4.杩樿鐞嗚В骞惰...
  • 绾跨▼鍜岃繘绋鐨勫尯鍒
    绛旓細3銆佺嚎绋嬩箣闂寸殑閫氫俊鏇存柟渚匡紝鍚屼竴杩涚▼涓嬬殑绾跨▼鍏变韩鍏ㄥ眬鍙橀噺銆侀潤鎬佸彉閲忕瓑鏁版嵁锛岃岃繘绋嬩箣闂寸殑閫氫俊闇瑕佷互閫氫俊鐨勬柟寮(IPC)杩涜銆備笉杩囧浣曞鐞嗗ソ鍚屾涓庝簰鏂ユ槸缂栧啓澶氱嚎绋绋嬪簭鐨勯毦鐐广4銆佷絾鏄澶氳繘绋绋嬪簭鏇村仴澹紝澶氱嚎绋嬬▼搴忓彧瑕佹湁涓涓嚎绋嬫鎺夛紝鏁翠釜杩涚▼涔熸鎺変簡锛岃屼竴涓繘绋嬫鎺夊苟涓嶄細瀵瑰彟澶栦竴涓繘绋嬮犳垚褰卞搷锛屽洜涓...
  • 扩展阅读:软件窗口大小自由调整 ... 服务器并发量一般多少 ... 电脑如何切换两个界面 ... 500并发相当于多少人 ... 多个窗口怎么来回切换 ... python 多进程并发 ... 一般项目的合格率为90% ... 5000用户的并发量多大 ... 为支持多进程的并发执行 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网