जवाबों:
यह बहुत सहज है:
एक प्रोग्राम सीपीयू बाउंड है अगर यह तेजी से चलेगा यदि सीपीयू तेज हो, यानी यह अपने समय के अधिकांश भाग को केवल सीपीयू (गणनाओं का उपयोग करके) खर्च करता है। एक प्रोग्राम जो program के नए अंकों की गणना करता है, आमतौर पर सीपीयू-बाउंड होगा, यह सिर्फ crunching नंबर है।
यदि I / O सबसिस्टम तेज़ होता तो एक प्रोग्राम I / O बाध्य होता है। कौन सा सटीक I / O सिस्टम है इसका मतलब अलग-अलग हो सकता है; मैं आमतौर पर इसे डिस्क के साथ जोड़ता हूं, लेकिन निश्चित रूप से नेटवर्किंग या सामान्य रूप से संचार भी आम है। एक प्रोग्राम जो कुछ डेटा के लिए एक बड़ी फ़ाइल के माध्यम से देखता है, वह I / O बाध्य हो सकता है, क्योंकि टोंटी तब डिस्क से डेटा को पढ़ना है (वास्तव में, यह उदाहरण शायद इन दिनों पुराने जमाने की तरह है जिसमें सैकड़ों MB / s हैं SSDs से आ रहा है)।
सीपीयू बाउंड का अर्थ है वह दर जिस पर प्रक्रिया आगे बढ़ती है वह सीपीयू की गति से सीमित होती है। एक कार्य जो संख्याओं के एक छोटे समूह पर गणना करता है, उदाहरण के लिए छोटे मैट्रिक्स को गुणा करना, सीपीयू बाध्य होने की संभावना है।
I / O बाउंड का अर्थ है वह दर जिस पर कोई प्रक्रिया आगे बढ़ती है I / O सबसिस्टम की गति से सीमित होती है। एक कार्य जो डिस्क से डेटा को संसाधित करता है, उदाहरण के लिए, किसी फ़ाइल में लाइनों की संख्या की गणना I / O बाध्य होने की संभावना है।
मेमोरी बाउंड का अर्थ है वह दर जिस पर एक प्रक्रिया आगे बढ़ती है जो उपलब्ध मेमोरी और उस मेमोरी एक्सेस की गति से सीमित होती है। एक कार्य जो बड़ी मात्रा में मेमोरी डेटा को संसाधित करता है, उदाहरण के लिए बड़े मैट्रिक्स को गुणा करना, मेमोरी बाउंड होने की संभावना है।
कैश बाउंड अर्थ है वह दर जिस पर एक प्रक्रिया प्रगति उपलब्ध कैश की मात्रा और गति से सीमित है। एक कार्य जो कैश में फिट बैठता है उससे अधिक डेटा को संसाधित करता है वह कैश बाध्य होगा।
I / O बाउंड मेमोरी से धीमी होगी बाउंड सीपीयू की तुलना में कैश बाउंड से धीमी होगी।
I / O बाध्य होने का समाधान अधिक मेमोरी प्राप्त करने के लिए आवश्यक नहीं है। कुछ स्थितियों में, एक्सेस एल्गोरिथ्म I / O, मेमोरी या कैश सीमाओं के आसपास डिज़ाइन किया जा सकता है। कैश विस्मृत एल्गोरिदम देखें ।
बहु सूत्रण
इस उत्तर में, मैं CPU बनाम IO बाउंड वर्क के बीच अंतर करने के एक महत्वपूर्ण उपयोग के मामले की जांच करूंगा: जब बहु-थ्रेडेड कोड लिख रहा हो।
RAM I / O बाध्य उदाहरण: वेक्टर सम
एक ऐसे कार्यक्रम पर विचार करें जो एकल वेक्टर के सभी मूल्यों को पूरा करता है:
#define SIZE 1000000000
unsigned int is[SIZE];
unsigned int sum = 0;
size_t i = 0;
for (i = 0; i < SIZE; i++)
/* Each one of those requires a RAM access! */
sum += is[i]
समानांतर करना कि आपके प्रत्येक कोर के लिए समान रूप से सरणी को विभाजित करके आम आधुनिक डेस्कटॉप पर सीमित उपयोगिता है।
उदाहरण के लिए, मेरे उबंटू 19.04 पर, सीपीयू के साथ लेनोवो थिंकपैड P51 लैपटॉप: इंटेल कोर i7-7820HQ सीपीयू (4 कोर / 8 धागे), रैम: 2x सैमसंग M471A2K43BB1-CRC (2xGGBB) मुझे इस तरह के परिणाम मिलते हैं:
ध्यान दें कि रन के बीच बहुत अधिक भिन्नता है। लेकिन मैं 8GiB पर पहले से ही सरणी का आकार बहुत अधिक नहीं बढ़ा सकता हूं, और मैं आज कई रनों के आंकड़े के मूड में नहीं हूं। यह हालांकि कई मैनुअल रन करने के बाद एक विशिष्ट रन की तरह लग रहा था।
बेंचमार्क कोड:
POSIX C pthread
स्रोत कोड ग्राफ में उपयोग किया जाता है।
और यहां एक सी ++ संस्करण है जो अनुरूप परिणाम पैदा करता है।
मुझे वक्र के आकार को पूरी तरह से समझाने के लिए पर्याप्त कंप्यूटर वास्तुकला नहीं पता है, लेकिन एक बात स्पष्ट है: गणना 8x तेज नहीं होती है क्योंकि मेरे सभी 8 थ्रेड का उपयोग करने के कारण भोलेपन की उम्मीद है! किसी कारण के लिए, 2 और 3 धागे सबसे इष्टतम थे, और अधिक जोड़ने से चीजें बहुत धीमी हो जाती हैं।
इसकी तुलना सीपीयू बाउंड वर्क से करें, जो वास्तव में 8 गुना तेज होता है: समय (1) के आउटपुट में 'वास्तविक', 'उपयोगकर्ता' और 'एसईएस' का क्या मतलब है?
इसका कारण यह है कि सभी प्रोसेसर एक एकल मेमोरी बस को रैम से जोड़ते हैं:
CPU 1 --\ Bus +-----+
CPU 2 ---\__________| RAM |
... ---/ +-----+
CPU N --/
इसलिए मेमोरी बस जल्दी से अड़चन बन जाती है, सीपीयू नहीं।
ऐसा इसलिए होता है क्योंकि दो नंबरों को जोड़ने से एक एकल सीपीयू चक्र लगता है, मेमोरी रीड 2016 हार्डवेयर में लगभग 100 सीपीयू चक्र लेता है ।
तो इनपुट डेटा के प्रति बाइट में सीपीयू काम बहुत छोटा है, और हम इसे आईओ-बाउंड प्रक्रिया कहते हैं।
उस गणना को गति देने का एकमात्र तरीका, नए मेमोरी हार्डवेयर, जैसे मल्टी-चैनल मेमोरी के साथ व्यक्तिगत मेमोरी एक्सेस को तेज करना होगा ।
उदाहरण के लिए तेजी से सीपीयू घड़ी में अपग्रेड करना बहुत उपयोगी नहीं होगा।
अन्य उदाहरण
मैट्रिक्स गुणन रैम और जीपीयू पर सीपीयू-बाउंड है। इनपुट में है:
2 * N**2
संख्याएं, लेकिन:
N ** 3
गुणन किया जाता है, और यह व्यावहारिक बड़े एन के लिए इसके समानांतर होने के लिए पर्याप्त है।
यही कारण है कि समानांतर CPU मैट्रिक्स गुणन पुस्तकालय निम्न की तरह मौजूद हैं:
कैश का उपयोग कार्यान्वयन की गति पर एक बड़ा अंतर डालता है। उदाहरण के लिए देखें यह दिमागी GPU तुलना उदाहरण ।
यह सभी देखें:
नेटवर्किंग प्रोटोटाइप IO- बाउंड उदाहरण है।
जब हम डेटा का एक बाइट भेजते हैं, तब भी इसे गंतव्य तक पहुंचने में बड़ा समय लगता है।
HTTP अनुरोध जैसे छोटे नेटवर्क अनुरोधों को समानांतर करना एक बहुत बड़ा प्रदर्शन लाभ प्रदान कर सकता है।
यदि नेटवर्क पहले से ही पूर्ण क्षमता पर है (जैसे कोई धार डाउनलोड कर रहा है), तो समानांतरकरण में अभी भी विलंबता में सुधार हो सकता है (उदाहरण के लिए आप "उसी समय एक वेब पेज लोड कर सकते हैं")।
एक डमी सी ++ सीपीयू बाउंड ऑपरेशन जो एक नंबर लेता है और उसे बहुत क्रंच करता है:
निम्नलिखित प्रयोग के आधार पर छंटनी सीपीयू प्रतीत होती है: क्या C ++ 17 समानांतर एल्गोरिदम पहले से ही लागू हैं? जो समानांतर प्रकार के लिए एक 4x प्रदर्शन में सुधार दिखा, लेकिन मैं एक अधिक सैद्धांतिक पुष्टि भी करना चाहूंगा
सीपीयू या आईओ बाउंड हैं तो कैसे पता करें
नॉन-रैम आईओ डिस्क, नेटवर्क की तरह बंधे हुए हैं: ps aux
और फिर अगर CPU% / 100 < n threads
। यदि हाँ, तो आप IO बंधे हुए हैं, उदाहरण के लिए ब्लॉकिंग read
s केवल डेटा की प्रतीक्षा कर रहे हैं और अनुसूचक उस प्रक्रिया को छोड़ रहा है। फिर आगे के औजारों का उपयोग sudo iotop
करके यह तय करें कि कौन सा IO समस्या है।
या, यदि निष्पादन त्वरित है, और आप थ्रेड्स की संख्या को परिमार्जित करते हैं, तो आप इसे आसानी से देख सकते हैं time
कि सीपीयू बाउंड वर्क के लिए थ्रेड्स की संख्या बढ़ जाती है: 'वास्तविक', 'उपयोगकर्ता' और 'सिस' का क्या अर्थ है समय का उत्पादन (1)?
RAM-IO बाध्य: यह बताना कठिन है, क्योंकि RAM प्रतीक्षा समय CPU%
माप में शामिल है , यह भी देखें:
कुछ विकल्प:
GPUs
GPU में एक IO टोंटी होती है जब आप पहली बार इनपुट डेटा को नियमित CPU पठनीय RAM से GPU में ट्रांसफर करते हैं।
इसलिए, सीपीयू केवल सीपीयू बाध्य अनुप्रयोगों के लिए सीपीयू से बेहतर हो सकता है।
एक बार जब डेटा को GPU में स्थानांतरित कर दिया जाता है, तो यह सीपीयू की तुलना में तेजी से उन बाइट्स पर काम कर सकता है, क्योंकि GPU:
अधिकांश सीपीयू प्रणालियों की तुलना में अधिक डेटा स्थानीयकरण है, और इसलिए डेटा को कुछ कोर के लिए दूसरों की तुलना में तेजी से एक्सेस किया जा सकता है
किसी भी डेटा पर केवल लंघन द्वारा डेटा समानता और बलिदान विलंबता का शोषण करता है जो तुरंत संचालित होने के लिए तैयार नहीं है।
चूंकि जीपीयू को बड़े समानांतर इनपुट डेटा पर काम करना पड़ता है, इसलिए बेहतर है कि अगले डेटा को छोड़ दें जो वर्तमान डेटा के उपलब्ध होने के इंतजार के बजाय उपलब्ध हो सकता है और सीपीयू जैसे अन्य सभी कार्यों को ब्लॉक करता है।
इसलिए यदि आपका आवेदन जीपीयू तेज हो सकता है तो सीपीयू:
इन डिजाइन विकल्पों ने मूल रूप से 3 डी रेंडरिंग के आवेदन को लक्षित किया, जिनके मुख्य चरण ओपनगेल में क्या हैं , इस पर दिखाए गए हैं और हमें उनके लिए क्या चाहिए?
और इसलिए हम निष्कर्ष निकालते हैं कि वे अनुप्रयोग सीपीयू-बाउंड हैं।
प्रोग्रामयोग्य GPGPU के आगमन के साथ, हम कई GPGPU अनुप्रयोगों का निरीक्षण कर सकते हैं जो CPU बाउंड ऑपरेशन के उदाहरण के रूप में कार्य करते हैं:
GLSL शेड्स के साथ इमेज प्रोसेसिंग?
एक धब्बा फिल्टर जैसे स्थानीय छवि प्रसंस्करण संचालन प्रकृति में अत्यधिक समानांतर हैं।
क्या बिंदु डेटा से प्रति सेकंड 60 बार हीटमैप बनाना संभव है?
यदि प्लॉटेड फ़ंक्शन पर्याप्त जटिल है, तो हीटमैप ग्राफ़ का प्लॉटिंग।
https://www.youtube.com/watch?v=fE0P6H8eK4I जेसुस मार्टीन बर्लंगा द्वारा "रियल-टाइम फ्लूड डायनामिक्स: सीपीयू बनाम जीपीयू"।
द्रव गतिकी के नवियर स्टोक्स समीकरण जैसे आंशिक अंतर समीकरणों को हल करना :
यह सभी देखें:
CPython Global Intepreter Lock (GIL)
एक त्वरित मामले के अध्ययन के रूप में, मैं पायथन ग्लोबल इंटरप्रेटर लॉक (GIL) की ओर इशारा करना चाहता हूं: CPython में ग्लोबल इंटरप्रेटर लॉक (GIL) क्या है?
यह CPython कार्यान्वयन विवरण CPU-बाउंड कार्य का उपयोग करते हुए कुशलतापूर्वक एकाधिक पायथन थ्रेड को रोकता है। CPython डॉक्स कहते हैं:
CPython कार्यान्वयन विवरण: CPython में, ग्लोबल इंटरप्रेटर लॉक के कारण, केवल एक धागा पायथन कोड को एक ही बार में निष्पादित कर सकता है (भले ही कुछ प्रदर्शन उन्मुख पुस्तकालय इस सीमा को पार कर सकते हैं)। यदि आप चाहते हैं कि आपका एप्लिकेशन मल्टी-कोर मशीनों के कम्प्यूटेशनल संसाधनों का बेहतर उपयोग करे, तो आपको सलाह दी जाती है कि आप इसका उपयोग करें
multiprocessing
याconcurrent.futures.ProcessPoolExecutor
। हालाँकि, थ्रेडिंग अभी भी एक उपयुक्त मॉडल है यदि आप एक साथ कई I / O- बाउंड कार्य चलाना चाहते हैं।
इसलिए, यहां हमारे पास एक उदाहरण है जहां सीपीयू-बाउंड कंटेंट उपयुक्त नहीं है और आई / ओ बाउंड है।
सीपीयू बाउंड का मतलब सीपीयू, या सेंट्रल प्रोसेसिंग यूनिट द्वारा प्रोग्राम को अड़चन है, जबकि I / O बाउंड का मतलब है कि प्रोग्राम I / O, या इनपुट / आउटपुट द्वारा अड़चन है, जैसे डिस्क, नेटवर्क, आदि पढ़ना या लिखना।
सामान्य तौर पर, जब कंप्यूटर प्रोग्राम का अनुकूलन होता है, तो कोई अड़चन की तलाश करने और उसे खत्म करने की कोशिश करता है। यह जानते हुए कि आपका प्रोग्राम सीपीयू बाउंड मदद करता है, ताकि कोई अनावश्यक रूप से कुछ और का अनुकूलन न करे।
[और "अड़चन" से मेरा तात्पर्य उस चीज से है जो आपके कार्यक्रम को धीमा बना देती है, अन्यथा उसके पास नहीं है।]
एक ही विचार वाक्यांश के लिए एक और तरीका:
यदि सीपीयू को गति देने से आपके प्रोग्राम में तेजी नहीं आती है, तो यह I / O बाध्य हो सकता है ।
यदि I / O (उदाहरण के लिए तेज़ डिस्क का उपयोग करना) में तेजी लाने से मदद नहीं मिलती है, तो आपका प्रोग्राम CPU बाध्य हो सकता है।
(मैंने "हो सकता है" का उपयोग किया क्योंकि आपको अन्य संसाधनों को ध्यान में रखना होगा। मेमोरी एक उदाहरण है।)
जब आपका प्रोग्राम I / O (यानी डिस्क रीड / राइट या नेटवर्क रीड / राइट वगैरह) का इंतजार कर रहा हो , तो सीपीयू आपके प्रोग्राम को रोकने के बावजूद अन्य कार्य करने के लिए स्वतंत्र है। आपके कार्यक्रम की गति ज्यादातर इस बात पर निर्भर करेगी कि IO कितनी तेजी से हो सकता है, और यदि आप इसे गति देना चाहते हैं तो आपको I / O को गति देने की आवश्यकता होगी।
यदि आपका प्रोग्राम बहुत सारे प्रोग्राम निर्देश चला रहा है और I / O की प्रतीक्षा नहीं कर रहा है, तो इसे सीपीयू बाउंड कहा जाता है। सीपीयू को तेज करने से प्रोग्राम तेजी से चलेगा।
किसी भी स्थिति में, प्रोग्राम को तेज करने की कुंजी हार्डवेयर को गति देने के लिए नहीं हो सकती है, लेकिन IO या CPU की आवश्यकता को कम करने के लिए प्रोग्राम को ऑप्टिमाइज़ करने के लिए या इसे I / O करने के लिए होना चाहिए जबकि यह CPU को गहन भी करता है। सामान।
I / O बाउंड एक ऐसी स्थिति को संदर्भित करता है जिसमें गणना करने में लगने वाला समय मुख्य रूप से इनपुट / आउटपुट ऑपरेशंस के पूरा होने की प्रतीक्षा में खर्च की गई अवधि से निर्धारित होता है।
यह सीपीयू बाउंड होने वाले कार्य के विपरीत है। यह परिस्थिति तब उत्पन्न होती है जब जिस दर पर डेटा का अनुरोध किया जाता है वह खपत की गई दर से धीमी होती है या दूसरे शब्दों में, इसे संसाधित करने की तुलना में डेटा का अनुरोध करने में अधिक समय व्यतीत होता है।
Async प्रोग्रामिंग का मुख्य कार्य टास्क और टास्क ऑब्जेक्ट्स हैं, जो अतुल्यकालिक संचालन को मॉडल करते हैं। वे एसिंक्स द्वारा समर्थित हैं और कीवर्ड की प्रतीक्षा कर रहे हैं। मॉडल ज्यादातर मामलों में काफी सरल है:
I / O- बाउंड कोड के लिए, आप एक ऑपरेशन का इंतजार करते हैं जो एक Async विधि के अंदर एक टास्क या टास्क देता है।
सीपीयू-बाउंड कोड के लिए, आप एक ऑपरेशन का इंतजार करते हैं जो टास्क के साथ एक बैकग्राउंड थ्रेड पर शुरू होता है।
प्रतीक्षारत कीवर्ड वह जगह है जहां जादू होता है। यह उस विधि के कॉलर को नियंत्रित करता है जिसने प्रतीक्षा की थी, और यह अंततः UI को उत्तरदायी या लोचदार होने की सेवा देता है।
I / O- बाउंड उदाहरण: एक वेब सेवा से डेटा डाउनलोड करना
private readonly HttpClient _httpClient = new HttpClient();
downloadButton.Clicked += async (o, e) =>
{
// This line will yield control to the UI as the request
// from the web service is happening.
//
// The UI thread is now free to perform other work.
var stringData = await _httpClient.GetStringAsync(URL);
DoSomethingWithData(stringData);
};
सीपीयू-बाउंड उदाहरण: एक गेम के लिए गणना करना
private DamageResult CalculateDamageDone()
{
// Code omitted:
//
// Does an expensive calculation and returns
// the result of that calculation.
}
calculateButton.Clicked += async (o, e) =>
{
// This line will yield control to the UI while CalculateDamageDone()
// performs its work. The UI thread is free to perform other work.
var damageResult = await Task.Run(() => CalculateDamageDone());
DisplayDamage(damageResult);
};
ऊपर दिए गए उदाहरणों से पता चला है कि आप किस तरह से एसिंक्स का उपयोग कर सकते हैं और I / O- बाउंड और CPU-बाउंड वर्क का इंतजार कर सकते हैं। यह महत्वपूर्ण है कि आप पहचान सकते हैं कि आपको कब नौकरी करनी है I / O- बाउंड या CPU-बाउंड, क्योंकि यह आपके कोड के प्रदर्शन को बहुत प्रभावित कर सकता है और संभावित रूप से कुछ निर्माणों का दुरुपयोग कर सकता है।
किसी भी कोड को लिखने से पहले आपको दो प्रश्न पूछने चाहिए:
क्या आपका कोड किसी चीज़ के लिए "वेटिंग" होगा, जैसे डेटाबेस से डेटा?
- यदि आपका उत्तर "हां" है, तो आपका काम I / O- बाध्य है।
क्या आपका कोड एक बहुत महंगी गणना कर रहा है?
- यदि आपने "हां" उत्तर दिया है, तो आपका काम सीपीयू-बाउंड है।
यदि आपके पास काम I / O- बाध्य है, तो Async का उपयोग करें और कार्य के बिना प्रतीक्षा करें । आपको टास्क पैरेलल लाइब्रेरी का उपयोग नहीं करना चाहिए। इसका कारण गहराई में Async में उल्लिखित है लेख ।
यदि आपके पास जो काम है वह सीपीयू-बाउंड है और आप जवाबदेही की परवाह करते हैं, तो एसिंक्स का उपयोग करें और इंतजार करें लेकिन टास्क के साथ किसी अन्य थ्रेड पर काम बंद कर दें। यदि कार्य समवर्ती और समानता के लिए उपयुक्त है, तो आपको टास्क समानांतर लाइब्रेरी का उपयोग करने पर भी विचार करना चाहिए ।
निष्पादन के दौरान अंकगणितीय / तार्किक / फ्लोटिंग-पॉइंट (ए / एल / एफपी) प्रदर्शन जब सीपीयू-बाउंड होता है, तो ज्यादातर प्रोसेसर के सैद्धांतिक शिखर-प्रदर्शन (निर्माता द्वारा उपलब्ध कराए गए डेटा और विशेषताओं द्वारा निर्धारित) के पास होता है प्रोसेसर: कोर की संख्या, आवृत्ति, रजिस्टर, ALUs, FPUs, आदि)।
असंभव नहीं कहने के लिए, वास्तविक दुनिया के अनुप्रयोगों में झांकना प्रदर्शन बहुत मुश्किल है। अधिकांश एप्लिकेशन निष्पादन के विभिन्न हिस्सों में मेमोरी तक पहुंचते हैं और प्रोसेसर कई चक्रों के दौरान ए / एल / एफपी संचालन नहीं कर रहा है। मेमोरी और प्रोसेसर के बीच मौजूद दूरी के कारण इसे वॉन न्यूमैन लिमिटेशन कहा जाता है ।
यदि आप सीपीयू शिखर-प्रदर्शन के पास होना चाहते हैं, तो मुख्य मेमोरी से डेटा की आवश्यकता से बचने के लिए कैश मेमोरी में अधिकांश डेटा का पुन: उपयोग करने की एक रणनीति हो सकती है। एक एल्गोरिथ्म जो इस सुविधा का शोषण करता है, वह है मैट्रिक्स-मैट्रिक्स गुणन (यदि दोनों मैट्रिस को कैश मेमोरी में संग्रहीत किया जा सकता है)। ऐसा इसलिए होता है क्योंकि यदि मैट्रिसेस साइज़ के होते हैं n x n
तो आपको 2 n^3
केवल 2 n^2
एफपी नंबरों के डेटा का उपयोग करके ऑपरेशन के बारे में करना होगा। उदाहरण के लिए, दूसरी ओर मैट्रिक्स जोड़, कम सीपीयू-बाउंड या मैट्रिक्स-गुणा की तुलना में अधिक मेमोरी-बाउंड एप्लिकेशन है क्योंकि इसमें n^2
एक ही डेटा के साथ केवल FLOP की आवश्यकता होती है ।
निम्नलिखित आंकड़े में एक Intel i5-9300H में मैट्रिक्स जोड़ और मैट्रिक्स गुणन के लिए भोले एल्गोरिदम के साथ प्राप्त FLOPs दिखाया गया है:
ध्यान दें कि मैट्रिक्स के प्रदर्शन में उम्मीद के मुताबिक मैट्रिक्स के अलावा गुणा से अधिक है। इन परिणामों चलाकर reproduced किया जा सकता है test/gemm
और test/matadd
इस में उपलब्ध भंडार ।
मेरा सुझाव है कि इस आशय के बारे में जे। डोंगरा द्वारा दिया गया वीडियो भी देखें ।
I / O बाध्य प्रक्रिया: - यदि किसी प्रक्रिया के जीवनकाल का अधिकांश भाग i / o अवस्था में व्यतीत होता है, तो प्रक्रिया ai / o बाध्य प्रक्रिया है ।example: -calculator, इंटरनेट एक्सप्लोरर
सीपीयू बाउंड प्रोसेस: - यदि प्रक्रिया का अधिकांश भाग सीपीयू में बिताया जाता है, तो यह सीपीयू बाउंड प्रोसेस है।