ভ্যামলোক এবং কমলোকের মধ্যে পার্থক্য কী?


113

আমি প্রায় googled এবং বেশিরভাগ লোকের ব্যবহারের পক্ষে পরামর্শ পেয়েছি kmalloc, আপনি মেমরির সংক্ষিপ্ত শারীরিক ব্লক পাওয়ার গ্যারান্টিযুক্ত হিসাবে। যাইহোক, এটি এমনও মনে হয় যে আপনি যদি চান এমন kmallocএকটি স্থির শারীরিক ব্লক খুঁজে না পাওয়া যায় তবে এটি ব্যর্থ হতে পারে।
মেমরির একটানা ব্লক থাকার সুবিধা কী কী? বিশেষত, আমার কেন একটি সিস্টেম কল এ মেমরির একটি জটিল শারীরিক ব্লক থাকা প্রয়োজন ? আমি কেবল ব্যবহার করতে পারি না এমন কোনও কারণ আছে ? অবশেষে, যদি আমি একটি সিস্টেম কল পরিচালনা করার সময় মেমরি বরাদ্দ করি, আমি কি উল্লেখ করব ? একটি সিস্টেম কল একটি পারমাণবিক প্রসঙ্গে কার্যকর করা হয়?vmalloc
GFP_ATOMIC

GFP_ATOMIC
বরাদ্দ উচ্চ-অগ্রাধিকার এবং ঘুম হয় না। বাধা হ্যান্ডলার, নীচের অংশ এবং অন্যান্য পরিস্থিতিতে আপনি ঘুমাতে পারবেন না এমন ক্ষেত্রে ব্যবহার করার জন্য এটি পতাকা।

GFP_KERNEL এটি একটি সাধারণ বরাদ্দ এবং এটি ব্লক হতে পারে। প্রক্রিয়া প্রসঙ্গ কোডে ঘুমানোর জন্য নিরাপদ হলে এটি ব্যবহার করা পতাকা।


ভ্যামলোক এবং কেমলোক সম্পর্কে একটি ভাল নিবন্ধ http://learnlinuxconcepts.blogspot.in/2014/02/linux-memory-management.html
JIN007

4
এই নিবন্ধটি ননসেন্স হিসাবে দাবি করে: "সাধারণত 32 বিট আর্কিটেকচারের 4KB পৃষ্ঠার আকার থাকে এবং একটি 64 বিট আর্কিটেকচারের 8KB পৃষ্ঠার আকার থাকে"। আমি এটি পুরোপুরি পড়িনি, তবে আমি এটিকে "ভাল" বলব না, এমনকি এটি থেকে একটি শব্দও বিশ্বাস করব না।
আলেকজান্দ্রো সানচেজ

1
দ্রষ্টব্য (আধা-সম্পর্কিত): vmallocকার্নেল 5.2 (Q2 2019) এর সাথে দ্রুত
ভোনসি

উত্তর:


96

আপনার কেবল শারীরিকভাবে সুসংগত মেমোরি ব্যবহার করার বিষয়ে চিন্তা করতে হবে যদি বাফারটি শারীরিকভাবে সম্বোধিত বাসে (পিসিআইয়ের মতো) কোনও ডিএমএ ডিভাইস দ্বারা অ্যাক্সেস করতে পারে। সমস্যাটি হ'ল অনেকগুলি সিস্টেমে কলগুলি তাদের বাফারকে শেষ পর্যন্ত কোনও ডিএমএ ডিভাইসে পাঠানো হবে কিনা তা জানার কোনও উপায় নেই: একবার আপনি বাফারটিকে অন্য কার্নেল সাবসিস্টেমের কাছে পৌঁছে দিলে আপনি সত্যিই বুঝতে পারবেন না যে এটি কোথায় যাচ্ছে। এমনকি যদি কার্নেল আজ ডিএমএর জন্য বাফার ব্যবহার না করে তবে ভবিষ্যতের বিকাশ এটি করতে পারে।

ভিমলোক প্রায়শই কমলোকের চেয়ে ধীর হয় কারণ এটি বাফার স্পেসটিকে কার্যত সংক্ষিপ্ত পরিসরে পুনর্নির্মাণ করতে পারে। কেমলোক কখনই রিম্যাক হয় না, যদিও জিএফপি_এটমিকের সাথে কল না করা হলে কম্মলোক ব্লক করতে পারে।

কেমলোক এটি সরবরাহ করতে পারে এমন আকারে সীমিত: 128 কেবিট *) । আপনার যদি সত্যই বড় বাফার দরকার হয় তবে আপনাকে ভিমেলক বা বুট-এ উচ্চ মেমরি সংরক্ষণের মতো অন্য কোনও পদ্ধতি ব্যবহার করতে হবে।

*) এটি পূর্ববর্তী কার্নেলের ক্ষেত্রে সত্য ছিল। সাম্প্রতিক কার্নেলগুলিতে (আমি এটি ২.6.৩৩.২ এ পরীক্ষা করেছি), একটি একক কেমলোকের সর্বোচ্চ আকার 4 এমবি পর্যন্ত! (আমি এটি সম্পর্কে মোটামুটি বিস্তারিত পোস্ট লিখেছি ।) - কাইওয়ান

একটি সিস্টেম কলের জন্য আপনাকে জিএফপি_এটমিককে কমলোক () এ পাস করতে হবে না, আপনি জিএফপি_কিরনেল ব্যবহার করতে পারেন। আপনি কোনও বাধা হ্যান্ডলার নন: অ্যাপ্লিকেশন কোডটি একটি ফাঁদ দিয়ে কার্নেল প্রসঙ্গে প্রবেশ করে, এটি কোনও বাধা নয়।


1
আমি ভেবেছিলাম সিস্টেম কলগুলি $ 0x80 ট্রিগার করে প্রবেশ করেছিল? (অর্থাত্ একটি বাধা)?
ফ্রিমেমোরি

2
int $ 0x80 একটি সফটওয়্যার বাধাপ্রাপ্ত হয়, তাকে একটি ফাঁদও বলা হয়। বাধা হ্যান্ডলার বলতে যা বোঝায় তা হল একটি হার্ডওয়ার বাধা, যেমন যখন ব্যবহারকারী কোনও কী চাপায় বা চালনা সরিয়ে দেয়।
ব্রানান

সিস্টেম কলগুলি কার্নেল স্পেস ট্রানজিশনের জন্য ইউজারস্পেসের জন্য ... কেমলোক কেবল কার্নেল প্রসঙ্গে ব্যবহৃত হয় ??
এআইবি

3
@ ফ্রি মেমোরি: ইনট $ 0x80 x86-নির্দিষ্ট, এবং এরপরে এটি একটি পুরানো পদ্ধতি যা সিনেসর / সিস্কেল দ্বারা চালিত (x86 এ)।
jørgensen

18

সংক্ষিপ্ত উত্তর: লিনাক্স ডিভাইস ড্রাইভারগুলি ডাউনলোড করুন এবং মেমরি পরিচালনা সম্পর্কিত অধ্যায়টি পড়ুন।

গুরুতরভাবে, কার্নেল মেমরি পরিচালনার সাথে সম্পর্কিত অনেকগুলি সূক্ষ্ম ইস্যু রয়েছে যা আপনার বুঝতে হবে - আমি এটির সাথে আমার বেশিরভাগ সময় ডিবিগিং সমস্যা ব্যয় করি।

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


1
"কারন কার্নেল খুব কমই ভার্চুয়াল মেমরি ব্যবহার করে" কেন এটি এমন কেন?
ট্রে

কারণ আপনি সাধারণত কার্নেল ব্লকটি চান না যখন এটি যখন কার্নেলটি ডিস্ক
মাইক হেইঞ্জ

না, ভিমলোক দিয়ে বরাদ্দ করা কার্নেল মেমরিটি কখনই অদলবদল হয় না । শুধুমাত্র ইউজারস্পেস মেমরিটি অদলবদল করা যায়। কার্নেলের ঠিকানা স্থানটি অদলবদলযোগ্য এবং vmalloc কার্নেলের ঠিকানার জায়গায় বরাদ্দ দেয়।
user2679859

13

রবার্ট লাভের লিনাক্স কার্নেল ডেভলপমেন্ট (তৃতীয় সংস্করণে অধ্যায় 12, পৃষ্ঠা 244) এর সুস্পষ্ট উত্তর দেয়।

হ্যাঁ, বেশিরভাগ ক্ষেত্রে শারীরিকভাবে স্থায়ী মেমরির প্রয়োজন হয় না। কার্মনে ভিমলোকের চেয়ে কমলোকের বেশি ব্যবহারের মূল কারণটি হল কর্মক্ষমতা। বইটিতে ব্যাখ্যা করা হয়েছে, যখন বড় মেমরি খণ্ডগুলি ভ্যামলোক ব্যবহার করে বরাদ্দ করা হয়, তখন কার্নেলকে শারীরিকভাবে অবিসংবাদযুক্ত অংশগুলি (পৃষ্ঠাগুলি) একটি একক স্বতন্ত্র ভার্চুয়াল মেমরি অঞ্চলে মানচিত্র করতে হয়। যেহেতু মেমরিটি কার্যত সংক্ষিপ্ত এবং শারীরিকভাবে অ-সঙ্গতিপূর্ণ তাই বেশ কয়েকটি ভার্চুয়াল-থেকে-শারীরিক ঠিকানা ম্যাপিংগুলি পৃষ্ঠার সারণিতে যুক্ত করতে হবে। এবং সবচেয়ে খারাপ ক্ষেত্রে, পৃষ্ঠা টেবিলটিতে ম্যাপিংগুলির সংখ্যা (বাফার / পৃষ্ঠার আকার) থাকবে

এই বাফারটি অ্যাক্সেস করার সময় এটি টিএলবি (সাম্প্রতিক ভার্চুয়ালটি ফিজিকাল অ্যাড্রেস ম্যাপিংগুলিতে স্টোর করা ক্যাশে এন্ট্রি )গুলিতেও চাপ যুক্ত করে। এটি ছিটকে যাওয়ার দিকে নিয়ে যেতে পারে ।


11

kmalloc()& vmalloc()ফাংশন বাইট আকারের অংশ কার্নেল মেমরি পাওয়ার জন্য একটি সহজ ইন্টারফেস আছে।

  1. kmalloc()ফাংশন গ্যারান্টী বা নিশ্চয়তা দিচ্ছে পৃষ্ঠাগুলি শারীরিকভাবে সংলগ্ন (এবং কার্যত সংলগ্ন) হয়।

  2. vmalloc()ফাংশন একটি অনুরূপ ফ্যাশন কাজ করে kmalloc(), বরাদ্দ মেমরি যা শুধুমাত্র কার্যত সংলগ্ন এবং অগত্যা শারীরিকভাবে সংলগ্ন নয় এটা ছাড়া।


4

মেমরির একটানা ব্লক থাকার সুবিধা কী কী? বিশেষত, আমার কেন সিস্টেম কল এ মেমরির একটি জটিল শারীরিক ব্লক লাগবে? আমি কেবল ভ্যামলোক ব্যবহার করতে পারি না এমন কোনও কারণ আছে?

গুগলের "আমি ভাগ্যবান বোধ করছি" থেকে vmalloc:

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


দেখুন, আমি এটি পড়েছি এবং এটি আমার কাছে বোধগম্য নয়। আমি বড় অঞ্চলের জন্য কমলোক ব্যবহার করে বুঝতে পারি ; তবে ছোট বরাদ্দগুলির জন্য, কেন ভিজিটল ব্যবহার করবেন না শারীরিক স্মৃতি ভাঙতে এড়ানোর জন্য?
ফ্রিমেমোরি

কারণ আপনার সেরাটি করার জন্য কার্নেলের উপর বিশ্বাস করা উচিত; যদি এটি মনে করে যে একক অংশ বরাদ্দ করা ভাল, তবে এটি করা হবে। ভ্যামলোক কেবল তখনই যখন আপনার অবশ্যই একেবারে সংলগ্ন অংশ থাকতে পারে।
অন্ধকার শিকারি

আমি অনুমান করি যে এটি উপলব্ধি করে, তবে এটি বিপরীত বলে মনে হয়। কেমলোক শোনাচ্ছে যেমন পারফরম্যান্স অত্যন্ত উদ্বেগের সাথে ব্যবহার করা উচিত (যেমন আমি ডিস্ক আইও দ্বারা জর্জরিত হতে পারি না)। এছাড়াও, GFP_ATOMIC সম্পর্কে কী?
ফ্রি মেমোরি

2

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

vmalloc () কার্নেল ভার্চুয়াল ঠিকানাটি দেয় যা ফলস্বরূপ শারীরিক র‍্যামের সাথে একটি ম্যাপিং নাও থাকতে পারে। বৃহত মেমরির বরাদ্দের জন্য দরকারী এবং যে ক্ষেত্রে আমাদের প্রসেসের জন্য বরাদ্দ হওয়া মেমরিটি শারীরিক র‍্যামেও অবিচ্ছিন্ন থাকে সেদিকে আমরা যত্নশীল নই।


1

অন্যান্য পার্থক্যের মধ্যে একটি হ'ল কমলোক লজিক্যাল ঠিকানাটি ফিরিয়ে দেবে (অন্যথায় আপনি জিপিএফএইচইইচইইইএমএম নির্দিষ্ট করে)। যৌক্তিক ঠিকানাগুলি "লো মেমোরি" (শারীরিক মেমরির প্রথম গিগাবাইটে) স্থাপন করা হয় এবং সরাসরি শারীরিক ঠিকানাগুলিতে ম্যাপ করা হয় (এটিকে রূপান্তর করতে __pa ম্যাক্রো ব্যবহার করুন)। এই বৈশিষ্ট্যটি বোঝায় যে kmalloced মেমরি অবিচ্ছিন্ন স্মৃতি।

অন্যদিকে, ভ্যামলোক "উচ্চ স্মৃতি" থেকে ভার্চুয়াল ঠিকানাগুলি ফিরিয়ে দিতে সক্ষম। এই ঠিকানাগুলিকে সরাসরি ফ্যাশনে শারীরিক ঠিকানায় রূপান্তর করা যায় না (আপনাকে virt_to_page ফাংশনটি ব্যবহার করতে হবে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.