Saya benar-benar tidak mengerti tentang cara kerja bagian dalam sistem operasi, tetapi saya dapat kira-kira kira-kira perilaku perkiraan dari banyak fungsi. Namun, satu hal yang tidak dapat saya pahami adalah multitasking.
Secara teori, sistem operasi mengatur waktu, menurut CPU untuk interval kecil ke berbagai program yang berjalan. Tapi itu tidak jelas bagaimana ini benar-benar bekerja.
Katakanlah sistem operasi ingin memulai program saya. Kode mesin dimuat di suatu tempat di RAM, mulai dari alamat tertentu. Saya kira lompatan harus dilakukan ke alamat itu, memungkinkan kode saya untuk mengeksekusi. Tetapi dengan cara ini, OS tidak bisa mendapatkan kembali kendali sampai saya melompat kembali.
Pada dasarnya, saya bisa membayangkan hanya dua cara untuk membuat ini bekerja, tetapi tidak ada yang benar-benar cocok:
Sistem operasi dapat membaca instruksi mesin yang ingin saya lakukan dan meniru mereka daripada mengeksekusi secara langsung. Saya sengaja tidak jelas, karena saya tidak tahu bagaimana ini akan bekerja, tetapi sepertinya itu akan sangat memperlambat program.
Atau, sistem operasi bisa menunggu sampai saya membuat panggilan sistem. Pada saat itu ia mendapatkan kembali kendali dan dapat memeriksa berapa lama saya telah menjalankan dan melakukan hal-hal pembagian waktu. Ini mungkin bekerja, tetapi tampaknya tidak dapat diandalkan, karena saya bisa membuat perhitungan panjang yang tidak melibatkan panggilan sistem dan menggantung semuanya untuk sementara waktu.
Jadi, sepertinya tidak ada mekanisme yang bekerja dengan baik. Bagaimana multitasking sebenarnya dilakukan?
sumber
interrupt
INT
instruksi. Sesuatu masih misterius bagi sayaJawaban:
OS memprogram penghitung waktu untuk memulai setiap beberapa mikrodetik (atau milidetik, tergantung pada kecepatan sistem). Timer ini meningkatkan interupsi perangkat keras, yang menyebabkan CPU menghentikan apa pun yang sedang dilakukannya, membuang semua isinya ke tumpukan dan memproses rutin interupsi yang ditunjukkan oleh alamat yang disediakan oleh pengendali interupsi. Rutin ini dapat memeriksa tumpukan dan berbagai variabel lain untuk membuat keputusan proses berjalan mana yang selanjutnya harus dilakukan kembali. Jika ini proses yang sama, rutin interupsi hanya kembali. Jika berbeda, bagian-bagian yang relevan dari tumpukan disimpan dan kemudian diganti dengan isi dari proses yang sebelumnya terganggu, jadi ketika rutinitas interupsi kembali, proses itu berlanjut. Selain fakta bahwa beberapa waktu telah berlalu,
Ini (untuk CPU modern) adalah versi yang SANGAT SANGAT disederhanakan dari apa yang terjadi, tetapi ini menjelaskan prinsipnya. Selain interupsi yang dikendalikan OS ini, ada juga interupsi yang disebabkan oleh peristiwa eksternal (mouse, keyboard, port serial, port jaringan, dll.) Yang diproses dengan rutin interupsi terpisah, yang biasanya terhubung ke event handler.
Seringkali proses / tugas / pengalihan konteks juga didasarkan pada ketersediaan sumber daya eksternal. Biasanya suatu proses yang membutuhkan data dari penyimpanan (yaitu tidak dalam RAM) akan menempatkan permintaan pada antrian, mengatur event handler untuk interupsi perangkat keras yang menunjukkan bahwa permintaan telah dilayani dan kemudian melepaskan kontrol ke penjadwal tugas (karena tidak ada titik menunggu). Sekali lagi, deskripsi yang sangat disederhanakan tentang apa yang sebenarnya terjadi, tetapi harus melayani tujuan dari jawaban ini.
sumber
Ini bervariasi dari satu sistem ke sistem lainnya.
Dalam sistem multitasking nonpreemptive (seperti Oberon asli, atau Apple Macintosh asli), sistem operasi secara berkala "mengumpulkan" semua tugas, memberi mereka kesempatan untuk melakukan pekerjaan. Tugas-tugas tersebut diharapkan dapat bermain dengan baik bersama. Jika mereka hanya memiliki sedikit pekerjaan yang harus dilakukan, mereka melakukannya dan kembali ke OS. Jika satu tugas memiliki sebagian besar untuk dilakukan, diharapkan memecahnya menjadi bagian-bagian kecil, dan bekerja satu bagian kecil setiap kali itu disurvei.
Interupsi perangkat keras (penyelesaian DMA drive disk, interupsi port serial, apa pun yang Anda lakukan) menyebabkan rutinitas interupsi dijalankan. Rutinitas interupsi ini pada gilirannya dapat memberitahukan tugas pekerjaan yang harus dilakukan ketika tugas berikutnya berjalan.
Dalam sistem multitasking nonpreemptive, kejadian atau tidak adanya interupsi tidak mempengaruhi tugas mana yang berjalan setelah rutin interupsi selesai.
Dalam sistem multitasking preemptive, dimungkinkan untuk suatu rutin interupsi untuk memaksakan perubahan penjadwalan. Dalam sistem multitasking preemptive round-robin tradisional, penghitung waktu berkala melakukan hal itu. Timer interrupt menyala, timer interrupt rutin melakukan sihir hitam untuk menyebabkan instruksi return-from-interrupt untuk kembali ke jadwal preemptive sistem operasi, daripada ke tugas yang sedang berjalan, mengambil prosesor dari tugas saat ini, dan (MUNGKIN) ) memberikannya ke tugas lain. Jika tidak ada tugas lain yang siap dijalankan pada saat itu, tugas saat ini akan mendapatkan prosesor lagi, hanya kehilangan beberapa waktu.
Multitasking preemptive dapat menyebabkan BANYAK masalah. Semua hal yang menjengkelkan tentang mutex dan bagian kritis dan pelukan mematikan dan inversi prioritas dan ... muncul ketika prosesor diambil dari Anda tanpa peringatan. Anda harus menggunakan semua hal itu untuk memberi tahu sistem operasi bahwa Anda berada di tengah-tengah pencampuran nitrogliserin dan mengambil prosesor dari Anda saat ini kemungkinan akan menghasilkan lubang virtual besar merokok di tengah lantai ruang server.
sumber
Timer interupsi dapat dihasilkan oleh perangkat keras komputer untuk mengganggu CPU. Dengan cara ini, berdasarkan algoritma penjadwalan yang digunakan oleh Sistem Operasi, OS dapat memutuskan apakah akan melanjutkan menjalankan program Anda saat ini atau beralih konteks ke program lain yang siap dijalankan.
sumber