এটি উদাহরণের মাধ্যমে কাজ করতেও সহায়ক হতে পারে। একজন শ্রমিকের জন্য তিনটি সাধারণ অবস্থা বিবেচনা করুন :
চলমান = কর্মী বর্তমানে হয় অ-প্রাকৃতিকভাবে বা পূর্বস্ময়করভাবে চলছে।
রুননেবল = কর্মসূচিটি শিডিউলারে চালাতে প্রস্তুত।
আশ্বাসপ্রাপ্ত = কর্মচারী বর্তমানে সাসপেন্ড করা হয়েছে, কোনও ইভেন্ট এটির সংকেত প্রেরণের জন্য অপেক্ষা করছে waiting
একটি রাষ্ট্রের সাথে কর্মীরা RUNNING
অপেক্ষা করার সময় উত্পন্ন করতে পারে। উদাহরণস্বরূপ, যদি কর্মীকে এসকিউএলএসের পরিবর্তে ওএসে কোড চালানোর প্রয়োজন হয় তবে এটি একটি প্রাকদর্শন বা বাহ্যিক অপেক্ষা করতে পারে। সেই সময়ে এটি সম্পর্কিত সিপিইউতে কোড চলবে তবে এটি এখনও অপেক্ষার সময় উত্পন্ন করবে।
একটি রাষ্ট্রের শ্রমিকরা RUNNABLE
অপেক্ষা করার সময় উত্পন্ন করতে পারে (যতদূর আমি জানি তারা সর্বদা করে)। যদি কর্মীটিকে সংকেত দেওয়া হয়েছিল যে কোনও সংস্থান উপলব্ধ ছিল তবে এটি শেষ অপেক্ষার ভিত্তিতে সংকেত অপেক্ষা করার সময় সংগ্রহ করতে পারে। যদি শ্রমিক তার পূর্ববর্তী 4 এমএস কোয়ান্টামটি শেষ করে দেয় তবে এটি SOS_SCHEDULER_YIELD
অপেক্ষা করার সময়টি জমা করতে পারে ।
একটি রাষ্ট্রের সাথে কর্মীরা SUSPENDED
অপেক্ষা করার সময় উত্পন্ন করতে পারে। এমন একজন কর্মী বিবেচনা করুন যা লকের জন্য অপেক্ষা করছে। এটি প্রয়োজন সময় লক সংস্থান যা উপলব্ধ না হওয়া পর্যন্ত এটি অপেক্ষা সময় উত্পন্ন করবে। কিছু সাসপেন্ড করা কর্মী কোনও কাজের সাথে জড়িত না এমনদের সহিত অপেক্ষা করার সময় উত্পন্ন করে না।
আমার ডেস্কটপে চারটি লজিক্যাল কোর রয়েছে, তাই ডিফল্ট সর্বোচ্চ কর্মীর সংখ্যা 512 । এটি প্রায় অবশ্যই অবাস্তব, তবে এই যন্ত্রটিতে আমি তাত্ত্বিকভাবে প্রতি সেকেন্ডে 512 সেকেন্ডের জন্য অপেক্ষা করার সময় উত্পন্ন করতে পারতাম যদি আমি প্রতিটি কর্মীকে একবারে কোনও কিছুতে অপেক্ষা করতে পারি। কোর / শ্রমিকের সংখ্যা বাড়ার সাথে সাথে এই সংখ্যাটি আরও বেশি হতে পারে।
আপনি প্রতি সেকেন্ডের অপেক্ষা এক সেকেন্ডেরও বেশি দেখতে পাবেন এমনকি আপনি এসকিউএল সার্ভারের বিরুদ্ধে কোনও অনুসন্ধান চালাচ্ছেন না। আমার মেশিনে, নিম্নলিখিত কোয়েরিটি 9-14 সারিগুলির মধ্যে উত্পন্ন বলে মনে হচ্ছে:
SELECT [state], last_wait_type, wait_started_ms_ticks
FROM sys.dm_os_workers
WHERE [state] IN ('SUSPENDED', 'RUNNABLE')
AND task_address IS NOT NULL
AND wait_started_ms_ticks <> 0
AND wait_started_ms_ticks >= start_quantum;
আমি সর্বমোট অপেক্ষার সময়ের স্ন্যাপশট নিতে পারি যেহেতু আমি সর্বশেষে সার্ভারটি পুনরায় চালু করেছি এবং দশ সেকেন্ড অপেক্ষা করার পরে এটি একটি নতুন মোটের সাথে তুলনা করব:
DECLARE @start_wait_time_ms BIGINT;
SELECT @start_wait_time_ms = SUM(wait_time_ms)
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';
WAITFOR DELAY '00:00:10';
SELECT SUM(wait_time_ms) - @start_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';
কখনও কখনও গণিত কাজ করে। শেষবার যখন আমি এটি চালিয়েছি তখন ডেল্টা ছিল 101339 এমএস। অন্য কথায়, সিস্টেমের কাজগুলি থেকে আমার প্রতি সেকেন্ডে 10 সেকেন্ডেরও বেশি অপেক্ষা ছিল।