涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼

涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼

鏈�杩戝湪鎬ц兘璋冭瘯鏃�,鍙戠幇浜嗕竴涓湁瓒g殑鐜拌薄,鎴戞妸浠g爜绠�鍖栧悗濡備笅.

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start...");
            DoSomething();
            Console.WriteLine("Ending...");
            Console.ReadLine();
        }

        static void DoSomething()
        {
            var sum="";
            for (int i = 2; i < int.MaxValue; i++)
            {
                sum += "s";
            }
            Console.WriteLine(sum.Length);
        }
    }

鍙互鐪嬪埌,闈炲父绠�鍗曠殑涓�娈典唬鐮�,褰撴垜鐢╓indows鐨勬�ц兘鐩戞祴宸ュ叿鏉ョ洃娴嬫瘡涓鐞嗗櫒鐨勪娇鐢ㄧ巼鏃�,鍙戠幇浜嗕竴涓湁瓒g殑鐜拌薄.

涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼_第1张图片

鎴戠數鑴戞槸鍥涙牳鐨処7澶勭悊鍣�,鎵ц浠ヤ笂浠g爜鍚�,鍗村彧鏈夊鐞嗗櫒2涓�鐩村鐞嗕竴涓瘮杈冮珮鐨勫崰鐢ㄧ巼,鑰屽叾浠栫殑涓変釜鍒欏浜庝竴涓�"鎽搁奔娣锋棩瀛�"鐨勭姸鎬�,澶勭悊鍣�1鍒欐洿杩囧垎,浣犳槸鐫$潃浜嗗悧?

涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼_第2张图片

鍚屼竴鍙扮數鑴戜笂鐨勫鐞嗗櫒,闅鹃亾澶у涓嶆槸鏈夌鍚屼韩,鏈夐毦鍚屽綋鐨勫悧? 涓轰粈涔堝叾浠栧嚑涓鐞嗗櫒灏卞繊蹇冪湅鐫�澶勭悊鍣�2姘存繁鐏儹鍛�?

鐒跺悗,鎴戝氨鍜岃繖涓棶棰樻纾曚笂浜�,鎭惰ˉ浜嗕竴浜涙搷浣滅郴缁熶笌澶氱嚎绋嬬殑鐭ヨ瘑,鐜板湪鎶婁竴鍐欑煡璇嗙偣涓茶捣鏉�,鍒嗕韩缁欏ぇ瀹�.

鍒嗙骇淇濇姢鍩�

鐢佃剳鎿嶄綔绯荤粺鎻愪緵涓嶅悓鐨勮祫婧愯闂骇鍒�傚湪璁$畻鏈轰綋绯荤粨鏋勪腑锛孯ings鏄敱涓や釜鎴栨洿澶氱殑鐗规潈鎬佺粍鎴愩�傚湪涓�浜涚‖浠舵垨鑰呭井浠g爜绾у埆涓婃彁渚涗笉鍚岀壒鏉冩�佹ā寮忕殑CPU鏋舵瀯涓婏紝淇濇姢鐜�氬父閮芥槸纭欢寮哄埗鐨勩�俁ings鏄粠鏈�楂樼壒鏉冪骇锛堥�氬父琚彨浣�0绾э級鍒版渶浣庣壒鏉冪骇锛堥�氬父瀵瑰簲鏈�澶х殑鏁板瓧锛夋帓鍒楃殑銆傚湪澶у鏁版搷浣滅郴缁熶腑锛孯ing 0鎷ユ湁鏈�楂樼壒鏉冿紝骞朵笖鍙互鍜屾渶澶氱殑纭欢鐩存帴浜や簰锛堟瘮濡侰PU锛屽唴瀛橈級銆傚湪Windows涓�, User Space,涔熷氨鏄垜浠嚜宸卞畨瑁呯殑閭d簺搴旂敤绋嬪簭澶勭悊Ring 3,鑰岀郴缁熷唴鏍稿氨鍦≧ing 0.

瀵逛簬杩欎釜闂,涓句釜渚嬪瓙,澶у灏卞ソ鐞嗚В浜�.
閽变笉鏄竾鑳界殑,浣嗘病閽辨槸涓囦竾涓嶈兘鐨�,鎵�浠ラ挶鏄竴涓搴殑閲嶄腑涔嬮噸,瀹堕噷鑰佸﹩鍛负浜嗚繖涓鐨勯暱娌讳箙瀹�,鎺屾彙瀹堕噷鐨勮储鏀垮ぇ鏉�,鎶婂閲岀殑灏忛噾搴撳畧寰楁姝荤殑,浣嗚繖灏辨剰鍛崇潃鎴戞病閽辫姳浜嗗悧?褰撶劧涓嶆槸,鍜岃�佸﹩澶т汉鐢ㄦ褰撶悊鐢辩敵璇蜂笉灏卞畬浜嬩簡?馃槀
鐢宠閫氳繃涔嬪悗,鑰佸﹩澶т汉鏄厑璁告垜鐩存帴浼告墜鍘诲閲屽皬閲戝簱鎷块挶鍚�? 閭e綋鐒朵笉鏄�,濡傛灉鎴戜竴鎶撲竴澶ф妸灏卞嵄闄╀簡,鎵�浠ヨ繕寰楃粡杩囧ス鐨勬墜浠庡皬閲戝簱鎷块挶缁欐垜.
杩欎釜鐜拌薄,鎴戣寰椾篃鏄竴绉嶅垎绾т繚鎶ゅ煙,鎵�浠ュ憿,涔熶竴鐩村鑰佸﹩澶т汉鐨勮繖绉嶄竾鎭惰寰勮〃绀虹悊瑙�.

鎿嶄綔绯荤粺涔熸槸杩欐牱,CPU,鍐呭瓨杩欎簺纭欢鏄數鑴戝畨鍏ㄧ殑鏍规湰,鎵�浠ヤ笉鑳界粰绗笁鏂硅蒋浠舵搷浣滄潈闄�,鎯虫搷浣滅‖浠�,灏遍�氳繃鐢盧ing 0涓唴鏍�(Kernel)鏆撮湶鐨勪弗鏍糀pi杩涜.

鐢ㄦ埛绾х嚎绋嬩笌鍐呮牳绾х嚎绋�

绾跨▼涓昏鏈変互涓嬩袱绉嶅疄鐜版柟寮�-

  • 鐢ㄦ埛绾х嚎绋� -鐢ㄦ埛鎵樼绾跨▼銆�
  • 鍐呮牳绾х嚎绋� -浣滅敤鍦ㄥ唴鏍革紙鎿嶄綔绯荤粺鏍稿績锛変笂鐨勬搷浣滅郴缁熺鐞嗙殑绾跨▼銆�

涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼_第3张图片

鍦ㄤ笂鍥句腑,User Space灏卞彲浠ョ悊瑙d负鎴戜笂涓珷鑺備腑鐨凴ing 3,鑰孠ernel Space灏辨槸Ring 0, 鍦≧ing 0涓�,鏄彲浠ョ洿鎺ユ搷浣淐PU,鍐呭瓨绛夌‖浠剁殑,鑰孯ing 3涓嶈.

浠ヤ笅鏄敤鎴风骇绾跨▼涓庡唴鏍哥骇绾跨▼鐨勫姣�.

鐢ㄦ埛绾х嚎绋� 鍐呮牳绾х嚎绋�
鐢ㄦ埛绾跨▼鐢辩敤鎴峰疄鐜般�� 鍐呮牳绾跨▼鐢監S瀹炵幇銆�
鎿嶄綔绯荤粺鏃犳硶璇嗗埆鐢ㄦ埛绾х嚎绋嬨�� 鍐呮牳绾跨▼琚搷浣滅郴缁熻瘑鍒��
鐢ㄦ埛绾跨▼鐨勫疄鐜板緢瀹规槗銆� 鍐呮牳绾跨▼鐨勫疄鐜板緢澶嶆潅銆�
涓婁笅鏂囧垏鎹㈡椂闂存洿灏戙�� 涓婁笅鏂囧垏鎹㈡椂闂存洿闀裤��
涓婁笅鏂囧垏鎹笉闇�瑕佺‖浠舵敮鎸併�� 闇�瑕佺‖浠舵敮鎸併��
濡傛灉涓�涓敤鎴风骇鍒殑绾跨▼鎵ц闃绘鎿嶄綔锛屽垯鏁翠釜杩囩▼灏嗚闃绘銆� 濡傛灉涓�涓唴鏍哥嚎绋嬫墽琛岄樆姝㈡搷浣滐紝鍒欏彟涓�绾跨▼鍙互缁х画鎵ц銆�
鏃犳硶鐩存帴鍙戞尌澶氭牳澶勭悊鍣ㄧ殑浼樺娍 鍙互浜彈澶氬鐞嗚捣甯︽潵鐨勫ソ澶�

鍏朵腑,闈炲父閲嶈鐨勪竴鐐�,鐢ㄦ埛绾х嚎绋嬫棤娉曠洿鎺ュ彂鎸ュ鏍稿鐞嗗櫒鐨勪紭鍔�,闅鹃亾鎴戜滑缂栧啓鍑烘潵鐨勪唬鐮佸彧鑳藉湪涓�涓鐞嗗櫒涓婅繍琛屼簡鍚�?杩欏氨瑕佽璁茬敤鎴风骇绾跨▼妯″瀷.

鐢ㄦ埛绾х嚎绋嬫ā鍨�

閫氬父锛屽唴鏍哥骇绾跨▼鍙互浣跨敤涓変釜妯″瀷涔嬩竴鏉ユ墽琛岀敤鎴风骇绾跨▼銆�

  • Many-to-one
  • One-to-one
  • Many-to-many

鎵�鏈夋ā鍨嬮兘灏嗙敤鎴风骇绾跨▼鏄犲皠鍒板唴鏍哥骇绾跨▼,涓�涓唴鏍哥嚎绋嬪氨鍍忎竴涓鐞嗗櫒,瀹冩槸绯荤粺缂栨帓浠诲姟鐨勫熀鏈崟浣嶃��

Many-to-one

澶氬涓�妯″瀷灏嗚澶氱敤鎴风骇绾跨▼鏄犲皠鍒颁竴涓唴鏍哥骇绾跨▼銆傜嚎绋嬬鐞嗘槸閫氳繃绾跨▼搴撳湪鐢ㄦ埛绌洪棿涓畬鎴愮殑銆傚綋绾跨▼杩涜闃诲鐨勭郴缁熻皟鐢ㄦ椂锛屾暣涓繃绋嬪皢琚樆濉炪�備竴娆″彧鑳芥湁涓�涓嚎绋嬭闂唴鏍革紝鍥犳澶氫釜绾跨▼鏃犳硶鍦ㄥ澶勭悊鍣ㄤ笂骞惰杩愯銆�
濡傛灉鐢ㄦ埛绾х嚎绋嬪簱鏄互鎿嶄綔绯荤粺涓嶆敮鎸佺殑鏂瑰紡瀹炵幇鐨勶紝鍒欏唴鏍哥嚎绋嬪皢浣跨敤澶氬涓�鍏崇郴妯″瀷銆�
涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼_第4张图片
鍐呮牳瀵圭敤鎴风骇绾跨▼涓嶅彲瑙�,鍦ㄥ畠鐪奸噷鍙湁鍐呮牳绾跨▼,鑰屽湪鍐呮牳绾跨▼鐨勭溂閲�,涓�涓繘绋嬫棤闈炲氨鏄竴涓伓灏旇琚畠缈荤墝鐨勯粦鐩掑瓙,杩涚▼璐熻矗鐢ㄦ埛绾跨▼鐨勮皟搴︿笌鎵ц.

One-to-one

鍦ㄨ繖绉嶆ā鍨嬩笅鐢ㄦ埛绾х嚎绋嬩笌鍐呮牳绾х嚎绋嬩箣闂村瓨鍦ㄤ竴瀵逛竴鐨勫叧绯汇�傝妯″瀷姣斿瀵逛竴妯″瀷骞跺彂鎬уソ,褰撲竴涓嚎绋嬭繘琛岄樆濉炵郴缁熻皟鐢ㄦ椂锛屽畠杩樺厑璁稿彟涓�涓嚎绋嬭繍琛�,鎵�浠ュ畠鏀寔澶氫釜绾跨▼浠ュ湪澶勭悊鍣ㄤ笂骞惰鎵ц銆�
璇ユā鍨嬬殑缂虹偣鏄垱寤虹敤鎴风嚎绋嬮渶瑕佺浉搴旂殑鍐呮牳绾跨▼,鑰屽垱寤哄唴鏍哥嚎绋嬪紑閿�鏄緢澶х殑.
涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼_第5张图片

Many-to-many

鍦ㄥ瀵瑰妯″瀷涓紝m涓唴鏍哥嚎绋嬪鐞唍涓敤鎴风嚎绋�,鍏朵腑m < n. 璇ユā鍨嬪苟鍙戞�ф渶濂�,骞朵笖涓嶇敤鍒涘缓杩囧鐨勫唴鏍哥嚎绋�,娑夊強鍒扮殑绾跨▼鍒囨崲鍚屾鐨勫紑閿�涔熸洿灏�.
涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼_第6张图片

鐪熺浉娴嚭姘撮潰

.Net鐨勪唬鐮佷綔涓烘墭绠′唬鐮佸湪鈥滄墭绠$嚎绋嬧�濅笂鎵ц锛岃�屾墭绠$嚎绋嬫槸鍦–LR铏氭嫙鏈轰笂鎵ц鐨勮櫄鎷熺嚎绋�,涔熸槸灞炰簬鐢ㄦ埛绾х嚎绋�.

姝eJIT缂栬瘧鍣ㄥ皢鈥滆櫄鎷熲�� IL鎸囦护鏄犲皠鍒板湪鐗╃悊璁$畻鏈轰笂鎵ц鐨勬湰鏈烘寚浠や竴鏍凤紝CLR鐨勭嚎绋嬪熀纭�缁撴瀯涔熷皢鈥滆櫄鎷熲�濇墭绠$嚎绋嬫槧灏勫埌鎿嶄綔绯荤粺鎻愪緵鐨勫唴鏍哥嚎绋嬨��

璇村埌杩欓噷,鎴戜滑涔熷樊涓嶅鏈変簡鍓嶉潰鎴戣鐨勯偅涓幇璞$殑绛旀浜�,骞堕潪鍏朵粬澶勭悊鍣ㄤ笉鎯充笌閭d釜姘存繁鐏儹鐨勫鐞嗗櫒鏈夐毦鍚屼韩,鑰屾槸鎴戞病鏈変娇鐢ㄥ绾跨▼,鎵�浠ユ墽琛岀殑绋嬪簭鍙湁涓�涓富绾跨▼,涔熷氨鏄鐢ㄦ埛绾跨▼鏁颁负1.鍙兘鏄痮ne to one 妯″瀷,鎵�浠ュ彧鏈変竴涓鐞嗗櫒鑳藉弬涓庡伐浣�.

鏃㈢劧鐭ラ亾浜嗛噷闈㈢殑鍘熺悊,閭f垜浠氨瀵瑰墠鏂囦腑鐨勭▼搴忚繘琛屾敼閫�,鍒涘缓鍥涗釜绾跨▼鏉ユ墽琛屼换鍔�,浼氫笉浼氭墍鏈夊鐞嗗櫒閮藉繖璧锋潵鍛�?

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start...");
            for (var i = 0; i < 4; i++)
            {
                var td=new Thread(DoSomething);
                td.Start();
            }
            Console.WriteLine("Ending...");
            Console.ReadLine();
        }

        static void DoSomething()
        {
            var sum="";
            for (int i = 2; i < int.MaxValue; i++)
            {
                sum += "s";
            }
            Console.WriteLine(sum.Length);
        }
    }

鍙互鐪嬪埌,杩欐澶у鐨勬浼愰兘鍋氬埌浜嗘儕浜虹殑涓�鑷�,鍥涗釜澶勭悊鍣ㄩ兘琚皟鐢ㄨ捣鏉�,鍔犱笂涓荤嚎绋�,杩欓噷鑷冲皯鏈変簲涓敤鎴风嚎绋�,鎵�浠ヨ繖閲屽簲璇ユ槸many to many鐨勬ā鍨嬩簡.

涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼_第7张图片

璋㈣阿瑙傝祻!

鍙傝�冭祫鏂�:
https://en.wikipedia.org/wiki/Protection_ring
https://stackoverflow.com/questions/15093510/whats-c-sharp-threading-type
https://github.com/dotnet/coreclr/blob/master/Documentation/botr/threading.md#clr-threading-overview

你可能感兴趣的:(涓嶄竴鏍风殑瑙掑害涓�绐ュ绾跨▼)