সি ++ প্রশ্নে ওএস বিকাশ


9

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

আমি যদি সি ব্যবহার করছিলাম তবে ম্যালোক ফাংশনগুলি মেমরির বরাদ্দকে পরিচালনা করতে পারে তা লেখার অর্থ হবে তবে সি ++ এ নতুন কীওয়ার্ড ব্যবহৃত হয়েছে। তাই ...

'নতুন' কীভাবে মেমরি বরাদ্দ করতে পর্দার আড়ালে কাজ করে এবং আমি কীভাবে এটি পরিচালনা করব?

এবং একটি বাস্তব হিসাবে ...

এর উচ্চ স্তরের বিমূর্তিগুলির সুবিধা নিতে সি ++ ব্যবহার করার চেষ্টা করা কি বোধগম্য? বা এটি ব্যবহারে মাথাব্যথা আরও বেশি হবে এবং আমি সি দিয়ে থাকা উচিত?

আপনি যদি বিশ্বাস করেন যে সি ++ ভাল পছন্দ না হয় দয়া করে যুক্তি সরবরাহ করুন।

উত্তর:


9

newপ্রকৃত বরাদ্দ বন্ধ শব্দ হাত operator new, যা বরং অনুরূপ আচরণ করবে malloc: এটা কোথাও থেকে মেমরি পায়। সংকলকটি তখন সমস্ত নির্মাণকারী যাদু করবে। সুতরাং, সি ++ সংকলকটি সি ++ রানটাইম লাইব (বা আপনার কোড) এর বাস্তবায়ন সরবরাহ করবে বলে আশা করবে operator new

নির্দিষ্ট বিমূর্ততার জন্য অবশ্যই সি ++ ব্যবহার করা বোধগম্য। কোনও OS এর নিজস্ব রোল করার কোনও কারণ নেই std::list<>। ব্যতিক্রমগুলি আরও বেশি ঝামেলার বিষয়। অকেজো স্টাফ থেকে দরকারী থেকে গ্রেডিয়েন্ট রয়েছে। std::complex? এটি নিখুঁতভাবে কাজ করে, তবে কেন আপনার এটির প্রয়োজন হবে?


5

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

newদুটি কাজ করে: এটি কোথাও থেকে স্মৃতি পেয়ে যায় এবং এটি কোনও প্রয়োজনীয় নির্মাণকারী চালায়। স্মৃতি পাওয়ার ক্ষেত্রে এটি আলাদা নয় malloc


3

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

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

আপনি যদি কীভাবে newকাজ করে সে সম্পর্কে যত্নশীল হন (প্রায়) অনিবার্য অনুসরনটি কীভাবে deleteকাজ করে:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

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


-4

বেশিরভাগ অপারেটিং সিস্টেম সিআই থিঙ্কে লিখিত হয়। অন্যদিকে এটি একটি মাস্টার্স প্রকল্প তাই আলাদা এবং আকর্ষণীয় কিছু করুন।


1
বেশিরভাগ বৃহত অপারেটিং সিস্টেমগুলি প্রাথমিকভাবে সি ++ উপলব্ধ হওয়ার আগে লেখা হয়েছিল। যে পছন্দ সীমিত। :-)
বো পারসন

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