Desain Kursus Sistem Operasi Berdasarkan C# WinForm: Spooling Spooled Input dan Simulasi Teknologi Output.
Diperlukan untuk merancang proses output spooling dan dua proses pengguna yang meminta output, serta program layanan output spooling. Ketika proses pengguna yang meminta output ingin mengeluarkan serangkaian informasi, program layanan output dipanggil, dan program layanan output mengirimkan informasi ke sumur output. Ketika flag end output ditemui, itu menunjukkan bahwa output file output dari proses selesai. Setelah itu, blok permintaan output diterapkan (digunakan untuk mencatat nama proses pengguna yang meminta output, posisi informasi di sumur output, panjang informasi yang akan menjadi output, dll.), Dan menunggu proses spooling untuk output.
Ketika proses output spooling berfungsi, itu sebenarnya akan menghasilkan printer atau monitor berdasarkan informasi yang akan di -output oleh setiap proses yang dicatat di blok permintaan. Di sini, proses output SP00LING dan proses pengguna yang meminta output dapat dijalankan secara bersamaan.
Penjadwalan proses menggunakan algoritma acak, yang konsisten dengan keacakan informasi output proses. Probabilitas penjadwalan dari dua proses pengguna yang meminta output masing -masing adalah 45%, dan proses output spooling adalah 10%, yang ditentukan oleh simulasi angka acak yang dihasilkan oleh generator angka acak.
Ada tiga kondisi dasar proses, yaitu dapat dieksekusi, menunggu dan berakhir. Negara yang dapat dieksekusi adalah negara di mana proses berjalan atau menunggu penjadwalan; Keadaan menunggu dibagi menjadi State 1, Waiting State 2 dan Waiting State 3.
Kondisi untuk perubahan negara adalah:
① Ketika proses dieksekusi, itu diatur ke keadaan "Akhir".
② Ketika program layanan mengirimkan informasi output ke output dengan baik, jika menemukan bahwa sumur output penuh, proses panggilan akan diatur ke "Waiting State 1".
③ Ketika proses spooling output, jika output kosong, itu akan masuk "status menunggu 2".
④ Setelah proses spooling menghasilkan blok informasi, ia harus segera melepaskan ruang sumur output yang ditempati oleh blok informasi dan mengatur proses menunggu output ke "status yang dapat dieksekusi".
⑤ Setelah program layanan mengeluarkan informasi ke sumur output dan membentuk blok informasi permintaan output, jika proses spooling dalam keadaan menunggu, diatur ke "status yang dapat dieksekusi".
⑥ Ketika proses pengguna meminta blok output, jika tidak ada blok permintaan yang tersedia, proses panggilan masuk "Waiting State 3".
Ada dua proses pengguna yang meminta output dalam sistem, dan dua proses dinamai masing -masing proses pengguna A dan proses pengguna B. Pengguna mungkin perlu mengeluarkan lebih dari satu file, dan file dipisahkan oleh bendera akhir output. Bendera ujung output file yang digunakan dalam percobaan ini adalah #.
Pengguna perlu memasukkan semua konten file untuk menjadi output selama fase inisialisasi dan kemudian menyimpannya ke dalam array. Ketika proses pengguna dijadwalkan, jika tiga ketentuan berikut dipenuhi: masih ada file yang tidak dikeluarkan, ruang yang tersisa di sumur output dapat meletakkan file, dan ada blok permintaan output yang tersedia, file dikirim ke sumur output, dan kemudian blok permintaan output diterapkan, dan blok permintaan ditambahkan ke blok permintaan yang menunggu Queue, dan menunggu spool for the spooling.
Ketika giliran proses output spooling untuk menempati CPU, proses output spooling pertama -tama memeriksa apakah ada blok output di blok permintaan menunggu antrian untuk output, dan jika tidak ada, ia memasuki keadaan menunggu. Kalau tidak, output dilakukan, dan kemudian ruang sumur output dan blok output yang diminta dirilis, dan proses pengguna yang sedang tidur karena tidak ada blok output yang tersedia.
Proses output spooling dan proses pengguna dapat dieksekusi secara bersamaan. Artikel ini mengabstraksi proses satu proses eksekusi (proses tidak harus berakhir setelah eksekusi) menjadi suatu fungsi, setiap kali menghasilkan angka acak dan menjalankan proses tertentu sesuai dengan angka acak. Jika proses diblokir karena situasi tertentu, nomor acak berikutnya akan dihasilkan dan proses lain akan dijadwalkan. Proses pengguna dan proses output spooling dijadwalkan pada gilirannya karena berbagai alasan, yaitu eksekusi bersamaan.
Fungsi seluruh sistem dibagi menjadi bagian -bagian berikut: fungsi inisialisasi, fungsi jadwal, fungsi proses pengguna, dan fungsi output spooling. Fungsi inisialisasi digunakan untuk mengimplementasikan input awal dan penyimpanan file pengguna; Fungsi pengiriman mengimplementasikan pengalihan antara proses pengguna dan proses output spooling; Fungsi proses pengguna mengimplementasikan serangkaian tindakan yang diselesaikan setelah proses dijadwalkan; Fungsi output spooling mewakili operasi output.
Diagram alur keseluruhan dari operasi sistem ditunjukkan pada Gambar 1:
Sistem pertama -tama menggunakan fungsi inisialisasi untuk menginisialisasi input konten oleh pengguna, dan kemudian menghasilkan angka acak R antara 0 dan 1, dan menilai apakah proses pengguna harus dieksekusi atau proses output harus dieksekusi sesuai dengan ukuran R. setelah proses pengguna dan proses output dieksekusi, program berlangsung, jika tidak penjadwalan akan dilanjutkan.
Pengguna perlu memasukkan konten yang ingin ia "cetak". Fungsi inisialisasi menerima input konten oleh pengguna dan memotongnya sesuai dengan karakter akhir file, dan memasukkan file cut ke dalam array, dan mengirimkannya ke output dengan baik ketika proses pengguna dijadwalkan.
Penjadwalan proses menggunakan algoritma acak, dan probabilitas penjadwalan dari dua proses pengguna yang meminta output adalah 45%, dan proses output spooling adalah 10%. Makalah ini menggunakan angka acak untuk mencapai persyaratan ini. Saat melakukan penjadwalan proses, desimal antara 0 dan 1 dihasilkan secara acak. Jika jumlahnya kurang dari atau sama dengan 0,45, proses pengguna A akan dioperasikan; Jika jumlahnya antara 0,45 dan 0,9, proses pengguna B akan dioperasikan; Jika jumlahnya lebih besar dari 0,9, proses output spooling akan dioperasikan.
Fungsi proses pengguna pertama -tama perlu memeriksa apakah proses saat ini memenuhi tiga kondisi: file tidak output, ruang yang tersisa di sumur output dapat meletakkan file ke bawah, dan ada blok permintaan output yang tersedia. Jika ketiga kondisi dipenuhi, file akan dikirim ke sumur output dan blok permintaan yang sesuai diterapkan.
Diagram alur dari eksekusi fungsi proses pengguna ditunjukkan pada Gambar 2:
Ketika proses pengguna dijalankan, jika ditemukan bahwa file telah output, proses berjalan berakhir. Kalau tidak, ditentukan apakah ada ruang yang tersisa di sumur output dan tidak ada keadaan menunggu yang dimasukkan. Jika ada ruang yang tersisa di sumur output, terus menilai apakah ada blok output. Jika ada, kirim file ke output dengan baik dan minta blok output, dan bangun proses output yang berpotensi mengantuk, jika tidak masukkan status tunggu 3.
Fungsi output spooling memeriksa apakah ada blok permintaan output, dan jika ada, output dan melepaskan sumber daya yang relevan. Kalau tidak, proses output spooling akan menunggu.
Diagram alur fungsi output spooling ditunjukkan pada Gambar 3:
Definisi PCB adalah sebagai berikut:
class PCB {
/*
* 进程描述
*/
public int id ; //序号
public int status ; //状态,0表示可执行,123表示三个等待状态,4表示结束
public string [ ] contents = new string [ MaxFileCount ] ; //要输出的内容
public int [ ] flags = new int [ MaxFileCount ] ; //为1表示该文件已经被输出,初始全部为0
public int fileCount ; //用户真实输入的文件个数
}Proses pengguna mencakup ID nomor seri, status status proses, konten menjadi output, bendera output file, dan jumlah file nyata.
Di antara mereka, proses proses yang mungkin di mana proses pengguna mungkin ada termasuk: 0 berarti keadaan yang dapat dieksekusi, 1 berarti status menunggu 1, 3 berarti status menunggu 3, 4 berarti mengakhiri proses.
OutputReqBlock didefinisikan sebagai berikut:
class OutputReqBlock {
/*
* 输出请求块
*/
public int id ; //要求进行输出的进程的id
public int start ; //文件在输出井中的起始位置
public int length ; //文件长度
public int fileIndex ; //要输出文件的序号
public OutputReqBlock ( int id , int start , int length , int fileIndex ) {
this . id = id ;
this . start = start ;
this . length = length ;
this . fileIndex = fileIndex ;
}
}Blok output permintaan meliputi: ID proses blok permintaan, posisi awal file di sumur output, panjang panjang file, dan nomor urutan file yang akan output di semua file pengguna.
Definisi outputwell adalah sebagai berikut:
class OutputWell {
/*
* 输出井
*/
public char [ ] buffer = new char [ MaxWellLen ] ; //输出缓冲区
public int begin = 0 ; //当前可用位置
public int restSize = MaxWellLen ; //剩余容量
}Parameter sumur output adalah: buffer buffer, yang digunakan untuk menyimpan data yang ditempatkan oleh pengguna; Lokasi yang tersedia saat ini dimulai, file disimpan dalam urutan di sumur output, dan awal selalu menunjuk ke posisi awal dari buffer yang tersedia saat ini; Kapasitas yang tersisa beristirahat, kapasitas yang tersisa dalam buffer, awalnya panjang buffer Maxwelllen.
Pengguna memasukkan informasi untuk "mencetak" di kotak teks, lalu memilih proses mana yang dimiliki konten output (A atau B). Terakhir, klik tombol Inisialisasi untuk memulai fungsi inisialisasi. Fungsi inisialisasi pertama kali menggunakan objek string untuk menyimpan input konten oleh pengguna. Kemudian, periksa apakah konten yang dimasukkan oleh pengguna diakhiri dengan nomor #, dan meminta pengguna untuk masuk kembali jika tidak legal. Setelah input legal, konten yang dimasukkan oleh pengguna dipotong sesuai dengan nomor #, dan string dipotong menjadi beberapa string. Akhirnya, objek PCB diinisialisasi menggunakan informasi yang dihasilkan dan ditempatkan di antrian menunggu Waitqueue.
Karena pengguna dapat mengklik tombol Inisialisasi beberapa kali, perlu untuk menentukan apakah proses saat ini telah diinisialisasi sebelum setiap klik. Jika pengguna telah menyelesaikan inisialisasi tetapi mengklik tombol inisialisasi lagi, konten asli akan ditimpa.
Sumur output secara otomatis diinisialisasi ketika antarmuka sistem dimuat.
Kode fungsi inisialisasi dilewati!
Untuk mencapai keacakan, setiap kali Anda ingin menjadwalkan, angka acak antara 0 dan 1 dihasilkan menggunakan fungsi acak C#. Jika angka acak kurang dari atau sama dengan 0,45 berarti bahwa proses pengguna A akan dijadwalkan selanjutnya; Jika angka acak antara 0,45 dan 0,9 berarti bahwa proses pengguna B akan dijadwalkan selanjutnya; Jika angka acak lebih besar dari 0,9 berarti proses output spooling akan dijadwalkan berikutnya.
Implementasi fungsi penjadwal adalah sebagai berikut:
private int dispatch ( ) {
/*
* 进程调度
*/
double res = rd . NextDouble ( ) ; //产生一个01之间的小数
if ( res <= 0.45 ) {
return 0 ;
} else if ( res <= 0.9 ) {
return 1 ;
} else {
return 2 ; //012分别表示两个进程和SPOOLing输出进程
}
} Digunakan untuk mengimplementasikan serangkaian operasi yang dilakukan saat proses pengguna berjalan.
Ketika proses pengguna dijadwalkan, pertama -tama periksa apakah masih ada file yang belum dikirim ke output dengan baik. Jika tidak ada, proses pengguna saat ini diatur ke keadaan akhir dan fungsi kembali.
Proses pengguna belum berakhir, yang berarti masih ada file yang belum dikirim ke output dengan baik. Loop untuk menemukan blok file yang belum menjadi output (bendera yang sesuai adalah 1), dan kemudian menanyakan apakah ruang yang tersisa di sumur output masih dapat meletakkan blok file ini. Jika tidak, atur status proses untuk menunggu status 1 dan fungsi kembali. Jika masih ada ruang yang tersisa, maka periksa apakah masih ada blok output permintaan yang tersedia. Jika proses tidak diatur untuk menunggu State 3, fungsi kembali. Jika tidak, blok file dikirim ke sumur output dan parameter yang relevan dari sumur output dimodifikasi. Kemudian, blok output permintaan diterapkan pada printqueue antrian output, dan output cetak dicetak saat proses output spooling dijadwalkan. Akhirnya, jika proses output spooling dalam keadaan menunggu, proses pengguna perlu membangunkannya.
Berbagai situasi selama fungsi proses proses pengguna disimpan melalui daftar untuk tampilan hasil akhir. Daftar ini meliputi: Nomor urutan penjadwalan saat ini, nomor proses, status proses, status sumur output, jumlah blok permintaan yang tersedia, nomor urutan file, dan panjang file.
Kode fungsi proses pengguna dilewati!
Fungsi fungsi output adalah untuk memilih blok output permintaan, kemudian output konten di dalamnya, dan akhirnya lepaskan sumber daya yang sesuai.
Pertama periksa apakah sumur output kosong. Jika proses output kosong diatur untuk menunggu status 2, fungsi kembali. Jika tidak, periksa apakah ada blok output permintaan dalam antrian output permintaan yang perlu output, dan tidak ada fungsi yang dikembalikan. Kalau tidak, blok output permintaan di kepala antrian diambil dari antrian output permintaan, dan kemudian blok permintaan adalah output, dan ruang output sumur dan blok permintaan yang sesuai dibebaskan.
Saat mengeluarkan fungsi output, konten output harus ditampilkan ke area output file.
Kode fungsi keluaran dilewati!
Pengguna mengklik tombol "Program Run" dan mulai menjalankan fungsi utama. Proses berjalan disesuaikan secara dinamis sesuai dengan situasi saat ini.
Fungsi utama pertama -tama menentukan apakah kedua proses pengguna telah diinisialisasi dan hanya dapat dijalankan setelah inisialisasi, jika tidak kesalahan akan dilaporkan.
Setelah inisialisasi, klik tombol "Program Run" lagi. Selama ada proses yang tidak dalam keadaan akhir, atau blok permintaan belum menjadi output, terus jadwalkan. Saat menjadwalkan, Anda harus menentukan apakah proses saat ini telah berakhir, dan mengeluarkan keadaan yang relevan setelah selesai.
Kode fungsi utama dilewati!
Deskripsi berbagai parameter yang digunakan dalam percobaan ditunjukkan pada Tabel 1:
| Nama Parameter | Maxwelllen | MAXFILECOUNT | blockcount |
|---|---|---|---|
| Deskripsi parameter | Keluaran panjangnya | Jumlah maksimum file yang dapat di -output pengguna | Jumlah blok yang diminta |
| Nilai parameter | 15 | 10 | 3 |
Antarmuka sistem ditunjukkan pada Gambar 4:
Antarmuka sistem dibagi menjadi tiga bagian: inisialisasi, proses penjadwalan dan area output file. Bagian inisialisasi berisi kotak teks, kotak pilihan, dan tombol. Pengguna memasukkan file yang akan dicetak di kotak teks dan kemudian menginisialisasi. Bagian Proses Penjadwalan terutama adalah tabel yang menampilkan proses rinci penjadwalan proses. Bagian output file digunakan untuk menampilkan proses pencetakan semua file.
Pengguna pertama -tama memilih proses, default awal adalah A, dan kemudian menempatkan file menjadi output ke dalam kotak teks dari bagian inisialisasi, dan kemudian mengklik tombol Inisialisasi. Inisialisasi berhasil, seperti yang ditunjukkan pada Gambar 5:
Untuk proses B, lakukan operasi di atas seperti yang ditunjukkan pada Gambar 6:
Setelah inisialisasi dua proses pengguna selesai, klik tombol Run Program, dan hasilnya ditunjukkan pada Gambar 7 dan Gambar 8:
Berikut ini adalah analisis singkat dari isi Gambar 7. Seperti yang ditunjukkan pada Gambar 9:
Proses output dijadwalkan untuk pertama kalinya, karena outputnya kosong saat ini, sehingga status proses output menunggu status 2, dan jumlah blok permintaan yang tersedia adalah 3. Kedua kalinya proses A dijadwalkan. Keadaan proses A dapat dieksekusi. Jumlah blok permintaan yang tersedia adalah 3. A mengirimkan file 0 ke output dengan baik. Panjang file 0 ("ABCD") adalah 4. Proses output dijadwalkan untuk ketiga kalinya. Ruang sumur output yang tersedia adalah 15-4 = 11, jumlah blok permintaan yang tersedia menjadi 2, dan file 0 dari proses A IS output, seperti yang ditunjukkan pada area output file, dan ruang yang relevan dirilis.