আধুনিক লিনাক্সে কেন, ডিফল্ট স্ট্যাকের আকার এত বিশাল - 8 এমবি (কিছু বিতরণে এমনকি 10)


10

উদাহরণস্বরূপ, ওএসএক্সে, এটি 512 কেও কম।

অ্যাপটি পুনরাবৃত্তি ব্যবহার করে না এবং প্রচুর স্ট্যাক ভেরিয়েবল বরাদ্দ করে না এমন প্রস্তাবিত আকার রয়েছে কি ?
আমি জানি প্রশ্নটি খুব বিস্তৃত এবং এটি ব্যবহারের উপর নির্ভর করে, তবে এখনও জিজ্ঞাসা করতে চেয়েছিলাম, কারণ আমি ভাবছিলাম যে এই বিশাল সংখ্যার পিছনে কোনও লুকানো / অভ্যন্তরীণ / সিস্টেমের কারণ আছে কিনা ।


আমি ভাবছিলাম, যেহেতু আমি আমার অ্যাপ্লিকেশনে স্ট্যাকের আকারটি 512 কিবিতে পরিবর্তন করতে চাইছি - এটি এখনও এটির জন্য বিশাল সংখ্যার মতো মনে হচ্ছে, তবে এটি 8 এমআইবির তুলনায় অনেক ছোট - এবং প্রক্রিয়াটির ভার্চুয়াল স্মৃতিতে উল্লেখযোগ্য পরিমাণ হ্রাস পাবে, প্রচুর থ্রেড রয়েছে (আই / ও)।

আমি আরও জানি যে এটি সত্যই আঘাত করে না, এখানে ভালভাবে ব্যাখ্যা করা হয়েছে : পাইথ্রেডগুলির জন্য ডিফল্ট স্ট্যাকের আকার


আপনি কি 32-বিট সিপিইউ ব্যবহার করছেন? X86_64 সিপিইউ 128 টেরাবাইট (ব্যবহারকারীর স্পেস) পর্যন্ত ভার্চুয়াল অ্যাড্রেস স্পেস সরবরাহ করে, এটি 8 এমবি স্ট্যাকের জন্য যথেষ্ট পরিমাণে হওয়া উচিত।
জোহান ম্যারেইন

@ জোহানমায়রিন - না, x64 এটি। এটি কোনও বড় বিষয় নয়, আমি কেবল ভাবছিলাম, এটি করার কোনও সত্যিকারের কারণ নেই (এই মুহুর্তে)।
কিরিল কিরভ

2019 এবং 8 এমআইবি অনেক স্মৃতি? আমি তাই মনে করি না. একটি বড় ডিফল্ট স্ট্যাক আকার থাকা পুনরাবৃত্তি সহ প্রোগ্রামগুলি লেখা খুব সহজ করে তোলে। আমি খুব অবাক হয়ে জানলাম উইন্ডোজে ডিফল্ট স্ট্যাকের আকারটি মাত্র 1MiB!
ওল্ডারেল

উত্তর:


15

যেমনটি অন্যেরা বলেছেন, এবং আপনার প্রশ্নে আপনি যে লিঙ্কটি দিয়েছেন তাতে উল্লেখ করা হয়েছে, 8 এমআইবি স্ট্যাক থাকা কোনও ক্ষতি করে না (অ্যাড্রেস স্পেস গ্রহণ করা ব্যতীত - won't৪-বিট সিস্টেমে কোনও বিষয় নয়)।

লিনাক্স খুব দীর্ঘ সময়ের জন্য 8MiB স্ট্যাক ব্যবহার করেছে; পরিবর্তনটি 1995 এর জুলাই মাসে কার্নেলের 1.3.7 সংস্করণে প্রবর্তন করা হয়েছিল Back এর আগে এটি একটি সীমা প্রবর্তন হিসাবে উপস্থাপিত হয়েছিল, আগে সেখানে ছিল না:

স্ট্যাককে কিছু বুদ্ধিমান ডিফল্টের মধ্যে সীমাবদ্ধ করুন: প্রয়োজন হলে রুট সর্বদা এই সীমাটি বাড়িয়ে তুলতে পারে .. 8 এমবি যুক্তিসঙ্গত বলে মনে হয়।

লিনাক্সে, স্ট্যাক সীমাটি প্রোগ্রাম আর্গুমেন্ট এবং পরিবেশের আকারকেও প্রভাবিত করে, যা স্ট্যাকের সীমাটির এক চতুর্থাংশের মধ্যে সীমাবদ্ধ ; আর্গুমেন্ট এবং পরিবেশের জন্য কার্নেল সর্বনিম্ন 32 পৃষ্ঠাগুলি প্রয়োগ করে।

থ্রেডগুলির জন্য, যদি স্ট্যাকের সীমা ( RLIMIT_STACK) সীমাহীন pthread_createহয় তবে নতুন থ্রেডের স্ট্যাকগুলিতে তার নিজস্ব সীমা প্রয়োগ করে - এবং বেশিরভাগ আর্কিটেকচারে, এটি 8MiB এর চেয়ে কম।


1
বাহ, আকর্ষণীয়। আমি ভেবেছিলাম যে সম্প্রতি চালু হয়েছিল। আমার প্রায় 200 টি থ্রেড রয়েছে (এটি অন্য দীর্ঘ বিষয়, সুতরাং আসুন মুহূর্তের জন্য একে এড়িয়ে চলুন) এবং topভীতিকর ভিআইআরটি ফলাফলগুলিতে দেখায়। যদিও, কিছুটা গভীর খনন করা হলেও, এই ভার্চুয়াল ঠিকানার বেশিরভাগ অংশ স্ট্যাকের আকার থেকে নয়, প্রতি থ্রেড (মেমরি) আঞ্চলিক অঞ্চল থেকে নেওয়া হয়েছে, সুতরাং স্ট্যাকের আকারটি হ্রাস করে ভার্চুয়াল মেমরিটি খুব দ্রুত হ্রাস পাবে না won't আমি শুধু কৌতূহল ছিলাম কেন 8 এমআইবি এবং কেন এত বেশি।
কিরিল কিরভ 13

"8 মেগাবাইট" শুধু অর্থ প্রতিটি থ্রেড এর স্ট্যাকের করতে 8 মেগাবাইট হত্তয়া থ্রেড এটি ব্যবহার করার সিদ্ধান্ত নেয় পারেন। তবে মেমরিটি ব্যবহার না করা অবধি শারীরিক স্মৃতি বরাদ্দ পাবে না। যদি আপনার 200 থ্রেডগুলি প্রতিটি 512 কেবি ব্যবহার করে তবে আপনি 100 এমবি দৈহিক র‌্যাম ব্যবহার করবেন, 1.6 জিবি নয়।
গুন্ট্রাম ব্লহম মনিকাকে

আপনি যদি অদলবদল না করে থাকেন topতবে আরআরএস কলামটি আপনাকে ভিআইআরটি করার চেয়ে "এই প্রক্রিয়াটি আসলে কী ব্যবহার করছে" এর একটি আরও ভাল উত্তর দেয়।
kbolino

1
@ গুট্রাম ওপি এ সম্পর্কে ভাল জানেন, প্রশ্নের লিঙ্কটি দেখুন।
স্টিফেন কিট

1

8 এমবি হ'ল স্ট্যাকের ভার্চুয়াল আকার। একটি পৃষ্ঠার ত্রুটি ঘটবে যখন আপনার অ্যাপ্লিকেশনটি বর্তমানে শারীরিকভাবে বরাদ্দের চেয়ে বেশি স্ট্যাক ব্যবহার করার চেষ্টা করবে। কার্নেলের পৃষ্ঠার ত্রুটি হ্যান্ডলার তারপরে একটি দৈহিক পৃষ্ঠা বরাদ্দ করবে এবং তারপরে আপনার অ্যাপ্লিকেশনটি চালিয়ে যাবে।

সম্পূর্ণ ব্যাখ্যার জন্য https://unix.stackexchange.com/a/280865/21212 দেখুন ।

আপনার স্ট্যাকের আকার হ্রাস তাই উচিত আপনার আবেদনের প্রকৃত মেমরি ব্যবহার হ্রাস কোন প্রভাব আছে।


1
আমি ইতিমধ্যে আমার প্রশ্নের সাথে এই উত্তরটি সংযুক্ত করেছি। আমি আরও লিখেছি, আমি এটি সম্পর্কে অবহিত, কিন্তু এটি আসলে প্রশ্নের উত্তর দেয় না। যাইহোক ধন্যবাদ
কিরিল কিরভ

আমি মনে করি আপনাকে প্রশ্নের প্রাঙ্গনে আবার ঘুরে দেখার দরকার, এবং এটি (অ-) উত্তর কেন তা নির্দেশ করে। ভার্চুয়াল মেমরি আসল স্মৃতি নয়। স্ট্যাকের আকার 800MB হতে পারে এবং এটি যদি 8 মিমি মূল্যের স্ট্যাক ফ্রেম তৈরি না করে তবে এটি প্রকৃত মেমরির ব্যবহারের উপর প্রভাব ফেলবে না।
kbolino
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.