JavaRush /وبلاگ جاوا /Random-FA /ترجمه: 50 سوال برتر مصاحبه بر اساس موضوع. قسمت 1.
KapChook
مرحله
Volga

ترجمه: 50 سوال برتر مصاحبه بر اساس موضوع. قسمت 1.

در گروه منتشر شد
قسمت اول ترجمه مقاله اصلی Top 50 Java Thread Interview Quests Answers for Freshers, Experiences Programmers. بخش دوم. توجه: مقاله بزرگ است، به همین دلیل در یک موضوع قرار نمی گیرد. علاوه بر این، بسیار پیچیده است، من تمام تلاشم را کردم تا آن را در گوگل جستجو کنم، اما هنوز. بنابراین، از شرکت کنندگانی که به زبان انگلیسی مسلط هستند، می خواهیم در صورتی که مطلبی را اشتباه متوجه شده اند یا آن را اشتباه ترجمه کرده اند، نگاهی به اصل آن بیاندازند و آن را با ترجمه مقایسه کنند. پیشاپیش از شما متشکرم. در هر مصاحبه ای، ارشد یا جوان، با تجربه یا مبتدی، با چند سوال در مورد موضوعات، موازی سازی و چند رشته ای مواجه خواهید شد. در واقع، این پشتیبانی داخلی برای همزمانی یکی از بزرگترین نقاط قوت جاوا است و به آن کمک کرده است تا بین کارآفرینان و برنامه نویسان محبوبیت پیدا کند. بیشتر موقعیت‌های توسعه‌دهنده جاوا به مهارت‌های چند رشته‌ای عالی و تجربه توسعه، اشکال‌زدایی و تنظیم برنامه‌های کاربردی با کارایی بالا و تاخیر کم نیاز دارند. بنابراین، یکی از مهارت های مورد نیاز در مصاحبه است. در یک مصاحبه معمولی جاوا، مصاحبه کننده به آرامی با مفاهیم اولیه Thread ها شروع می کند، سوالاتی مانند چرایی موضوعات مورد نیاز، نحوه ایجاد آنها، بهترین راه ایجاد آنها، ارث بردن از Thread یا پیاده سازی Runnable را می پرسد و سپس به آرامی حرکت می کند. در مورد مشکلات همزمانی، مشکلات پیش آمده در توسعه برنامه های موازی، ابزارهای همزمان سطح بالا معرفی شده در JDK 1.5، اصول و الگوهای طراحی برنامه های کاربردی موازی، و مشکلات کلاسیک چند رشته ای. از آنجایی که فقط دانستن اصول چند رشته ای کافی نیست، باید بدانید که چگونه با مسائل همزمانی مانند بن بست، شرایط مسابقه، ناهماهنگی حافظه و مسائل مختلف ایمنی رشته مقابله کنید. این مهارت ها به طور کامل آزمایش می شوند و چالش های مختلف چند رشته ای و همزمانی را ارائه می دهند. بسیاری از توسعه دهندگان جاوا معمولاً سؤالات را قبل از خود مصاحبه می خوانند، که چیز بدی نیست، اما باید این را درک کنید. همچنین، انباشتن سوالات و انجام تمرینات مشابه زمان زیادی را تلف می کند، بنابراین من این لیست را ایجاد کردم.
  1. thread در جاوا چیست؟

  2. thread یک مسیر اجرایی مستقل است. هدف آن استفاده از چندین پردازنده موجود در دستگاه است. با استفاده از رشته های متعدد، می توانید سرعت کارهای مربوط به CPU را افزایش دهید. به عنوان مثال، اگر یک رشته 100 میلی ثانیه طول می کشد تا یک کار کامل شود، می توانید از 10 رشته برای کاهش آن کار به 10 میلی ثانیه استفاده کنید. جاوا پشتیبانی عالی از چند رشته ای در سطح زبان ارائه می دهد و این یکی از قوی ترین مزایای آن است.
  3. تفاوت بین Thread ها و Process ها در جاوا؟

  4. یک thread زیرمجموعه ای از یک فرآیند است؛ به عبارت دیگر، یک فرآیند می تواند شامل رشته های زیادی باشد. این دو فرآیند در فضای حافظه متفاوتی در حال اجرا هستند، اما همه رشته‌ها فضای حافظه یکسانی دارند. این را با حافظه پشته ای اشتباه نگیرید، که برای هر رشته متفاوت است و برای ذخیره داده های محلی آن رشته استفاده می شود.
  5. چگونه یک موضوع ایجاد کنیم؟

  6. در سطح زبان، دو راه برای ایجاد یک موضوع وجود دارد. یک شی از کلاس java.lang.Thread یک thread را نشان می دهد، اما برای اجرا به یک وظیفه نیاز دارد، که یک شی است که رابط java.lang.Runnable را پیاده سازی می کند. از آنجایی که کلاس Thread رابط Runnable را پیاده سازی می کند، می توانید با استخراج کلاس خود از Thread یا با پیاده سازی رابط Runnable در آن، متد run() را نادیده بگیرید.
  7. چه زمانی از Runnable و چه زمانی از Thread استفاده کنیم؟

  8. این ضمیمه سوال قبلی است. همانطور که می دانیم، می توان یک رشته را با ارث بردن از کلاس Thread یا با پیاده سازی رابط Runnable ایجاد کرد. این سوال پیش می آید که کدام روش بهتر است و چه زمانی از کدام استفاده کنیم؟ اگر بدانید جاوا از وراثت چند کلاسه پشتیبانی نمی کند اما به شما اجازه می دهد چندین رابط را پیاده سازی کنید، پاسخ به این سوال آسان است. یعنی اگر می‌خواهید از کلاس دیگری ارث بری کنید، بهتر است Runnable را پیاده‌سازی کنید.
  9. تفاوت بین متدهای start() و run()؟

  10. یکی از ترفندهای گذشته بود، اما هنوز به اندازه کافی خوب است که بتوان درک سطحی چند رشته ای را در جاوا تشخیص داد. متد start() برای شروع یک رشته جدید استفاده می شود. حتی با وجود اینکه start() متد run() را به صورت داخلی فراخوانی می‌کند، اما با فراخوانی ساده run () یکسان نیست. اگر run() را به عنوان یک متد معمولی فراخوانی کنید، در همان رشته فراخوانی می‌شود و هیچ رشته جدیدی شروع نمی‌شود، که با فراخوانی متد start() این اتفاق می‌افتد.
  11. تفاوت بین Runnable و Callable؟

  12. هر دو اینترفیس وظایفی را نشان می‌دهند که قرار است در رشته‌های جداگانه اجرا شوند. Runnable از زمان JDK 1.0 وجود داشته است و Callable در JDK 1.5 اضافه شده است. تفاوت اصلی این است که متد call ()Callable می‌تواند مقادیر را برگرداند و استثناها را پرتاب کند، که با متد ()runnable امکان‌پذیر نیست. Calable یک شی Future را برمی گرداند که می تواند حاوی نتیجه یک محاسبه باشد.
  13. تفاوت بین CyclicBarrier و CountDownLatch؟

  14. در حالی که هر دوی این همگام‌کننده‌ها به نخ‌ها اجازه می‌دهند تا برای یکدیگر منتظر بمانند، تفاوت اصلی بین آن‌ها این است که نمی‌توانید از CountDownLatch پس از رسیدن شمارنده آن به صفر دوباره استفاده کنید، اما می‌توانید دوباره از CyclicBarrier حتی پس از شکستن مانع استفاده کنید.
  15. مدل حافظه جاوا چیست؟

  16. مدل حافظه مجموعه‌ای از قوانین و دستورالعمل‌هایی است که به برنامه‌های جاوا اجازه می‌دهد تا به طور قطعی در چندین معماری حافظه، پردازنده و سیستم عامل عمل کنند. این امر به ویژه در مورد چند رشته ای بسیار مهم است. مدل حافظه تضمین می کند که تغییرات ایجاد شده توسط یک رشته برای دیگران قابل مشاهده باشد، یکی از آنها رابطه اتفاق می افتد. این رابطه قوانین متعددی را تعریف می کند که به برنامه نویسان اجازه می دهد تا رفتار برنامه های موازی را پیش بینی و تعیین کنند. به عنوان مثال، ضمانت‌های قبل از وقوع:
    • هر عمل در یک رشته قبل از هر عمل در آن رشته که به ترتیب برنامه دنبال می‌شود، اتفاق می‌افتد که به عنوان قانون ترتیب برنامه نیز شناخته می‌شود.
    • باز کردن قفل مانیتور قبل از هر قفل بعدی همان مانیتور انجام می شود که به عنوان قانون قفل مانیتور نیز شناخته می شود.
    • نوشتن در یک فیلد فرار قبل از هر بار خواندن بعدی آن فیلد، یک قانون متغیر فرار رخ می دهد.
    • فراخوانی به Thread.start() در یک رشته قبل از اینکه هر رشته دیگری متوجه شود که موضوع متوقف شده است، یا پس از موفقیت () Thread.join یا اگر () Thread.isAlive false را برگرداند، قانون ()Thread.start رخ می دهد. .
    • رشته‌ای که توسط رشته‌ای دیگر قطع می‌شود، قبل از اینکه رشته قطع شده متوجه وقفه شود (یا از پرتاب کردن یک InterruptedException یا از بررسی isInterrupted()) رخ می‌دهد، قانون وقفه رشته.
    • پایان سازنده یک شی، قبل از شروع نهایی ساز آن شی، یعنی قانون Finalizer رخ می دهد.
    • اگر A قبل از B اتفاق می افتد و B قبل از C اتفاق می افتد، A قبل از C اتفاق می افتد، به این معنی که اتفاق می افتد - قبل از گذرا بودن را تضمین می کند.
  17. متغیر فرار چیست؟

  18. فرار یک اصلاح کننده خاص است که فقط می تواند برای ویژگی ها اعمال شود. در برنامه های موازی جاوا، تغییرات ایجاد شده توسط رشته های مختلف در ویژگی ها در غیاب همگام سازی برای دیگران قابل مشاهده نیست. یک متغیر فرار تضمین می کند که یک نوشتن قبل از خواندن بعدی اتفاق می افتد، همانطور که در قانون متغیر فرار در سوال قبلی بیان شد.
  19. ایمنی نخ چیست؟ آیا کلاس Vector امن است؟

  20. ایمنی موضوع خاصیتی از یک شی یا کد است که تضمین می کند که هنگام اجرا یا استفاده توسط چندین رشته، کد مطابق مورد نظر رفتار می کند. به عنوان مثال، اگر از یک نمونه شمارنده یکسان در بین رشته‌های متعدد استفاده شود، شمارنده ایمن رشته از هیچ شمارشی رد نمی‌شود. بدیهی است که کلاس های مجموعه را می توان به دو دسته thread-safe و non-thread-safe تقسیم کرد. Vector ایمن است و با همگام سازی روش هایی که حالت Vector را تغییر می دهد به این مهم دست می یابد، از طرف دیگر همتای آن ArrayList ایمن نیست.
  21. شرط مسابقه چیست؟

  22. شرایط مسابقه علت اشکالات ظریف است. همانطور که از نام خود می گوید، یک شرط مسابقه به دلیل مسابقه بین چندین رشته اتفاق می افتد؛ اگر رشته ای که باید اجرا شود ابتدا مسابقه را از دست بدهد و دومی اجرا شود، رفتار کد تغییر می کند و باگ های غیر قطعی ایجاد می کند. اینها برخی از سخت‌ترین اشکال‌ها برای گرفتن و تکثیر به دلیل ماهیت نامرتب مسابقات بین رشته‌ها هستند. نمونه ای از شرایط مسابقه، اجرای نامنظم است.
  23. چگونه می توان تاپیک را متوقف کرد؟

  24. من همیشه گفته‌ام که جاوا برای همه چیز APIهای غنی ارائه می‌کند، اما از قضا راه‌های مناسبی برای متوقف کردن یک رشته ارائه نمی‌کند. JDK 1.0 چندین روش کنترلی داشت، مانند stop()، suspend() و resume()، که در نسخه های بعدی به دلیل تهدیدات احتمالی بن بست به عنوان منسوخ علامت گذاری شدند؛ از آن زمان، توسعه دهندگان Java API هیچ تلاشی برای ارائه رشته انجام نداده اند. -مقاوم - راهی ایمن و زیبا برای متوقف کردن نخ ها. برنامه نویسان عمدتاً بر این واقعیت تکیه می کنند که رشته به محض اتمام اجرای متدهای run() یا call() خود را متوقف می کند. برای توقف دستی، برنامه نویسان از متغیر بولی فرار استفاده می کنند و در صورت وجود حلقه در متد run() مقدار آن را در هر تکرار بررسی می کنند، یا رشته ها را با متد interrupt() قطع می کنند تا به طور ناگهانی کارها را لغو کنند.
  25. چه اتفاقی می افتد زمانی که یک رشته یک استثنا می اندازد؟

  26. این یکی از آن سوالات ترفند خوب است. به عبارت ساده، اگر استثنا مورد نظر قرار نگیرد، thread مرده است؛ اگر یک کنترل کننده برای استثناهای uncack نصب شده باشد، یک callback دریافت خواهد کرد. Thread.UncaughtExceptionHandler یک رابط است که به عنوان یک رابط تودرتو برای کنترل کننده ها تعریف می شود که زمانی که یک رشته به طور ناگهانی به دلیل یک استثنا نامشخص متوقف می شود، فراخوانی می شود. هنگامی که یک رشته به دلیل یک استثناء کشف نشده در شرف از بین رفتن است، JVM وجود UncaughtExceptionHandler را با استفاده از Thread.getUncaughtExceptionHandler() بررسی می کند و متد uncaughtException هندلر را فراخوانی می کند و رشته و استثنا را به عنوان آرگومان ارسال می کند.
  27. چگونه داده ها را بین دو رشته به اشتراک بگذاریم؟

  28. شما می توانید داده ها را بین رشته ها با استفاده از یک شی مشترک یا ساختارهای داده موازی مانند BlockingQueue به اشتراک بگذارید.
  29. تفاوت بین notify و notifyAll؟

  30. این یک سوال پیچیده دیگر است، از آنجایی که یک مانیتور می‌تواند توسط چندین رشته نظارت شود، توسعه‌دهندگان Java API روشی را ارائه می‌کنند تا فقط یک یا همه رشته‌ها را از تغییر وضعیت آن مطلع کند، اما آنها فقط نیمی از پیاده‌سازی را ارائه می‌دهند. متد notify() راهی برای انتخاب رشته خاصی ندارد، بنابراین زمانی مفید است که مطمئن باشید فقط یک رشته در انتظار است. از سوی دیگر، notifyAll() به همه رشته‌ها اطلاع می‌دهد و به آن‌ها اجازه می‌دهد تا برای مانیتور رقابت کنند، که تضمین می‌کند حداقل یک رشته به جلو حرکت می‌کند.
  31. چرا wait، notify و notifyAll در کلاس Thread نیستند؟

  32. این یک سوال طراحی است که بررسی می کند داوطلب در مورد سیستم های موجود چه فکر می کند یا اینکه آیا تا به حال به چیزی مشابه که در ابتدا نامناسب به نظر می رسد فکر کرده است یا خیر. برای پاسخ به این سوال، باید چندین دلیل ارائه کنید که چرا این متدها در کلاس Object بهتر پیاده سازی می شوند و چرا در کلاس Thread نه. اولین دلیل واضح این است که جاوا از قفل ها در سطح شی پشتیبانی می کند، نه در سطح رشته. هر جسمی دارای قفلی است که با نخ به دست می آید. و اگر یک رشته نیاز به منتظر ماندن برای قفل خاصی داشته باشد، فراخوانی wait() روی یک شیء منطقی تر است تا در این رشته. اگر wait() در کلاس Thread اعلان می شد، مشخص نمی شد که رشته در انتظار کدام قفل است. به طور خلاصه، از آنجایی که منتظر، اطلاع رسانی و notifyAll در سطح قفل عمل می کنند، راحت تر است که آنها را در کلاس Object اعلام کنیم زیرا lock به یک شی اشاره دارد.
  33. متغیر ThreadLocal چیست؟

  34. متغیرهای ThreadLocal نوع خاصی از متغیرها هستند که در دسترس برنامه نویس جاوا هستند. همانطور که حالت ها دارای متغیر حالت هستند، رشته ها نیز دارای متغیرهای ThreadLocal هستند. این یک راه خوب برای دستیابی به thread-safeness برای اشیاء گران قیمت است؛ برای مثال، می‌توانید SimpleDateFormat را با استفاده از ThreadLocal ایمن کنید. از آنجایی که این یک کلاس گران است، استفاده از آن در یک محدوده محلی که به نمونه های جداگانه برای هر تماس نیاز دارد، توصیه نمی شود. با دادن نسخه خود به هر نخ، دو پرنده را با یک سنگ می کشید. اولاً با استفاده از تعداد نمونه های ثابت جدید تعداد نمونه های اشیاء گران قیمت را کاهش می دهید و ثانیاً بدون از دست دادن همگام سازی و تغییرناپذیری به ایمنی نخ می رسید. مثال خوب دیگری از متغیرهای محلی thread، کلاس ThreadLocalRandom است که تعداد نمونه های پرهزینه برای ایجاد اشیاء تصادفی را در یک محیط چند رشته ای کاهش می دهد.
  35. FutureTask چیست؟

  36. FutureTask یک محاسبات ناهمزمان قابل لغو در یک برنامه جاوا موازی است. این کلاس یک پیاده سازی اولیه Future را با روش هایی برای شروع و توقف یک محاسبه، روش هایی برای پرس و جو از وضعیت یک محاسبه و بازیابی نتایج ارائه می دهد. نتیجه فقط زمانی بدست می آید که محاسبه کامل شود؛ اگر محاسبه هنوز کامل نشده باشد، روش گیرنده مسدود می شود. از اشیاء FutureTask می توان برای بسته بندی اشیاء Callable و Runnable استفاده کرد. از آنجایی که FutureTask Runnable را پیاده سازی می کند، می توان آن را برای اجرا به Executor ارسال کرد.
  37. تفاوت بین interrupted و isInterrupted؟

  38. تفاوت اصلی بین interrupted() و isInterrupted() این است که اولی وضعیت وقفه را بازنشانی می کند در حالی که دومی این کار را نمی کند. مکانیسم وقفه در جاوا با استفاده از یک پرچم داخلی به نام وضعیت وقفه پیاده سازی می شود. قطع کردن یک رشته با فراخوانی () Thread.interrupt این پرچم را تنظیم می کند. هنگامی که یک رشته قطع شده وضعیت وقفه را با فراخوانی متد استاتیک () Thread.interrupted بررسی می کند، وضعیت وقفه بازنشانی می شود. متد غیراستاتیک isInterrupted() که توسط یک رشته برای بررسی وضعیت وقفه یک رشته دیگر استفاده می شود، پرچم وقفه را تغییر نمی دهد. به طور معمول، هر روشی که با پرتاب یک InterruptedException خاتمه می یابد، پرچم وقفه را بازنشانی می کند. با این حال، همیشه این امکان وجود دارد که در صورت فراخوانی یک رشته دیگر، interrupt() بلافاصله پرچم دوباره تنظیم شود.
  39. چرا روش های انتظار و اعلان در یک بلوک همگام نامیده می شوند؟

  40. دلیل اصلی فراخوانی انتظار و اطلاع رسانی از یک بلوک یا روش استاتیک این است که Java API به آن نیاز دارد. اگر آنها را از خارج از یک بلوک همگام‌سازی شده فراخوانی کنید، کد شما یک IllegalMonitorStateException ایجاد می‌کند. دلیل هوشمندانه تر، اجتناب از شرایط مسابقه بین انتظار و اطلاع رسانی تماس ها است.
  41. چرا باید وضعیت انتظار را در یک حلقه بررسی کنید؟

  42. این احتمال وجود دارد که یک رشته انتظار اخطارهای نادرست و تماس های بیدارسازی نادرست را دریافت کند، اگر حالت انتظار را در یک حلقه بررسی نکند، حتی اگر به حالت نرسیده باشد، به سادگی خارج می شود. هنگامی که یک رشته انتظار بیدار می شود، به این واقعیت فکر نمی کند که حالتی که منتظرش بود ممکن است هنوز در حال اجرا باشد. در واقع می تواند در گذشته باشد، اما پس از فراخوانی متد notify() و قبل از بیدار شدن رشته تغییر کرد. بنابراین، همیشه بهتر است که wait() را از داخل یک حلقه فراخوانی کنید.
  43. تفاوت بین مجموعه های همگام و همزمان؟

  44. در حالی که هر دو مجموعه همگام و همزمان مجموعه‌های ایمن را ارائه می‌کنند، دومی مقیاس‌پذیرتر است. قبل از جاوا 1.5، برنامه نویسان فقط به مجموعه های همگام شده دسترسی داشتند، که وقتی چندین رشته به طور همزمان به آنها دسترسی پیدا می کردند، به منبع اختلاف تبدیل می شد و مقیاس کردن سیستم را دشوار می کرد. جاوا 5 مجموعه های همزمانی مانند ConcurrentHashMap را معرفی کرد که نه تنها ایمنی رشته را فراهم می کند بلکه مقیاس پذیری را با استفاده از تکنیک های مدرن مانند حذف قفل و پارتیشن بندی داخلی جدول بهبود می بخشد.
  45. تفاوت بین پشته و هیپ؟

  46. چرا این سوال در سوالات مربوط به چند رشته وجود دارد؟ زیرا پشته قطعه ای از حافظه است که ارتباط نزدیکی با رشته ها دارد. هر رشته دارای پشته مخصوص به خود است که متغیرهای محلی، پارامترهای متد و پشته فراخوانی را ذخیره می کند. متغیر ذخیره شده در پشته یک رشته برای دیگری قابل مشاهده نیست. از سوی دیگر، heap یک ناحیه مشترک از حافظه است که در بین تمام رشته ها مشترک است. اشیاء، چه محلی و چه در هر سطح دیگری، روی پشته ایجاد می شوند. برای بهبود عملکرد، یک نخ معمولاً مقادیر را از پشته به پشته خود ذخیره می کند، جایی که متغیرهای فرار وارد بازی می شوند. فرار به رشته ها می گوید که متغیری را از حافظه اصلی بخوانند.
  47. استخر نخ چیست؟

  48. ایجاد یک موضوع از نظر زمان و منابع گران است. اگر در حین پردازش درخواست، رشته ای ایجاد کنید، زمان پاسخگویی را کاهش می دهد و این فرآیند تنها می تواند تعداد محدودی رشته ایجاد کند. برای جلوگیری از این مشکلات، مجموعه‌ای از رشته‌ها هنگام راه‌اندازی برنامه ایجاد می‌شود و رشته‌ها دوباره برای پردازش درخواست‌ها استفاده می‌شوند. به این مجموعه نخ ها «حوض نخ» و به نخ های موجود در آن نخ کارگر می گویند. با شروع با جاوا 1.5، Java API چارچوب Executor را فراهم می کند، که به شما امکان می دهد استخرهای رشته های مختلفی ایجاد کنید، مانند یک thread pool که تنها یک کار را در واحد زمان پردازش می کند، یک استخر رشته ثابت، یک استخر با تعداد ثابت. از موضوعات، و یک مخزن موضوع حافظه پنهان، یک استخر قابل گسترش مناسب برای برنامه های کاربردی با بسیاری از وظایف کوتاه مدت.
  49. چگونه مشکل مصرف کننده تولید کننده را حل کنیم؟

  50. اکثر مشکلات رشته ای که در واقعیت حل می کنید از الگوی مصرف کننده تولید کننده است که در آن یک رشته مشکل را ایجاد می کند و دومی آن را مصرف می کند. برای حل این مشکل باید بدانید که چگونه می توانید تعاملات نخ داخلی ایجاد کنید. در سطح پایین می توانید از روش های انتظار و اطلاع رسانی و در سطح بالا می توانید از Semaphore یا BlockingQueue استفاده کنید.
  51. چگونه از بن بست جلوگیری کنیم؟

  52. ترجمه: 50 سوال برتر مصاحبه بر اساس موضوع.  قسمت 1. - 1 بن بست حالتی است که در آن یک نخ منتظر است تا thread دوم عملی را انجام دهد و دومی در همان زمان منتظر همان موضوع از اول است. این یک مشکل بسیار جدی است که باعث می شود برنامه شما فریز شود و کاری را که برای آن طراحی شده است انجام ندهد. بن بست زمانی رخ می دهد که به این 4 حالت برسد:
    • طرد متقابل: حداقل یک منبع باید در حالت تقسیم ناپذیر اشغال شود. فقط یک فرآیند می تواند در هر زمان از یک منبع استفاده کند.
    • Hold and Wait: یک فرآیند حداقل یک منبع را در خود نگه می دارد و منابع اضافی را درخواست می کند که توسط فرآیندهای دیگر نگهداری می شوند.
    • بدون پیش پاکسازی: سیستم عامل اگر منابع قبلاً اشغال شده باشد، مجدداً تخصیص نمی دهد، آنها باید به طور داوطلبانه در اختیار فرآیند برگزاری قرار گیرند.
    • انتظار چرخه‌ای: یک فرآیند منتظر می‌ماند تا منابع توسط فرآیند دیگری آزاد شوند، که به نوبه خود منتظر می‌ماند تا منابع توسط فرآیند اول آزاد شوند.
    ساده ترین راه برای جلوگیری از بن بست، اجتناب از انتظار در یک حلقه است؛ این امر می تواند با به دست آوردن قفل ها در یک ترتیب خاص و آزاد کردن آنها به ترتیب معکوس به دست آید.
  53. تفاوت بین زنده و بن بست؟

  54. یک Livelock شبیه به بن بست است، فقط در یک Livelock حالات رشته ها یا فرآیندهای درگیر بسته به یکدیگر دائماً تغییر می کنند. Livelock یک مورد خاص از کمبود منابع است. یک مثال واقعی از یک لاک زنده زمانی است که دو نفر در یک راهروی باریک ملاقات می کنند و هر یک، سعی می کنند مودب باشند، کنار می روند و بنابراین بی وقفه از این سو به آن سو می روند.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION