Memahami tingkat komputasi

9

Maaf, untuk pertanyaan saya yang membingungkan. Saya mencari beberapa petunjuk.

Hingga kini saya telah bekerja sebagian besar dengan Java dan Python pada lapisan aplikasi dan saya hanya memiliki pemahaman yang samar tentang sistem operasi dan perangkat keras. Saya ingin memahami lebih banyak tentang tingkat komputasi yang lebih rendah, tetapi entah bagaimana rasanya sangat berlebihan. Di universitas saya mengambil kelas tentang pemrograman mikro, yaitu bagaimana prosesor terhubung dengan kabel untuk mengimplementasikan kode ASM. Sampai sekarang saya selalu berpikir saya tidak akan menyelesaikan lebih banyak jika belajar lebih banyak tentang "level rendah".

Satu pertanyaan yang saya miliki adalah: bagaimana mungkin perangkat keras disembunyikan hampir sepenuhnya dari pengembang? Apakah akurat untuk mengatakan bahwa sistem operasi adalah lapisan perangkat lunak untuk perangkat keras? Satu contoh kecil: dalam pemrograman saya tidak pernah menemukan perlunya memahami apa itu L2 atau L3 Cache. Untuk lingkungan aplikasi bisnis yang khas, orang hampir tidak pernah perlu memahami assembler dan tingkat komputasi yang lebih rendah, karena saat ini ada tumpukan teknologi untuk hampir semua hal. Saya kira inti dari level yang lebih rendah ini adalah untuk menyediakan antarmuka ke level yang lebih tinggi. Di sisi lain saya bertanya-tanya seberapa besar pengaruh level yang lebih rendah dapat miliki, misalnya seluruh hal komputasi grafis ini.

Jadi, di sisi lain, ada cabang ilmu komputer teoretis ini, yang bekerja pada model komputasi abstrak. Namun, saya juga jarang menghadapi situasi, di mana saya menemukan pemikiran yang membantu dalam kategori model kompleksitas, verifikasi bukti, dll. Saya agak tahu, bahwa ada kelas kompleksitas yang disebut NP, dan bahwa mereka agak tidak mungkin untuk dipecahkan. sejumlah besar N. Apa yang saya lewatkan adalah referensi untuk kerangka kerja untuk memikirkan hal-hal ini. Tampak bagi saya, bahwa ada semua jenis kamp yang berbeda, yang jarang berinteraksi.

Beberapa minggu terakhir saya membaca tentang masalah keamanan. Di sini entah bagaimana, banyak lapisan yang berbeda berkumpul. Serangan dan eksploitasi hampir selalu terjadi pada tingkat yang lebih rendah, jadi dalam hal ini perlu untuk mempelajari tentang rincian lapisan OSI, cara kerja bagian dalam OS, dll.

RParadox
sumber
1
Ada jawaban yang bagus untuk ini (yang pertama ke pertanyaan) programmers.stackexchange.com/questions/81624/…
Puckl
Serangan dan eksploitasi dapat terjadi di semua tingkatan. Jika saya menulis skrip PHP yang rentan, dapat dieksploitasi terlepas dari OS yang mendasarinya, apalagi perangkat keras.
tdammers
1
Menemukan buku yang bagus tentang topik: Elemen Sistem Komputasi: Membangun Komputer Modern dari Prinsip Pertama Noam Nisan, Shimon Schocken. Pembicaraan oleh Tn. Schocken tentang pendekatan ini: youtube.com/watch?v=IlPj5Rg1y2w&feature=plcp
RParadox
Kembali ke masa lalu, menggunakan bahasa assembly untuk rutinitas grafis VGA adalah satu-satunya cara untuk mendapatkan kinerja apa pun, tetapi saya rasa saya tidak tahu apa yang saya lakukan! Tetapi dalam 10 tahun terakhir atau lebih dalam karir saya, saya tidak harus melihat sesuatu yang begitu rendah. Dan saya sekarang sebagian besar tidak tahu apa yang terjadi di level tersebut. Jarang sekali saya bahkan perlu mengalokasikan atau membersihkan ingatan saya sendiri. Saya menduga banyak di tim saya tidak tahu apa itu tumpukan! Dalam banyak hal itu tidak produktif untuk kode pada tingkat seperti itu, menciptakan kembali roda untuk berbicara. Sebaliknya, kita berdiri di atas bahu raksasa.
Gavin Howden

Jawaban:

19

Kata kunci untuk memikirkan hal-hal ini adalah abstraksi .

Abstraksi berarti mengabaikan rincian suatu sistem dengan sengaja sehingga Anda dapat menganggapnya sebagai komponen tunggal yang tidak dapat dibagi ketika merakit sistem yang lebih besar dari banyak subsistem. Ini sangat kuat - menulis program aplikasi modern sambil mempertimbangkan perincian alokasi memori dan mendaftar tumpah dan runtime transistor mungkin dalam beberapa cara yang ideal, tetapi jauh lebih mudah tidakuntuk memikirkannya dan gunakan saja operasi tingkat tinggi sebagai gantinya. Paradigma komputasi modern sangat bergantung pada berbagai tingkat abstraksi: elektronik solid-state, pemrograman mikro, instruksi mesin, bahasa pemrograman tingkat tinggi, OS dan API pemrograman Web, kerangka kerja dan aplikasi yang dapat diprogram pengguna. Sebenarnya tidak ada yang bisa memahami seluruh sistem saat ini, dan bahkan tidak ada jalan yang bisa kita gunakan untuk kembali ke keadaan itu.

Sisi lain dari abstraksi adalah hilangnya daya. Dengan menyerahkan keputusan tentang perincian ke tingkat yang lebih rendah, kami sering menerima bahwa perincian itu dapat dibuat dengan efisiensi yang tidak optimal, karena tingkat yang lebih rendah tidak memiliki 'Gambaran Besar' dan dapat mengoptimalkan pekerjaan mereka hanya dengan pengetahuan lokal, dan tidak (berpotensi) cerdas sebagai manusia. (Biasanya. Untuk isntance, mengkompilasi HLL ke kode mesin saat ini sering dilakukan lebih baik oleh mesin daripada bahkan oleh manusia yang paling berpengetahuan, karena arsitektur prosesor telah menjadi begitu rumit.)

Masalah keamanan merupakan hal yang menarik, karena kelemahan dan 'kebocoran' dalam abstraksi seringkali dapat dieksploitasi untuk melanggar integritas suatu sistem. Ketika API mendalilkan bahwa Anda dapat memanggil metode A, B, dan C, tetapi hanya jika kondisi X berlaku, mudah untuk melupakan kondisi dan tidak siap untuk kejatuhan yang terjadi ketika kondisi dilanggar. Misalnya, buffer overflow klasik mengeksploitasi fakta bahwa menulis ke sel memori menghasilkan perilaku yang tidak ditentukan kecuali Anda telah mengalokasikan blok memori khusus ini sendiri. API hanya menjamin sesuatu ituakan terjadi sebagai hasilnya, tetapi dalam praktiknya hasilnya ditentukan oleh perincian sistem di tingkat bawah berikutnya - yang sengaja kita lupakan! Selama kita memenuhi persyaratan, ini tidak penting, tetapi jika tidak, seorang penyerang yang memahami kedua level secara intim biasanya dapat mengarahkan perilaku seluruh sistem yang diinginkan dan menyebabkan hal-hal buruk terjadi.

Kasus bug alokasi memori sangat buruk karena ternyata benar-benar sangat sulit untuk mengelola memori secara manual tanpa kesalahan tunggal dalam sistem besar. Ini bisa dilihat sebagai kasus abstraksi yang gagal: meskipun dimungkinkan untuk melakukan semua yang Anda butuhkan dengan CmallocAPI, itu hanya untuk mudah disalahgunakan. Sebagian komunitas pemrograman sekarang berpikir bahwa ini adalah tempat yang salah untuk memperkenalkan batas level ke dalam sistem, dan alih-alih mempromosikan bahasa dengan manajemen memori otomatis dan pengumpulan sampah, yang kehilangan daya, tetapi memberikan perlindungan terhadap korupsi memori dan perilaku yang tidak terdefinisi . Bahkan, alasan utama untuk masih menggunakan C ++ saat ini adalah fakta bahwa ini memungkinkan Anda untuk mengontrol sumber daya apa saja yang diperoleh dan dirilis kapan. Dengan cara ini, perpecahan utama antara bahasa yang dikelola dan tidak dikelola saat ini dapat dilihat sebagai ketidaksepakatan tentang di mana tepatnya untuk menentukan lapisan abstraksi.

Hal yang sama dapat dikatakan untuk banyak paradigma alternatif utama lainnya dalam komputasi - masalah ini benar-benar muncul sepanjang waktu di mana sistem besar harus dibangun, karena kami tidak dapat merekayasa solusi dari awal untuk persyaratan kompleks yang umum saat ini. (Sudut pandang umum dalam AI dewasa ini adalah bahwa otak manusia benar - benar berfungsi seperti itu - perilaku yang muncul melalui loop umpan balik, jaringan yang saling berhubungan secara masif, dll. Alih-alih modul dan lapisan terpisah dengan antarmuka sederhana yang diabstraksikan di antara mereka, dan inilah mengapa kami hanya memiliki sedikit keberhasilan dalam mensimulasikan kecerdasan kita sendiri.)

Kilian Foth
sumber
1
Terima kasih banyak. Jadi, contoh pengumpulan sampah / manajemen memori mungkin adalah contoh interaksi ini yang paling terkenal. Neil Gershenfeld telah menulis beberapa hal menarik, walaupun saya hanya mengerti sebagian saja.
RParadox
... Poin yang sangat bagus tentang kompleksitas. Jika hanya mesin yang bisa mendesain mesin kami, kemana ini mengarah? Jika orang-orang AI berbicara tentang AI yang menciptakan AI yang lebih pintar, kita hampir di sana, mungkin. ;)
RParadox