কীভাবে ঘুমানো কোনও সুতোর কাজ করে?


14

আপনি যখন একটি থ্রেড ঘুমান , আসলে কি চলছে?

আমি দেখতে পাচ্ছি যে একটি থ্রেড ঘুমানো "নির্দিষ্ট সময়ের জন্য বর্তমান থ্রেডকে বিরতি দেয়" । তবে কীভাবে এটি কাজ করে?

মতে কিভাবে Thread.sleep () কাজ অভ্যন্তরীণভাবে এবং কিভাবে Thread.sleep সত্যিই কাজ করে? :

  • ঘুমের সময়কাল কিছু সিস্টেম-নির্দিষ্ট গ্রানুলারিটির সাপেক্ষে
  • ঘুম অবরুদ্ধ হয়
  • থ্রেডটি সিপিইউ ছেড়ে দেয় এবং এর কার্য সম্পাদন বন্ধ করে দেয়
  • থ্রেডটি ঘুমানোর সময় সিপিইউ সময় গ্রহণ করে না

আমি কেবল এই সমস্ত কী বোঝায় তার অভ্যন্তরীণ এবং মৌলিক যান্ত্রিক কৌশলগুলি বেশ বুঝতে পারি না।

আমি বুঝতে পারি যে শিডিয়ুলার নামে কিছু আছে যা থ্রেডগুলির মধ্যে স্যুইচ করার জন্য দায়ী।

সূত্রগুলি ইঙ্গিত করে বলে মনে হচ্ছে যে এটি ওএস (বা হার্ডওয়্যার?) দ্বারা পরিবর্তিত হয় এবং সিপিইউ অন্য থ্রেডে স্যুইচ করার আগে বেশিরভাগ থ্রেডকে 1 মিমি - 60 মিমি বা আরও কিছু দেওয়া হয়।

কিন্তু যখন কোনও থ্রেড ঘুমায় (উদাহরণস্বরূপ, অনেক সেকেন্ড), এটি আবার কীভাবে শুরু হয়? আমি অনুমান করছি টাইমার কোনওভাবে জড়িত, এটি কি মাদারবোর্ডের ঘড়ি? এটি কি সিপিইউ ক্লক রেটের সাথে সম্পর্কিত?

এমনকি যদি কোনও টাইমার জড়িত থাকে, তখন আবার থ্রেডে মনোযোগ দেওয়ার সময় সিপিইউ কীভাবে জানবে? এটি প্রস্তুত কিনা তা ধারাবাহিকভাবে থ্রেডে চেক ইন করতে হবে না? হয় কার্যকরভাবে যে পোলিং এবং সেইজন্য ধরনের হয় CPU- র সময় গ্রাসকারী?

থ্রেডের ভাষা নির্দিষ্ট করে ঘুমানো কি ওএস এর জন্য দায়ী বা এটি কোনও সিপিইউ-নির্দিষ্ট জিনিস?

কেউ দয়া করে আমাকে শিডিয়ুলার এবং সিপিইউ এই সমস্তকালে কী করছে সেগুলি সম্পর্কে মৌলিক ব্যাখ্যা দিয়ে আমার কাছে এটি ব্যাখ্যা করবে?


2
একটি ঘুমন্ত থ্রেড জাগ্রত করা সময়সীমা বাধা দ্বারা কাজ করে, সাধারণত একটি বিঘ্নিত ঘড়ি দ্বারা উত্পাদিত হয়, যা সিপিইউর মূল অংশ থেকে পৃথক পৃথক একটি হার্ডওয়্যার উপাদান যা নির্দেশাবলী প্রক্রিয়া করে। এটি ভোট দেওয়ার প্রয়োজনীয়তা এড়ায়। হয়তো কোওরার এই ব্যাখ্যাটি কিছু বিষয় পরিষ্কার করবে: কোওরা. com
ডক ব্রাউন

1
বেশিরভাগ জেভিএম প্রকৃতপক্ষে মাল্টি-থ্রেডিং প্রয়োগ করে না : এগুলি কেবল অন্তর্নিহিত অপারেটিং সিস্টেমের মাল্টি-থ্রেডিং ক্ষমতা ব্যবহার করে। আপনি যদি সত্যিই এটি কীভাবে কাজ করে তা জানতে চান, অপারেটিং সিস্টেম ডিজাইনের বিষয়ে প্রচুর বই রয়েছে।
সলোমন স্লো

উত্তর:


11

একটি প্রোগ্রাম চালানোর সাথে আরও অনেক কিছু জড়িত রয়েছে সেই প্রোগ্রামের মধ্যে কেবল কোডের চেয়ে।

মাল্টি-প্রসেস ওএসে চলমান যে কোনও প্রোগ্রাম ওএসের শিডিয়ুলারের নিয়ন্ত্রণে থাকে এবং সিডিইউ চক্রগুলি উপলভ্য হলে কোনটি প্রসেস চালাচ্ছে, কোনটি চলার অপেক্ষায় রয়েছে তা নির্ধারণ করে এবং শিডিয়ুলার একটি স্পষ্ট টেবিল বজায় রাখে which চালানোর চেষ্টা করা (ঘুমন্ত) সময়সূচী সাধারণত তাদের অগ্রাধিকার এবং কার্যকর করার ইতিহাসের উপর নির্ভর করে প্রক্রিয়াগুলিতে সম -আকারের সময় স্লাইসগুলি নির্ধারণ করে। শেষ পর্যন্ত, এই লুপটি হার্ডওয়্যার বিঘ্ন দ্বারা চালিত হয়, সাধারণত প্রধান বোর্ডে একটি দোলক দ্বারা উত্পাদিত হয়।

ঘুমানো সর্বদা একটি বৈশিষ্ট্য যা একটি প্রোগ্রামিং ভাষা কেবল সমর্থন করতে পারে কারণ রান-টাইম পরিবেশ যেখানে এটি কার্যকর করা হবে এটি সমর্থন করে। একটি সাধারণ প্রোগ্রাম নিজেকে স্থগিত করতে পারে না , এটি কেবল শিডিয়ুলারকে এটি কীভাবে চিকিত্সা করতে চান তা বলতে পারে - এবং শিডিয়ুলার কোনওভাবেই বাধ্য নয় বা এমনকি এই ইচ্ছাটিকে সন্তুষ্ট করতে সর্বদা সক্ষম। কোনও ল্যাপটপ বন্ধ হয়ে যাওয়া এবং হাইবারনেশনে যাওয়ার কথা ভাবুন; মূল বোর্ডের দোলকটি পালস করে চলেছে, তবে যেহেতু শিডিয়ুলারটি চলছে না, তাই কোনও অগ্রাধিকার যত বেশি হোক না কেন কোনও প্রক্রিয়া চলছে না।


এটি প্রক্রিয়াগুলির ক্ষেত্রে (সাধারণত) সত্য, তবে থ্রেডগুলির ক্ষেত্রে সর্বদা সত্য নয় যা কখনও কখনও ভাষা নির্ভর করে। থ্রেডগুলি ওএসের বাইরে স্বাধীনভাবে প্রয়োগ করা যেতে পারে, এবং এটি সমবায় বা অগ্রণী হতে পারে। উদাহরণস্বরূপ রুবিতে "ফাইবার" রয়েছে (থ্রেড ছাড়াও)। রুবি ফাইবারগুলি সমবায় ভিত্তিতে নির্ধারিত।
ডেভিড 25272

সত্য, কেবল নেটিভ থ্রেডগুলি এ জাতীয় কাজ করে। সবুজ থ্রেডগুলি বাইট-সংকলিত ভাষায় একটি প্রোগ্রাম চালিয়ে ভিএম দ্বারা নির্ধারিত হয়। সাধারণত সেগুলি যখন নেটিভ থ্রেড উপলব্ধ না থাকে বা সঠিকভাবে থ্রেড-নিরাপদ না চলমান কোড চলাকালীন ব্যবহার করা হয় (ভিএম কখনও কখনও এটি নিশ্চিত করতে পারে যে কোনও মাল্টি-থ্রেড প্রোগ্রামের শব্দার্থিকগুলি ওএস শিডিয়ুলার যেভাবে করতে পারে না সেভাবে সঠিক থাকে)।
কিলিয়ান ফথ

7

ডক ব্রাউন যেমন একটি মন্তব্যে উল্লেখ করেছেন, বাধা কেবলমাত্র ঘুমের জন্য নয় key

একটি বাধা হ'ল একটি হার্ডওয়্যার সিগন্যাল যা প্রসেসরের এটি যা করা বন্ধ করে দেওয়া উচিত এবং কোডের একটি অংশ চালানো উচিত। প্রসেসরের মনোযোগের প্রয়োজন হলে বাহ্যিক ডিভাইসগুলি বিঘ্ন ঘটায়: উদাহরণস্বরূপ, যখন কোনও ডিস্ক ডেটা পড়া শেষ করে, বা কোনও কী চাপানো হয়, বা মাদারবোর্ডে একটি কাউন্টডাউন টাইমার শূন্যে পৌঁছে যায়।

ইন্টারপেট-হ্যান্ডলিং কোডটি সাধারণত খুব ছোট এবং খুব দ্রুত। উদাহরণস্বরূপ, যখন ডিস্কটি ইঙ্গিত করে যে কোনও ব্লকের মেমোরিতে অনুলিপি করা হয়েছে, ওএস সহজেই কোথাও "প্রস্তুত ব্লক" এর একটি তালিকায় সেই ঘটনাটি রেকর্ড করতে পারে এবং তারপরে যা কিছু করছে তা ফিরে আসতে পারে। আপনি চান না যে সিপিইউ তার পুরো সময়টি বিঘ্নিত হ্যান্ডলিং কোডে ব্যয় করবে এবং ব্যবহারকারী কোডটি চালাচ্ছে না।

বিঘ্ন চালিত কোডের এক টুকরা যে নয় অগত্যা ছোট নির্ধারণকারী হয়। এটি একটি কাউন্টডাউন টাইমার থেকে একটি সংকেত দ্বারা ট্রিগার, এবং যখনই এটি চালিত হয় সিস্টেমের অবস্থা পরীক্ষা করে। এর মধ্যে সাধারণত চালানোর জন্য প্রস্তুত প্রক্রিয়াগুলি সনাক্তকরণ (উদাহরণস্বরূপ, কারণ তারা যে ব্লকটির জন্য অপেক্ষা করছিল তারা স্মৃতিতে এসে গেছে) এবং সেই সাথে তাদের সময় স্লাইস শেষ করে দিয়েছে।

সুতরাং, যখন আপনি একটি থ্রেড স্লিপ এক্সিকিউট করবেন, আপনি যা করছেন তা ওএসকে বলছে যে (1) আপনি আপনার সময় স্লাইস ছেড়ে দিচ্ছেন, এবং (২) একটি নির্দিষ্ট সময় ব্যয় না হওয়া পর্যন্ত আপনাকে আর জাগানো উচিত নয়।

শিডিউলার যখনই চলবে তখন এটি আপনার থ্রেডের দিকে নজর দেবে এবং সেই সময়টি ব্যয় হয়ে গেলে কেবল "চালানোর জন্য প্রস্তুত" হিসাবে চিহ্নিত হবে। এটি একটি ধরণের পোলিং, তবে এটি "ব্যস্ত-লুপ" পোলিং নয় যেহেতু এটি কোনও বাধাপ্রাপ্ত হয়ে ট্রিগার করে। এটি এতটা ব্যয়বহুলও নয়: সাধারণত একবারে কেবল কয়েক হাজার বা তার বেশি থ্রেড থাকে।

এটি আপনাকে ঘুমের সময়গুলি সঠিক কেন না তা ধারণা দেয়: আপনার থ্রেড চলার জন্য প্রস্তুত হয়ে উঠলে অন্য থ্রেড থাকতে পারে যা এখনও চলছে এবং তাদের সময় স্লাইস শেষ করে নি। বা উচ্চ-অগ্রাধিকারের থ্রেড থাকতে পারে যা চালানোর জন্য প্রস্তুত।


এভাবেই "আধুনিক" অপারেটিং সিস্টেমগুলি কাজ করে। ওএস এক্স এর আগে উইন্ডোজ 3 বা ম্যাক ওএসের মতো পুরানো অপারেটিং সিস্টেমে কোনও প্রক্রিয়া অপারেটিং সিস্টেমে নিয়ন্ত্রণ () নিয়ন্ত্রণ অর্জন করতে হত। দুর্ভাগ্যক্রমে যদি কোনও প্রোগ্রাম কোনও লুপে আটকে যায় বা কোনওভাবে ডেডলক হয়ে যায় তবে এটি কখনও নিয়ন্ত্রণ পেতে পারে না এবং পুরো সিস্টেমটি স্তব্ধ হয়ে যায়।
ডেভিড 25272

@ ডেভিড 25272 - আমি মনে করি আমি "প্রবীণ" না হয়ে "সরল" শব্দটি ব্যবহার করেছি কারণ 1960 এর দশকের সিস্টেমগুলি প্রচলিত মাল্টিটাস্কিং করেছিল। এবং এটি সত্য যে, সমবায় মাল্টটাস্কিংয়ের জন্য প্রসেসরের নিয়ন্ত্রণ মুক্ত করার জন্য সক্রিয় থ্রেডের কিছু প্রয়োজন (সাধারণত একটি ব্লকিং সিস্টেম কল করে, একটি স্পষ্ট ফলন না দিয়ে), আমি বিশ্বাস করি না যে অনেক সাধারণ উদ্দেশ্যমূলক প্রোগ্রামার রয়েছে are আজ যারা একটি অপারেটিং থ্রেডিং মডেল সহ কোনও ওএস ব্যবহার করেন।
কেডিগ্রিগরি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.