Sistem Operasi: Tiga Potongan Mudah. Bagian 1: Intro (terjemahan)

Pengantar Sistem Operasi


Halo, Habr! Saya ingin menarik perhatian Anda serangkaian artikel-terjemahan dari satu literatur yang menarik menurut saya - OSTEP. Artikel ini membahas lebih dalam karya sistem operasi mirip-unix, yaitu, bekerja dengan proses, berbagai penjadwal, memori, dan komponen serupa lainnya yang membentuk OS modern. Asli semua bahan bisa Anda lihat di sini . Harap dicatat bahwa terjemahannya dilakukan secara tidak profesional (cukup bebas), tetapi saya harap saya tetap memiliki makna umum.

Pekerjaan laboratorium tentang hal ini dapat ditemukan di sini:


Bagian lain:

Dan Anda dapat melihat saluran saya di telegram =)

Program bekerja


Apa yang terjadi ketika suatu program bekerja? Menjalankan program melakukan satu hal sederhana - menjalankan instruksi. Setiap detik, jutaan dan bahkan mungkin milyaran instruksi diekstraksi oleh prosesor dari RAM, pada gilirannya, ia menerjemahkannya (misalnya, mengenali jenis instruksi ini milik siapa) dan mengeksekusi. Ini bisa berupa penambahan dua angka, akses ke memori, memeriksa kondisi, beralih ke fungsi, dan sebagainya. Setelah menyelesaikan satu instruksi, prosesor melanjutkan untuk mengeksekusi instruksi lainnya. Dan demikian instruksi dengan instruksi, mereka dieksekusi sampai program selesai.

Contoh ini secara alami dianggap disederhanakan - pada kenyataannya, untuk mempercepat prosesor, perangkat keras modern memungkinkan Anda untuk mengeksekusi instruksi secara bergiliran, menghitung hasil yang mungkin, mengikuti instruksi pada saat yang sama dan trik serupa.

Model Komputasi Von Neumann


Bentuk pekerjaan yang disederhanakan yang kami jelaskan mirip dengan model perhitungan Von Neumann. Von Neumann adalah salah satu pelopor sistem komputer, ia juga salah satu penulis teori permainan . Ketika program sedang berjalan, banyak peristiwa lain terjadi, banyak proses lain dan kerja logika pihak ketiga, yang tujuan utamanya adalah untuk menyederhanakan peluncuran, operasi, dan pemeliharaan sistem.

Ada satu set perangkat lunak yang bertanggung jawab atas kesederhanaan menjalankan program (atau bahkan memungkinkan Anda untuk menjalankan beberapa program pada saat yang sama), itu memungkinkan program untuk berbagi memori yang sama, serta berinteraksi dengan perangkat yang berbeda. Perangkat lunak semacam itu (perangkat lunak) pada dasarnya disebut sistem operasi dan tugas-tugasnya meliputi pemantauan bahwa sistem bekerja dengan benar dan efisien, serta memastikan kemudahan pengelolaan sistem ini.

Sistem operasi


Sistem operasi, kependekan dari OS, adalah suatu komplek dari program yang saling berhubungan yang dirancang untuk mengelola sumber daya komputer dan mengatur interaksi pengguna dengan komputer .

OS mencapai efektivitasnya terutama melalui teknik yang paling penting - teknik virtualisasi . OS berinteraksi dengan sumber daya fisik (prosesor, memori, disk, dan sejenisnya) dan mengubahnya menjadi bentuk yang lebih umum, lebih kuat dan lebih mudah digunakan. Oleh karena itu, untuk pemahaman umum, Anda dapat membandingkan sistem operasi dengan mesin virtual.

Untuk memungkinkan pengguna memberikan instruksi kepada sistem operasi dan dengan demikian menggunakan kemampuan mesin virtual (seperti: meluncurkan program, mengalokasikan memori, mengakses file, dan sebagainya), sistem operasi menyediakan beberapa antarmuka yang disebut API (antarmuka pemrograman aplikasi) dan yang Anda dapat melakukan panggilan. Sistem operasi tipikal memungkinkan untuk melakukan ratusan panggilan sistem.

Dan akhirnya, karena virtualisasi memungkinkan banyak program untuk bekerja (dengan demikian berbagi CPU), dan pada saat yang sama mendapatkan akses ke instruksi dan data mereka (dengan demikian berbagi memori), serta mengakses disk (sehingga berbagi perangkat I / O ), sistem operasi juga disebut manajer sumber daya. Setiap prosesor, disk, dan memori adalah sumber daya sistem dan karenanya salah satu peran sistem operasi menjadi tugas mengelola sumber daya ini, melakukannya secara efisien, jujur, atau sebaliknya, tergantung pada tugas yang dirancang sistem operasi ini.

Virtualisasi CPU


Pertimbangkan program berikut:
(https://www.youtube.com/watch?v=zDwT5fUcki4)

gambar

Itu tidak melakukan tindakan khusus, pada kenyataannya semua yang dilakukannya adalah memanggil fungsi spin (), yang tugasnya adalah siklus waktu dan kembali setelah satu detik berlalu. Dengan demikian, ia mengulangi tanpa henti string yang dilewati pengguna sebagai argumen.

Jalankan program ini, dan berikan simbol "A" sebagai argumen. Hasilnya tidak terlalu menarik - sistem hanya menjalankan program yang secara berkala menampilkan simbol "A".

Sekarang mari kita coba opsi ketika banyak contoh dari program yang sama sedang berjalan, tetapi menampilkan huruf yang berbeda, sehingga lebih mudah dimengerti. Dalam hal ini, hasilnya akan sedikit berbeda. Terlepas dari kenyataan bahwa kami memiliki satu prosesor, program ini berjalan secara bersamaan. Bagaimana ini bisa terjadi? Tetapi ternyata sistem operasi, bukan tanpa bantuan kemampuan perangkat keras, menciptakan ilusi. Ilusi bahwa ada beberapa prosesor virtual dalam sistem, mengubah satu prosesor fisik menjadi angka yang tak terbatas secara teoritis dan dengan demikian memungkinkan program muncul untuk dieksekusi secara bersamaan. Ilusi semacam itu disebut Virtualisasi CPU .

Gambaran seperti itu menimbulkan banyak pertanyaan, misalnya, jika beberapa program ingin memulai secara bersamaan, program mana yang akan diluncurkan? "Kebijakan" OS bertanggung jawab atas pertanyaan ini. Kebijakan digunakan di banyak tempat OS dan menjawab pertanyaan serupa, dan juga mekanisme dasar yang diterapkan OS. Karenanya peran OS sebagai manajer sumber daya.

Virtualisasi memori


Sekarang mari kita lihat ingatannya. Model memori fisik dalam sistem modern direpresentasikan sebagai array byte . Untuk membaca dari memori, Anda harus menentukan alamat sel untuk mengaksesnya. Untuk merekam atau memperbarui data, Anda juga harus menentukan data dan alamat sel tempat menulisnya.

Akses memori terjadi terus-menerus selama operasi program. Suatu program menyimpan dalam memori seluruh struktur datanya, dan mengaksesnya dengan mengikuti berbagai instruksi. Instruksi, sementara itu, juga disimpan dalam memori, sehingga itu juga diakses untuk setiap permintaan ke instruksi berikutnya.

Hubungi malloc ()


Pertimbangkan program berikut yang mengalokasikan wilayah memori menggunakan panggilan malloc () (https://youtu.be/jnlKRnoT1m0):

gambar

Program ini melakukan beberapa hal. Pertama, ia mengalokasikan sejumlah memori (baris 7), kemudian menampilkan alamat sel yang dipilih (baris 9), menulis nol ke slot pertama dari memori yang dialokasikan. Selanjutnya, program memasuki siklus di mana ia meningkatkan nilai yang direkam dalam memori di alamat dalam variabel "p". Ini juga menampilkan pengidentifikasi proses itu sendiri. ID proses unik untuk setiap proses yang berjalan . Setelah meluncurkan beberapa salinan, kami akan menemukan hasil yang menarik: Dalam kasus pertama, jika Anda tidak melakukan apa-apa dan hanya memulai beberapa salinan, maka alamatnya akan berbeda. Tapi ini tidak termasuk dalam teori kita! Memang benar, karena dalam distribusi modern fungsi pengacakan memori diaktifkan secara default. Jika Anda mematikannya, kami mendapatkan hasil yang diharapkan - alamat memori dari dua program yang berjalan secara bersamaan akan bertepatan.

gambar

Akibatnya, ternyata dua program independen bekerja dengan ruang alamat pribadi mereka sendiri, yang pada gilirannya ditampilkan oleh sistem operasi dalam memori fisik . Oleh karena itu, penggunaan alamat memori dalam satu program tidak akan memengaruhi yang lain dengan cara apa pun, dan tampaknya setiap program memiliki memori fisiknya sendiri, yang sepenuhnya dapat digunakan. Kenyataannya, bagaimanapun, adalah bahwa memori fisik adalah sumber daya bersama yang dikelola oleh sistem operasi.

Koherensi


Topik penting lain dalam sistem operasi adalah konsistensi . Istilah ini digunakan ketika datang ke masalah dalam sistem yang dapat terjadi ketika bekerja dengan banyak hal pada saat yang sama dalam program yang sama. Masalah konsistensi muncul bahkan dalam sistem operasi itu sendiri. Dalam contoh sebelumnya dengan memori dan virtualisasi prosesor, kami menyadari bahwa OS mengelola banyak hal pada saat yang sama - ia memulai proses pertama, kemudian yang kedua, dan seterusnya. Ternyata, perilaku ini dapat menyebabkan beberapa masalah. Jadi, misalnya, program multithreaded modern mengalami kesulitan seperti itu.

Pertimbangkan program berikut:

gambar

Program di fungsi utama membuat dua utas menggunakan panggilan Pthread_create () . Dalam contoh ini, utas dapat dianggap sebagai fungsi yang berjalan di ruang memori yang sama di sebelah fungsi lainnya, dan jumlah fungsi yang diluncurkan secara bersamaan jelas lebih dari satu. Dalam contoh ini, setiap utas memulai dan menjalankan fungsi pekerja () , yang pada gilirannya hanya menambah variabel ,.

Jalankan program ini dengan argumen 1000. Seperti yang Anda duga, hasilnya seharusnya 2000, karena setiap utas menambah variabel 1000 kali. Namun, semuanya tidak begitu sederhana. Mari kita coba menjalankan program dengan jumlah pengulangan yang lebih banyak.

gambar

Dengan memasukkan angka, misalnya, 100000, kami berharap akan melihat 200000 pada outputnya. Namun, dengan menjalankan angka 100000 beberapa kali, kami tidak hanya tidak akan melihat jawaban yang benar, tetapi juga mendapatkan jawaban yang salah berbeda. Jawabannya terletak pada fakta bahwa untuk menambah angka, diperlukan tiga operasi - mengekstraksi nomor dari memori, menambah dan kemudian menulis nomor kembali. Karena semua instruksi ini tidak diimplementasikan secara atom (semuanya pada saat bersamaan), hal-hal aneh seperti itu dapat terjadi. Masalah ini disebut pemrograman kondisi ras - kondisi lomba . Ketika kekuatan yang tidak dikenal pada saat yang tidak diketahui dapat mempengaruhi kinerja operasi Anda.

Source: https://habr.com/ru/post/id446340/


All Articles