1. مفهوم العملية والخيط
(1) في أنظمة التشغيل التقليدية ، لا يمكن أن تعمل البرامج بشكل مستقل ، وبما أن الوحدات الأساسية لتخصيص الموارد والتشغيل المستقل كلها عمليات.
في الأنظمة التي لا تحتوي على نظام تشغيل ، فإن طريقة تنفيذ البرامج هي التنفيذ المتسلسل ، أي أنه يجب تنفيذ برنامج واحد قبل تنفيذ برنامج آخر ؛ في بيئة متعددة البرامج ، يُسمح بتنفيذ برامج متعددة بشكل متزامن. هناك اختلافات كبيرة بين طريقتي تنفيذ البرنامج. إن هذه هي بالضبط خاصية التنفيذ المتزامن للبرامج التي تؤدي إلى إدخال مفهوم العمليات في نظام التشغيل.
نظرًا لأن الأشخاص اقترحوا مفهوم العمليات في الستينيات ، فقد تم استخدام العمليات دائمًا في نظام التشغيل كوحدة أساسية يمكن أن تحتوي على موارد وتشغيلها بشكل مستقل. حتى منتصف الثمانينيات من القرن الماضي ، اقترح الأشخاص وحدة أساسية يمكن أن تعمل بشكل مستقل ، الخيوط ، وهي أصغر من العمليات ، لمحاولة استخدامها لزيادة درجة التنفيذ المتزامن للبرامج داخل النظام ، وبالتالي زيادة إنتاجية النظام. خاصة بعد دخول التسعينيات ، تطورت أنظمة متعددة المعالجات بسرعة. يمكن أن تحسن الخيوط بشكل أفضل التنفيذ الموازي للبرامج من العمليات وممارسة مزايا المعالجات المتعددة بالكامل. لذلك ، تم تقديم المواضيع في نظام التشغيل متعدد المعالجات الذي تم إطلاقه في السنوات الأخيرة لتحسين أداء نظام التشغيل.
― تم مقتطف أعلاه من "نظام تشغيل الكمبيوتر - الذي تم تحريره بواسطة Tang Xiaodan وآخرون - الإصدار 3" (عنوان التنزيل)
(2) الشكل التالي هو تفسير من مستخدمي Zhihu:
من خلال الفهم العام المذكور أعلاه ، نعرف أساسًا ما تفعله الخيوط والعمليات. لذلك دعونا نلخص مفهوم العمليات والموضوعات أدناه:
(3) العملية هي نشاط تشغيل لبرنامج في جهاز كمبيوتر حول مجموعة بيانات معينة ، وهي الوحدة الأساسية لتخصيص موارد النظام وجدولةها ، وهي أساس بنية نظام التشغيل. في هياكل الكمبيوتر الموجه نحو العملية المبكرة ، كانت العمليات كيانات التنفيذ الأساسية للبرامج ؛ في هياكل الكمبيوتر المعاصرة الموجهة نحو الخيوط ، كانت العمليات حاويات من الخيوط. البرنامج هو وصف للتعليمات والبيانات وشكله التنظيمي ، والعملية هي كيان لبرنامج.
(4) المواضيع ، التي تسمى أحيانًا العمليات الخفيفة (LWP) ، هي أصغر وحدة لتنفيذ البرنامج. المواضيع هي عملية تحكم متسلسلة واحدة في البرنامج. وحدة التنفيذ المستقلة نسبيًا وقابلة للتطبيق في هذه العملية هي الوحدة الأساسية للجدولة المستقلة وإرسال وحدة المعالجة المركزية في النظام ، والتي تشير إلى وحدة الجدولة لبرامج التشغيل. تشغيل مؤشرات ترابط متعددة في وقت واحد في برنامج واحد لإكمال أعمال مختلفة ، تسمى MultiThreading.
(5) العلاقة بين العملية والخيط:
2. Java تنفذ طريقة متعددة الخيوط
(1) روث الخيط وأعد كتابة طريقة التشغيل ()
الطبقة العامة myThread يمتد Thread {Override public void run () {بينما (true) {system.out.println (this.currentThRead (). getName ()) ؛ }} public static void main (string [] args) {mythread thread = new MyThread () ؛ thread.start () ؛ // الطريقة الصحيحة لبدء مؤشر ترابط}}نتيجة الإخراج:
Thread-0thread-0thread-0 ...
بالإضافة إلى ذلك ، تحتاج إلى فهم أن طريقة Start () هي طريقة Start () بدلاً من طريقة Run (). إذا تم استخدام طريقة Run () ، فهي طريقة عادية للتنفيذ.
(2) تنفيذ الواجهة القابلة للتشغيل
الطبقة العامة myrunnable تنفس Runnable {Override public void run () {system.out.println ("123") ؛ } main static void main (string [] args) {myrunnable myrunnable = new myrunnable () ؛ موضوع الموضوع = مؤشر ترابط جديد (MyRunnable ، "T1") ؛ thread.start () ؛ }}3. سلامة الموضوع
مفهوم سلامة مؤشرات الترابط: عندما تصل مؤشرات الترابط المتعددة إلى فئة معينة (كائن أو طريقة) ، يمكن للفئة دائمًا إظهار السلوك الصحيح ، ثم هذه الفئة (الكائن أو الطريقة) آمنة مؤشر ترابط.
سلامة الخيط هي عند الوصول إلى قوائم متعددة ، يتم اعتماد آلية قفل. عندما يصل مؤشر ترابط إلى بيانات معينة من الفصل ، يتم حمايته. لا يمكن لخيوط أخرى الوصول إليها حتى ينتهي الخيط من قراءته ، ولا يمكن لخيوط أخرى استخدامها. لن يكون هناك عدم تناسق البيانات أو تلوث البيانات. المواضيع ليست آمنة ، مما يعني أنها لا توفر حماية للوصول إلى البيانات. من الممكن أن تقوم مؤشرات الترابط المتعددة بتغيير البيانات تلو الأخرى ، مما يؤدي إلى أن تكون البيانات الناتجة قذرة. آلية القفل المشتركة هنا هي: متزامنة
4. المعدل المتزامن
(1) متزامن: يمكنك إضافة أقفال إلى أي كائن وطريقة ، ويسمى الرمز المقفلة "منطقة Mutex" أو "المنطقة الحرجة".
(2) ** لا تستخدم ** مثيل متزامن (الرمز أ):
الطبقة العامة myThread يمتد Thread {private int count = 5 ؛ Override public void run () {count-؛ system.out.println (this.currentThread (). getName () + "count:" + count) ؛} public static void main (] موضوع (MyThread ، "Thread2") ؛ Thread Thread3 = مؤشر ترابط جديد (MyThread ، "Thread3") ؛ Thread Thread4 = New Thread (MyThread ، "Thread4") ؛ Thread Thread5 = New Thread (MyThread ، "Thread5") ؛ Thread1.Start () ؛نتيجة واحدة للإخراج هي كما يلي:
Thread3 Count: 2Thread4 Count: 1Thread1 Count: 2Thread2 Count: 3Thread5 Count: 0
يمكن ملاحظة أن النتيجة أعلاه غير صحيحة ، لأن سلسلة مؤشرات ترابط متعددة تعمل على تشغيل طريقة التشغيل () في نفس الوقت وتعديل العدد ، مما يؤدي بدوره إلى خطأ.
(3) ** استخدم ** مثيل متزامن (الرمز ب):
الطبقة العامة MyThread يمتد الموضوع {private int count = 5 ؛ Override public synchronized void run () {count-- ؛ System.out.println (this.currentThRead (). getName () + "count:" + count) ؛ } public static void main (string [] args) {mythread myThread = new MyThread () ؛ Thread Thread1 = موضوع جديد (MyThread ، "Thread1") ؛ Thread Thread2 = مؤشر ترابط جديد (MyThread ، "Thread2") ؛ Thread Thread3 = مؤشر ترابط جديد (myThread ، "Thread3") ؛ Thread Thread4 = مؤشر ترابط جديد (MyThereD ، "Thread4") ؛ Thread Thread5 = مؤشر ترابط جديد (myThread ، "Thread5") ؛ thread1.start () ؛ thread2.start () ؛ thread3.start () ؛ thread4.start () ؛ thread5.start () ؛ }}نتيجة الإخراج:
Thread1 Count: 4Thread2 Count: 3Thread3 Count: 2Thread5 Count: 1Thread4 Count: 0
يمكن ملاحظة أن الفرق بين الكود A والرمز B هو أن يتم إضافة تعديل متزامن إلى طريقة Run ().
الوصف كما يلي:
عند الوصول إلى سلسلة مؤشرات ترابط متعددة إلى طريقة تشغيل MyThread ، إذا تم استخدام التعديل المتزامن ، فسيتم معالجة Multi-Thread في قائمة انتظار (يتم تحديد قائمة الانتظار هنا وفقًا لترتيب تخصيص وحدة المعالجة المركزية). إذا أراد مؤشر ترابط تنفيذ الكود في طريقة التعديل المتزامن ، فإنه يحاول أولاً الحصول على القفل. إذا حصل على القفل ، فإنه ينفذ محتويات هيكل الكود المتزامن. إذا لم يتمكن من الحصول على القفل ، فسيستمر الخيط في محاولة الحصول على القفل حتى يحصل عليه. علاوة على ذلك ، تتنافس مؤشرات ترابط متعددة على القفل في نفس الوقت ، مما يعني أن المنافسة ستحدث.
5. كائن لديه قفل! مواضيع متعددة وأقفال متعددة!
ما هو ، كائن واحد يحتوي على قفل واحد ، ومواضيع متعددة لها أقفال متعددة! أولاً ، دعنا نلقي نظرة على رمز المثال أدناه (الرمز C):
الفئة العامة multithread {private int num = 200 ؛ printnum printnum المزامنة العامة (سلسلة threadname ، علامة السلسلة) {if (tag.equals ("a")) {num = num - 100 ؛ system.out.println (threadname + "tag a ، set num over!") ؛ } آخر {num = num - 200 ؛ System.out.println (threadname + "tag" + tag + "، num =" + num) ؛ } رميات الفراغ الثابتة العامة (سلسلة [] args) interruptedException {Final MultiThRead MultiThread1 = جديد multiThread () ؛ multithread النهائي multithread2 = جديد multiThread () ؛ مؤشر ترابط جديد (جديد RunNable () {public void run () {multiThRead1.printnum ("thread1" ، "a") ؛}}). start () ؛ thread.sleep (5000) ؛ System.out.println ("انتظر 5 ثوان للتأكد من تنفيذ Thread1!") ؛ New Thread (new RunNable () {public void run () {multiThRead2.PrintNum ("thread2" ، "b") ؛}}). start () ؛ }}نتيجة الإخراج:
Thread1 Tag A ، Set num Over! Thread1 Tag A ، num = 100wait 5 Seconds للتأكد من تنفيذ Thread1! Thread2 Tag B ، اضبط NUM Over! Thread2 Tag B ، num = 0
يمكن ملاحظة أن هناك كائنان: multithread1 و multithread2. إذا استخدمت كائنات متعددة نفس القفل ، فيجب أن تكون نتيجة التنفيذ أعلاه: Thread2 Tag B ، num = -100. لذلك ، كل كائن لديه قفل هذا الكائن.
الأقفال التي تم الحصول عليها بواسطة الكلمة الرئيسية المتزامنة هي أقفال الكائن ، بدلاً من معالجة قطعة من الكود أو الطريقة كأقفال. لذلك ، في رمز المثال أعلاه ، الذي ينفذ مؤشر ترابط أولاً طريقة الكلمات الرئيسية المتزامنة ، يحتفظ مؤشر الترابط بقفل الكائن الذي تنتمي إليه الطريقة. يحصل مؤشر الترابط على قفلتين مختلفتين من كائنين مختلفين ، ويكملان بعضهما البعض.
لذلك ، في السيناريوهات العادية ، يجب أن يكون هناك موقف تعمل فيه جميع الكائنات على عدد متغير ، فكيف يتم تنفيذه؟ من السهل جدًا إضافة ثابت. نحن نعلم أن جميع الكائنات في هذه الفئة لها نفس المرجع ، بغض النظر عن عدد الكائنات التي يتم تأهيلها ، والمكالمة هي طريقة ، والرمز كما يلي (الرمز D):
الطبقة العامة multithread {private static int num = 200 ؛ printnum printnum الثابتة الثابتة العامة (سلسلة threadname ، علامة السلسلة) {if (tag.equals ("a")) {num = num - 100 ؛ system.out.println (threadname + "tag a ، set num over!") ؛ } آخر {num = num - 200 ؛ System.out.println (ThreadName + "Tag B ، Set num Over!") ؛ } system.out.println (threadname + "tag" + tag + "، num =" + num) ؛ } رميات الفراغ الثابتة العامة (سلسلة [] args) interruptedException {Final MultiThRead MultiThread1 = جديد multiThread () ؛ multithread النهائي multithread2 = جديد multiThread () ؛ مؤشر ترابط جديد (جديد RunNable () {public void run () {multiThRead1.printnum ("thread1" ، "a") ؛}}). start () ؛ thread.sleep (5000) ؛ System.out.println ("انتظر 5 ثوان للتأكد من تنفيذ Thread1!") ؛ New Thread (new RunNable () {public void run () {multiThRead2.PrintNum ("thread2" ، "b") ؛}}). start () ؛ }}نتيجة الإخراج:
Thread1 Tag A ، Set num Over! Thread1 Tag A ، num = 100wait 5 Seconds للتأكد من تنفيذ Thread1! Thread2 Tag B ، تعيين NUM Over! Thread2 Tag B ، num = -100
يمكن ملاحظة أن إضافة تعديل ثابت للمتغيرات والأساليب يمكن أن يدرك السيناريوهات التي نحتاجها. كما يوضح أنه لأساليب التعديل الثابتة غير الستاطية أو المتغيرات ، كائن مغلق.
6. أقفال كائن متزامن وغير متزامن
(1) متزامن
مفهوم التزامن هو المشاركة. نحتاج أن نعرف أن كلمة "مشاركة" ليست مورد مشترك ، ليست هناك حاجة لمزامنة ، أي ليست هناك حاجة إلى قفلها ؛
الغرض من التزامن هو ضمان سلامة المواضيع. في الواقع ، من أجل سلامة الخيط ، يجب الوفاء بخصائصين أساسيتين: الذرة والرؤية ؛
(2) غير متزامن: غير متزامن
مفهوم التزامن هو الاستقلال ، دون أي قيود بين بعضها البعض ، وليس هناك علاقة بين الاثنين.
(3) رمز عينة:
الفئة العامة myObject {public void method () {system.out.println (thread.currentThRead (). getName ()) ؛ } public static void main (string [] args) {final myobject myobject = new myobject () ؛ Thread T1 = New Thread (New RunNable () {public void run () {myobject.method () ؛}} ، "T1") ؛ Thread T2 = New Thread (New RunNable () {public void run () {myobject.method () ؛}} ، "T2") ؛ t1.start () ؛ t2.start () ؛ }}في الكود أعلاه ، الطريقة () هي طريقة غير متزامنة.
لخص
ما ورد أعلاه هو المحتوى الكامل لهذه المقالة حول الحل الأولي لمفهوم الترابط والعملية ومزامنة في جافا متعددة الخيوط. آمل أن يكون ذلك مفيدًا للجميع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة وإشرافها ، وسيقوم المحرر بالرد على الجميع في الوقت المناسب.