প্রসেস দ্বারা ফাইলগুলি কি র‌্যামে লোড করা হয়?


24

কমান্ডগুলি উদাহরণস্বরূপ sed, প্রোগ্রাম এবং প্রোগ্রামগুলি কোনও ফাইলের অভ্যন্তরে কোডযুক্ত লজিক এবং এই ফাইলগুলি হার্ড ডিস্কের কোথাও। কমান্ডগুলি চালিত হওয়ার পরে, হার্ড ডিস্ক থেকে তাদের ফাইলগুলির একটি অনুলিপি র‍্যামে রাখা হয় , যেখানে তারা প্রাণে আসে এবং স্টাফ করতে পারে এবং প্রসেসগুলি বলে

প্রক্রিয়াগুলি অন্যান্য ফাইলগুলি ব্যবহার করতে পারে, সেগুলিতে পড়তে বা লিখতে পারে এবং যদি তারা এই ফাইলগুলি করে তবে ওপেন ফাইলগুলি বলা হয়। সব চলমান প্রসেস দ্বারা সব ফাইল খুলুন তালিকা কমান্ড হল: lsof

ঠিক আছে, তাই আমি যা ভাবছি তা হ'ল যদি কোনও কমান্ডের দ্বিগুণ জীবন, একটি হার্ড ডিস্কে, র‌্যামের অন্যটি অন্য ধরণের ফাইলগুলির ক্ষেত্রেও সত্য, উদাহরণস্বরূপ যাদের লজিক প্রোগ্রামিং নেই, তবে কেবল কন্টেইনারগুলির জন্য রয়েছে ডেটা।

আমার ধারণাটি হ'ল, প্রক্রিয়াগুলি দ্বারা খোলা ফাইলগুলিও র‌্যামে লোড হয়। আমি জানি না এটি সত্য কিনা, এটি কেবল একটি অন্তর্দৃষ্টি।

দয়া করে, কেউ এটি বোঝাতে পারে?


উত্তর:


27

কমান্ডগুলি চালিত হওয়ার পরে, হার্ড ডিস্ক থেকে তাদের ফাইলগুলির একটি অনুলিপি র‍্যামে রাখা হয়,

এটি ভুল (সাধারণভাবে)। যখন কোনও প্রোগ্রাম কার্যকর করা হয় (থ্রু এক্সিকিউ (2) ...) প্রক্রিয়াটি (সেই প্রোগ্রামটি চালাচ্ছে) তার ভার্চুয়াল অ্যাড্রেস স্পেস পরিবর্তন করে এবং কার্নেল সেই উদ্দেশ্যে এমএমইউ পুনরায় কনফিগার করছে । ভার্চুয়াল মেমরি সম্পর্কেও পড়ুন । লক্ষ করুন যে, অ্যাপ্লিকেশন প্রোগ্রাম ব্যবহার করে তাদের ভার্চুয়াল অ্যাড্রেস স্পেস পরিবর্তন করতে পারেন mmap (2) & munmap& mprotect (2) , এছাড়াও দ্বারা ব্যবহৃত গতিশীল linker (দেখুন LD-লিনাক্স (8) )। আরও দেখুন madvise (2) & posix_fadvise (2) & mlock (2)

ভবিষ্যতের পৃষ্ঠা ত্রুটিগুলি এক্সিকিউটেবল ফাইল থেকে পৃষ্ঠা (লোজিলি) লোড করার জন্য কার্নেল দ্বারা প্রক্রিয়া করা হবে। থ্র্যাশিং সম্পর্কেও পড়ুন ।

কার্নেল একটি বৃহত পৃষ্ঠার ক্যাশে বজায় রাখে । অনুলিপি সম্পর্কেও পড়ুন । আরও দেখুন readahead (2)

ঠিক আছে, তাই আমি যা ভাবছি তা হ'ল যদি কোনও কমান্ডের দ্বিগুণ জীবন, একটি হার্ড ডিস্কে, র‌্যামের অন্যটি অন্য ধরণের ফাইলগুলির ক্ষেত্রেও সত্য, উদাহরণস্বরূপ যাদের লজিক প্রোগ্রামিং নেই, তবে কেবল কন্টেইনারগুলির জন্য রয়েছে ডেটা।

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

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

আরও দেখুন লিনাক্স খেতাম সেটাও খেয়েছি আমার র্যাম মত এবং চালানোর কমান্ড xosview, top, htopবা cat /proc/self/mapsবা cat /proc/$$/maps(দেখুন proc (5) )।

গীত। আমি লিনাক্সে ফোকাস করছি, তবে অন্যান্য ওএসের ভার্চুয়াল মেমরি এবং পৃষ্ঠা ক্যাশে রয়েছে।


35

না, কোনও ফাইল এটিকে খোলার মাধ্যমে মেমরিটিতে স্বয়ংক্রিয়ভাবে পড়া হয় না। এটি ভয়াবহভাবে অকার্যকর হবে। sedউদাহরণস্বরূপ, অন্যান্য ইউনিক্স সরঞ্জামগুলির মতো এটির ইনপুট লাইনও লাইনে পড়ে। এটি কদাচিৎ বর্তমান লাইনের চেয়ে স্মৃতিতে বেশি রাখতে হবে।

সঙ্গে awkএটি একই আছে। এটি একটি সময়ে একটি রেকর্ড পড়ে , যা ডিফল্টরূপে একটি লাইন। আপনি ভেরিয়েবল ইনপুট ডেটা পার্টসের দোকান পারেন, যে অতিরিক্ত, অবশ্যই হতে হবে 1

কিছু লোকের মতো জিনিস করার অভ্যাস থাকে

for line in $(cat file); do ...; done

যেহেতু শেলটি লুপের $(cat file)এমনকি প্রথম পুনরাবৃত্তি চালানোর আগে কমান্ড প্রতিস্থাপনটিকে পুরোপুরি প্রসারিত করতে হবেfor , এটি পুরো মেমোরিতে পড়বে (শেলটি লুপ চালানো মেমরিটিতে)। এটি কিছুটা মূর্খ এবং অপ্রয়োজনীয়ও। পরিবর্তে, এক করা উচিতfilefor

while IFS= read -r line; do ...; done <file

এটি fileলাইন দ্বারা লাইন প্রক্রিয়া করবে (তবে "আইএফএস = রিড-আর লাইন" বোঝার জন্য পড়ুন )।

শেলের লাইনে ফাইলগুলি লাইন প্রক্রিয়াকরণ করা খুব কমই প্রয়োজন যদিও বেশিরভাগ ইউটিলিটিগুলি যাইহোক লাইন-ভিত্তিক হয় (দেখুন পাঠকে খারাপ অনুশীলন হিসাবে বিবেচনা করার জন্য শেল লুপটি কেন ব্যবহার করা হচ্ছে? )।

আমি বায়োইনফরম্যাটিকসে কাজ করছি এবং বিপুল পরিমাণ জিনোমিক ডেটা প্রক্রিয়াকরণ করার সময় আমি কেবলমাত্র মেমরিতে একেবারে প্রয়োজনীয় ডেটার বিট না রাখলে আমি বেশি কিছু করতে পারতাম না। উদাহরণস্বরূপ, যখন আমার কোনও ভিসিএফ ফাইলে ডিএনএ ভেরিয়েন্টযুক্ত 1 টেরাবাইট ডেটাসেটের ব্যক্তিদের সনাক্ত করতে ব্যবহার করা যেতে পারে এমন ডেটার বিটগুলি সরিয়ে ফেলতে হবে (কারণ এই ধরণের ডেটা জনসম্মুখে প্রকাশ করা যায় না), আমি লাইন দিয়ে লাইনে করি একটি সাধারণ awkপ্রোগ্রামের সাথে প্রক্রিয়াজাতকরণ (ভিসিএফ ফর্ম্যাটটি লাইন-ভিত্তিক হওয়ায় এটি সম্ভব)। আমি মেমরিটিতে ফাইলটি পড়ি না , এটি প্রক্রিয়া করে সেখানে আবার লিখি! যদি ফাইলটি সংকুচিত করা হত, তবে আমি এটিকে মাধ্যমে ফিড করব zcatবা gzip -d -c, যেহেতু gzip, ডেটা প্রবাহের প্রক্রিয়াকরণ থেকে, পুরো ফাইলটি মেমরিতে পড়বে না।

এমনকি JSON বা XML এর মতো লাইন ভিত্তিক নয় এমন ফাইল ফর্ম্যাটগুলির সাথেও স্ট্রিম পার্সার রয়েছে যা র্যামের মধ্যে সমস্ত সংরক্ষণ না করেই বিশাল ফাইলগুলি প্রক্রিয়া করা সম্ভব করে।

এক্সিকিউটেবলের সাথে, ভাগ করা লাইব্রেরিগুলি চাহিদা অনুসারে লোড হতে পারে এবং / বা প্রক্রিয়াগুলির মধ্যে ভাগ করা যেতে পারে ( উদাহরণস্বরূপ ভাগ করা লাইব্রেরি এবং র‌্যাম ব্যবহারের লোড দেখুন )।

ক্যাশে করা এমন কিছু যা আমি এখানে উল্লেখ করি নি। এই তথ্যটি প্রায়শই অ্যাক্সেস করা টুকরো রাখা র‌্যাম ব্যবহারের ক্রিয়া। ক্ষুদ্রতর ফাইলগুলি (উদাহরণস্বরূপ এক্সিকিউটেবল) ওএসের সাহায্যে ক্যাশ করা যেতে পারে এই আশায় যে ব্যবহারকারী তাদের কাছে অনেকগুলি রেফারেন্স তৈরি করবে। ফাইলটির প্রথম পড়া ছাড়াও পরবর্তী অ্যাকসেসগুলি ডিস্কের পরিবর্তে র‌্যামে করা হবে। ক্যাচিং, যেমন ইনপুট এবং আউটপুট বাফারিং সাধারণত ব্যবহারকারীর কাছে অনেকাংশে স্বচ্ছ হয় এবং জিনিসগুলি ক্যাশে করতে ব্যবহৃত মেমরির পরিমাণ অ্যাপ্লিকেশন ইত্যাদির দ্বারা বরাদ্দ হওয়া র্যামের পরিমাণের উপর নির্ভর করে পরিবর্তনশীল পরিবর্তন হতে পারে etc.


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


আপনি বলেছিলেন, ভাগ করা লাইব্রেরিগুলি র্যামে লোড করা সম্ভব, কোনও নিয়মিত ফাইল লোড করাও কি সম্ভব, যাতে কেবলমাত্র র্যামে ডেটা থাকে, যদিও তা বোঝা যায় না?
শার্কান্ট

1
@ শারকান্ত অবশ্যই এটি কেবলমাত্র একটি ভেরিয়েবলের (বা অ্যারে, বা হ্যাশ, বা যে কোনও ডেটা কাঠামোগত ভাষা সরবরাহের প্রশ্নে সরবরাহ করে) যতক্ষণ না সমস্ত ফাইল সঞ্চিত হয়। সঙ্গে awk, { a[i++] = $0 }অ্যারেতে ইনপুট ফাইল সব লাইন যোগ হবে a। আপনি সি ফাংশনটি সন্ধান করতেও পারেন mmap()তবে এর ব্যবহারটি এখানে কিছুটা অফ-টপিক হতে পারে।
কুসালানন্দ

6
sed, awkএবং অন্যান্য লাইন-ভিত্তিক প্রোগ্রামগুলি একবারে মেমরির মধ্যে একটি লাইন পড়ে না, কারণ সরল পাঠ্য ফাইলগুলিতে একটি লাইন সূচক থাকে না এবং ফাইল সিস্টেম এপিআই এবং নিম্ন-স্তরের স্টোরেজ হার্ডওয়্যার এক বা একাধিক "সেক্টর" পড়ে (সাধারণত 512) বা 1024 বাইট) একসাথে। যদি আমি প্রথম লাইনটি প্রক্রিয়াজাতকরণের আগে 8KB এর চেয়ে কম ওএস দ্বারা মেমরিতে পড়ে থাকি তবে আমি অবাক হই।
রাসেল বোরোগোভ

5
যদিও এর মতো কোনও ইউটিলিটি sedকেবল একবারে একটি লাইন মেমোরিতে পড়বে, তবে এটি উল্লেখ করার মতো যে অপারেটিং সিস্টেমগুলি ফাইলে ক্যাশে ফ্রি র‌্যাম ব্যবহার করবে যাতে এগুলি দ্রুত অ্যাক্সেস করতে পারে। আপনি যদি sedএকটি ছোট ফাইলটিতে চালিত হন তবে এটি সম্ভব হয় যে ওএস মেমরির মধ্যে পুরো ফাইলটিকে ক্যাশে করবে এবং পুরোপুরি র‌্যামে সম্পন্ন হবে। দেখুন: এন.ইউইকিপিডিয়া.আর
শন ডসন

5
@ শারকান্ত মেমরিতে সম্পূর্ণরূপে অ্যাক্সেসযোগ্য একটি ফাইল থাকার ক্ষেত্রে ব্যবহার রয়েছে (অন্য উত্তরটি দেখুন, এমএমএপটি এখানে কীওয়ার্ড সিস্টেম কল)। উদাহরণস্বরূপ, একটি ডাটাবেস সিস্টেম সাধারণত অ্যাক্সেসের স্বাচ্ছন্দ্য এবং গতির জন্য পুরো ডাটাবেস বা কমপক্ষে কিছু সূচকে মেমরিতে ম্যাপ করে রাখতে চায়। এর অর্থ এই নয় যে পুরো জিনিসটি আসলে মেমরির মধ্যে রয়েছে। ওএস "ভান" করতে মুক্ত যে ফাইলটি স্মৃতিতে রয়েছে। এটি অ্যাপ্লিকেশনটিকে "এখানে, মেমরির এই ব্যাপ্তিতে আপনার ফাইলটি" বলে দেয় এবং কেবল একবার একবার পঠন করা হয় (ঠিক যখন প্রক্রিয়াটি অদলবদল হয়ে যায়), তথ্যটি আসলে পড়ে।
জোনাস শ্যাফার 30:37

5

না, যদিও এই দিনগুলিতে র‌্যামের জিগ রাখা চমত্কার, এমন একটি সময় ছিল যখন র‌্যাম খুব সীমাবদ্ধ সংস্থান ছিল (আমি 2MB র‌্যামের একটি ভ্যাক্স 11/750 এ প্রোগ্রামিং শিখেছিলাম) এবং র‌্যামের একমাত্র জিনিস ছিল কার্যকর কার্যকর এবং ডেটা পৃষ্ঠাগুলি সক্রিয় প্রক্রিয়া এবং ফাইল ডেটা যা বাফার ক্যাশে ছিল।
বাফার ক্যাশে ফ্লাশ করা হয়েছিল এবং ডেটা পৃষ্ঠাগুলি অদলবদল করা হয়েছিল। এবং প্রায়শই মাঝে মাঝে। কেবলমাত্র পঠনযোগ্য সম্পাদনযোগ্য পৃষ্ঠাগুলি লিখিত ছিল এবং পৃষ্ঠাগুলি চিহ্নিত হয়েছে যাতে প্রোগ্রামটি যদি সেই পৃষ্ঠাগুলিকে আবার স্পর্শ করে তবে সেগুলি ফাইল সিস্টেম থেকে পেজ করা হয়। অদলবদল থেকে ডেটা পেজড করা হয়েছিল। উপরে উল্লিখিত হিসাবে, এসটিডিআইও গ্রন্থাগারটি ব্লকগুলিতে ডেটা টেনে নিয়েছিল এবং প্রয়োজনীয়ভাবে প্রোগ্রাম দ্বারা প্রাপ্ত করা হয়েছিল: fgetc, fgets, fread, ইত্যাদি। এমএএম্যাপের সাহায্যে একটি ফাইল প্রক্রিয়াটির ঠিকানার জায়গাতে ম্যাপ করা যায়, যেমনটি সম্পন্ন করা হয় ভাগ করা লাইব্রেরি অবজেক্টস এমনকি নিয়মিত ফাইল। হ্যাঁ, এটি র‌্যামে রয়েছে বা না (মলক) থাকলে আপনার কিছুটা নিয়ন্ত্রণ থাকতে পারে তবে এটি কেবল এতদূর চলে যায় (মলকের ত্রুটি কোড বিভাগটি দেখুন)।


1
"আপনার ফাইলগুলির জন্য আপনার র‌্যাম খুব ছোট হতে চলেছে" উক্তিটি এখন সত্য যেমনটি ভ্যাক্সের পুরানো দিনগুলিতে ছিল।
ফেডেরিকো পোলোনি

1
@ ফেডেরিকো_পোলনি আজ তেমন সত্য নয়। আমার শেষ নিয়োগকর্তায় আমরা একটি ওয়ার্কস্টেশন-ক্লাসের পিসি দিয়েছিলাম 1 টিবি র‌্যাম এবং মাত্র 0.5 টিবি হার্ড ডিস্ক। (সমস্যা শ্রেণি: গণনার সময় ছোট ইনপুট, মাঝারি আউটপুট, বড় এলোমেলোভাবে অ্যাক্সেস করা অ্যারে)।
নিগেল 222
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.