কম্পিউটার প্রোগ্রাম চললে কী ঘটে?


180

আমি সাধারণ তত্ত্ব জানি কিন্তু আমি বিশদগুলিতে ফিট করতে পারি না।

আমি জানি যে একটি প্রোগ্রাম কম্পিউটারের দ্বিতীয় স্মৃতিতে থাকে। প্রোগ্রামটি কার্যকর হয়ে গেলে এটি সম্পূর্ণরূপে র‍্যামে অনুলিপি করা হয়। তারপরে প্রসেসর একবারে কয়েকটি নির্দেশাবলী পুনরুদ্ধার করে (এটি বাসের আকারের উপর নির্ভর করে), তাদের রেজিস্টারগুলিতে রাখে এবং তাদের সম্পাদন করে।

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

আমি বুঝতে পারি না যে এই দুটি জিনিস কীভাবে সংযুক্ত হয়। নির্দেশাবলী বাস্তবায়নের জন্য স্ট্যাকটি কোন পর্যায়ে ব্যবহৃত হয়? নির্দেশাবলী র‌্যাম থেকে স্ট্যাকের কাছে, নিবন্ধকদের কাছে যায়?


43
মৌলিক প্রশ্ন জিজ্ঞাসা করার জন্য +1!
mkelley33

21
হুম ... আপনি জানেন, তারা সে সম্পর্কে বই লিখেন। আপনি কি সত্যিই এসও এর সহায়তায় ওএস আর্কিটেকচারের এই অংশটি অধ্যয়ন করতে চান?
আন্দ্রে

1
আমি প্রশ্নের স্মৃতি-সম্পর্কিত প্রকৃতি এবং সি ++ এর রেফারেন্সের ভিত্তিতে কয়েকটি ট্যাগ যুক্ত করেছি, যদিও আমি মনে করি জাভা বা সি # তে জ্ঞানবান কারও কাছ থেকে একটি ভাল উত্তর আসতে পারে
মেকেলি 33

14
উত্সাহিত এবং পছন্দসই। আমি সবসময় জিজ্ঞাসা করতে খুব ভয়
পেয়েছি

2
"তাদের রেজিস্টারে রাখে" শব্দটি বেশ সঠিক নয়। বেশিরভাগ প্রসেসরগুলিতে, নিবন্ধগুলি কার্যকর হয় না, অন্তর্বর্তী মানগুলি ব্যবহার করতে ব্যবহৃত হয়।

উত্তর:


161

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

+---------+
|  stack  |  function-local variables, return addresses, return values, etc.
|         |  often grows downward, commonly accessed via "push" and "pop" (but can be
|         |  accessed randomly, as well; disassemble a program to see)
+---------+
| shared  |  mapped shared libraries (C libraries, math libs, etc.)
|  libs   |
+---------+
|  hole   |  unused memory allocated between the heap and stack "chunks", spans the
|         |  difference between your max and min memory, minus the other totals
+---------+
|  heap   |  dynamic, random-access storage, allocated with 'malloc' and the like.
+---------+
|   bss   |  Uninitialized global variables; must be in read-write memory area
+---------+
|  data   |  data segment, for globals and static variables that are initialized
|         |  (can further be split up into read-only and read-write areas, with
|         |  read-only areas being stored elsewhere in ROM on some systems)
+---------+
|  text   |  program code, this is the actual executable code that is running.
+---------+

এটি অনেকগুলি সাধারণ ভার্চুয়াল-মেমরি সিস্টেমে সাধারণ প্রক্রিয়া ঠিকানার স্থান। "ছিদ্র" হ'ল আপনার মোট স্মৃতির আকার, বিয়োগ স্থানটি অন্য সমস্ত ক্ষেত্রের দ্বারা নেওয়া; এটি গাদা হয়ে যাওয়ার জন্য প্রচুর পরিমাণে স্থান দেয় gives এটি "ভার্চুয়াল", অর্থ এটি অনুবাদ টেবিলের মাধ্যমে আপনার আসল স্মৃতিতে মানচিত্র করে এবং প্রকৃত মেমরির যে কোনও স্থানে এটি সংরক্ষণ করা যেতে পারে। এটি একটি প্রক্রিয়াটিকে অন্য প্রক্রিয়ার স্মৃতিতে অ্যাক্সেস থেকে রক্ষা করতে এবং প্রতিটি প্রক্রিয়াটিকে একটি সম্পূর্ণ সিস্টেমে চলছে কিনা তা ভাবার জন্য এটি করা হয়।

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

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

+-----------+ top of memory
| extended  | above the high memory area, and up to your total memory; needed drivers to
|           | be able to access it.
+-----------+ 0x110000
|  high     | just over 1MB->1MB+64KB, used by 286s and above.
+-----------+ 0x100000
|  upper    | upper memory area, from 640kb->1MB, had mapped memory for video devices, the
|           | DOS "transient" area, etc. some was often free, and could be used for drivers
+-----------+ 0xA0000
| USER PROC | user process address space, from the end of DOS up to 640KB
+-----------+
|command.com| DOS command interpreter
+-----------+ 
|    DOS    | DOS permanent area, kept as small as possible, provided routines for display,
|  kernel   | *basic* hardware access, etc.
+-----------+ 0x600
| BIOS data | BIOS data area, contained simple hardware descriptions, etc.
+-----------+ 0x400
| interrupt | the interrupt vector table, starting from 0 and going to 1k, contained 
|  vector   | the addresses of routines called when interrupts occurred.  e.g.
|  table    | interrupt 0x21 checked the address at 0x21*4 and far-jumped to that 
|           | location to service the interrupt.
+-----------+ 0x0

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

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

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

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


তুমি বলেছিলে:

আমি আরও জানি যে একটি কম্পিউটার প্রোগ্রাম দুটি ধরণের মেমরি ব্যবহার করে: স্ট্যাক এবং হিপ, যা কম্পিউটারের প্রাথমিক স্মৃতির অংশও।

"স্ট্যাক" এবং "হিপ" কেবল শারীরিকভাবে স্বতন্ত্র "ধরণের" মেমরির পরিবর্তে কেবল বিমূর্ত ধারণা।

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

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

X86 আর্কিটেকচারের স্ট্যাক এবং হিপগুলি উভয়ই আপনার সিস্টেমে মেমরি (র‌্যাম) এ শারীরিকভাবে বাস করে এবং উপরে বর্ণিত পদ্ধতি হিসাবে ভার্চুয়াল মেমরি বরাদ্দকরণের মাধ্যমে ম্যাপ করা হয়।

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

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


তোমার প্রশ্ন:

নির্দেশাবলী বাস্তবায়নের জন্য স্ট্যাকটি কোন পর্যায়ে ব্যবহৃত হয়? নির্দেশাবলী র‌্যাম থেকে স্ট্যাকের কাছে, নিবন্ধকদের কাছে যায়?

স্ট্যাক (সিস্টেমে / ভাষাগুলিতে যেগুলি রয়েছে এবং সেগুলি ব্যবহার করে) প্রায়শই এটির মতো ব্যবহৃত হয়:

int mul( int x, int y ) {
    return x * y;       // this stores the result of MULtiplying the two variables 
                        // from the stack into the return value address previously 
                        // allocated, then issues a RET, which resets the stack frame
                        // based on the arg list, and returns to the address set by
                        // the CALLer.
}

int main() {
    int x = 2, y = 3;   // these variables are stored on the stack
    mul( x, y );        // this pushes y onto the stack, then x, then a return address,
                        // allocates space on the stack for a return value, 
                        // then issues an assembly CALL instruction.
}

এটির মতো একটি সাধারণ প্রোগ্রাম লিখুন এবং তারপরে এটি সমাবেশে সংকলন করুন (আপনার gcc -S foo.cযদি জিসিসিতে অ্যাক্সেস থাকে) এবং একবার দেখুন। সমাবেশটি অনুসরণ করা বেশ সহজ। আপনি দেখতে পারেন যে স্ট্যাকটি ফাংশন স্থানীয় ভেরিয়েবলগুলির জন্য এবং ফাংশনগুলি কল করার জন্য, তাদের তর্কগুলি সংরক্ষণ করার জন্য এবং ফেরতের মানগুলির জন্য ব্যবহৃত হয় is আপনি যখন এমন কিছু করেন তখনও এটি হয়:

f( g( h( i ) ) ); 

এই সমস্ত ঘুরে ফিরে কল করা। এটি আক্ষরিক অর্থে ফাংশন কল এবং তাদের যুক্তিগুলির একটি স্ট্যাক তৈরি করছে, এগুলি কার্যকর করে এবং তারপরে ঝরে পড়ার সাথে সাথে এটিকে পপিং করে (বা উপরে;)। যাইহোক, উপরে উল্লিখিত হিসাবে, স্ট্যাকটি (x86 এ) আসলে আপনার প্রক্রিয়া মেমরি স্পেসে (ভার্চুয়াল মেমরিতে) থাকে এবং তাই এটি সরাসরি চালিত হতে পারে; মৃত্যুদন্ড কার্যকর করার সময় এটি পৃথক পদক্ষেপ নয় (বা কমপক্ষে প্রক্রিয়াটির অরথোগোনাল)।

এফওয়াইআই, উপরের সি কলিং কনভেনশনটিও সি ++ ব্যবহার করে। অন্যান্য ভাষা / সিস্টেমগুলি স্ট্যাকের উপর একটি পৃথক ক্রমে আর্গুমেন্ট চাপতে পারে এবং কিছু ভাষা / প্ল্যাটফর্ম এমনকি স্ট্যাক ব্যবহার করে না এবং এটিকে বিভিন্ন উপায়ে চালায়।

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


4
দুঃখিত, তবে একটি ভাল বইয়ের সুপারিশই এর চেয়ে ভাল উত্তর হতে পারে, IMO
এন্ড্রে

13
হ্যাঁ, "আরটিএফএম" সর্বদা ভাল।
Sdaz MacSkibbons

56
@ অ্যান্ড্রে: সম্ভবত আপনার সেই মন্তব্যটি "এটিকেও বদলে দেওয়া উচিত, আপনি আপনার ভাল-বইয়ের সুপারিশটি পড়তে চাইতে পারেন " আমি বুঝতে পারি যে এই ধরণের প্রশ্ন আরও তদন্তের যোগ্যতাযুক্ত, তবে যখনই আপনাকে "দুঃখিত" দিয়ে মন্তব্য শুরু করতে হবে। .. "সম্ভবত আপনার অবশ্যই মডারেটরের মনোযোগের জন্য পোস্টটি পতাকাঙ্কিত করা বা কমপক্ষে কোনও কারণেই আপনার মতামত কারও কাছে কেন গুরুত্বপূর্ণ, সে সম্পর্কে কোনও ব্যাখ্যা দেওয়ার কথা বিবেচনা করা উচিত।
mkelley33

2
দুর্দান্ত উত্তর। এটি অবশ্যই আমার জন্য কিছু জিনিস পরিষ্কার করেছে!
ম্যাক্সপাম

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

61

Sdaz খুব অল্প সময়ে একটি উল্লেখযোগ্য সংখ্যক upvotes অর্জন করেছেন, কিন্তু দুঃখের বিষয় সিপিইউ মাধ্যমে নির্দেশাবলী কীভাবে সরানো হয় সে সম্পর্কে একটি ভ্রান্ত ধারণা পোষণ করে চলেছে।

প্রশ্ন জিজ্ঞাসা:

নির্দেশাবলী র‌্যাম থেকে স্ট্যাকের কাছে, নিবন্ধকদের কাছে যায়?

এসডাজ বলেছেন:

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

তবে এটি ভুল। স্ব-সংশোধনকারী কোডের বিশেষ কেস ব্যতীত, নির্দেশাবলী কখনই ডেটাপথে প্রবেশ করে না। এবং এগুলি ডেটাপথ থেকে কার্যকর করা যায় না।

এক্স 86 সিপিইউ রেজিস্টার আছেন:

  • জেনারেল EAX EBX ECX EDX নিবন্ধিত করে

  • বিভাগটি সিএস ডিএস ইএস এফএস জিএস এসএস নিবন্ধিত করে

  • সূচক এবং পয়েন্টারসমূহ ESI EDI EBP EIP ESP

  • সূচক EFLAGS

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

এই রেজিস্টারগুলির কোনওটিই এক্সিকিউটেবল কোডের জন্য ব্যবহৃত হয় না। EIPসম্পাদনকারী নির্দেশের ঠিকানা রয়েছে, নির্দেশ নিজেই নয়।

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

কম্পিউটার আর্কিটেকচারে শিখানো ক্লাসিক ক্রম হ'ল ফেচ-ডিকোড-এক্সিকিউট। মেমরি নিয়ামক ঠিকানাটিতে সঞ্চিত নির্দেশিকাটি সন্ধান করেEIP । প্রসেসরের বিভিন্ন মাল্টিপ্লেক্সারের জন্য সমস্ত নিয়ন্ত্রণ সংকেত তৈরি করতে নির্দেশের বিটগুলি কিছু সংযুক্ত যুক্তি দিয়ে যায় log এবং কিছু চক্রের পরে, গাণিতিক যুক্তি ইউনিট একটি ফলাফল আসে, যা গন্তব্য মধ্যে আটকে আছে। তারপরে পরবর্তী নির্দেশ আনতে হবে।

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

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

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


স্পষ্টতার জন্য ধন্যবাদ। আমি এটি যুক্ত করতে দ্বিধা বোধ করছিলাম কারণ আমি এর সাথে ঘনিষ্ঠভাবে পরিচিত নই, তবে অন্য কারও অনুরোধে এটি করেছি।
এসডাজ ম্যাকস্কিবোন

এস / এআরএম / র‌্যাম / ইন "মানে ডেটা এবং কোড এআরএমের সাথে মিলিত হয়"। রাইট?
বার্জার ফ্রেন্ড-হানসেন

@ বারজারেফ: প্রথমবার হ্যাঁ, তবে দ্বিতীয়বার নয়। আমি এটা ঠিক করব.
বেন ভয়েগট

17

কোনও প্রক্রিয়া সম্পাদন করার সময় মেমরির সঠিক লেআউটটি আপনি যে প্ল্যাটফর্মটি ব্যবহার করছেন তার উপর সম্পূর্ণ নির্ভর করে। নিম্নলিখিত পরীক্ষা প্রোগ্রাম বিবেচনা করুন:

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

int main()
{
    int stackValue = 0;
    int *addressOnStack = &stackValue;
    int *addressOnHeap = malloc(sizeof(int));
    if (addressOnStack > addressOnHeap)
    {
        puts("The stack is above the heap.");
    }
    else
    {
        puts("The heap is above the stack.");
    }
}

উইন্ডোজ এনটি (এবং এটির শিশুরা) তে, এই প্রোগ্রামটি সাধারণত উত্পাদন করে:

স্তূপ স্তূপের উপরে

পসিক্স বাক্সে, এটি বলতে চলেছে:

স্ট্যাকটি স্তূপের উপরে

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

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

উইন্ডোজের মেমরির মডেল আলাদা কারণ এটি যে ধরণের কোড ব্যবহার করে তা ভিন্ন। উইন্ডোজ পিই ফাইল ফর্ম্যাট ব্যবহার করে যা কোডটি অবস্থান-নির্ভর বিন্যাসে ফেলে দেয়। এটি হ'ল ভার্চুয়াল মেমরিতে ঠিক কোথায় কোড লোড হয় তার উপর কোড নির্ভর করে। পিই অনুচ্ছেদে একটি পতাকা রয়েছে যা ওএসকে জানায় যেখানে আপনার প্রোগ্রামটি সঞ্চালনের সময় গ্রন্থাগারটি বা এক্সিকিউটেবল ম্যাপ করা উচিত exactly যদি কোনও প্রোগ্রাম বা লাইব্রেরিটিকে এটির পছন্দসই ঠিকানায় লোড করা না যায় তবে উইন্ডোজ লোডার অবশ্যই আবশ্যক শোধ করতে হবেলাইব্রেরি / এক্সিকিউটেবল - মূলত, এটি অবস্থান-নির্ভর কোডটি নতুন পজিশনে নির্দেশ করে - যার জন্য অনুসন্ধানের সারণীগুলির প্রয়োজন হয় না এবং শোষণ করা যায় না কারণ ওভাররাইট করার জন্য কোনও অনুসন্ধানের টেবিল নেই। দুর্ভাগ্যক্রমে, এটির জন্য উইন্ডোজ লোডারটিতে খুব জটিল বাস্তবায়ন প্রয়োজন এবং যদি কোনও চিত্র পুনরায় সাজানো দরকার হয় তবে তার যথেষ্ট শুরুর সময় ওভারহেড থাকে। বৃহত্তর বাণিজ্যিক সফ্টওয়্যার প্যাকেজগুলি প্রায়শই রিবেসিং এড়ানোর জন্য বিভিন্ন গ্রন্থে উদ্দেশ্যমূলকভাবে শুরু করার জন্য তাদের গ্রন্থাগারগুলি পরিবর্তন করে; উইন্ডোজ নিজেই এটির নিজস্ব লাইব্রেরি দিয়ে কাজ করে (উদাঃ ntdll.dll, kernel32.dll, psapi.dll, ইত্যাদি all সমস্ত ডিফল্টরূপে আলাদা আলাদা ঠিকানা রয়েছে)

Windows এ ভার্চুয়াল মেমরি করার জন্য একটি কলের মাধ্যমে সিস্টেম থেকে প্রাপ্ত হয় VirtualAlloc , এবং এটি মাধ্যমে সিস্টেমে ফিরিয়ে দেওয়া হয় VirtualFree (ঠিক আছে, টেকনিক্যালি VirtualAlloc NtAllocateVirtualMemory কাছে খামার, কিন্তু যে একটি বাস্তবায়ন বিস্তারিত এর) (POSIX, এই তুলনা যেখানে মেমরি পারব না পুনরুদ্ধার করা হবে)। এই প্রক্রিয়াটি ধীর গতিতে (এবং আইআইআরসি-র জন্য আপনার শারীরিক পৃষ্ঠার আকার বরাদ্দ করা দরকার; সাধারণত 4 কেবি বা আরও বেশি)। উইন্ডোজ নিজেই হিপ ফাংশন (হিপঅলোক, হিপফ্রি ইত্যাদি) সরবরাহ করে যা আরটিএলহ্যাপ নামে পরিচিত একটি লাইব্রেরির অংশ হিসাবে, যা উইন্ডোজ নিজেই একটি অংশ হিসাবে অন্তর্ভুক্ত থাকে, যার উপর সি রানটাইম (যা, mallocএবং বন্ধুরা) সাধারণত প্রয়োগ করা হয়।

উইন্ডোজের পুরানো 80386s মোকাবেলা করার দিনগুলি থেকে বেশ কয়েকটি লিগ্যাসি মেমোরি বরাদ্দ এপিআই রয়েছে এবং এই ফাংশনগুলি এখন আরটিএলহ্যাপের শীর্ষে নির্মিত। উইন্ডোজে মেমরি পরিচালনা নিয়ন্ত্রণকারী বিভিন্ন এপিআই সম্পর্কে আরও তথ্যের জন্য এই এমএসডিএন নিবন্ধটি দেখুন: http://msdn.microsoft.com/en-us/library/ms810627

এটিও নোট করুন যে উইন্ডোজটিতে এর অর্থ একটি একক প্রক্রিয়াতে (এবং সাধারণত হয়) একাধিক গাদা থাকে। (সাধারণত, প্রতিটি ভাগ করা লাইব্রেরি এটি নিজস্ব গাদা তৈরি করে))

(এই তথ্যগুলির বেশিরভাগই রবার্ট সিকর্ডের "সিওর কোডিং ইন সি এবং সি ++" থেকে এসেছে)


দুর্দান্ত তথ্য, ধন্যবাদ! আশা করি "ব্যবহারকারী 487117" অবশেষে ফিরে আসবে। :-)
6d9 এ Sdaz MacSkibbons

5

স্ট্যাক

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

উদাহরণস্বরূপ একটি পূর্ণসংখ্যার গুণ:

MUL BX

বিএক্স নিবন্ধের সাথে গুণিত করে এক্স রেজিস্টার। (ফলাফলটি ডিএক্স এবং এএক্স, উচ্চতর বিট সমেত ডিএক্স এ হবে)।

স্ট্যাক ভিত্তিক মেশিনগুলি (জাভা ভিএম এর মতো) তাদের বেসিক ক্রিয়াকলাপগুলির জন্য স্ট্যাকটি ব্যবহার করে। উপরের গুণ:

DMUL

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

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

গাদা

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

সিস্টেমের সংস্থানগুলিতে অ্যাক্সেস করা হচ্ছে

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

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