এম্বেড থাকা সিস্টেমে একটি একক অ্যারের জন্য স্ট্যাকের বিশাল পরিমাণ বরাদ্দ করার কোনও ত্রুটি রয়েছে?


12

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

আমি একটি বিদ্যমান কোড কাজ করছি যা আমি উন্নত করার চেষ্টা করছি (ডিজাইন, সম্ভাব্য সমস্যা, পারফরম্যান্স ইত্যাদি)। এই কোডটি 4KB র‌্যামের সাথে পুরানো 8 বিট এমসিইউতে চলে । এই কোডটিতে আমি প্রায় 1KB (হ্যাঁ, 4KB র‌্যাম সিস্টেমে 1KB ) এর অ্যারের ব্যবহারের মুখোমুখি । এই অ্যারের প্রতিটি বাইট ব্যবহার করা হয়, এটি প্রশ্ন নয়। সমস্যাটি হ'ল এই অ্যারেটি যে ফাইলটিতে এটি ঘোষিত হয়েছে সেখানে স্থির অ্যারে, তাই এর জীবনচক্রটি প্রোগ্রামের মতো (যেমন অসীম হিসাবে বিবেচনা করা যেতে পারে) is

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

এখন প্রশ্ন: এটি একটি ভাল ধারণা হবে? ডিজাইনের দৃষ্টিকোণ থেকে যদি এটির জন্য যদি অসীম / গ্লোবাল লাইফসাইকেলের প্রয়োজন না হয় তবে এটি স্ট্যাকের অন্তর্ভুক্ত। তবে আরে, 4KB এর মধ্যে 1KB, র্যামের 25% এর মতো বরাদ্দ করার কোনও অসুবিধা নেই? (এটি স্ট্যাকের 50% বা তার বেশি হতে পারে)

কেউ কি এই ধরণের পরিস্থিতির সাথে কিছু অভিজ্ঞতা ভাগ করে নিতে পারেন, বা কেউ এই বৈধতাটিকে স্ট্যাকের মধ্যে না রাখার কোনও বৈধ কারণ সম্পর্কে ভাবেন? আমি প্রযুক্তিগত ত্রুটিগুলি পাশাপাশি ডিজাইনে মন্তব্যগুলি খুঁজছি।

আমি সচেতন একমাত্র জিনিস হ'ল এই ফাংশনটি প্রবেশ করার সময় আমাকে অবশ্যই নিশ্চিত করতে হবে যে আমার কাছে আসলে 1KB স্ট্যাক ফ্রি আছে। আমার যত্ন নিতে হবে এমনই হতে পারে, সম্ভবত না।


4
আপনি লিখেছেন, "এবং তাই এই 1 কেবি র্যামটি সংরক্ষণ করুন"। এটা কি জন্য সংরক্ষণ করুন? অ্যারের জন্য আপনার যখন প্রয়োজন হবে তখন 1KB টি উপলব্ধ থাকতে হবে তাই স্থির বরাদ্দ কেন নয়? অ্যারের প্রয়োজন হয় না যখন আপনার কি মেমরির জন্য অন্য ব্যবহার আছে?
kkrambo

@kkrambo কিছু সময় আমরা র‌্যামে আরও কিছু যোগ করতে না পারলে আমরা সিস্টেমটি পূর্ণ বলে বিবেচনা করি, এটি কিছু স্থির হোক বা স্ট্যাকের হোক। আমরা যদি এই অ্যারেটি কেবল স্ট্যাকের উপরে রাখি যখন এটি ব্যবহার করি, এটি একই সময়ে ব্যবহৃত না হওয়া অবধি এটি অন্য কার্যকারিতার জন্য রাখবে। তবে প্রশ্নটি সম্পূর্ণ যুক্তিযুক্ত, এই মুহূর্তে যদি আমরা এসডব্লুতে কিছু পরিবর্তন না করি তবে আমাদের আরও র‌্যামের দরকার নেই;)
টিম

1
আপনি কী স্পষ্ট করতে পারেন যে এই অ্যারেটিতে এমন সামগ্রী রয়েছে যা সর্বদা একই থাকে বা যদি এটি ব্যবহার করে যে ফাংশনটি ব্যবহৃত হয় তখন তা পরিবর্তন হয়?
Blrfl

@ ব্লারফ্লাল এটি প্রতিটি সময় ফাংশনটি বলা হয় পরিবর্তিত হয়।
টিম

উত্তর:


8

আমি সচেতন একমাত্র জিনিস হ'ল এই ফাংশনটি প্রবেশ করার সময় আমাকে অবশ্যই নিশ্চিত করতে হবে যে আমার কাছে আসলে 1KB স্ট্যাক ফ্রি আছে।

হ্যাঁ, এবং এটি একটি শক্তিশালী বাধা। আপনার কাছে স্ট্যাকের মতো এত বড় জায়গার চেয়ে স্ট্যাটিকভাবে নিশ্চিত হওয়া উচিত। কোড ছোট হয়, তাহলে আপনি একটি সাম্প্রতিক ব্যবহার করছেন জিসিসি আপনার কোড কম্পাইল করার, দেখুন এই

বিটিডাব্লু, কিছু সস্তা মাইক্রোপ্রসেসর একটি "বড়" কল ফ্রেমটি একটি "সাধারণ" এর চেয়ে বেশি ব্যয়বহুল করে তুলতে পারে (উদাহরণস্বরূপ, কারণ তাদের নির্দেশাবলী সেট স্ট্যাক পয়েন্টার থেকে এক-বাইট অফসেটের পক্ষে হবে)। YMMV।

এছাড়াও, আপনি যদি সি তে কোডিং দিচ্ছেন এবং যদি আপনার মনে হয় যে আপনার বৃহত অ্যারেটির স্থানটি অন্য উদ্দেশ্যে ব্যবহার করতে পারে তবে আপনি এটিকে ইউনিয়ন সদস্য হিসাবে বিবেচনা করতে পারেন (বৈশ্বিক unionধরণের বৈকল্পিক সহ )। হ্যাঁ, এটি বেশ কুরুচিপূর্ণ।

অন্যথা, আপনি আপনার আবেদন উপযুক্ত কিছু আদিম গাদা বরাদ্দকরণ কোডিং বিবেচনা করতে পারে (এবং এটি একটি API বিভিন্ন হতে পারে malloc& free....)।


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

আপনি আপনার প্ল্যাটফর্মের জন্য একটি জিসিসি সংকলক (সম্ভবত এটির উত্স কোড থেকে জিসিসি সংকলন করে) পেতে পারবেন না?
বেসিল স্টারিনকিভিচ

2
আমার ইতিমধ্যে একটি আছে, এটি সত্যই পুরানো। নতুন নিয়ে কাজ করা আমার সুযোগের মতো নয়, এটি আমার সময়সূচিতেও খাপ খায় না। তবে নিশ্চিত যে আপ টু ডেট সরঞ্জামগুলি দিয়ে কিছু জিনিস সহজ হবে।
টিম

3
আপনাকে নতুন জিসিসি পেতে আপনার বসকে জিজ্ঞাসা করা (আপনি আপনাকে যুগোপযোগী বাইনারি সরঞ্জাম সরবরাহ করে, বা আপনাকে জিসিসি পুনঃসংশোধনের জন্য সময় দিয়ে) আইএমএইচও সার্থক কারণ সম্ভবত সম্ভবত আরও নতুন জিসিসি কিছুটা আরও উন্নত করবে (আপনি কি জানেন gcc -flto -Os? ) এবং আপনি কিছু স্মৃতি অর্জন করতে পারেন ....
বেসিল স্টারিনকিভিচ

2
এটি ট্র্যাকে রয়েছে তবে এটি কিছুক্ষণের আগে আসবে না। আমি ইতিমধ্যে আরও সাম্প্রতিক সরঞ্জামচেনগুলি সহ অন্যান্য সিস্টেমে -Os ব্যবহার করেছি, তবে আমি এই-ফ্লাটো প্যারামিটার সম্পর্কে অবগত ছিলাম না, এটি নির্দেশ করার জন্য ধন্যবাদ। (দ্রষ্টব্য যে আমি কয়েক সপ্তাহ আগে জিসিসি 5.4.1 এ জিসিসি-ওগুলি এবং -O1-3 প্যারামিটারের সাথে কয়েকটি পরীক্ষা করেছি এবং র‌্যাম সমস্ত সময় একই ছিল The ফ্ল্যাশ এবং এমসিইউ চলমান সময়টি আলাদা ছিল। আমি এই প্রশ্নোত্তরে
টিম

6

লোকেরা বড় স্ট্যাকের সাথে সতর্ক হওয়ার প্রবণতা রাখে, কারণ এটি র্যামের পিছনে বৃদ্ধি পায় এবং ভেরিয়েবলের মানগুলি ওভাররাইট করে, অব্যক্ত আচরণের দিকে পরিচালিত করে। এটি আরও খারাপ হয়ে যায়, কারণ আপনাকে রুটিনে প্রবেশের সময় সবচেয়ে কম সম্ভাব্য স্ট্যাক পয়েন্টার ঠিকানা জানতে হবে এবং বরাদ্দ করতে আকারটি বিয়োগ করতে হবে।

এটি হার্ডওয়্যার মেমরি পরিচালনার জন্য (স্ট্যাকের ওভারফ্লো যখন ঘটে তখন ফাঁদ বা ত্রুটিগুলি উত্পন্ন করা উচিত) বা সংকলকটির জন্য, এটিতে এই ধরণের বিশ্লেষণের বৈশিষ্ট্য রয়েছে।

অন্যথায়, আপনি আপনার র‌্যামের সাহায্যে যা করতে পারেন তা করতে পারেন।


4

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

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

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


1

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


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

1

বিশেষত এমবেড থাকা সিস্টেমগুলির সাথে কাজ করার সময়, আপনি সংকলনের সময় যতটা সম্ভব ব্যর্থতা ঘটতে চান এবং রান সময়ে কিছুই কখনও ব্যর্থ হয় না (যদিও আমরা এটি অর্জন করতে পারতাম তবে চমৎকার ...)।

আপনার প্রোগ্রামের স্বেচ্ছাসেবীভাবে বরাদ্দকৃত বড় আকারের অ্যারেগুলি আপনার প্রয়োজন হতে পারে ঠিক তা করে - লিঙ্কারটি আপনাকে শেষ পর্যন্ত "এটি র‍্যামের সাথে খাপ খায় না" সাবধান করে দেবে, অন্যদিকে স্ট্যাক বরাদ্দকরণ কেবল আপনার প্রোগ্রামটিকে হার্ড-টু-ডিবাগ স্ট্যাকের সাথে ক্রাশ করে দেবে whereas উপচে।

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