আমি হাইমেম এবং লোমেমের মধ্যে পার্থক্যে আগ্রহী:
- কেন এমন পার্থক্য আছে?
- তা করে আমরা কী লাভ করব?
- প্রতিটি বৈশিষ্ট্য কি আছে?
আমি হাইমেম এবং লোমেমের মধ্যে পার্থক্যে আগ্রহী:
উত্তর:
একটি 32-বিট আর্কিটেকচারে, র্যামের ঠিকানা দেওয়ার জন্য ঠিকানা স্থানের সীমাটি হ'ল:
0x00000000 - 0xffffffff
বা 4'294'967'295
(4 জিবি)।
লিনাক্স কার্নেলটি যথাক্রমে ব্যবহারকারীর স্পেস (উচ্চ মেমরি) এবং কার্নেল স্পেসে (কম মেমোরি) 3/1 (আরও 2/2, বা 1/3 1 হতে পারে ) পর্যন্ত বিভক্ত হয়।
ব্যবহারকারীর স্থান পরিসর:
0x00000000 - 0xbfffffff
প্রতিটি নতুন প্রসারিত ব্যবহারকারী প্রক্রিয়া এই অঞ্চলের ভিতরে একটি ঠিকানা (পরিসর) পায়। ব্যবহারকারীর প্রক্রিয়াগুলি সাধারণত অবিশ্বস্ত থাকে এবং তাই কার্নেল স্থান অ্যাক্সেস করতে নিষেধ করা হয়। তদতিরিক্ত, এগুলিকে অ-জরুরি হিসাবে বিবেচনা করা হয়, একটি সাধারণ নিয়ম হিসাবে, কার্নেল সেই প্রক্রিয়াগুলিতে মেমরির বরাদ্দকে স্থগিত করার চেষ্টা করে।
কার্নেল স্পেস রেঞ্জ:
0xc0000000 - 0xffffffff
একটি কার্নেল প্রক্রিয়াগুলি এখানে তার ঠিকানা (পরিসর) পায়। কার্নেলটি এই 1 জিবি ঠিকানাগুলিতে সরাসরি অ্যাক্সেস করতে পারে (ভাল, পুরো 1 জিবি নয়, উচ্চ মেমরির অ্যাক্সেসের জন্য 128 এমবি সংরক্ষিত আছে)।
কার্নেল স্পেসে প্রসেস করা প্রক্রিয়াগুলি বিশ্বস্ত, জরুরি এবং ধরে নেওয়া ত্রুটিমুক্ত, মেমরি অনুরোধটি তাত্ক্ষণিকভাবে প্রক্রিয়াজাত হয়ে যায়।
প্রতিটি কার্নেল প্রক্রিয়া যদি ইচ্ছা করে তবে ব্যবহারকারীর স্থান পরিসীমাও অ্যাক্সেস করতে পারে। এবং এটি অর্জন করার জন্য, কার্নেলটি ব্যবহারকারীর স্থান (উচ্চ স্মৃতি) থেকে তার কার্নেল স্পেসে (লো মেমরি) একটি ঠিকানা মানচিত্র করে, উপরে বর্ণিত 128 এমবি বিশেষত এটির জন্য সংরক্ষিত।
1 বিভাজনটি 3/1, 2/2, বা 1/3 CONFIG_VMSPLIT_...
বিকল্প দ্বারা নিয়ন্ত্রিত কিনা ; /boot/config*
আপনার কার্নেলের জন্য কোন বিকল্পটি নির্বাচিত হয়েছে তা দেখতে আপনি সম্ভবত এটি পরীক্ষা করতে পারেন ।
চালু করার প্রথম রেফারেন্সটি হ'ল লিনাক্স ডিভাইস ড্রাইভারস (অনলাইনে এবং বই আকারে উভয় উপলব্ধ), বিশেষত অধ্যায় 15 যার বিষয়টির একটি বিভাগ রয়েছে।
একটি আদর্শ বিশ্বে, প্রতিটি সিস্টেমের উপাদান এটির যে সমস্ত মেমরির অ্যাক্সেসের প্রয়োজন তা ম্যাপ করতে সক্ষম হবে। এবং এটি লিনাক্স এবং বেশিরভাগ অপারেটিং সিস্টেমে প্রসেসগুলির ক্ষেত্রে: 32-বিট প্রক্রিয়া কেবল ভার্চুয়াল মেমরির 2 ^ 32 বাইটের থেকে কিছুটা কম অ্যাক্সেস করতে পারে (আসলে একটি লিনাক্স 32-বিট আর্কিটেকচারে 3 জিবি সম্পর্কে)। কার্নেলের পক্ষে এটি শক্ত হয়ে ওঠে, যার সিস্টেমটি যে প্রক্রিয়াটিকে এটি সম্পাদন করছে তার পুরো মেমরির মানচিত্র তৈরি করতে সক্ষম হওয়া প্রয়োজন, পুরো শারীরিক মেমরির পাশাপাশি অন্য কোনও মেমরি-ম্যাপযুক্ত হার্ডওয়্যার ডিভাইস map
সুতরাং যখন কোনও 32-বিট কার্নেল 4GB এর বেশি মেমরির মানচিত্রের প্রয়োজন হয়, তখন এটি অবশ্যই উচ্চ মেমরির সমর্থন সহ সংকলন করতে হবে। উচ্চ মেমরি হ'ল মেমরি যা কার্নেলের ঠিকানার স্থানে স্থায়ীভাবে ম্যাপ করা হয় না। (কম স্মৃতি বিপরীত: এটি সর্বদা ম্যাপ করা থাকে, তাই আপনি কেবল পয়েন্টারকে ডিফারেন্স করে এটি কার্নেলের মধ্যে অ্যাক্সেস করতে পারেন))
আপনি যখন কার্নেল কোড থেকে উচ্চ মেমরি অ্যাক্সেস করেন, kmap
পৃষ্ঠার ডেটা স্ট্রাকচার ( struct page
) থেকে পয়েন্টার পাওয়ার জন্য আপনাকে প্রথমে কল করতে হবে । kmap
পৃষ্ঠাটি উচ্চ বা কম স্মৃতিতে রয়েছে কিনা তা কল করা কাজ করে। এছাড়াও রয়েছে kmap_atomic
যা বাধাগুলি যুক্ত করেছে তবে মাল্টিপ্রসেসর মেশিনে আরও দক্ষ কারণ এটি সূক্ষ্ম-দানযুক্ত লকিং ব্যবহার করে। এর মাধ্যমে প্রাপ্ত পয়েন্টারটি kmap
একটি সংস্থান: এটি ঠিকানার স্থান ব্যবহার করে। এটি শেষ করার পরে, আপনাকে অবশ্যই kunmap
(বা kunmap_atomic
) সেই সংস্থানটি মুক্ত করতে কল করতে হবে ; তারপরে পয়েন্টারটি আর বৈধ নয় এবং আপনি আর কল না করা পর্যন্ত পৃষ্ঠার সামগ্রীগুলি অ্যাক্সেস করা যাবে না kmap
।
এটি লিনাক্স কার্নেলের সাথে প্রাসঙ্গিক; কোনও ইউনিক্স কার্নেল কীভাবে এটি পরিচালনা করে তা আমি নিশ্চিত নই।
হাই মেমরি হ'ল মেমোরির সেগমেন্ট যা ব্যবহারকারী-স্পেস প্রোগ্রামগুলি সম্বোধন করতে পারে। এটি লো মেমোরিটিকে স্পর্শ করতে পারে না।
লো মেমরি হ'ল মেমরির বিভাগ যা লিনাক্স কার্নেল সরাসরি সম্বোধন করতে পারে। যদি কার্নেলটি অবশ্যই উচ্চ মেমোরি অ্যাক্সেস করতে পারে তবে প্রথমে এটি নিজের নিজের ঠিকানা স্পেসে ম্যাপ করতে হবে।
সম্প্রতি একটি প্যাচ চালু হয়েছিল যা আপনাকে সেগমেন্টটি কোথায় তা নিয়ন্ত্রণ করতে দেয়। ট্রেডঅফটি হ'ল আপনি ব্যবহারযোগ্য স্থান থেকে দূরে অ্যাড্রেসযোগ্য মেমরি নিতে পারেন যাতে কার্নেলের আরও মেমরি থাকতে পারে যা ব্যবহার করার আগে এটির মানচিত্রের দরকার নেই।
অতিরিক্ত সম্পদ:
HIGHMEM কার্নেলের মেমরি স্পেসের একটি ব্যাপ্তি, তবে এটি আপনার অ্যাক্সেসের স্মৃতি নয় তবে এটি এমন একটি জায়গা যেখানে আপনি অ্যাক্সেস করতে চান সেখানে রেখে দেন।
একটি সাধারণ 32 বিট লিনাক্স ভার্চুয়াল মেমরি মানচিত্রটি হ'ল:
0x00000000-0xbfffffff: ব্যবহারকারী প্রক্রিয়া (3 জিবি)
0xc0000000-0xffffffff: কার্নেল স্পেস (1 জিবি)
(সিপিইউ-নির্দিষ্ট ভেক্টর এবং যা কিছু এখানে উপেক্ষা করা হয়)।
লিনাক্স 1 জিবি কার্নেল স্পেসকে 2 টুকরো, লওএমইএম এবং হাইটমেমে বিভক্ত করে। বিভাজন ইনস্টলেশন থেকে ইনস্টলেশন পর্যন্ত পরিবর্তিত হয়।
যদি কোনও ইনস্টলেশন চয়ন করে বলে, LOW এবং HIGH mems এর জন্য 512MB-512MB, 512MB LOWMEM (0xc0000000-0xdfffffff) স্থিরভাবে কার্নেল বুট করার সময় ম্যাপ করা হয়েছে; সাধারণত শারীরিক মেমরির প্রথম এতগুলি বাইট ব্যবহার করা হয় যাতে এই পরিসরে ভার্চুয়াল এবং শারীরিক ঠিকানাগুলিতে 0xc0000000 বলা যায় constant
অন্যদিকে, পরবর্তী 512 এমবি (হাইএইচএমইএম) এর কোনও স্থির ম্যাপিং নেই (যদিও আপনি পৃষ্ঠাগুলিকে অর্ধ-স্থায়ীভাবে ম্যাপযুক্ত রাখতে পারেন তবে আপনার ড্রাইভার কোডে অবশ্যই এটি স্পষ্টভাবে করতে হবে)। পরিবর্তে, পৃষ্ঠাগুলি এখানে অস্থায়ীভাবে ম্যাপ করা এবং আনম্যাপ করা হয় যাতে এই সীমার ভার্চুয়াল এবং শারীরিক ঠিকানার কোনও সামঞ্জস্যপূর্ণ ম্যাপিং না থাকে। HIGHMEM এর সাধারণ ব্যবহারের মধ্যে একক সময় ডেটা বাফার অন্তর্ভুক্ত।
অনেকে বলেছেন যে লো মেমরি অপারেটিং সিস্টেমের জন্য। এটি সাধারণত সত্য তবে এটি হতে হবে না। হাই মেমরি এবং লো মেমোরি মেমরি স্পেসের মাত্র দুটি অংশ, তবে লিনাক্স সিস্টেমে লো মেমরি কেবল কার্নেলের জন্য এবং ব্যবহারকারী প্রসেসের জন্য উচ্চ মেমরির জন্য থাকে।
"ডাইনোসর বই (অপারেটিং সিস্টেম ধারণা)" অনুসারে, আমরা অপারেটিং সিস্টেমকে কম স্মৃতি বা উচ্চ স্মৃতিতে রাখতে পারি। এই সিদ্ধান্তকে প্রভাবিত করার প্রধান কারণটি হ'ল বিঘ্নিত ভেক্টরের অবস্থান। যেহেতু বিঘ্নিত ভেক্টর প্রায়শই কম স্মৃতিতে থাকে তাই প্রোগ্রামাররা সাধারণত অপারেটিং সিস্টেমকে কম স্মৃতিতে রাখে।