CPU, যাকে মাইক্রোপ্রসেসরও বলা হয়, কম্পিউটারের হৃৎপিণ্ড এবং/অথবা মস্তিষ্ক। কম্পিউটারের মূল অংশে গভীরে নেমে দেখি যাতে আমরা কম্পিউটার প্রোগ্রাম দক্ষতার সাথে লিখতে পারি।
"একটি টুল সাধারণত একটি মেশিনের চেয়ে সহজ; এটি সাধারণত হাতে ব্যবহার করা হয়, যখন একটি মেশিন প্রাণী বা স্টিম পাওয়ার দিয়ে চলায়।"
– চার্লস বেবেজ
একটি কম্পিউটার হলো একটি মেশিন যা অধিকাংশই বিদ্যুত দিয়ে চালানো হয় কিন্তু এর নমনীয়তা এবং প্রোগ্রামযোগ্যতা এটিকে টুলের সাদगी দিয়েছে।
CPU হলো কম্পিউটারের হৃৎপিণ্ড এবং/অথবা মস্তিষ্ক। এটি প্রদত্ত ইনস্ট্রাকশন এক্সিকিউট করে। এর মূল কাজ হলো আর্থমেটিক এবং লজিক্যাল অপারেশন পারফর্ম করা এবং ইনস্ট্রাকশনগুলো একসাথে অর্কেস্ট্রেট করা। মূল অংশগুলোতে যাওয়ার আগে CPU-এর মূল কম্পোনেন্টগুলো এবং তাদের ভূমিকা দেখি:
প্রসেসরের দুটি মূল কম্পোনেন্ট
- কন্ট্রোল ইউনিট — CU
- অ্যারিথমেটিক অ্যান্ড লজিক্যাল ইউনিট — ALU
কন্ট্রোল ইউনিট — CU
কন্ট্রোল ইউনিট CU হলো CPU-এর वो পার্ট যা ইনস্ট্রাকশন এক্সিকিউশন অর্কেস্ট্রেট করতে সাহায্য করে। এটি বলে কী করতে হবে। ইনস্ট্রাকশন অনুযায়ী, এটি CPU-কে কম্পিউটারের বিভিন্ন অন্য পার্টসह ALU-এর সাথে কানেক্ট করা 와য়ারগুলো এক্টিভেট করতে সাহায্য করে। কন্ট্রোল ইউনিট হলো প্রসেসিং-এর জন্য ইনস্ট্রাকশন পাওয়ার CPU-এর প্রথম কম্পোনেন্ট।
কন্ট্রোল ইউনিটের দুটি ধরন রয়েছে:
- হার্ডওয়ার্ড কন্ট্রোল ইউনিটস।
- মাইক্রোপ্রোগ্রামেবল (মাইক্রোপ্রোগ্রামড) কন্ট্রোল ইউনিটস।
হার্ডওয়ার্ড কন্ট্রোল ইউনিটস হার্ডওয়্যার এবং এর কাজ কনফিগারেশন পরিবর্তন করতে হার্ডওয়্যার পরিবর্তন দরকার। অন্যদিকে মাইক্রোপ্রোগ্রামেবল কন্ট্রোল ইউনিটকে প্রোগ্রাম করে এর আচরণ পরিবর্তন করা যায়। হার্ডওয়ার্ড CU ইনস্ট্রাকশন প্রসেসিং-এ দ্রুত, কিন্তু মাইক্রোপ্রোগ্রামেবল বেশি নমনীয়।
অ্যারিথমেটিক অ্যান্ড লজিক্যাল ইউনিট — ALU
অ্যারিথমেটিক অ্যান্ড লজিক্যাল ইউনিট ALU নাম অনুযায়ী সকল আর্থমেটিক এবং লজিক্যাল কম্পিউটেশন করে। ALU যোগ, বিয়োগের মতো অপারেশন পারফর্ম করে। ALU লজিক সার্কিট বা লজিক গেটস দিয়ে গঠিত যা এই অপারেশনগুলো করে।
অধিকাংশ লজিক গেট দুটি ইনপুট নেয় এবং একটি আউটপুট প্রডিউস করে।
নিচে হাফ অ্যাডার সার্কিটের একটি উদাহরণ দেওয়া হলো যা দুটি ইনপুট নেয় এবং রেজাল্ট আউটপুট করে। এখানে A এবং B ইনপুট, S আউটপুট, এবং C কেরি।
স্টোরেজ — রেজিস্টার এবং মেমরি
CPU-এর মূল কাজ হলো প্রদত্ত ইনস্ট্রাকশন এক্সিকিউট করা। এই ইনস্ট্রাকশন প্রসেস করার জন্য অধিকাংশ সময় এটাকে ডেটা দরকার। কিছু ডেটা ইন্টারমিডিয়েট ডেটা, কিছু ইনপুট, এবং অন্যটি আউটপুট। এই ডেটাগুলো ইনস্ট্রাকশনসহ নিচের স্টোরেজে সংরক্ষিত থাকে:
রেজিস্টার
রেজিস্টার হলো ডেটা স্টোর করার একটি ছোট সেট। একটি রেজিস্টার হলো ল্যাচের কম্বিনেশন। ল্যাচেস যাকে ফ্লিপ-ফ্লপসও বলা হয়, লজিক গেটস-এর কম্বিনেশন যা ১ বিট ইনফোর্মেশন স্টোর করে।
একটি ল্যাচের দুটি ইনপুট ওয়ায়ার থাকে, রাইট এবং ইনপুট ওয়ায়ার, এবং একটি আউটপুট ওয়ায়ার। রাইট ওয়ায়ার ইনাবল করলে স্টোরড ডেটা পরিবর্তন করা যায়। রাইট ওয়ায়ার ডিসেবল থাকলে আউটপুট সবসময় একই থাকে।
CPU-তে আউটপুট ডেটা স্টোর করার জন্য রেজিস্টার রয়েছে। মেইন মেমরি (RAM)-এ পাঠালে স্লো হবে কারণ এটি ইন্টারমিডিয়েট ডেটা। এই ডেটা অন্য রেজিস্টারে পাঠানো হয় যা একটি বাস (BUS) দিয়ে কানেক্টেড। একটি রেজিস্টার ইনস্ট্রাকশন, আউটপুট ডেটা, স্টোরেজ অ্যাড্রেস বা যেকোনো ধরনের ডেটা স্টোর করতে পারে।
মেমরি (RAM)
RAM হলো রেজিস্টারগুলোর একটি সমষ্টি যা অপ্টিমাইজড ভাবে সাজানো এবং কম্প্যাক্ট করা হয়েছে যাতে বেশি সংখ্যক ডেটা স্টোর করা যায়। RAM (র্যান্ডম অ্যাক্সেস মেমরি) ভোলেটাইল এবং পাওয়ার অফ করলে এর ডেটা হারিয়ে যায়। রেজিস্টার সমষ্টি হলো RAM, তাই ডেটা রিড/রাইট করার জন্য RAM ৮-বিট অ্যাড্রেস, একচুয়াল ডেটার জন্য ডেটা ইনপুট, এবং نهایتো রিড ও রাইট এনাবলার ইনপুট নেয় যা ল্যাচের জন্য যেভাবে কাজ করে তেভাবেই।
ইনস্ট্রাকশন কী?
ইনস্ট্রাকশন হলো কম্পিউটার যা গ্রানুলার লেভেল কম্পিউটেশন পারফর্ম করতে পারে। CPU যে বিভিন্ন ধরনের ইনস্ট্রাকশন প্রসেস করতে পারে।
ইনস্ট্রাকশনগুলো شامل:
- আর্থমেটিক যেমন add এবং subtract
- লজিক ইনস্ট্রাকশন যেমন and, or, এবং not
- ডেটা ইনস্ট্রাকশন যেমন move, input, output, load, এবং store
- কন্ট্রোল ফ্লো ইনস্ট্রাকশন যেমন goto, if … goto, call, এবং return
- CPU-কে নোটিফাই করুন যে প্রোগ্রাম শেষ হয়েছে Halt
ইনস্ট্রাকশনগুলো অ্যাসেম্বলি ল্যাঙ্গুয়েজ দিয়ে কম্পিউটারে দেওয়া হয় বা কম্পাইলার দ্বারা জেনারেট হয় বা কিছু হাই-লেভেল ল্যাঙ্গুয়েজে ইন্টারপ্রেট হয়।
এই ইনস্ট্রাকশনগুলো CPU-তে হার্ডওয়ার্ডড থাকে। ALU-তে আর্থমেটিক এবং লজিক্যাল, CU-তে কন্ট্রোল ফ্লো ম্যানেজড হয়।
এক ক্লক সাইকেল-এ কম্পিউটার এক ইনস্ট্রাকশন পারফর্ম করতে পারে কিন্তু আধুনিক কম্পিউটার একাধিক পারফর্ম করতে পারে।
এক কম্পিউটার যে গ্রুপ ইনস্ট্রাকশন পারফর্ম করতে পারে সেটাকে ইনস্ট্রাকশন সেট বলা হয়।
CPU ক্লক
ক্লক সাইকেল
এক কম্পিউটারের গতি নির্ভর করে এর ক্লক সাইকেলের ওপর। এটি হলো প্রতি সেকেন্ডে কম্পিউটার যে ক্লক পিরিয়ড-এর সংখ্যা। একক ক্লক সাইকেল খুব ছোট, প্রায় ২৫০ * ১০ *-১২ সেকেন্ড। যত বেশি ক্লক সাইকেল, তত দ্রুত প্রসেসর।
CPU ক্লক সাইকেল GHz (গিগাহার্টজ) তে মাপা হয়। ১ GHz = ১০⁹ Hz (হার্টজ)। একটি হার্টজ মানে এক সেকেন্ড। তাই ১ গিগাহার্টজ মানে ১০⁹ সাইকেল প্রতি সেকেন্ড।
যত দ্রুত ক্লক সাইকেল, তত বেশি ইনস্ট্রাকশন CPU এক্সিকিউট করতে পারে।
Clock cycle = 1/clock rate
CPU Time = number of clock cycle / clock rate
এটি বোঝায় CPU টাইম উন্নত করতে আমরা ক্লক রেট বাড়াতে পারি বা CPU-এ দেওয়া ইনস্ট্রাকশন অপ্টিমাইজ করে ক্লক সাইকেলের সংখ্যা কমানো পারি। কিছু প্রসেসর ক্লক সাইকেল বাড়াতে দেয় কিন্তু যেহেতু এটি ফিজিকেল চেঞ্জ, তাই ওভারহিটিং বা এমনকি ধোঁয়া/আগুন হতে পারে।
এক ইনস্ট্রাকশন কীভাবে এক্সিকিউট হয়
ইনস্ট্রাকশনগুলো RAM-এ সিকোয়েনশিয়াল অর্ডারে স্টোর থাকে। একটি হাইপোথেটিক্যাল CPU-র জন্য ইনস্ট্রাকশন [OP কোড (অপারেশনাল কোড) এবং মেমরি বা রেজিস্টার অ্যাড্রেস]-র সমষ্টি।
কন্ট্রোল ইউনিটের ভিতরে দুটি রেজিস্টার রয়েছে: ইনস্ট্রাকশন রেজিস্টার (IR) যা ইনস্ট্রাকশনের OP কোড লোড করে এবং ইনস্ট্রাকশন অ্যাড্রেস রেজিস্টার যা করেন্ট এক্সিকিউট হওয়া ইনস্ট্রাকশনের অ্যাড্রেস লোড করে। CPU-র ভিতরে অন্যান্য রেজিস্টারও রয়েছে যা ইনস্ট্রাকশনের শেষ ৪ বিটের অ্যাড্রেসে স্টোরড ভ্যালু রাখে।
দুই সংখ্যা যোগ করার ইনস্ট্রাকশন সেটের একটি উদাহরণ নিই। নিচে ইনস্ট্রাকশনগুলো এবং তাদের বর্ণনা:
STEP 1 — LOAD_A 8:
ইনস্ট্রাকশন RAM-এ INITIALLY সেভ থাকে যেন <1100 1000>। প্রথম ৪ বিট হলো op কোড। এটি ইনস্ট্রাকশন নির্ধারণ করে। এই ইনস্ট্রাকশন ফেচ হয়ে IR-এ যায় কন্ট্রোল ইউনিটের। ইনস্ট্রাকশন ডিকোড হয় load_A হিসেবে যার মানে এটাকে অ্যাড্রেস 1000 (ইনস্ট্রাকশনের শেষ ৪ বিট)-এ থাকা ডেটা রেজিস্টার A-তে লোড করতে হবে।
STEP 2 — LOAD_B 2
উপরের মতই এটি মেমরি অ্যাড্রেস 2 (0010)-এ থাকা ডেটা CPU রেজিস্টার B-তে লোড করে।
STEP 3 — ADD B A
এখন পরবর্তী ইনস্ট্রাকশন হলো এই দুটি নম্বর যোগ করা। এখানে CU ALU-কে বলে অ্যাড অপারেশন পারফর্ম করতে এবং রেজাল্ট রেজিস্টার A-তে সেভ করতে।
STEP 4 — STORE_A 23
দুই সংখ্যা যোগ করার জন্য এটি একটি খুব সিম্পল ইনস্ট্রাকশন সেট।
আমরা সফলভাবে দুটি সংখ্যা যোগ করলাম!
BUS
CPU, রেজিস্টার, মেমরি এবং IO ডিভাইসের মধ্যে সকল ডেটা বাস (BUS) দিয়ে ট্রান্সফার হয়। যোগফলটি মেমরিতে লোড করতে, CPU মেমরি অ্যাড্রেসকে অ্যাড্রেস বাসে এবং যোগফলকে ডেটা বাসে রাখে এবং কন্ট্রোল বাসে রাইট সিগন্যাল এনাবল করে। এইভাবে বাসের সাহায্যে ডেটা মেমরিতে লোড হয়।
ক্যাশে (Cache)
CPU-তে ইনস্ট্রাকশন প্রি-ফেচ করার ক্যাশে মেকানিজমও রয়েছে। আমরা জানি প্রতি সেকেন্ডে মিলিয়ন মিলিয়ন ইনস্ট্রাকশন প্রসেসর কমপ্লিট করতে পারে। এর মানে ইনস্ট্রাকশন RAM থেকে ফেচ করতে এক্সিকিউট করার চেয়ে বেশি টাইম লাগবে। তাই CPU ক্যাশে কিছু ইনস্ট্রাকশন এবং ডেটা প্রি-ফেচ করে রাখে যাতে এক্সিকিউশন ফাস্ট হয়।
যদি ক্যাশে এবং অপারেটিং মেমরিতে ডেটা ভিন্ন হয়, তবে ডেটাকে ডার্টি বিট হিসেবে মার্ক করা হয়।
ইনস্ট্রাকশন পাইপলাইনিং
আধুনিক CPU ইনস্ট্রাকশন পাইপলাইনিং ব্যবহার করে ইনস্ট্রাকশন এক্সিকিউশনে প্যারাললাইজেশন এর জন্য। Fetch, Decode, Execute। যখন এক ইনস্ট্রাকশন ডিকোড ফেজে থাকে, CPU অন্য ইনস্ট্রাকশন ফেচ ফেজে প্রসেস করতে পারে।
এখানে একটি সমস্যা রয়েছে যখন এক ইনস্ট্রাকশন অন্য ইনস্ট্রাকশনের ওপর ডিপেন্ডেন্ট। তাই প্রসেসর ডিপেন্ডেন্ট নয় এমন ইনস্ট্রাকশনগুলো ভিন্ন অর্ডারে এক্সিকিউট করে।
মাল্টি-কোর কম্পিউটার
এটি মূলত আলাদা আলাদা CPU কিন্তু কিছু শেয়ারড রিসোর্স থাকে যেমন ক্যাশে।
পারফরম্যান্স
CPU-এর পারফরম্যান্স নির্ভর করে এর এক্সিকিউশন টাইমের ওপর।
Performance = 1/execution time
মান লেন একটি প্রোগ্রাম এক্সিকিউট হতে ২০ms লাগে। CPU-এর পারফরম্যান্স ১/২০ = ০.০৫ms
Relative performance = execution time 1 / execution time 2
CPU পারফরম্যান্সের যেসব ফ্যাক্টর বিবেচনা করা হয় সেগুলো হলো ইনস্ট্রাকশন এক্সিকিউশন টাইম এবং CPU ক্লক স্পিড। তাই একটি প্রোগ্রামের পারফরম্যান্স বাড়াতে হলে আমরা হয় ক্লক স্পিড বাড়াতে হবে বা প্রোগ্রামে ইনস্ট্রাকশনের সংখ্যা কমানো হবে। প্রসেসর স্পিড লিমিটেড এবং আধুনিক কম্পিউটার মাল্টি-কোর সহ মিলিয়ন মিলিয়ন ইনস্ট্রাকশনต่อ সেকেন্ড সাপোর্ট করতে পারে। কিন্তু আমাদের লিখা প্রোগ্রামে অনেক ইনস্ট্রাকশন থাকলে ওভারঅল পারফরম্যান্স কমে যাবে।
Big O notation নির্ধারণ করে দেওয়া ইনপুটের সাথে পারফরম্যান্স কীভাবে প্রভাবিত হবে।
CPU-কে দ্রুত এবং যথাসম্ভব পারফরম্যান্ট বানাতে অনেক অপ্টিমাইজেশন করা হয়। যেকোনো প্রোগ্রাম লিখতে সময় আমাদের বিবেচনা করতে হবে কীভাবে CPU-এ দেওয়া ইনস্ট্রাকশনের সংখ্যা কমানো কম্পিউটার প্রোগ্রামের পারফরম্যান্স বাড়াবে।
ও পোষ্টেড অন Milap Neupane Blog: How Does a CPU work