Pthreads জন্য ডিফল্ট স্ট্যাক আকার


24

আমি যেমন বুঝতে পেরেছি, লিনাক্সে pthread এর জন্য ডিফল্ট স্ট্যাকের আকার 16K। আমি আমার -৪-বিট উবুন্টু ইনস্টলে অদ্ভুত ফলাফল পাচ্ছি।

$ ulimit -s
8192

এছাড়াও:

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("Thread stack size = %d bytes \n", stacksize);

Prints
    Thread stack size = 8388608 bytes

আমি নিশ্চিত যে স্ট্যাকের আকার "8388608" নয়। কি হতে পারে?


7
আমি ভাবি 8388608 / 1024 = 8192
cuonglm

6
আপনি প্রতি থ্রেড কার্নেল স্ট্যাকের জন্য 16 কে ভাবছেন । ব্যবহারকারী-স্পেস স্ট্যাক মেমরি থেকে পুরোপুরি পৃথক ইস্যু। কার্নেল স্ট্যাকগুলি ছোট কারণ তারা পৃষ্ঠাবদ্ধ হতে পারে না, বা অলস-বরাদ্দ হতে পারে এবং শারীরিক স্মৃতিতে সংলগ্ন পৃষ্ঠা হতে হবে। elinux.org/ কার্নেল_ম্যাসেল_ট্যাক্স । মোট থ্রেডগুলির একটি অত্যন্ত উচ্চ সংখ্যা থাকা আই 386 এর জন্য সমস্যা হতে পারে, যেখানে ঠিকানা-স্থান সীমাবদ্ধ রয়েছে, বিশেষত ৩২-বিটের জন্য 8k স্ট্যাকের সাথে ডিফল্ট।
পিটার কর্ডস

উত্তর:


21
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

stacksizeঅ্যাট্রিবিউট ন্যূনতম স্ট্যাকের আকার (বাইটে) তৈরি থ্রেড স্ট্যাকের জন্য বরাদ্দ নির্ধারণ করবে।

আপনার উদাহরণে, স্ট্যাকের আকারটি 8388608 বাইটে সেট করা হয়েছে যা 8MB এর সাথে মিলে যায়, যাতে কমান্ডের সাহায্যে ফিরে আসে ulimit -s

pthread_create()বর্ণনা থেকে :

উপর লিনাক্স / x86-32 , একটি নতুন থ্রেড জন্য ডিফল্ট স্ট্যাকের আকার 2 মেগাবাইটএনপিটিএল থ্রেডিং বাস্তবায়নের আওতায়, প্রোগ্রামটি শুরু হওয়ার সময় যদি RLIMIT_STACK সফ্ট রিসোর্স সীমাতে "সীমাহীন" ব্যতীত অন্য কোনও মান থাকে, তবে এটি নতুন থ্রেডের ডিফল্ট স্ট্যাক আকার নির্ধারণ করে। Pthread_attr_setstacksize (3) ব্যবহার করে স্ট্যাক সাইজের বৈশিষ্ট্যটি স্পষ্টভাবে ডিফল্ট ব্যতীত অন্য কোনও স্ট্যাকের আকার পাওয়ার জন্য একটি থ্রেড তৈরি করতে ব্যবহৃত অ্যাটর আর্গুমেন্টে সুস্পষ্টভাবে সেট করা যেতে পারে।

সুতরাং থ্রেড স্ট্যাকের আকারটি উপরের সেট ফাংশন, বা ulimitসিস্টেমের সম্পত্তি দ্বারা সেট করা যেতে পারে । আপনি যে ১k কেটির কথা উল্লেখ করছেন, আপনি কোন প্ল্যাটফর্মটি দেখেছেন তা এবং / অথবা যদি এর জন্য কোনও সিস্টেমের সীমা নির্ধারণ করা হয়েছিল তা পরিষ্কার নয়।

দেখুন pthread_create পৃষ্ঠা এবং এখানে এই কিছু আকর্ষণীয় উদাহরণ জন্য।


47

আসলে, আপনার ভার্চুয়াল স্ট্যাকের আকার হয় 8388608 বাইট (8 মেগাবাইট)। অবশ্যই, এই সিদ্ধান্তটি যথাযথ হতে পারে না এটাই স্বাভাবিক, কারণ এটি প্রতিটি স্ট্রেডের জন্য একটি হাস্যকর মেমরির প্রচুর পরিমাণে থাকে যখন 99% সময় কয়েক কেবি সম্ভবত তাদের প্রয়োজন হয়।

সুসংবাদটি হ'ল আপনার থ্রেডটি কেবল প্রকৃত পরিমাণে শারীরিক মেমরির প্রয়োজন ব্যবহার করে। আপনার ওএস আপনার প্রসেসরে হার্ডওয়্যার মেমোরি ম্যানেজমেন্ট ইউনিট (এমএমইউ) ব্যবহার করে যে মায়াবী শক্তি অর্জন করে তার মধ্যে এটি একটি। যা ঘটে তা এখানে:

  1. আপনার থ্রেডের জন্য এমএমইউর পৃষ্ঠা সারণীগুলি স্থাপন করে ওএস আপনার স্ট্যাকের জন্য ভার্চুয়াল মেমরির 8 এমবি বরাদ্দ করে। কেবল পৃষ্ঠা সারণীর এন্ট্রিগুলি ধরে রাখতে এটির খুব কম র‌্যাম দরকার।

  2. যখন আপনার থ্রেড চলমান এবং স্ট্যাকের কোনও ভার্চুয়াল ঠিকানার অ্যাক্সেস করার চেষ্টা করেছে যাতে এটিতে এখনও কোনও বরাদ্দকৃত পৃষ্ঠা থাকে না, তখন এমএমইউ দ্বারা একটি "পৃষ্ঠা ফল্ট" নামে একটি হার্ডওয়্যার ব্যতিক্রম শুরু হয়।

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

  4. কার্নেল সেই ভার্চুয়াল মেমরি পৃষ্ঠায় শারীরিক র‍্যামের একটি পৃষ্ঠা বরাদ্দ করে এবং ব্যবহারকারীর স্পেস থ্রেডে ফিরে আসে।

ব্যবহারকারীর স্পেস থ্রেড সেই কাজের কোনওটাই দেখতে পায় না। এর দৃষ্টিকোণ থেকে, এটি কেবল স্ট্যাকটি এমনভাবে ব্যবহার করে যেন স্মৃতি সেখানে রয়েছে। এদিকে, থ্রেডটির চাহিদা মেটাতে স্ট্যাকটি স্বয়ংক্রিয়ভাবে বেড়ে যায় (বা হয় না)।

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

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