যেমন অন্যরা সঠিকভাবে নির্দেশ করেছে, কোনও প্রক্রিয়া দ্বারা ব্যবহৃত প্রকৃত মেমরির ভাগ করা অঞ্চলগুলি এবং এমএমপ'যুক্ত ফাইলগুলি কী এবং কী কী তা ব্যবহার করা শক্ত।
আপনি যদি পরীক্ষক হন তবে আপনি ভালগ্রাইন্ড এবং ম্যাসিফ চালাতে পারেন । এটি নৈমিত্তিক ব্যবহারকারীর জন্য কিছুটা ভারী হয়ে উঠতে পারে তবে আপনি সময়ের সাথে সাথে একটি অ্যাপ্লিকেশনটির স্মৃতি আচরণের ধারণা পাবেন। যদি কোনও অ্যাপ্লিকেশন ম্যালোক () এর প্রয়োজন মতো হয় তবে এটি আপনাকে প্রক্রিয়াটির আসল গতিশীল মেমরির ব্যবহারের একটি ভাল উপস্থাপনা দেবে। তবে এই পরীক্ষাটি "বিষাক্ত" হতে পারে।
বিষয় জটিল করতে, লিনাক্স আপনি করতে পারবেন overcommit আপনার মেমরি। আপনি যখন মেমোরি malloc করেন, আপনি স্মৃতি গ্রাস করার আপনার উদ্দেশ্যটি উল্লেখ করছেন। আপনার বরাদ্দ হওয়া "র্যাম" এর নতুন পৃষ্ঠায় বাইট না লিখে অবধি সত্যিই ঘটে না। আপনি নিজের মতো এটি একটি সামান্য সি প্রোগ্রাম লিখে এবং চালিয়ে প্রমাণ করতে পারেন:
// test.c
#include <malloc.h>
#include <stdio.h>
#include <unistd.h>
int main() {
void *p;
sleep(5)
p = malloc(16ULL*1024*1024*1024);
printf("p = %p\n", p);
sleep(30);
return 0;
}
# Shell:
cc test.c -o test && ./test &
top -p $!
১GB জিবি র্যামেরও কম র্যাম সহ একটি মেশিনে এটি চালান এবং ভোইলা! আপনি সবেমাত্র ১GB জিবি মেমরি পেয়েছেন! (না সত্যিই না).
লক্ষ্য করুন top
আপনি "ভিআইআরটি" 16.004 জি হিসাবে দেখেন তবে% এমইএম 0.0 হয়
এটি আবার ভালগ্রাইন্ড দিয়ে চালান:
# Shell:
valgrind --tool=massif ./test &
sleep 36
ms_print massif.out.$! | head -n 30
এবং ম্যাসিফ "সমস্ত বরাদ্দের যোগফল () = 16 গিগাবাইট" বলে। সুতরাং এটি খুব আকর্ষণীয় নয়।
কিন্তু, আপনি যদি এটি একটি বুদ্ধিমান প্রক্রিয়াতে চালনা করেন :
# Shell:
rm test test.o
valgrind --tool=massif cc test.c -o test &
sleep 3
ms_print massif.out.$! | head -n 30
--------------------------------------------------------------------------------
Command: cc test.c -o test
Massif arguments: (none)
ms_print arguments: massif.out.23988
--------------------------------------------------------------------------------
KB
77.33^ :
| #:
| :@::@:#:
| :::::@@::@:#:
| @:: :::@@::@:#:
| ::::@:: :::@@::@:#:
| ::@:::@:::::@:: :::@@::@:#:
| @::@:::@:::::@:: :::@@::@:#:
| @::@:::@:::::@:: :::@@::@:#:
| :@@@@@@@@@@@@@@@@@@@@:@::@:::@:::::@:: :::@@::@:#:
| :@@ :@::@:::@:::::@:: :::@@::@:#:
| :@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| ::::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| ::::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
0 +----------------------------------------------------------------------->Mi
0 1.140
এবং এখানে আমরা দেখতে পেয়েছি (খুব অনুগতভাবে এবং খুব উচ্চ আত্মবিশ্বাসের সাথে) যে সংকলকটি 77KB গাদা বরাদ্দ করেছে।
শুধু স্তূপ ব্যবহারের জন্য কেন এত চেষ্টা করুন? কারণ একটি প্রক্রিয়া যে সমস্ত ভাগ করা অবজেক্ট এবং পাঠ্য বিভাগগুলি ব্যবহার করে (এই উদাহরণস্বরূপ, সংকলক) মারাত্মক আকর্ষণীয় নয়। তারা একটি প্রক্রিয়া জন্য ধ্রুবক ওভারহেড হয়। প্রকৃতপক্ষে, প্রক্রিয়াটির পরবর্তী অনুরোধগুলি প্রায় "ফ্রি" এর জন্য আসে।
এছাড়াও, নিম্নলিখিত তুলনা করুন এবং বিপরীতে:
এমএমএপি () একটি 1 জিবি ফাইল। আপনার ভিএমএস আকারটি 1 + জিবি হবে। তবে আপনি আবাসিক সেট আকার হবেন কেবলমাত্র সেই ফাইলের অংশ যা আপনি পৃষ্ঠাতে তৈরি করেছেন (সেই অঞ্চলে কোনও পয়েন্টারকে ডিফারেন্স করে)। এবং আপনি যদি পুরো ফাইলটি "পড়" তখন, শেষের দিকে এসে পৌঁছানোর পরে, কার্নেলটি ইতিমধ্যে সূচনা পৃষ্ঠাটি বের করে ফেলেছে (এটি করা সহজ কারণ কার্নেল জানে যে ঠিক কীভাবে / কোথায় এই পৃষ্ঠাগুলি প্রতিস্থাপন করতে হবে যদি আবার বিবেচনা করা হয়) )। উভয় ক্ষেত্রেই, ভিএমএসাইজ বা আরএসএস উভয়ই আপনার স্মৃতি "ব্যবহারের" জন্য একটি ভাল সূচক নয়। আপনি আসলে ম্যালোক () এর এড কিছুই করেননি।
বিপরীতে, ম্যালোক () এবং মেমরির প্রচুর স্পর্শ করুন - যতক্ষণ না আপনার স্মৃতি ডিস্কে সরে যায়। সুতরাং আপনার বরাদ্দ মেমরি এখন আপনার আরএসএস অতিক্রম করে। এখানে, আপনার ভিএমএসাইজ আপনাকে কিছু বলতে শুরু করতে পারে (আপনার র্যামের মধ্যে থাকা প্রক্রিয়াটির চেয়ে আপনার প্রক্রিয়াটি আরও বেশি মেমরির মালিক)। কিন্তু ভাগ করা পৃষ্ঠাগুলি এবং ভিএএম যে ডেটা অদলবদল করা হয় তার মধ্যে পার্থক্য করা এখনও কঠিন।
এখানেই ভালগ্র্যান্ড / ম্যাসিফ আকর্ষণীয় হয়ে ওঠে। এটি আপনাকে প্রদর্শন করে যা আপনি ইচ্ছাকৃতভাবে বরাদ্দ করেছেন (আপনার পৃষ্ঠাগুলির অবস্থা নির্বিশেষে)।
htop
একই প্রশ্নের একটি লেখকের আমার উত্তর ভাগ করা উচিত ... / proc / meminfo (এইচটিপি এর মতো) থেকে মেমরির ব্যবহার কীভাবে গণনা করতে হবে