ম্যালোক () এবং ফ্রি () ব্যবহার করা কি আরডুইনোতে সত্যিই খারাপ ধারণা?


49

ব্যবহারের malloc()এবং free()যাও Arduino বিশ্বের চমত্কার বিরল বলে মনে হয়। এটি খাঁটি এভিআর সিতে প্রায়শই ব্যবহৃত হয় তবে এখনও সতর্কতার সাথে।

এটি ব্যবহার করা malloc()এবং free()আরডুইনো সহ সত্যিই খারাপ ধারণা ?


2
আপনি অন্যথায় সত্যিই দ্রুত স্মৃতি থেকে সরে যাবেন এবং আপনি যদি জানেন যে আপনি কতটা মেমরি ব্যবহার করবেন আপনি স্থিরভাবে যেকোন উপায়ে বরাদ্দ করতে পারেন
র‌্যাচেট ফ্রিক

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

4
যথারীতি সঠিক উত্তরটি "এটি নির্ভর করে"। আপনার পক্ষে ডায়নামিক বরাদ্দ সঠিক কিনা তা নিশ্চিত হয়ে ওঠার জন্য আপনি পর্যাপ্ত তথ্য সরবরাহ করেন নি।
ওয়াইনসোকেড

উত্তর:


40

এম্বেড থাকা সিস্টেমগুলির জন্য আমার সাধারণ নিয়মটি কেবলমাত্র malloc()বড় বাফার এবং প্রোগ্রামের শুরুতে, একবারে, একবারে setup()। আপনি যখন মেমরি বরাদ্দ করেন এবং ডি-বরাদ্দ করেন তখন সমস্যাটি আসে। অনুরোধের জন্য মোট নিখরচর মেমরিটি পর্যাপ্ত পরিমাণের চেয়েও বেশি হলেও দীর্ঘ অংশের অধিবেশনটিতে, মেমরিটি খণ্ডিত হয়ে যায় এবং অবশেষে পর্যাপ্ত পরিমাণ বৃহত মুক্ত অঞ্চল না থাকার কারণে একটি বরাদ্দ ব্যর্থ হয়।

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

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


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

16

সাধারণত, আরডুইনো স্কেচগুলি লেখার সময়, আপনি গতিশীল বরাদ্দ এড়াতে পারবেন (এটি সি ++ উদাহরণগুলির সাথে mallocবা এটির newজন্য), লোকেরা বরং গ্লোবাল-ও static- ভেরিয়েবল বা স্থানীয় (স্ট্যাক) ভেরিয়েবল ব্যবহার করে।

গতিশীল বরাদ্দ ব্যবহার করে বেশ কয়েকটি সমস্যা দেখা দিতে পারে:

  • মেমোরি ফাঁস (যদি আপনি পূর্বে বরাদ্দ করা কোনও মেমরির কোনও পয়েন্টার হারিয়ে ফেলেন বা আপনি যখন প্রয়োজন নেই তখন বরাদ্দ মেমরিটি মুক্ত করতে ভুলে যান তবে সম্ভবত)
  • হিপ বিভাজন (বেশ কয়েকটি malloc/ freeকল করার পরে ) যেখানে গাদা বড় হয় সেখানে বর্তমানে বরাদ্দ হওয়া মেমরির আসল পরিমাণ

বেশিরভাগ পরিস্থিতিতে আমি মুখোমুখি হয়েছি, গতিশীল বরাদ্দ হয় প্রয়োজন হয় না, বা নিম্নলিখিত কোডের নমুনায় যেমন ম্যাক্রোগুলির সাথে এড়ানো যায়:

MySketch.ino

#define BUFFER_SIZE 32
#include "Dummy.h"

Dummy.h

class Dummy
{
    byte buffer[BUFFER_SIZE];
    ...
};

ছাড়াই #define BUFFER_SIZE, যদি আমরা Dummyশ্রেণিটির একটি স্থির-অবিরাম bufferআকার রাখতে চাইতাম, তবে আমাদের নীচের মতো গতিশীল বরাদ্দ ব্যবহার করতে হবে:

class Dummy
{
    const byte* buffer;

    public:
    Dummy(int size):buffer(new byte[size])
    {
    }

    ~Dummy()
    {
        delete [] bufer;
    }
};

এক্ষেত্রে আমাদের কাছে প্রথম নমুনার চেয়ে আরও বিকল্প রয়েছে (উদাহরণস্বরূপ , প্রত্যেকের জন্য Dummyবিভিন্ন bufferআকারের সাথে বিভিন্ন বস্তু ব্যবহার করুন ) তবে আমাদের কাছে হ্যাপ ফ্র্যাগমেন্টেশন সমস্যা থাকতে পারে।

উদাহরণস্বরূপ মুছে ফেলা bufferহলে জন্য গতিশীলভাবে বরাদ্দ মেমরি মুক্ত করা হবে তা নিশ্চিত করতে একটি ডেস্ট্রাক্টরের ব্যবহার নোট করুন Dummy


14

আমি malloc()avr-libc থেকে ব্যবহৃত অ্যালগরিদমটি একবার দেখেছি এবং মনে হচ্ছে কয়েকটি ব্যবহারের ধরণ রয়েছে যা গাদা বিভক্তির দৃষ্টিকোণ থেকে নিরাপদ:

1. শুধুমাত্র দীর্ঘকালীন বাফার বরাদ্দ করুন

এর অর্থ আমার: প্রোগ্রামটির শুরুতে আপনার যা যা প্রয়োজন তা বরাদ্দ করুন এবং এটি কখনই মুক্ত করবেন না। অবশ্যই, এই ক্ষেত্রে, আপনি পাশাপাশি স্থির বাফার ব্যবহার করতে পারেন ...

২. শুধুমাত্র স্বল্প-কালীন বাফারগুলি বরাদ্দ করুন

অর্থ: আপনি অন্য কিছু বরাদ্দের আগে বাফারটি মুক্ত করুন। একটি যুক্তিসঙ্গত উদাহরণ হতে পারে:

void foo()
{
    size_t size = figure_out_needs();
    char * buffer = malloc(size);
    if (!buffer) fail();
    do_whatever_with(buffer);
    free(buffer);
}

যদি ভিতরে কোনও মলোক না do_whatever_with()থাকে, বা যদি এই ফাংশনটি যা বরাদ্দ করে তা মুক্ত করে, তবে আপনি খণ্ডন থেকে নিরাপদ।

৩. সর্বদা শেষ বরাদ্দযুক্ত বাফারটি মুক্ত করুন

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

৪. সর্বদা একই আকার বরাদ্দ করুন

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


1
প্যাটার্ন 2 এড়ানো উচিত কারণ এটি মলোক () এবং বিনামূল্যে () এর জন্য চক্র যুক্ত করে যখন এটি "চর বাফার [আকার]" সহ করা যায়; (সি ++ এ)। আমি এ্যান্টি-প্যাটার্নটি "কখনই কোনও আইএসআর থেকে নেই" এড়াতে চাই।
মিকেল প্যাটেল

9

গতিশীল বরাদ্দ ব্যবহার ( malloc/ freeঅথবা new/ মাধ্যমে delete) এর মতো অন্তর্নিহিত খারাপ নয়। আসলে, স্ট্রিং প্রসেসিংয়ের মতো Stringকোনও জিনিসের জন্য (যেমন বস্তুর মাধ্যমে ), এটি প্রায়শই বেশ সহায়ক। এর কারণ অনেক স্কেচ স্ট্রিংয়ের কয়েকটি ছোট ছোট টুকরা ব্যবহার করে যা শেষ পর্যন্ত বড় আকারে একত্রিত হয়। গতিশীল বরাদ্দ ব্যবহার আপনাকে প্রতিটিটির জন্য প্রয়োজন যতটা মেমরি ব্যবহার করতে দেয়। বিপরীতে, প্রত্যেকের জন্য একটি স্থির-আকারের স্ট্যাটিক বাফার ব্যবহার করে প্রচুর জায়গা নষ্ট হয়ে যায় (এটি স্মৃতি থেকে খুব দ্রুত সঞ্চালিত হতে পারে), যদিও এটি পুরোপুরি প্রসঙ্গে নির্ভর করে।

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

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


6

আমি এমন লোকদের সাথে একমত নই যাঁরা মনে করেন আপনার এটি ব্যবহার করা উচিত নয় বা এটি সাধারণত অপ্রয়োজনীয়। আমি বিশ্বাস করি এটি বিপজ্জনক হতে পারে যদি আপনি এর ইনস এবং আউটগুলি না জানেন তবে এটি কার্যকর। আমার এমন কেস রয়েছে যেখানে আমি কাঠামোর আকার বা বাফারের আকার (সংকলন করার সময় বা রান টাইমে) আকারে জানি না (এবং এটি জানা উচিত নয়) বিশেষত যখন আমি লাইব্রেরিতে আসে তখনই আমি বিশ্বে পাঠাই। আমি সম্মত হই যে আপনি যদি অ্যাপ্লিকেশনটি কেবল একটি একক, জ্ঞাত কাঠামোর সাথেই কাজ করে থাকেন তবে আপনাকে সংকলনের সময় সেই আকারটি বেক করা উচিত।

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

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

// found at learn.adafruit.com/memories-of-an-arduino/measuring-free-memory
int freeRam () {
    extern int __heap_start, *__brkval;
    int v;
    return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

uint8_t *_tester;

while(1) {
    uint8_t len = random(1, 1000);
    Serial.println("-------------------------------------");
    Serial.println("len is " + String(len, DEC));
    Serial.println("RAM: " + String(freeRam(), DEC));
    Serial.println("_tester = " + String((uint16_t)_tester, DEC));
    Serial.println("alloating _tester memory");
    _tester = (uint8_t *)malloc(len);
    Serial.println("RAM: " + String(freeRam(), DEC));
    Serial.println("_tester = " + String((uint16_t)_tester, DEC));
    Serial.println("Filling _tester");
    for (uint8_t i = 0; i < len; i++) {
        _tester[i] = 255;
    }
    Serial.println("RAM: " + String(freeRam(), DEC));
    Serial.println("freeing _tester memory");
    free(_tester); _tester = NULL;
    Serial.println("RAM: " + String(freeRam(), DEC));
    Serial.println("_tester = " + String((uint16_t)_tester, DEC));
    delay(1000); // quick look
}

আমি এই পদ্ধতিটি ব্যবহার করে গতিশীলভাবে এটিকে বরাদ্দ দেওয়ার ক্ষমতা বা র‍্যামে কোনও ধরণের অবক্ষয় দেখিনি, তাই আমি বলব এটি একটি কার্যকর সরঞ্জাম। FWIW।


2
আপনার পরীক্ষার কোডটি ব্যবহারের ধরণ অনুসারে 2 আমার পূর্ববর্তী উত্তরে আমি বর্ণিত কেবলমাত্র স্বল্প-কালীন বাফারগুলি বরাদ্দ করুন All এটি নিরাপদ বলে পরিচিত কয়েকটি ব্যবহারের ধরণগুলির মধ্যে একটি।
এডগার বোনেট

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

@ অ্যাডগারবনেট হ্যাঁ, ঠিক আছে। শুধু ভাগ করতে চেয়েছিলেন।
স্টাফঅ্যান্ডিমেস

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

1
"এটি বিপজ্জনক হতে পারে যদি আপনি এর ইনস এবং আউটগুলি না জানেন তবে এটি কার্যকর।" সি / সি ++ এর সমস্ত বিকাশের পরিমাণ যথেষ্ট। :-)
থেটঅ্যান্ট ওয়ার্কিং

4

আরডিনো দিয়ে ম্যালোক () এবং ফ্রি () ব্যবহার করা কি আসলেই খারাপ ধারণা?

সংক্ষিপ্ত উত্তর হল হ্যাঁ. নীচের কারণগুলি:

এটি এমপিইউ কী এবং উপলব্ধ সংস্থানগুলির সীমাবদ্ধতার মধ্যে কীভাবে প্রোগ্রাম করা যায় তা বোঝার বিষয়। আরডুইনো ইউনো 32KB আইএসপি ফ্ল্যাশ মেমরি, 1024 বি ইপ্রোম এবং 2 কেবি এসআরামের সাথে একটি এটিমেগা 328 পি এমপিইউ ব্যবহার করে । এটি প্রচুর স্মৃতি সংস্থান নয়।

মনে রাখবেন যে 2 কেবি এসআরএএম সমস্ত গ্লোবাল ভেরিয়েবল, স্ট্রিং লিটারালস, স্ট্যাক এবং গাদাটির সম্ভাব্য ব্যবহারের জন্য ব্যবহৃত হয়। স্ট্যাকের একটি আইএসআর এর জন্য প্রধান কক্ষ থাকা দরকার।

মেমরি লেআউট হল:

এসআরএএম মানচিত্র

আজকের পিসি / ল্যাপটপগুলিতে মেমরির পরিমাণ 1.000.000 গুণ বেশি। থ্রেড প্রতি 1 এমবিতে ডিফল্ট স্ট্যাক স্পেস অস্বাভাবিক নয় তবে কোনও এমপিইউতে সম্পূর্ণ অবাস্তব।

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


আমেন যে: "[এইচ] আর্ড রিয়েল-টাইম এম্বেড প্রোগ্রামিং দক্ষতা অর্জনের জন্য প্রোগ্রামিং দক্ষতার মধ্যে সবচেয়ে কঠিন is"
স্টাফ অ্যান্ডিমেস

মলোকের ফাঁসির সময় কি সর্বদা একই থাকে? আমি কল্পনা করতে পারি যে মলোক আরও বেশি সময় নিচ্ছে কারণ এটি যে স্লটটির সাথে খাপ খায় তার জন্য উপলভ্য র‌্যামে আরও অনুসন্ধান করে? এই যেতে যেতে মেমরি বরাদ্দ না করার জন্য আরও একটি যুক্তি (র‌্যামের বাইরে চলে যাওয়া) হবে?
পল

@ পল হিপ অ্যালগরিদম (ম্যালোক এবং ফ্রি) সাধারণত ধ্রুবক প্রয়োগের সময় নয়, এবং অনুবর্তনকারী নয়। অ্যালগরিদমটিতে অনুসন্ধান এবং ডেটা স্ট্রাকচার রয়েছে যা থ্রেডগুলি ব্যবহার করার সময় লকগুলির প্রয়োজন হয় (সম্মতি)।
মিকায়েল প্যাটেল

0

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

হ্যালটিং সমস্যাটি আসল

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

হ্যালো মিঃ ট্যুরিং মাই নেম হুব্রিস

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

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


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

আমি কিছু অলৌকিক বাড়াবাড়ি স্বীকার করব তবে মূল কথাটি হ'ল যদি আপনি আচরণের গ্যারান্টি দিতে চান তবে হিপ ব্যবহার করে এমন ঝুঁকির স্তর বোঝানো হয় যা কেবল স্ট্যাকটি ব্যবহারের সাথে লেগে থাকার চেয়ে অনেক বেশি।
কেলি এস ফরাসী

-3

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

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

Malloc দ্বারা সৃষ্ট বাগগুলি ট্র্যাক ডাউন এবং ঠিক করা কি আরও শক্ত? হ্যাঁ, তবে কোডার অংশে ঝুঁকির চেয়ে হতাশার বিষয়টি আরও বেশি। যতদূর ঝুঁকি রয়েছে, আপনার কোডের যে কোনও অংশই ম্যালোকের চেয়ে সমান বা বেশি ঝুঁকিপূর্ণ হতে পারে যদি আপনি সঠিকভাবে কাজটি নিশ্চিত করার জন্য পদক্ষেপ না নেন।


4
আপনি উদাহরণস্বরূপ একটি ড্রোন ব্যবহার করেছেন তা আকর্ষণীয়। এই নিবন্ধটি অনুসারে ( মিল-এম্বেডড / আর্টিকেলস / ), "এটির ঝুঁকির কারণে, সুরক্ষা-সংকটযুক্ত এম্বেডেড এভিওনিক্স কোডে, ডিও -178 বি মানের অধীনে গতিশীল মেমরির বরাদ্দ নিষিদ্ধ করা হয়েছে।"
গ্যাব্রিয়েল স্ট্যাপলস

DARPA এর ঠিকাদারদের তাদের নিজস্ব প্ল্যাটফর্মের সাথে মাপসই করে এমন চশমাগুলি বিকাশ করার অনুমতি দেওয়ার দীর্ঘ ইতিহাস রয়েছে - যখন তারা কর প্রদানকারীরা বিলটি দেয় তখন তাদের কেন করা উচিত নয়। এ কারণেই অন্যেরা 10,000 ডলার দিয়ে কী করতে পারে তা বিকাশ করতে তাদের জন্য 10 বিলিয়ন ডলার ব্যয় হয়। প্রায় শোনার মতো আপনি যদি সামরিক শিল্প কমপ্লেক্সটিকে একটি সৎ উল্লেখ হিসাবে ব্যবহার করেন।
জেএসএন

গতিশীল বরাদ্দটি আপনার প্রোগ্রামটির জন্য হ্যালটিং সমস্যায় বর্ণিত গণনার সীমাটি প্রদর্শনের জন্য একটি আমন্ত্রণ বলে মনে হচ্ছে। কিছু পরিবেশ রয়েছে যা এই পরিমাণ থামার ঝুঁকির একটি সামান্য পরিমাণকে পরিচালনা করতে পারে এবং এমন পরিবেশগুলি রয়েছে (স্থান, প্রতিরক্ষা, চিকিত্সা, ইত্যাদি) যা নিয়ন্ত্রণযোগ্য ঝুঁকির পরিমাণকে সহ্য করবে না, সুতরাং তারা এমন অপারেশনগুলি অস্বীকার করে যা "উচিত নয়" ব্যর্থ কারণ আপনি যখন রকেট চালু করছেন বা হার্ট / ফুসফুসের যন্ত্রটি নিয়ন্ত্রণ করছেন তখন 'এটি কাজ করা উচিত' যথেষ্ট ভাল নয়।
কেলি এস ফ্রেঞ্চ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.