Sunday, March 4, 2012

বোকা কম্পিউটারের চালাকি – ৪ : “আয়োডিন সমস্যা”

সংবিধিবদ্ধ সতর্কীকরণঃ এই লেখা কম্পিউটারবোদ্ধাদের জন্য নহে।


আচ্ছা, আমি যে রাস্তায় হাঁটতে হাঁটতে সুন্দরী মেয়ে দেখতে গেলে কিংবা সুন্দরী মেয়ে দেখতে দেখতে রাস্তায় হাঁটতে গেলে প্রায়ই হোঁচট খাই, তা কি কেউ আপনাদের বলে দিয়েছে? এই আমার এক দোষ। একসাথে দুইটা কাজ ঠিকমতো করতে পারি না। সুন্দরী দেখা আর রাস্তায় হাঁটা – দুইটাতো আলাদা কাজ, তাই না? দুইটা কাজ কি একসাথে ঠিকভাবে করা যায় বলেন? অন্যরা পারলেও পারতে পারে, তবে ভাই, আমি পারি না। আমার এক বন্ধু একে কী বলে জানেন? বলে, “আয়োডিনের অভাব”।

জানলে হয়তো অবাক হবেন, কেবল আমার না, কম্পিউটারের মধ্যেও “আয়োডিনের অভাব” আছে। ভাবছেন কী বলতে চাচ্ছি? ঐ যে, আরে ঐ যে, কম্পিউটারের সব কাজ করে যে প্রসেসর, ঐরকম একটা বেসিক প্রসেসর একসাথে একটার বেশি কাজ করতে পারে না। একটার বেশি প্রোগ্রাম চালাতে পারে না। আমার মেয়ে দেখা আর রাস্তায় হাঁটা যদি “আয়োডিনের অভাব” হতে পারে, কম্পিউটারের এই বৈশিষ্ট্যও কি তবে তাই না? আপনি হয়তো এর মধ্যেই চিন্তা করা শুরু করছেন যে, “আমিতো দিব্যি ৮-১০ টা প্রোগ্রাম চালাই একসাথে”, তাই না? নিচের ছবিটাকে হয়তো প্রমাণ হিসেবেও দেখাতে চাইবেন।

একসাথে চলছে অনেকগুলো প্রোগ্রাম
একসাথে চলছে অনেকগুলো প্রোগ্রাম

আপনার মনে আছে কি – ০ আর ১ দিয়ে গড়া ইন্সট্রাকশনের মাধ্যমে কম্পিউটার প্রোগ্রাম কীভাবে কাজ করে? প্রতিটা প্রোগ্রামের (মাইক্রোসফ্‌ট্‌ ওয়ার্ড, মজিলা ফায়ারফক্স, মেসেঞ্জার ইত্যাদি) চলার পিছনে এক সেট ইন্সট্রাকশন থাকে। মাইক্রোসফ্‌ট ওয়ার্ড যখন চলে তখন আসলে তার ইন্সট্রাকশন একটার পর একটা চলতে থাকে, আবার যখন ফায়ারফক্স চলে তখন আসলে তার ইন্সট্রাকশন চলতে থাকে। একটা প্রোগ্রাম চালাতে হলে সেই প্রোগ্রামের ইন্সট্রাকশনগুলো প্রথমে মেমোরিতে নিতে হয়। মেমোরিতে নেয়া ইন্সট্রাকশনগুলো চালানোর জন্য প্রয়োজনীয় ডাটা সেভ করা থাকে কিছু রেজিস্টারে। এই প্রয়োজনীয় ডাটা কিরকম হতে পারে তার উদাহরণ দিচ্ছি - মেমোরির কোন্‌ জায়গা থেকে ইন্সট্রাকশন শুরু হয়েছে, এই মুহুর্তে কোন্‌ ইন্সট্রাকশন চলছে, যদি এই ইন্সট্রাকশনটা ‘যোগ’ হয় তবে কোন্‌ কোন্‌ সংখ্যা যোগ করা হচ্ছে আর যোগফলই বা কোথায় সেভ করা হবে, এর পরের ইন্সট্রাকশনটা কোথায় ইত্যাদি ইত্যাদি। যে কথা বলছিলাম, এই রেজিস্টারও এক ধরনের মেমোরি, তবে একটু বিশেষ ধরনের, আমরা র‍্যাম (RAM - Random Access Memory) বলে যা জানি তা থেকে ভিন্ন। রেজিস্টারে ডাটা সেভ করে রাখা যায় খুব দ্রুত, আবার খুব দ্রুত এখান থেকে ডাটা পড়ে নেয়াও যায়। এই দ্রুততার কারণেই মূলতঃ প্রসেসর (অন্য কথায় কম্পিউটার) এত দ্রুত কাজ করতে পারে। তবে এই দ্রুততা পাওয়ার জন্য একেকটা রেজিস্টারকে একেকটা বিশেষ কাজের জন্য বিশেষভাবে তৈরি করতে হয়। সেই সাথে রেজিস্টারের সংখ্যাও রাখতে হয় খুব সীমিত, না হলে কখন কোন্‌ রেজিস্টার থেকে ডাটা আনা-নেয়া করতে হবে সেটা বের করতেই সময় চলে যাবে। কম্পিউটারের সব কয়টা প্রোগ্রামকেই তাই একই রেজিস্টার ব্যবহার করতে হয়।

কিছু মনে করবেন না, একটা দুর্গন্ধময় উদাহরণের কথা মাথায় এসেছে। আপনার বাসায় যে পায়খানা আছে, সেটা মল-মূত্র ব্যবস্থাপনার জন্য বিশেষভাবে তৈরি, তাই না? নিশ্চয় খাওয়া-দাওয়া-ঘুমের জন্য তৈরি না। :P  আর এটা ব্যবহার করার জন্য – আপনার পরিবারের একেকজন যার যখন দরকার হয় তখন পায়াখানায় গিয়ে শান্তির কর্মটি সেরে আসেন, তাই না? বেয়াদবি মাফ করবেন, রেজিস্টারও একরকম পায়খানার মতো, এটি বিশেষ কাজের জন্য তৈরি এবং যখন সে প্রোগ্রামের দরকার হয় সেই প্রোগ্রাম রেজিস্টার ব্যবহার করে আসে। আপনারা যেমন দুইজন একসাথে সেই পায়খানা ব্যবহার করতে যান না, তেমনি একাধিক প্রোগ্রামও একইসাথে সেই রেজিস্টার ব্যবহার করতে পারে না। তাই একটা প্রসেসরে আসলে একই সময়ে একটার বেশি প্রোগ্রাম চলতে পারে না। আরো সঠিকভাবে বললে, প্রসেসরে একই সময়ে একটা ইন্সট্রাকশনের বেশি চলতে পারে না। “আয়োডিনের সমস্যা”-র মূল বিষয়টাই এখানে।

আপনি নিশ্চয় এখনো চিন্তা করছেন – “আমি তো দিব্যি দেখতে পাচ্ছি, কম্পিউটার একসাথে বহু প্রোগ্রাম চালাচ্ছে, এমন একটা উদাহরণ উপরে দিয়েছিও ছবির মাধ্যমে, তাহলে আয়োডিন সমস্যা থাকলো কোথায়?”। একটু দাঁড়ান, উত্তর দিচ্ছি। তার আগে মাইক্রোসফ্‌ট্‌ ওয়ার্ডে (অথবা ওপেন অফিস কিংবা অন্য কোন টেক্সট এডিটরে) লেখালেখির কথা একটু ভাবুনতো। আমিই যখন ওয়ার্ডে এই লেখাখানি লিখছি, তখন একটা লাইন লিখে আবার চিন্তা করছি পরের লাইনটা কীভাবে লিখলে আপনাকে সহজে আমার কথা বুঝাতে পারবো। চিন্তা করছি – আগের লাইনটা ঠিক হয়েছে তো? আমি যখন এইসব চিন্তা করছি, কিছুই লিখছি না, তখনতো আসলে মাইক্রোসফ্‌ট্‌ ওয়ার্ডের কোন কাজ করতে হচ্ছে না, মনিটরে প্রোগ্রামটা দেখা যাচ্ছে কেবল। এইসময় মনিটর আমার প্রোগ্রামের জন্য ব্যস্ত থাকলেও সেই রেজিস্টারগুলো কিন্তু এক্কেবারেই বেকার বসে আছে। এত এক্সপার্ট রেজিস্টারগুলোকে বসিয়ে রাখার কোন দরকার আছে বলুন? তার চেয়ে এই বেকার সময়টাতে অন্য কোন প্রোগ্রাম চালানো গেলে ভাল হতো না? ধরুন, হয়তো ইউটিউব থেকে ডাউনলোড চলতে থাকলো এই সময়ে, তাহলে ভাল হতো না? হ্যাঁ, কম্পিউটার আসলে এই কাজটাই করে। কিছু সময় একটা প্রোগ্রাম চালিয়ে আবার অন্য আরেকটা প্রোগ্রাম চালাতে যায়। আর এই ব্যাপারটাকে বলে টাস্ক-সুইচিং বা কনটেক্সট সুইচিং। টাস্ক সুইচিংয়েরর সময় অর্থাৎ এক প্রোগ্রাম থেকে অন্য প্রোগ্রামে যাওয়ার সময়, কম্পিউটার প্রথমে এখন যে প্রোগ্রামটা চলছে সেই প্রোগ্রামের জন্য রেজিস্টারে রাখা সব ডাটা মেমোরিতে সেভ করে, তারপর অন্য প্রোগ্রামটা চালিয়ে দেয়। আবার আগের প্রোগ্রামে ফিরে আসার সময় মেমোরিতে সেভ করে রাখা ডাটা আগে রেজিস্টারে রাখে, ও পরে সেই প্রোগ্রামটা চালিয়ে দেয়। এভাবে এক প্রোগ্রাম থেকে অন্য প্রোগ্রামে যাওয়া আসার কাজটা এত দ্রুত ঘটে যে, আপনি টেরই পাননা - আপনি যখন কোন একটা প্রোগ্রামে কাজ করছেন, কম্পিউটার তখন আপনার প্রোগ্রাম ছেড়ে অন্য প্রোগ্রাম থেকে ঘুরে আসছে! এভাবেই আসে কম্পিউটারের একসাথে একাধিক কাজ করার ক্ষমতা, যাকে বলে মাল্টিটাস্কিং

একজন প্রোগ্রামার যখন একটা প্রোগ্রাম তৈরি করেন, তখনতো আর তিনি জানেন না যে, ঐসময়ে আর কোন্‌ কোন্‌ প্রোগ্রাম চলবে। এক প্রোগ্রাম থেকে অন্য প্রোগ্রামে সুইচিংযের কাজটা করে কে তাহলে? এটা করে থাকে আমাদের অপারেটিং সিস্টেম (যেমনঃ উইন্ডোজ, লিনাক্স)। অপারেটিং সিস্টেমের কাছে কখন কোন্‌ প্রোগ্রাম চলছে সব তথ্য থাকে। সে বিভিন্ন প্রোগ্রাম ও থ্রেড (থ্রেড কী জিনিস একটু পর বলছি) এর মাঝে রেজিস্টারসহ কম্পিউটারের বিভিন্ন রিসোর্স কীভাবে ব্যবহার করা হবে তা ঠিক করে দেয়। কেতাবি ভাষায় একে বলে টাস্ক শিডিউলিং। এই শিডিউলিংটা প্রতিটা টাস্ক ১ মিলিসেকেন্ড পরপর চালিয়ে দেয়ার মতো সাধারণ হতে পারে (যাকে বলে রাউন্ড-রবিন শিডিউলিং), আবার আপনার স্ট্র্যাটেজি অনুযায়ী বুদ্ধিদীপ্তও হতে পারে।  যেমন ধরুন, আপনি নিশ্চয় চাইবেন আপনার দরকারি ও প্রিয় প্রোগ্রামগুলো যেন দ্রুত কাজ করে, কোনভাবে যেন বাঁধাগ্রস্ত না হয়। অর্থাৎ, প্রোগ্রামগুলো যেন অগ্রাধিকার (বা প্রায়োরিটি) অনুযায়ী শিডিউলিং করা হয় (যাকে বলে প্রায়োরিটি-বেস্‌ড শিডিউলিং) আবার গান শুনার সময় আপনি নিশ্চয় ভেঙ্গে-ভেঙ্গে আসা সুর পছন্দ করবেন না; নিশ্চিত করতে চাইবেন যে, গান শুনার সময়, বাবা কম্পিউটার, তুমি যে কাজই কর না কেন প্রতি ০.১ সেকেন্ডের মধ্যে গান শোনানোর প্রোগ্রামে ফিরে এসো, যাতে শব্দ শুনা যায় ঠিকভাবে। এভাবে নানান দিক বিবেচনা করে অনেকগুলো টাস্ক বা প্রোগ্রামের মধ্যে সমন্বয় করা হয়।

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

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

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

No comments: