যখনই আপনি আপনার কোড চালান, আপনি মেমরি ব্যবহার করেন। আপনি যখন রুবির মতো একটি ভাষায় লেখেন, তখন মনে হয় আপনার কাছে উপলব্ধ স্মৃতি অসীম। আপনার কোড চালিত সিস্টেমের নির্দিষ্ট পরিমাণ মেমরি সম্পর্কে চিন্তা না করেই আপনি চালিয়ে যেতে পারেন। এই রুবি ম্যাজিক পর্বে আমরা ব্যাখ্যা করব কিভাবে এটি কাজ করে!
একটু ইতিহাস
আগের দিনে, রুবির মতো স্ক্রিপ্টিং ভাষা এখনও বিদ্যমান ছিল না। লোকেরা শুধুমাত্র সি, একটি নিম্ন স্তরের প্রোগ্রামিং ভাষা যেমন ভাষায় কোড লিখেছিল। একটি জিনিস যা এই ভাষাগুলিকে নিম্ন স্তরের করে তোলে তা হ'ল আপনাকে নিজের পরে পরিষ্কার করতে হবে। উদাহরণস্বরূপ, যখনই আপনি একটি String
সংরক্ষণ করতে মেমরি বরাদ্দ করেন , কখন এটি পরিষ্কার করতে হবে তাও আপনাকে সিদ্ধান্ত নিতে হবে।
ম্যানুয়াল ক্লিনআপ
এটি নীচের মক রুবি কোডের মতো কিছুটা দেখায়। এটি একটি পরিবর্তনশীল ঘোষণা করে এবং free
পদ্ধতি ব্যবহার করে -এই পদ্ধতিটি আসলে রুবিতে বিদ্যমান নেই– আমরা ভেরিয়েবলের সাথে কাজ শেষ করার পরে যে মেমরি ব্যবহার করেছি তা পরিষ্কার করার জন্য৷
1_000_000.times do |i|
variable = "Variable #{i}"
puts variable
free(variable)
end
প্রোগ্রামিং এর একটি ক্লান্তিকর উপায়
আপনি হয়তো ইতিমধ্যেই বুঝতে পেরেছেন এখানে একটি ঝুঁকি রয়েছে:আপনি যদি free
করতে ভুলে যান তাহলে কী হবে পরিবর্তনশীল? সেক্ষেত্রে প্রক্রিয়াটি শেষ না হওয়া পর্যন্ত সেই ভেরিয়েবলের বিষয়বস্তু মেমরিতে থাকবে। আপনি যদি এটি প্রায়শই করেন তবে আপনার স্মৃতি হারিয়ে যাবে এবং আপনার প্রক্রিয়া ক্র্যাশ হয়ে যাবে৷
পরবর্তী উদাহরণ আরেকটি সাধারণ সমস্যা দেখায়:
1_000_000.times do |i|
variable = "Variable #{i}"
free(variable)
puts variable
end
আমরা পরিবর্তনশীল ঘোষণা করি এবং free
এটা কিন্তু তারপরে আমরা এটি আবার ব্যবহার করার চেষ্টা করি, যা অসম্ভব কারণ এটি আর বিদ্যমান নেই। যদি এটি C হয়, আপনার প্রোগ্রাম এখন একটি segfault
এর সাথে ক্র্যাশ হবে . উফ!
মানুষ ভুল মেশিন
মানুষ সব সময় এই ধরনের ভুল না করার জন্য কুখ্যাতভাবে খারাপ। তাই স্বয়ংক্রিয়ভাবে মেমরি পরিষ্কার করার একটি উপায় প্রয়োজন। এটি করার সবচেয়ে জনপ্রিয় উপায় – রুবিতেও ব্যবহৃত হয়– হল গারবেজ কালেকশন (GC)।
আবর্জনা সংগ্রহ (GC) কিভাবে কাজ করে
GC ব্যবহার করে এমন একটি ভাষায়, আপনি ম্যানুয়ালি পরিষ্কার না করেই বস্তু তৈরি করতে পারেন। যখনই আপনি একটি বস্তু তৈরি করেন, এটি আবর্জনা সংগ্রাহকের সাথে নিবন্ধিত হয়। GC আপনি এই বস্তুতে করা সমস্ত রেফারেন্স ট্র্যাক রাখার চেষ্টা করে। যখন এটি নির্ধারণ করে যে আপনি বস্তুটি আর ব্যবহার করছেন না, এটি পরিষ্কারের জন্য চিহ্নিত করা হয়। আবর্জনা সংগ্রাহক আপনার প্রোগ্রামকে বিরতি দেয় এবং সমস্ত চিহ্নিত বস্তু পরিষ্কার করে।
কিছু উদাহরণ দেখছি
সহজ লুপে আমরা আগে ব্যবহার করেছি GC এর কাজ মোটামুটি সহজ। লুপের প্রতিটি পুনরাবৃত্তির সাথে, ভেরিয়েবলটি আর কোথাও ব্যবহার করা হয় না। পরিবর্তনশীলটি অবিলম্বে পরিষ্কারের জন্য চিহ্নিত করা যেতে পারে।
1_000_000.times do |i|
variable = "Variable #{i}"
puts variable
end
পরবর্তী উদাহরণে আমরা ভেরিয়েবলটিকে puts_later
-এ পাস করি পদ্ধতি যা 30 সেকেন্ডের জন্য অপেক্ষা করে এবং তারপর puts
পরিবর্তনশীল।
def puts_later(variable)
Thread.new do
sleep 30
puts variable
end
end
1_000_000.times do |i|
variable = "Variable #{i}"
puts_later variable
end
এই তুলনামূলক সহজ উদাহরণে আবর্জনা সংগ্রহকারীর কাজ ইতিমধ্যেই বেশ জটিল। এটা বুঝতে হবে যে আমরা puts_later
-এ ভেরিয়েবল উল্লেখ করি পদ্ধতি যেহেতু পদ্ধতিটি একটি থ্রেড শুরু করে, আবর্জনা সংগ্রাহককে থ্রেডের ট্র্যাক রাখতে হবে এবং এটি শেষ হওয়ার জন্য অপেক্ষা করতে হবে। তবেই পরিবর্তনশীলটিকে পরিষ্কারের জন্য চিহ্নিত করা যেতে পারে।
যখন এটা জটিল হয়ে যায়
জটিল উদাহরণে না গিয়ে, আমাকে বিশ্বাস করুন যখন আমি বলি আবর্জনা সংগ্রহকারীর কাজ সত্যিই কঠিন। এটিও ব্যাখ্যা করে কেন GC আপনার উৎপাদন পরিবেশে ওভারহেড এবং সমস্যা সৃষ্টি করতে পারে। সঠিকভাবে মেমরি পরিষ্কার করার জন্য আপনার প্রোগ্রামে কী ঘটছে তার একটি খুব বিশদ বোঝার প্রয়োজন, যা সঠিকভাবে পেতে বেশ কয়েকটি CPU চক্র লাগে। কিন্তু আরে, এটা নিজের পরে পরিষ্কার করা মার!
আবর্জনা সংগ্রহের আরও অনেক কিছু আছে
এটি ছিল শুধুমাত্র আবর্জনা সংগ্রহের সাথে আমাদের পরিচয়। ভবিষ্যতের একটি নিবন্ধে আমরা দেখব যে এটি রুবিতে ঠিক কীভাবে কাজ করে এবং কীভাবে আপনি আপনার অ্যাপ্লিকেশনের কার্যকারিতা উন্নত করতে GC পরিমাপ এবং টিউন করতে পারেন৷
আপডেট: পরবর্তী পর্ব এখানে পাওয়া যাবে।