Bagian 2 TClass Atom
Di unit System.pas, TClass didefinisikan seperti ini:
TClass = kelas TObject;
Artinya TClass adalah kelas dari TObject. Karena TObject sendiri adalah sebuah kelas, TClass disebut sebagai kelas dari kelas.
Secara konseptual, TClass adalah tipe kelas, yaitu kelas. Namun, kita tahu bahwa kelas DELPHI mewakili sebagian data VMT. Oleh karena itu, kelas dapat dianggap sebagai tipe yang ditentukan untuk item data VMT. Faktanya, ini adalah tipe penunjuk yang menunjuk ke data VMT!
Dalam bahasa C++ tradisional sebelumnya, tipe kelas tidak dapat ditentukan. Setelah objek dikompilasi, objek tersebut diperbaiki, informasi struktural kelas telah diubah menjadi kode mesin absolut, dan informasi kelas yang lengkap tidak akan ada di memori. Beberapa bahasa berorientasi objek tingkat tinggi dapat mendukung akses dinamis dan pemanggilan informasi kelas, namun seringkali memerlukan mekanisme interpretasi internal yang kompleks dan lebih banyak sumber daya sistem. Bahasa Object Pascal DELPHI menyerap beberapa fitur luar biasa dari bahasa berorientasi objek tingkat tinggi, sambil tetap mempertahankan keunggulan tradisional dalam mengkompilasi program secara langsung ke dalam kode mesin, yang secara sempurna memecahkan masalah fungsi lanjutan dan efisiensi program.
Justru karena DELPHI menyimpan informasi kelas yang lengkap dalam aplikasi sehingga DELPHI dapat menyediakan fungsi berorientasi objek tingkat lanjut seperti as dan is untuk mengonversi dan mengidentifikasi kelas saat runtime, di mana data VMT kelas tersebut memainkan peran inti yang penting. Teman-teman yang berminat dapat membaca dua proses perakitan AsClass dan IsClass di unit Sistem, yang merupakan kode implementasi dari operator as dan is untuk memperdalam pemahaman tentang kelas dan data VMT.
Dengan tipe kelas, Anda bisa menggunakan kelas sebagai variabel. Variabel kelas dapat dipahami sebagai objek khusus, dan Anda dapat mengakses metode variabel kelas seperti halnya objek. Sebagai contoh: Mari kita lihat potongan program berikut:
jenis
TSampleClass = kelas TSampleObject;
TSampleObject = kelas( TObject )
publik
konstruktor Buat;
destruktor Hancurkan;
fungsi kelas GetSampleObjectCount:Integer;
Prosedur GetObjectIndex:Integer;
akhir;
var
aSampleClass : TSampleClass;
aKelas : Kelas T;
Dalam kode ini, kita mendefinisikan kelas TSampleObject dan tipe kelas terkaitnya TSampleClass, serta dua variabel kelas aSampleClass dan aClass. Selain itu, kami juga mendefinisikan konstruktor, destruktor, metode kelas GetSampleObjectCount, dan metode objek GetObjectIndex untuk kelas TSampleObject.
Pertama, mari kita pahami arti variabel kelas aSampleClass dan aClass.
Jelas, Anda dapat memperlakukan TSampleObject dan TObject sebagai nilai konstan dan menugaskannya ke variabel aClass, sama seperti menetapkan 123 nilai konstan ke variabel integer i. Oleh karena itu, hubungan antara tipe kelas, kelas, dan variabel kelas adalah hubungan antar tipe, konstanta, dan variabel, tetapi pada level kelas, bukan pada level objek. Tentu saja, tidak sah untuk menetapkan TObject secara langsung ke aSampleClass, karena aSampleClass adalah variabel kelas dari kelas TSampleObject yang diturunkan dari TObject, dan TObject tidak berisi semua definisi yang kompatibel dengan tipe TSampleClass. Sebaliknya, sah untuk menetapkan TSampleObject ke variabel aClass, karena TSampleObject adalah kelas turunan dari TObject dan kompatibel dengan tipe TClass. Ini persis sama dengan hubungan penugasan dan pencocokan tipe variabel objek.
Lalu, mari kita lihat apa itu metode kelas.
Yang disebut metode kelas mengacu pada metode yang dipanggil di tingkat kelas, seperti metode GetSampleObjectCount yang didefinisikan di atas, yang merupakan metode yang dideklarasikan dengan kelas kata yang dicadangkan. Metode kelas berbeda dengan metode objek yang dipanggil pada tingkat objek. Metode objek sudah tidak asing lagi bagi kita, dan metode kelas selalu digunakan pada tingkat mengakses dan mengendalikan karakteristik umum semua objek kelas dan mengelola objek secara terpusat. Dalam definisi TObject, kita dapat menemukan sejumlah besar metode kelas, seperti ClassName, ClassInfo, NewInstance, dll. Diantaranya, NewInstance juga didefinisikan sebagai virtual, yaitu metode kelas virtual. Ini berarti Anda dapat menulis ulang metode implementasi NewInstance dalam subkelas turunan untuk membuat instance objek kelas tersebut dengan cara khusus.
Anda juga dapat menggunakan pengidentifikasi self dalam metode kelas, tetapi maknanya berbeda dengan self dalam metode objek. Self dalam metode kelas mewakili kelasnya sendiri, yaitu penunjuk ke VMT, sedangkan self dalam metode objek mewakili objek itu sendiri, yaitu penunjuk ke ruang data objek. Meskipun metode kelas hanya dapat digunakan pada tingkat kelas, Anda masih dapat memanggil metode kelas melalui suatu objek. Misalnya, metode kelas ClassName dari objek TObject dapat dipanggil melalui pernyataan aObject.ClassName, karena 4 byte pertama dalam ruang data objek yang ditunjuk oleh penunjuk objek adalah penunjuk ke kelas VMT. Sebaliknya, Anda tidak dapat memanggil metode objek di tingkat kelas, dan pernyataan seperti TObject.Free harus ilegal.
Perlu dicatat bahwa konstruktor adalah metode kelas, dan destruktor adalah metode objek!
Apa? Konstruktor adalah metode kelas dan destruktor adalah metode objek! Apakah ada kesalahan?
Soalnya, saat Anda membuat objek, Anda jelas menggunakan pernyataan seperti berikut:
aObject := TObject.Buat;
Ini jelas memanggil metode Create dari kelas TObject. Saat menghapus objek, gunakan pernyataan berikut:
aObject.Hancurkan;
Bahkan jika Anda menggunakan metode Gratis untuk melepaskan objek, metode Penghancuran objek akan dipanggil secara tidak langsung.
Alasannya sangat sederhana. Sebelum objek dibangun, objek tersebut belum ada, hanya kelas yang ada. Sebaliknya, menghapus suatu objek harus menghapus objek yang ada, bukan kelasnya.
Terakhir, mari kita bahas masalah konstruktor fiktif.
Dalam bahasa C++ tradisional, destruktor virtual dapat diimplementasikan, namun mengimplementasikan konstruktor virtual adalah masalah yang sulit. Sebab, dalam bahasa C++ tradisional, tidak ada tipe kelas. Contoh objek global ada di ruang data global pada waktu kompilasi, dan objek fungsi lokal juga merupakan contoh yang dipetakan dalam ruang tumpukan pada waktu kompilasi. Bahkan objek yang dibuat secara dinamis ditempatkan dalam struktur kelas tetap menggunakan operator baru yang dialokasikan ruang heap, dan konstruktor hanyalah metode objek yang menginisialisasi instance objek yang dihasilkan. Tidak ada metode kelas nyata dalam bahasa C++ tradisional. Meskipun apa yang disebut metode berbasis kelas statis dapat didefinisikan, metode tersebut pada akhirnya diimplementasikan sebagai fungsi global khusus, belum lagi metode kelas virtual hanya dapat menargetkan objek tertentu contoh. efisien. Oleh karena itu, bahasa C++ tradisional percaya bahwa sebelum instance objek tertentu dihasilkan, tidak mungkin membuat objek itu sendiri berdasarkan objek yang akan dihasilkan. Memang tidak mungkin, karena hal ini akan menciptakan paradoks logika yang saling bertentangan!
Namun, justru karena konsep kunci informasi tipe kelas dinamis, metode kelas virtual, dan konstruktor yang diimplementasikan berdasarkan kelas di DELPHI maka konstruktor virtual dapat diimplementasikan. Objek dihasilkan oleh kelas. Objek itu seperti bayi yang sedang tumbuh, dan kelas adalah ibunya. Bayi itu sendiri tidak mengetahui akan menjadi orang seperti apa dia di masa depan, tetapi para ibu menggunakan metode pendidikannya sendiri untuk membina anak-anak yang berbeda. .Teman-teman, prinsipnya sama.
Dalam definisi kelas TComponent konstruktor Create didefinisikan sebagai virtual sehingga berbagai jenis kontrol dapat mengimplementasikan metode konstruksinya sendiri. Inilah kehebatan konsep seperti kelas yang dibuat oleh TClass, dan juga kehebatan DELPHI.
................................................. ..
Bab 3 Pemandangan Ruang dan Waktu di WIN32
Ayah saya yang sudah tua memandangi cucu kecilnya yang sedang bermain dengan mainan di tanah, lalu berkata kepada saya: "Anak ini sama seperti kamu ketika kamu masih kecil. Dia suka membongkar barang-barang dan hanya berhenti setelah melihatnya sampai akhir." Mengingat kembali masa kecil saya, saya sering membongkar mobil mainan, jam weker kecil, kotak musik, dll, dan sering dimarahi oleh ibu saya.
Pertama kali saya memahami prinsip dasar komputer berkaitan dengan kotak musik yang saya bongkar. Itu ada di buku komik ketika saya masih di sekolah menengah. Seorang lelaki tua berjanggut putih sedang menjelaskan teori mesin pintar, dan seorang paman berkumis sedang berbicara tentang komputer dan kotak musik. Mereka mengatakan bahwa unit pengolah pusat komputer adalah deretan buluh musik yang digunakan untuk pengucapan di dalam kotak musik, dan program komputer adalah benjolan padat pada silinder kecil di dalam kotak musik untuk perputaran unit pemrosesan pusat. Pergerakan alami dari penunjuk instruksi, sedangkan tonjolan yang mewakili musik pada silinder kecil mengontrol getaran buluh musik untuk menghasilkan instruksi yang setara dengan eksekusi program oleh prosesor pusat. Kotak musik mengeluarkan melodi yang indah, yang dimainkan sesuai dengan partitur musik yang telah diukir pada silinder kecil oleh pengrajinnya. Komputer menyelesaikan pemrosesan yang rumit berdasarkan program yang telah diprogram sebelumnya oleh pemrogram. Setelah saya kuliah, saya mengetahui bahwa lelaki tua berjanggut putih itu adalah raksasa ilmiah Turing. Teorinya tentang automata terbatas mendorong perkembangan seluruh revolusi informasi, dan paman berkumis itu adalah bapak komputer, von Neumann. Arsitektur komputer masih menjadi struktur arsitektur utama komputer. Kotak musiknya tidak dibongkar sia-sia, ibu bisa yakin.
Hanya dengan pemahaman yang sederhana dan mendalam kita dapat menciptakan kreasi yang mendalam dan ringkas.
Dalam bab ini kita akan membahas konsep dasar yang terkait dengan pemrograman kita di sistem operasi Windows 32-bit dan menetapkan tampilan waktu dan ruang yang benar di WIN32. Saya berharap setelah membaca bab ini, kita dapat memiliki pemahaman yang lebih dalam tentang program, proses dan thread, memahami prinsip-prinsip file yang dapat dieksekusi, pustaka tautan dinamis dan paket runtime, dan melihat dengan jelas kebenaran tentang data global, data lokal, dan parameter di memori. .
Bagian 1 Memahami Prosesnya
Karena alasan historis, Windows berasal dari DOS. Di era DOS, kita selalu hanya mempunyai konsep program, bukan konsep proses. Pada saat itu, hanya sistem operasi biasa, seperti UNIX dan VMS, yang memiliki konsep proses, dan multi-proses berarti komputer mini, terminal, dan banyak pengguna, yang juga berarti uang. Seringkali, saya hanya dapat menggunakan mikrokomputer dan sistem DOS yang relatif murah. Saya baru mulai mengenal proses dan komputer mini ketika saya mempelajari sistem operasi.
Itu hanya setelah Windows 3. Dahulu, pada DOS, hanya satu program yang dapat dijalankan pada waktu yang sama, namun pada Windows, beberapa program dapat dijalankan pada waktu yang bersamaan. Saat menjalankan program di DOS, program yang sama tidak dapat dijalankan pada waktu yang sama, tetapi di Windows, lebih dari dua salinan program yang sama dapat dijalankan pada waktu yang sama, dan setiap salinan program yang berjalan adalah sebuah proses. Lebih tepatnya, setiap menjalankan program apa pun menghasilkan tugas, dan setiap tugas adalah sebuah proses.
Ketika program dan proses dipahami bersama, kata program dapat dianggap merujuk pada hal-hal statis. Program tipikal adalah kode statis dan data yang terdiri dari file EXE atau file EXE ditambah beberapa file DLL. Suatu proses adalah dijalankannya suatu program, yaitu kode dan data yang berubah secara dinamis yang berjalan secara dinamis di memori. Ketika program statis diperlukan untuk dijalankan, sistem operasi akan menyediakan ruang memori tertentu untuk operasi ini, mentransfer kode program dan data statis ke dalam ruang memori ini, dan memposisikan ulang serta memetakan kode program dan data di ruang ini dieksekusi di dalam, sehingga menciptakan proses yang dinamis.
Dua salinan dari program yang sama yang berjalan pada waktu yang sama berarti terdapat dua ruang proses dalam memori sistem, namun fungsi programnya sama, namun berada dalam keadaan yang berubah secara dinamis berbeda.
Dilihat dari waktu berjalannya proses, setiap proses dijalankan pada waktu yang sama. Istilah profesionalnya disebut eksekusi paralel atau eksekusi bersamaan. Tapi ini terutama perasaan dangkal yang diberikan sistem operasi kepada kita. Faktanya, setiap proses dijalankan dengan cara berbagi waktu, yaitu setiap proses secara bergiliran menggunakan waktu CPU untuk menjalankan instruksi program dari proses tersebut. Untuk CPU, hanya instruksi dari satu proses yang dijalankan pada waktu yang sama. Sistem operasi adalah manipulator di balik pengoperasian proses yang dijadwalkan. Sistem operasi secara konstan menyimpan dan mengubah status terkini dari setiap proses yang dijalankan di CPU, sehingga setiap proses yang dijadwalkan dianggap berjalan sepenuhnya dan terus menerus. Karena penjadwalan proses pembagian waktu sangat cepat, hal ini memberi kita kesan bahwa semua proses berjalan pada waktu yang sama. Faktanya, operasi simultan yang sebenarnya hanya mungkin dilakukan di lingkungan perangkat keras multi-CPU. Ketika kita berbicara tentang thread nanti, kita akan menemukan bahwa thread adalah yang benar-benar mendorong proses, dan yang lebih penting, thread menyediakan ruang proses.
Dalam hal ruang yang ditempati oleh proses, setiap ruang proses relatif independen, dan setiap proses berjalan dalam ruang independennya masing-masing. Suatu program mencakup ruang kode dan ruang data. Baik kode maupun data menempati ruang proses. Windows mengalokasikan memori sebenarnya untuk ruang data yang diperlukan oleh setiap proses, dan umumnya menggunakan metode berbagi untuk ruang kode, memetakan satu kode program ke beberapa proses program. Artinya jika suatu program mempunyai 100K kode dan memerlukan 100K ruang data, yang berarti dibutuhkan total 200K ruang proses, sistem operasi akan mengalokasikan 200K ruang proses saat pertama kali program dijalankan, dan 200K ruang proses. ruang akan dialokasikan saat program dijalankan untuk kedua kalinya. Ketika suatu proses dimulai, sistem operasi hanya mengalokasikan 100K ruang data, sedangkan ruang kode berbagi ruang dengan proses sebelumnya.
Di atas adalah tampilan waktu dan ruang dasar dari proses di sistem operasi Windows. Faktanya, terdapat perbedaan besar dalam tampilan waktu dan ruang dari proses antara sistem operasi Windows 16-bit dan 32-bit.
Dari segi waktu, proses manajemen sistem operasi Windows 16-bit, seperti Windows 3.x, sebenarnya hanya sistem operasi manajemen multi-tugas. Selain itu, penjadwalan tugas sistem operasi bersifat pasif. Jika tugas tidak berhenti memproses pesan, sistem operasi harus menunggu. Karena kelemahan dalam manajemen proses sistem Windows 16-bit, ketika suatu proses sedang berjalan, itu sepenuhnya menghabiskan sumber daya CPU. Pada masa itu, agar Windows 16-bit mempunyai kesempatan untuk menjadwalkan tugas-tugas lain, Microsoft memuji para pengembang aplikasi Windows karena menjadi pemrogram yang berwawasan luas, sehingga mereka bersedia menulis beberapa baris kode lagi sebagai hadiah kepada para pengembang. sistem operasi. Sebaliknya, sistem operasi WIN32, seperti Windows 95 dan NT, memiliki kemampuan sistem operasi multi-proses dan multi-tasking yang nyata. Proses di WIN32 sepenuhnya dijadwalkan oleh sistem operasi. Setelah waktu proses yang berjalan berakhir, sistem operasi akan secara aktif beralih ke proses berikutnya terlepas dari apakah proses tersebut masih memproses data. Sebenarnya, sistem operasi Windows 16-bit tidak dapat dianggap sebagai sistem operasi yang lengkap, tetapi sistem operasi WIN32 32-bit adalah sistem operasi yang sebenarnya. Tentu saja, Microsoft tidak akan mengatakan bahwa WIN32 menutupi kekurangan Windows 16-bit, tetapi mengklaim bahwa WIN32 menerapkan teknologi canggih yang disebut "preemptive multitasking", yang merupakan metode komersial.
Dari perspektif ruang, meskipun ruang proses dalam sistem operasi Windows 16-bit relatif independen, proses dapat dengan mudah mengakses ruang data satu sama lain. Karena proses ini sebenarnya adalah segmen data yang berbeda dalam ruang fisik yang sama, dan operasi alamat yang tidak tepat dapat dengan mudah menyebabkan kesalahan pembacaan dan penulisan ruang, dan membuat sistem operasi crash. Namun, dalam sistem operasi WIN32, setiap ruang proses sepenuhnya independen. WIN32 menyediakan setiap proses dengan ruang alamat virtual dan berkelanjutan hingga 4G. Yang disebut ruang alamat kontinu berarti bahwa setiap proses memiliki ruang alamat dari $00000000 hingga $FFFFFFFF, bukan ruang tersegmentasi pada Windows 16-bit. Di WIN32, Anda tidak perlu khawatir tentang operasi baca dan tulis yang secara tidak sengaja memengaruhi data di ruang proses lain, dan Anda tidak perlu khawatir tentang proses lain yang mengganggu pekerjaan Anda. Pada saat yang sama, ruang virtual 4G berkelanjutan yang disediakan oleh WIN32 untuk proses Anda adalah memori fisik yang dipetakan kepada Anda oleh sistem operasi dengan dukungan perangkat keras. Meskipun Anda memiliki ruang virtual yang begitu luas, sistem tidak akan pernah menyia-nyiakan satu byte pun . memori fisik.
Bagian 2 Ruang Proses
Saat kami menggunakan DELPHI untuk menulis aplikasi WIN32, kami jarang peduli dengan dunia internal dari proses saat sedang berjalan. Karena WIN32 menyediakan 4G ruang proses virtual berkelanjutan untuk proses kami, mungkin aplikasi terbesar di dunia saat ini hanya menggunakan sebagian saja. Tampaknya ruang proses tidak terbatas, tetapi ruang proses 4G bersifat virtual, dan memori sebenarnya mesin Anda mungkin jauh dari ini. Meskipun prosesnya memiliki ruang yang begitu besar, beberapa program algoritma yang kompleks masih tidak dapat dijalankan karena stack overflow, terutama program yang berisi algoritma rekursif dalam jumlah besar.
Oleh karena itu, pemahaman mendalam tentang struktur ruang proses 4G, hubungannya dengan memori fisik, dll. akan membantu kita memahami dunia ruang-waktu WIN32 dengan lebih jelas, sehingga kita dapat menggunakan metode yang benar dalam pekerjaan pengembangan sebenarnya. . Pandangan dunia dan metodologi untuk memecahkan berbagai masalah sulit.
Selanjutnya, kita akan menggunakan eksperimen sederhana untuk memahami dunia internal ruang proses WIN32. Ini mungkin memerlukan pengetahuan tentang register CUP dan bahasa assembly, tetapi saya mencoba menjelaskannya dalam bahasa yang sederhana.
Ketika DELPHI dimulai, proyek Project1 akan dibuat secara otomatis, dan kita akan memulainya. Tetapkan breakpoint di mana saja dalam program asli Project1.dpr, misalnya, tetapkan breakpoint di awal kalimat. Kemudian jalankan programnya dan secara otomatis akan berhenti ketika mencapai breakpoint. Saat ini, kita dapat membuka jendela CPU di alat debugging untuk mengamati struktur internal ruang proses.
Register penunjuk instruksi saat ini Eip dihentikan pada $0043E4B8. Dari dua digit heksadesimal tertinggi dari alamat tempat instruksi program berada sama-sama nol, terlihat bahwa program saat ini berada pada posisi alamat di bagian bawah 4G. ruang proses, yang menempati $00000000 hingga Cukup sedikit ruang alamat untuk $FFFFFFFF.
Di kotak perintah di jendela CPU, Anda dapat melihat isi ruang proses. Saat melihat konten ruang kurang dari $00400000, Anda akan menemukan serangkaian tanda tanya "????" muncul di konten kurang dari $00400000. Itu karena ruang alamat belum dipetakan ke ruang fisik sebenarnya. Jika Anda melihat nilai heksadesimal dari variabel global HInstance saat ini, Anda akan menemukan bahwa nilainya juga $00400000. Meskipun HInstance mencerminkan pegangan contoh proses, pada kenyataannya, ini adalah nilai alamat awal ketika program dimuat ke dalam memori, juga di Windows 16-bit. Oleh karena itu, kita dapat berpikir bahwa program dari proses tersebut dimuat mulai dari $00400000, yaitu ruang yang dimulai dari 4M di ruang virtual 4G adalah ruang tempat program dimuat.
Dari $00400000 dan seterusnya hingga $0044D000, ini terutama merupakan ruang alamat kode program dan data global. Di kotak tumpukan di jendela CPU, Anda dapat melihat alamat tumpukan saat ini. Demikian pula, Anda akan menemukan bahwa ruang alamat tumpukan saat ini adalah dari $0067B000 hingga $00680000, dengan panjang $5000. Faktanya, ukuran ruang tumpukan minimum proses adalah $5000, yang diperoleh berdasarkan nilai ukuran tumpukan Min yang ditetapkan di halaman Linker ProjectOptions saat mengkompilasi program DELPHI, ditambah $1000. Tumpukan bertambah dari alamat kelas atas ke bawah. Ketika tumpukan saat program sedang berjalan tidak mencukupi, sistem akan secara otomatis menambah ukuran ruang tumpukan menuju alamat bawah ruang proses. Saat mengkompilasi program DELPHI, Anda dapat mengontrol ruang tumpukan maksimum yang dapat ditingkatkan dengan mengatur nilai Ukuran tumpukan maks di halaman Linker di ProjectOptions. Khususnya dalam program yang berisi hubungan pemanggilan subrutin yang dalam atau menggunakan algoritma rekursif, nilai ukuran tumpukan Maks harus diatur secara wajar. Karena pemanggilan subrutin memerlukan ruang tumpukan, dan setelah tumpukan habis, sistem akan memunculkan kesalahan "Stack overflow".
Tampaknya ruang proses setelah ruang tumpukan seharusnya merupakan ruang kosong. Faktanya, tidak demikian. Informasi yang relevan dari WIN32 mengatakan bahwa ruang 2G setelah $80.000.000 adalah ruang yang digunakan oleh sistem. Tampaknya proses tersebut hanya dapat memiliki ruang 2G. Faktanya, ruang yang benar-benar dapat dimiliki oleh suatu proses bahkan bukan 2G, karena ruang 4M dari $00000000 hingga $00400000 juga merupakan area terbatas.
Namun apa pun yang terjadi, alamat yang dapat digunakan oleh proses kami masih sangat luas. Terutama setelah ruang tumpukan dan antara $80.000.000, ini adalah medan perang utama dari ruang proses. Ruang memori yang dialokasikan oleh proses dari sistem akan dipetakan ke ruang ini, perpustakaan tautan dinamis yang dimuat oleh proses akan dipetakan ke ruang ini, ruang tumpukan thread dari thread baru juga akan dipetakan ke ruang ini, hampir semuanya operasi yang melibatkan alokasi memori Semua akan dipetakan ke ruang ini. Harap dicatat bahwa pemetaan yang disebutkan di sini berarti korespondensi antara memori sebenarnya dan ruang virtual ini. Ruang proses yang tidak dipetakan ke memori sebenarnya tidak dapat digunakan, seperti string "" di kotak perintah jendela CPU selama debugging? ???".
............
Terima kasih telah membaca!