স্ট্যাকের সীমাবদ্ধতা


10

সম্প্রতি আমি বিভিন্ন ওএস সহ তিনটি ডিভাইসে স্ট্যাকের সীমা পরীক্ষা করেছি (সীমা অনুসারে, আমি স্ট্যাকটি সর্বাধিক সংখ্যার স্তরের বলতে পারি) এবং আমি লক্ষ্য করেছি যে প্রতিবার যখন আমি 2 ^ 16 স্তরটি হিট করি তখন এটি আমাকে দেয় ওভারফ্লো ত্রুটি, এবং যখন আমি 2 ^ 16-1 রাখি এটি সঠিকভাবে কাজ করে।

সুতরাং আমার প্রশ্ন - এটা কি সত্য? সংজ্ঞা অনুসারে স্ট্যাকের সর্বাধিক সীমা 2 ^ 16-1 রয়েছে কি না এটি OS এর উপর নির্ভর করে?


5
here i mean by limit the maximum number of levels that can the stack haveকি স্তর?
tkausl


3
আপনি কিভাবে এটি পরীক্ষা করছেন? আপনি কি ইনপুট হিসাবে একটি 2-বাইট (শব্দ) ব্যবহার করছেন?
pro3carp3

6
আপনি কোন প্রোগ্রামিং ভাষা ব্যবহার করছেন? একটি নির্দিষ্ট সংখ্যায় এ জাতীয় তীক্ষ্ণ সীমা ইঙ্গিত দেয় যে এটি আপনার ভাষা নির্দিষ্ট রানটাইম দ্বারা ইচ্ছাকৃত সীমাবদ্ধতা এবং ওএস বরাদ্দ করা স্ট্যাক আকারের দ্বারা নয়। উদাহরণস্বরূপ পাইথন আপনাকে সত্যিকারের স্ট্যাক ওভারফ্লো আঘাত করা থেকে রোধ করতে ডিফল্টরূপে 1000 এর সীমাবদ্ধতা প্রয়োগ করে বলে মনে হয় (বাস্তব স্ট্যাকের ওভারফ্লোগুলি থেকে পুনরুদ্ধার করা শক্ত)
CodeInChaos

উত্তর:


20

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

(কিছু প্রোগ্রামিং ল্যাঙ্গুয়েজ স্পেসিফিকেশনগুলির জন্য টেল কল অপ্টিমাইজেশানগুলি প্রয়োজন, যেমন আর 5 আরএস )

আমি নিশ্চিত না যে আপনার প্রশ্নটি বোধগম্য হয়েছে (এবং অবশ্যই আপনার 2 16 সীমা নয়)। আমার লিনাক্স ডেস্কটপে (ডিবিয়ান / সিড / x86-64, লিনাক্স 4.9 কার্নেল, 32 জিবি র‌্যাম, ইন্টেল আই 5-4690 এস) আমার কল স্ট্যাক 8 মেগাবাইট পর্যন্ত থাকতে পারে (এবং যদি আমি সত্যিই চাইতাম তবে আমি এই সীমাটি বাড়িয়ে দিতে পারি) )।

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

এটির মূল্যের জন্য, আমি কেবল নিম্নলিখিত সি 99 (এবং সি 11) কোডটিও চেষ্টা করেছি:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void recfun(int x, int d) {
  printf("start recfun x=%d d=%d\n", x, d);
  fflush(NULL);
  if (d>0)
    recfun(x+1, d-1);
  printf("end recfun x=%d d=%d\n", x, d);
}

int main(int argc, char**argv) {
  int md = argc>1?atoi(argv[1]):10000;
  printf ("start md=%d\n", md);
  recfun(0, md);
  printf("end md=%d clock=%ld µs\n", md, clock());
}    
// eof recur.c

এবং আমি সেই recurপ্রোগ্রামটি চালাতে সক্ষম হয়েছি (জিসিসি 6 এর সাথে সংকলিত gcc -Wall -O recur.c -o recur) হিসাবে recur 161000 (আপনার 2 2 16 সীমা থেকে অনেক বেশি )। সঙ্গে recur 256000এটাও কাজ করেন। সঙ্গে recur 456000এটা (ক সঙ্গে ক্র্যাশ স্ট্যাক ওভারফ্লো স্তরের জন্য x=272057)। অন্যান্য পরীক্ষার জন্য আমার ধৈর্য নেই। আপনার কম্পিউটারে চেষ্টা করুন। অপ্টিমাইজেশান জিজ্ঞাসা করতে ভুলবেন না।

থাম্বের একটি নিয়ম (ডেস্কটপ, ল্যাপটপ, ট্যাবলেটগুলির জন্য) আপনার কল স্ট্যাকটি একটি মেগাবাইটের নীচে রাখা হতে পারে।

এছাড়াও ক্ষণস্থায়ী দ্বারা -fstack-usage করতে gcc আমি নিম্নলিখিত পেয়ে করছি recur.suফাইল (সংখ্যা, আমার 8Mb স্ট্যাক সীমা স্বজ্ঞা সঙ্গে সামঞ্জস্যপূর্ণ বাইটে হয়; ভুলবেন না mainকল ফ্রেম, এবং আরও বেশী গুরুত্বপূর্ণ প্রাথমিক স্ট্যাক লেআউট, কার্নেল দ্বারা ইনস্টল যখন করছেন execve (2 ) ..., crt0 এর জন্য ):

 recur.c:5:10:recfun    32  static
 recur.c:13:9:main  16  static

পুনশ্চ. আমার Arduino টি Atmega328 , RAM এর শুধুমাত্র 2Kbytes যাতে অবশ্যই যে কত আবৃত্ত করতে পারবে না। আমার ধারণা, আরডুইনোসে কেবল কয়েক শতাধিক স্ট্যাক ফ্রেম সর্বাধিক ব্যবহারিকভাবে সম্ভব।


3

কোনও প্রক্রিয়ার মূল থ্রেডের জন্য স্ট্যাক আকার লিংক দ্বারা সেট করা উইন্ডোজ। ডিফল্টটি 1MB তবে / স্ট্যাক সুইচের সাথে সামঞ্জস্য করা যায়। পরে তৈরি করা থ্রেডগুলি ক্রিয়েটথ্রেড ফাংশনের dwStackSize প্যারামিটার ব্যবহার করতে পারে।

সুতরাং .. আপনি যদি বিভিন্ন উইন্ডোজ ওএস পরীক্ষা করে থাকেন তবে কমপক্ষে এনটি 4.0 থেকে তাদের সবার একই ডিফল্ট স্ট্যাকের আকার রয়েছে।

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