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 =)
Pertimbangkan abstraksi paling mendasar yang diberikan OS kepada pengguna: proses. Mendefinisikan proses cukup sederhana - ini adalah
program yang berfungsi . Program itu sendiri adalah sesuatu yang tidak bernyawa terletak di disk - itu adalah serangkaian instruksi dan mungkin beberapa jenis data statis menunggu untuk diluncurkan. Ini adalah OS yang mengambil byte ini dan meluncurkannya, mengubah program menjadi sesuatu yang bermanfaat.
Paling sering, pengguna ingin menjalankan lebih dari satu program sekaligus, misalnya, Anda dapat menjalankan browser, game, pemutar media, editor teks dan sejenisnya di laptop Anda. Bahkan, sistem tipikal dapat menjalankan puluhan dan ratusan proses secara bersamaan. Fakta ini membuat sistem lebih mudah digunakan, Anda tidak perlu khawatir tentang apakah CPU gratis, Anda hanya menjalankan program.
Ini menimbulkan masalah: bagaimana cara memberikan ilusi dari banyak CPU? Bagaimana OS menciptakan ilusi jumlah CPU yang hampir tak terbatas, bahkan jika Anda hanya memiliki satu CPU fisik?OS menciptakan ilusi ini melalui virtualisasi CPU. Dengan memulai satu proses, kemudian menghentikannya, memulai proses lain, dan seterusnya, OS dapat mendukung ilusi bahwa ada banyak CPU virtual, meskipun pada kenyataannya itu akan menjadi satu atau lebih prosesor fisik. Teknik ini disebut
pembagian waktu CPU . Teknik ini memungkinkan pengguna untuk menjalankan proses simultan sebanyak yang mereka inginkan. Biaya solusi semacam itu adalah kinerja - karena jika CPU dibagi oleh beberapa proses, setiap proses akan diproses lebih lambat.
Untuk mengimplementasikan virtualisasi CPU, dan terutama untuk melakukannya dengan baik, OS membutuhkan dukungan level rendah dan level tinggi. Dukungan tingkat rendah disebut
mekanisme - ini adalah metode atau protokol tingkat rendah yang mengimplementasikan bagian fungsionalitas yang diperlukan. Contoh fungsionalitas tersebut adalah pengalihan konteks, yang memberikan OS kemampuan untuk menghentikan satu program dan menjalankan program lain pada prosesor. Pembagian waktu ini diterapkan di semua sistem operasi modern.
Di atas mekanisme ini ada beberapa logika yang tertanam dalam OS, dalam bentuk "kebijakan".
Kebijakan adalah algoritma pengambilan keputusan tertentu oleh sistem operasi. Politisi semacam itu, misalnya, memutuskan program mana yang akan dijalankan (dari daftar perintah) sejak awal. Jadi, misalnya, kebijakan yang disebut kebijakan
penjadwalan akan menyelesaikan masalah ini dan ketika memilih solusi itu akan dipandu oleh data seperti: riwayat startup (program mana yang telah berjalan paling lama di menit terakhir), jenis beban apa yang dijalankan proses ini (jenis program apa yang diluncurkan) ), metrik kinerja (apakah sistem dioptimalkan untuk interaksi interaktif atau untuk bandwidth) dan seterusnya.
Abstraksi: proses
Abstraksi dari program yang berjalan yang dilakukan oleh sistem operasi adalah apa yang kita sebut
proses . Seperti disebutkan sebelumnya, suatu proses hanyalah sebuah program kerja, pada periode waktu sesaat apa pun. Sebuah program dengan bantuan yang kami dapat memperoleh informasi ringkasan dari berbagai sumber daya sistem, dan yang alamat program ini atau yang mempengaruhi selama pelaksanaannya.
Untuk memahami komponen proses, Anda perlu memahami keadaan sistem: bahwa program dapat membaca atau mengubah selama operasinya. Kapan saja, Anda perlu memahami elemen sistem apa yang penting untuk eksekusi program.
Salah satu elemen yang jelas dari keadaan sistem yang termasuk dalam proses adalah
memori . Instruksi ada di memori. Data yang dibaca atau ditulis oleh program juga terletak di memori. Dengan demikian, memori yang dapat ditangani oleh proses (yang disebut ruang alamat) adalah bagian dari proses.
Register juga merupakan bagian dari status sistem. Banyak instruksi ditujukan untuk mengubah makna register atau membaca artinya, dan dengan demikian register juga menjadi bagian penting dari proses.
Perlu dicatat bahwa keadaan mesin juga dibentuk dari beberapa register khusus. Sebagai contoh,
IP - pointer instruksi - pointer ke instruksi yang sedang dijalankan oleh program. Ada juga
penunjuk tumpukan dan
penunjuk bingkai yang terkait, yang digunakan untuk mengontrol: parameter fungsi, variabel lokal, dan mengembalikan alamat.
Terakhir, program sering mengakses ROM (memori hanya baca). Informasi semacam itu tentang "I / O" (input-output) harus mencakup daftar file yang saat ini terbuka oleh proses.
API proses
Untuk meningkatkan pemahaman tentang proses, mari kita periksa contoh panggilan sistem yang harus dimasukkan dalam antarmuka sistem operasi. API ini dalam satu atau lain bentuk tersedia di OS apa pun.
●
Buat : OS harus menyertakan beberapa metode yang memungkinkan Anda membuat proses baru. Ketika Anda memasukkan perintah di terminal atau meluncurkan aplikasi dengan mengklik dua kali pada ikon, banding dikirim ke OS untuk membuat proses baru dan kemudian meluncurkan program yang ditentukan.
●
Penghapusan : Setelah ada antarmuka untuk membuat proses, OS juga harus menyediakan kemampuan untuk memaksa penghapusan proses. Sebagian besar program secara alami akan diluncurkan dan diselesaikan sendiri saat dijalankan. Jika tidak, pengguna ingin dapat membunuh mereka, dan dengan demikian antarmuka untuk menghentikan proses tidak akan berlebihan.
●
Tunggu : Kadang-kadang berguna untuk menunggu proses selesai, jadi beberapa antarmuka disediakan yang memberikan kemampuan untuk menunggu.
●
Kontrol Lain-lain (kontrol lain-lain): Selain mematikan dan menunggu proses, ada berbagai metode pengendalian lainnya. Sebagai contoh, sebagian besar sistem operasi memberikan kemampuan untuk membekukan suatu proses (menghentikannya untuk periode tertentu) dan kemudian melanjutkannya (melanjutkan eksekusi)
●
Status : Ada berbagai antarmuka untuk menerima beberapa informasi tentang status proses, seperti durasi operasinya atau statusnya saat ini.

Penciptaan Proses: Detail
Salah satu hal yang menarik adalah bagaimana tepatnya program ditransformasikan menjadi proses. Terutama bagaimana OS mengambil dan menjalankan program. Bagaimana tepatnya proses itu dibuat.
Pertama-tama, OS harus memuat kode program dan data statis ke dalam memori (dalam ruang alamat proses). Program biasanya terletak pada disk atau solid state drive dalam beberapa format yang dapat dieksekusi. Dengan demikian, proses memuat program dan data statis ke dalam memori memerlukan OS untuk membaca byte ini dari disk dan menempatkannya di suatu tempat di memori.
Pada sistem operasi awal, proses pengunduhan dilaksanakan dengan penuh semangat, yang berarti bahwa kode tersebut dimuat ke dalam memori sepenuhnya sebelum program dimulai. OS modern melakukan ini dengan malas, yaitu, memuat potongan kode atau data hanya ketika mereka dibutuhkan oleh program selama pelaksanaannya.
Setelah kode dan data statis dimuat ke dalam memori OS, Anda perlu melakukan beberapa hal lagi sebelum memulai proses. Sejumlah memori harus dialokasikan untuk tumpukan.
Program menggunakan tumpukan untuk variabel lokal, parameter fungsi, dan alamat pengirim . OS mengalokasikan memori ini dan memberikannya ke proses. Tumpukan juga dapat dialokasikan dengan beberapa argumen, khususnya mengisi parameter fungsi main (), misalnya, dengan array argc dan argv.
Sistem operasi juga dapat mengalokasikan sejumlah memori untuk tumpukan program.
Heap digunakan oleh program untuk data yang dialokasikan secara dinamis dan diminta secara dinamis . Program meminta ruang ini dengan memanggil fungsi
malloc () dan secara eksplisit menghapus dengan memanggil fungsi
free () . Tumpukan diperlukan untuk struktur data seperti lembar yang ditautkan, tabel hash, pohon, dan lainnya. Pada awalnya, sejumlah kecil memori dialokasikan untuk heap, tetapi seiring waktu, selama operasi program, heap dapat meminta lebih banyak memori melalui pustaka API call malloc (). Sistem operasi terlibat dalam proses mengalokasikan lebih banyak memori untuk membantu memenuhi tantangan-tantangan ini.
Sistem operasi juga akan melakukan tugas inisialisasi, khususnya yang terkait dengan I / O. Misalnya, pada sistem UNIX, setiap proses memiliki 3 deskriptor file terbuka secara default, untuk input standar, output, dan aliran kesalahan. Deskriptor ini memungkinkan program membaca input dari terminal, serta menampilkan informasi di layar.
Dengan demikian, memuat kode dan data statis ke dalam memori, membuat dan menginisialisasi tumpukan, dan juga melakukan pekerjaan lain yang terkait dengan pelaksanaan tugas I / O, OS menyiapkan situs untuk proses tersebut. Pada akhirnya, tugas terakhir tetap: untuk menjalankan program melalui titik masuknya, yang disebut fungsi utama (). Melanjutkan ke fungsi utama (), OS mentransfer kontrol CPU ke proses yang baru dibuat, sehingga program mulai berjalan.
Status proses
Sekarang kami memiliki pemahaman tentang apa proses itu dan bagaimana proses itu dibuat, kami membuat daftar keadaan proses di mana proses itu bisa terjadi. Dalam bentuknya yang paling sederhana, sebuah proses bisa berada di salah satu dari keadaan ini:
●
Berjalan . Dalam kondisi berjalan, proses berjalan pada prosesor. Ini berarti bahwa instruksi sedang dijalankan.
●
Siap . Dalam keadaan siap, proses siap untuk memulai, tetapi untuk beberapa alasan, OS tidak menjalankannya pada titik waktu tertentu.
●
Diblokir . Dalam keadaan terkunci, proses melakukan beberapa operasi yang mencegahnya dari siap untuk dieksekusi sampai suatu peristiwa terjadi. Salah satu contoh umum adalah ketika suatu proses memulai operasi IO, itu menjadi diblokir dan beberapa proses lainnya dapat menggunakan prosesor.

Anda dapat membayangkan kondisi ini dalam bentuk grafik. Seperti yang dapat kita lihat dalam gambar, keadaan proses dapat berubah antara MENJALANKAN dan SIAP sesuai kebijakan OS. Ketika keadaan proses berubah dari SIAP ke MENJALANKAN, ini berarti bahwa proses telah dijadwalkan. Di arah yang berlawanan - dihapus dari tata letak. Pada saat proses menjadi DIBLOKIR, misalnya, saya menginisialisasi operasi IO, OS akan menyimpannya dalam keadaan ini sampai beberapa peristiwa terjadi, misalnya, penyelesaian IO. pada saat ini, transisi ke status READY dan mungkin langsung ke status MENJALANKAN, jika OS memutuskan demikian.
Mari kita lihat contoh bagaimana dua proses melewati kondisi ini. Pertama, bayangkan kedua proses berjalan, dan masing-masing hanya menggunakan CPU. Dalam hal ini, negara bagian mereka akan terlihat sebagai berikut.

Dalam contoh berikut, proses pertama setelah beberapa waktu meminta IO dan memasuki keadaan DILOKOK, memberikan proses lain kemampuan untuk memulai (Gambar 1.4). OS melihat bahwa proses 0 tidak menggunakan CPU dan memulai proses 1. Selama pelaksanaan proses 1 - IO berakhir dan status proses 0 berubah menjadi SIAP. Akhirnya, proses 1 selesai, dan pada akhirnya, proses 0 memulai, mengeksekusi, dan mengakhiri pekerjaannya.

Struktur data
OS itu sendiri adalah sebuah program, dan seperti program lainnya, ia memiliki beberapa struktur data utama yang melacak berbagai potongan informasi yang relevan. Untuk melacak status setiap proses di OS,
daftar proses tertentu untuk semua proses dalam keadaan SIAP dan beberapa informasi tambahan untuk proses pelacakan yang sedang berjalan akan didukung. Juga, OS harus melacak dan memblokir proses. Setelah menyelesaikan IO, OS harus membangkitkan proses yang diinginkan dan membuatnya siap untuk diluncurkan.
Jadi, misalnya, OS harus menyimpan status register prosesor. Pada saat proses berhenti, keadaan register disimpan dalam ruang alamat proses, dan pada saat kelanjutannya, dimungkinkan untuk mengembalikan nilai-nilai register dan dengan demikian melanjutkan proses.
Selain status siap, diblokir, berjalan, ada beberapa negara lain. Terkadang, pada saat penciptaan, suatu proses dapat memiliki status INIT. Akhirnya, suatu proses dapat ditempatkan dalam status FINAL ketika sudah selesai, tetapi informasi tentangnya belum dihapus. Pada sistem UNIX, keadaan ini disebut
proses zombie . Keadaan ini berguna untuk kasus-kasus ketika proses induk ingin mengetahui kode pengembalian keturunan, misalnya, biasanya 0 menunjukkan penyelesaian yang sukses, dan 1 menunjukkan kesalahan, tetapi programmer dapat membuat kode output tambahan, menandakan berbagai masalah. Setelah selesai, proses induk membuat panggilan sistem terakhir, misalnya, tunggu (), untuk menunggu proses turunan untuk menyelesaikan dan memberi sinyal pada OS bahwa data apa pun yang terkait dengan proses yang diselesaikan dapat dihapus.

Poin-poin penting dari kuliah ini:
●
Proses - abstraksi utama dari program yang sedang berjalan di OS. Kapan saja, suatu proses dapat dijelaskan oleh keadaannya: isi memori di ruang alamatnya, isi register prosesor, termasuk penunjuk instruksi dan penumpukan tumpukan, juga dengan informasi tentang IO, misalnya, membuka file yang dibaca atau ditulis.
●
API Proses terdiri dari panggilan yang dapat dilakukan program terkait proses. Ini biasanya panggilan untuk membuat, menghapus, atau yang lainnya.
● Suatu proses berada di salah satu dari banyak negara, termasuk berjalan, siap, diblokir. Berbagai acara, seperti perencanaan, pengecualian dari perencanaan, atau harapan, dapat menerjemahkan keadaan suatu proses dari satu ke yang lain.
● Daftar
proses berisi informasi tentang semua proses dalam sistem. Setiap entri di dalamnya disebut blok kontrol proses, yang dalam kenyataannya adalah struktur yang berisi semua informasi yang diperlukan tentang proses tertentu.