Mengapa proses memprioritaskan tidak menghasilkan peningkatan kecepatan?

18

Saya sudah mendapat 2 aplikasi yang sama-sama menggunakan banyak sumber daya sistem. Ketika saya mengurangi prioritas satu di Task Manager, sementara meningkatkan yang lain, saya tidak melihat peningkatan signifikan dalam kecepatan dalam aplikasi dengan prioritas yang lebih tinggi.

Kenapa ini? Apakah ada lebih banyak hal yang terjadi atau masih banyak yang perlu dilakukan?

Musa
sumber
6
Ini seperti kehidupan nyata. Jika Anda memiliki prioritas lebih tinggi untuk naik pesawat daripada penumpang lain, itu tidak berarti penerbangan akan memakan waktu lebih sedikit untuk Anda!
Mehrdad

Jawaban:

28

Prioritas tidak membantu ketika bottleneck adalah CPU itu sendiri. Apa yang sebenarnya dilakukan prioritas adalah mempengaruhi algoritma penjadwalan yang digunakan Sistem Operasi untuk menentukan proses mana yang berjalan selanjutnya karena tidak ada cukup prosesor di sebagian besar sistem untuk menjalankan setiap proses secara terus menerus.

Tugas dengan prioritas lebih tinggi akan membuat jalannya ke puncak antrian lebih cepat, jadi ini membantu dengan latensi umum, tetapi jika proses Anda melelahkan seluruh kutu waktu itu dialokasikan pada perhitungan aktual maka penjadwalan tidak akan mengubah apa pun di sana. Mengubah prioritas lebih berguna ketika Anda memiliki proses yang menunggu di I / O dan Anda ingin menjadi lebih responsif.

Andon M. Coleman
sumber
5
Prioritas memang membantu ketika bottleneck terlalu banyak utas yang dapat dijalankan. Utas dengan prioritas lebih tinggi pada Windows yang tetap dapat dijalankan pada akhir waktu mereka akan mendapatkan kesempatan lain untuk berjalan dalam preferensi untuk utas prioritas rendah (Windows mencoba untuk tidak kelaparan utas prioritas rendah dan kadang-kadang meningkatkannya). Prioritas tidak banyak berpengaruh pada utas yang menunggu I / O - Windows untuk sementara meningkatkan prioritas utas setelah I / O selesai, tergantung pada jenis I / O yang ditunggu.
Mike Dimmick
4

Prioritas adalah waktu CPU. Apakah semua core digunakan 100% setiap saat? Jika tidak, maka prioritas tidak akan berpengaruh. Cukup sering CPU bukan penghambat, dan itu adalah memori, disk, atau sumber daya GPU.

Jason
sumber
3

Prioritas hanya penting ketika ada utas yang lebih bisa dijalankan daripada inti CPU yang tersedia. Ketika itu terjadi, prioritas mengontrol utas yang dapat dijalankan. Di sebagian besar sistem, tidak ada cukup komputasi yang terjadi untuk pertikaian pada CPU: utas semuanya diblokir , menunggu sesuatu terjadi. Itu mungkin sedang menunggu Anda untuk mengetik sesuatu, menggerakkan mouse, menyentuh layar, atau agar data datang dari disk, jaringan, beberapa perangkat lain yang Anda tancapkan, atau untuk utas lainnya untuk menyelesaikan mengerjakan data penting struktur. Mungkin sedang menunggu sebagian program untuk membaca dari disk atau beberapa memori yang ditukar untuk dibaca kembali, daripada secara eksplisit membaca file.

Di Windows, penjadwal membuat antrean utas yang dapat dijalankan di setiap tingkat prioritas. Ketika ia membuat keputusan penjadwalan - apakah utas telah kehabisan kuantumnya (waktu yang diizinkan sebelum hal lain perlu dijalankan), artinya utas lain harus berbelok, atau utas telah diblokir dan tidak lagi bisa dijalankan, atau prioritas lebih tinggi utas telah diblokir - utas berikutnya dalam antrian di tingkat prioritas teratas dengan utas yang dapat dijalankan akan dijadwalkan. Jika utas yang berjalan telah menggunakan kuantumnya, ia diletakkan di ujung antrian. Jika itu satu-satunya utas pada tingkat prioritasnya yang dapat dijalankan, dan tidak ada utas lain yang prioritasnya lebih tinggi, tetapi tidak berjalan, utas, itu akan mendapat giliran lain.

Dalam sistem multicore / multiprosesor, mungkin ada batasan di mana core dapat dijalankan. Juga, sistem mencoba untuk menjaga utas pada inti ideal mereka dan dalam simpul NUMA mereka sehingga data utas tersebut kemungkinan masih berada dalam cache inti itu dan memiliki akses cepat ke data yang dibuatnya. Utas masih akan berjalan di inti yang tidak ideal jika tidak ada pilihan apa yang akan dijalankan selanjutnya.

Sistem menggunakan berbagai dorongan prioritas dinamis dan ukuran kuantum dinamis sehingga aplikasi latar depan mendapat lebih banyak waktu (jika diperlukan) daripada proses latar belakang, dan agar proses dapat bereaksi dengan cepat ketika operasi I / O selesai (termasuk mouse, keyboard, dan input layar sentuh). Selain itu, peningkatan prioritas digunakan untuk mengatasi inversi prioritas, di mana utas prioritas tinggi sedang menunggu sumber daya yang dimiliki utas prioritas rendah saat ini. Jika ada utas prioritas menengah yang juga berjalan, ia akan kelaparan utas waktu prosesor prioritas rendah, menahan utas prioritas tinggi. Jadi utas prioritas rendah sementara ditingkatkan ke prioritas yang lebih tinggi sehingga mendapatkan waktu dan mudah-mudahan melepaskan sumber daya yang dibutuhkan utas prioritas tinggi.

Sebelum Windows Vista, prioritas utas tidak berpengaruh pada seberapa cepat operasi I / O selesai. Sejak Windows Vista, I / Os juga dapat memiliki prioritas, yang secara default berasal dari prioritas utas.

Rangkuman: Anda sebagian besar tidak akan melihat pengaruh mengubah prioritas utas kecuali CPU Anda sarat beban, dan bahkan efeknya biasanya minimal. Jika proses harus menunggu I / O atau tidak bersaing dengan proses lain untuk waktu CPU, itu sudah berjalan tercepat yang bisa dan mengubah prioritas tidak akan membuatnya lebih cepat.

Mike Dimmick
sumber
0

Secara umum, dibutuhkan upaya ekstra untuk membuat program menggunakan lebih dari satu CPU (dengan menambahkan multi-threading). Jadi, bahkan jika program memiliki prioritas tertinggi yang tersedia, itu mungkin hanya menggunakan satu inti.

Kemungkinan masalah lain:

  • Program ini bisa jadi tidak efisien / ditulis dengan buruk
  • Ini bisa diperlambat karena akses disk "lambat" atau jaringan lambat
Jon Onstott
sumber
0

Bahkan meningkatkan prioritas I / O dari proses I / O-terikat tidak akan membuatnya berjalan lebih cepat. Sebagai contoh, jika itu adalah konsumen data yang dihasilkan oleh proses yang terpisah, mungkin jarak jauh, dan sesuai dengan tingkat di mana sumber itu menghasilkan data, maka ia tidak dapat berjalan lebih cepat atau memiliki throughput yang lebih tinggi.

Bertentangan dengan apa yang secara kategoris dinyatakan dalam kalimat pertama dari jawaban yang saat ini diterima ( /superuser//a/752587/322588 ), perubahan prioritas paling efektif ketika CPU menjadi hambatan, seperti dijelaskan dalam jawaban Mike Dimmick ( /superuser//a/752864/322588 ). Selanjutnya, pernyataan dalam paragraf kedua jawaban yang diterima, "jika proses Anda melelahkan seluruh waktu kutu itu dialokasikan pada perhitungan yang sebenarnya maka penjadwalan tidak akan mengubah apa pun di sana" benar-benar salah kecuali proses tersebut umumnya memiliki prioritas tertinggi dari semua utas runnable setiap kali menunggu untuk dijalankan. Ini karena dalam semua keadaan lain, menaikkan prioritas kemungkinan akan membuatnya lebih banyak rentang waktu per interval jam dinding.

Mike Dimmick menunjukkan masalah dengan jawaban ini beberapa hari yang lalu, dan memberikan jawaban yang jauh lebih baik, namun yang pertama secara misterius terus mendapatkan suara. Klaim pengarangnya bahwa ia hanya meredam jawabannya bagi kami boneka tidak masuk akal, karena itu tidak hanya sederhana, atau bahkan sederhana, itu salah, paling tidak berkaitan dengan proses yang terikat CPU.

Penafian: Saya tidak tahu Pak Dimmick, meskipun saya bisa mengatakan dia tahu apa yang dia tulis.

sdenham
sumber
Mungkin Anda salah paham; pertanyaannya adalah tentang proses yang berjalan lebih cepat. Proses yang terikat CPU akan menghabiskan seluruh unit penjadwalan (kuantum) mereka dan kemudian pergi ke antrian proses yang siap di akhir. Dalam sistem operasi desktop seperti Windows, itu berarti proses memiliki peluang 1 / quantum-Hz untuk berjalan setiap detik. Mengubah prioritas (umumnya) tidak mengubah panjang rentang waktunya. Akan selalu dibutuhkan jumlah penjadwalan yang sama untuk diselesaikan. Yang terpenting , ini adalah bagaimana Windows sebenarnya mengukur proses runtime: jumlah kuanta dijadwalkan.
Andon M. Coleman
Prosesnya mungkin selesai lebih cepat, tetapi masih berjalan untuk jumlah unit penjadwalan yang sama. Ketika proses I / O terikat menempatkan dirinya pada daftar tunggu, itu mungkin mendapatkan kesempatan kedua untuk menjalankan dan mendahului proses yang berjalan dengan prioritas yang lebih rendah sebelum kuantumnya berakhir jika operasi I / O-nya selesai. Proses yang terikat CPU tidak memiliki kebebasan ini, mereka menghabiskan seluruh waktu mereka dan kemudian masuk ke antrian siap. Hal ini mungkin bagi mereka untuk menjalankan segera setelah itu jika mereka memiliki prioritas yang cukup tinggi, tapi itu tidak ada hubungannya dengan bagaimana Windows mengukur waktu eksekusi.
Andon M. Coleman
Prioritas pada proses ikatan I / O yang menunggu pada dasarnya berbeda dan dapat memiliki dampak yang terukur pada runtime yang dilaporkan di Windows. Sekali lagi, Windows mengukur runtime ketika jumlah kuanta yang kedaluwarsa (bahkan jika suatu proses menghabiskan 1 ms dari 10 ms kuantum benar-benar berjalan dan kemudian secara sukarela menunggu sisa 9 ms untuk I / O, kernel Windows menghitung sebagai 10 ms senilai runtime mode pengguna). Preemption dapat membantu aplikasi terikat I / O membutuhkan lebih sedikit kuanta untuk menyelesaikannya. Kernel lain (misalnya Linux) dapat dengan benar mengukur kuanta parsial dalam proses runtime, tetapi Windows tidak bisa.
Andon M. Coleman
@ AndonM.Coleman Pada Vista dan kemudian, ya, itu bisa dan tidak.
Jamie Hanrahan
@JamieHanrahan: Ya, Anda selalu bisa menelepon timeBeginPeriod (...), yang sudah dilakukan oleh apa pun yang interaktif. Sebuah permainan biasanya akan mengatur ini ke 1 ketika mulai, dan itu berlaku interval penjadwalan 1 ms di seluruh papan untuk semua yang berjalan pada sistem. Itu tidak terisolasi hanya dengan proses yang melakukannya. Itu bagian dari alasan sulit untuk menganggap Windows serius untuk multi-tasking.
Andon M. Coleman