Apakah "Saluran Tunggu" dari suatu proses?

36

Di tab Proses Monitor Sistem GNOME ada kolom "Saluran Tunggu". Sejauh ini nilai-nilai paling umum yang saya lihat di sini adalah poll_schedule_timeout , tetapi saya juga melihat nilai-nilai lain: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagram dan unix_stream_data_wait .

Jadi, apa artinya kolom "Saluran Tunggu" ini? Dan mungkin apa arti beberapa nilai di dalamnya?

Tangkapan layar

8128
sumber

Jawaban:

42

Saluran tunggu adalah tempat di Kernel tempat tugas sedang menunggu. Tugas harus menunggu Sumber, yang dapat berupa data atau waktu pemrosesan. Keduanya termasuk soket jaringan, perangkat keras, file, dan sebagainya; karena kebanyakan dari mereka hanya file, di sistem seperti Unix.

  • 0: Proses tidak menunggu

  • poll_schedule_timeout

    poll()adalah system call 1 yang digunakan untuk menangani I / O. Ini mirip dengan select(). 2

    Aplikasi yang menggunakan I / O non-pemblokiran menggunakan panggilan ini untuk melihat apakah mereka dapat membaca dari atau menulis ke file, tanpa harus memblokirnya. Mereka sering digunakan untuk stream input / output, yang mungkin tidak diblokir (jika tidak, mungkin mouse Anda akan berhenti bergerak).

    Saluran tunggu poll_schedule_timeoutmenunjukkan bahwa tugas sedang menunggu I / O, baik perangkat keras seperti keyboard dan mouse, perangkat suara atau bahkan soket jaringan.

    1. Sebuah fungsi di Kernel
    2. Mereka didefinisikan dalam <linux/poll.h>. polladalah implementasi yang pertama kali terlihat di Sistem V, selectadalah setara BSD UNIX.
  • futex_wait_queue_me:

    Untuk menjelaskan ini, kita harus melihat Kunci. Kunci adalah keadaan tersimpan dalam sistem yang menunjukkan bahwa tugas bekerja dengan sumber daya. Misalnya, hanya ada satu tugas yang membaca file. Tugas ini akan mengunci file, tugas lain 1 yang mencoba untuk membaca file akan tahu itu terkunci, dan menunggu kunci untuk pergi, sebelum dapat mengaksesnya. Hal yang sama terjadi pada waktu prosesor.

    Versi modern Linux (pada sebagian besar arsitektur) menggunakan kunci Futex (fast userspace mutex) di kernel. Mutex, pengecualian bersama, mengacu pada gagasan bahwa sumber daya bersama hanya dapat diakses oleh satu tugas setiap saat. Untuk ini, bendera dalam sistem diatur.

    Jika suatu proses sedang menunggu sumber daya yang dikunci, ini disebut Sibuk Menunggu atau "Berputar", merujuk pada fakta bahwa ia mencoba mengaksesnya berulang-ulang, hingga dapat. Suatu tugas dikatakan diblokir ketika berputar.

    Jika Anda dapat membaca ini, Anda berkewajiban untuk memperbaiki setidaknya satu kesalahan dalam jawaban ini: P

    Kunci Futex dapat dianggap sebagai angka di userspace, yang dapat ditambahkan atau dikurangi dengan tugas (dalam kasus di mana sumber daya dapat diakses oleh beberapa tugas, angka ini bisa menjadi lebih besar dari satu). Ini adalah angka yang ditunjukkan pada diagram 4 .

    Tugas-tugas ini enqueue sendiri dalam antrian menunggu , antrian sederhana dari tugas-tugas yang perlu melakukan beberapa pekerjaan, setelah waktu pemrosesan tersedia, tugas-tugas melakukan pekerjaan mereka dan dihapus dari antrian.

    futex_wait_queue_memembutuhkan tugas. Kemudian menunggu sinyal, waktu istirahat atau bangun. Tugas yang ada di saluran tunggu ini menunggu bukan pada antrian tunggu, mereka menunggu untuk di enqueued.


    1. Tugas dapat berupa Proses 3 atau Thread 2
    2. Thread adalah sub-bagian dari suatu Proses. Banyak utas yang dapat berjalan paralel
    3. Suatu proses adalah program penuh, terdiri dari satu atau lebih utas, meskipun suatu program dapat terdiri dari beberapa proses juga.
    4. Ingat, ini masih merupakan pandangan tingkat yang sangat tinggi, itu tidak mempertimbangkan detail implementasi
  • __skb_recv_datagram

    Tunggu beberapa data pada soket jaringan yang terkunci.

  • sk_wait_data

    Tunggu beberapa data pada soket jaringan.

  • do_exit

    Ini adalah bagian terakhir dari proses berhenti. do_exit()panggilan schedule()selanjutnya, untuk menjadwalkan proses lain. Ketika do_exit()dipanggil, prosesnya adalah a ZOMBIE.

  • do_wait

    Sebuah proses ditambahkan ke antrian tunggu penjadwal.

  • pipe_wait, unix_stream_data_wait

    Suatu Proses sedang menunggu data dari suatu subproses. Ini terjadi, misalnya, ketika Anda menjalankan kode semacam ini:

    echo | sleep 10 && echo hallo              # pipe
    

    atau

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    Prosesnya adalah tidur, menggunakan hrtimer_nanosleep()metode. Metode ini dapat digunakan untuk program tidur selama interval waktu tertentu, dengan akurasi nanodetik.

Ini tidak semua, tapi saya tidak mengamati yang lain. Poskan komentar jika saya melewatkan sesuatu.

Stefano Palazzo
sumber
Saya menemukan sleep_on_page_killable?
Emmanuel M. Smith
Penyebab yang paling mungkin untuk sleep_on_page_killable adalah proses mencoba memuat halaman yang tidak ada dalam memori, sehingga menyebabkan kesalahan halaman, dan proses itu harus ditidurkan sampai halaman dimuat. Jika subsistem I / O kelebihan beban (mungkin karena Anda melakukan banyak I / O) ini bisa sering muncul.
tsuna
bagaimana signal? Saya sudah mengalami itu. Apakah prosesnya mati? zombie? atau apa? apa yang akan terjadi pada prosesnya?
itsnotmyrealname
11

Nilai saluran tunggu adalah nama fungsi kernel di mana proses saat ini diblokir.

Nama ini biasanya terkait dengan panggilan sistem, yang akan memiliki halaman manual.

  • futex_wait_queue_me terkait dengan futex . Ini mengacu pada jenis kunci mutex (pengecualian saling pengguna yang cepat) yang digunakan untuk menjadwalkan banyak proses bekerja pada satu prosesor. Negara menunjukkan bahwa proses Anda enqueued untuk menerima kunci. 2
  • do_wait terkait dengan menunggu .
  • dll.

Jika Anda benar-benar menginginkan informasi lebih rinci, Anda dapat memeriksa sumber kernel .

Jika Anda mengetikkan cat /proc/some_pid/stackterminal Anda akan mendapatkan beberapa output seperti itu:

[<c0227f4e>] poll_schedule_timeout+0x3e/0x60
[<c022879f>] do_select+0x55f/0x670
[<c0228f40>] core_sys_select+0x140/0x240
[<c0229241>] sys_select+0x31/0xc0
[<c05c9cc4>] syscall_call+0x7/0xb
[<ffffffff>] 0xffffffff

Dan pada baris pertama Anda mendapatkan apa yang ditampilkan pada monitor sistem. Sejauh yang saya tahu, poll_schedule_timeout menunjukkan bahwa proses Anda sedang menunggu sesuatu.

Ini berkaitan dengan I / O dan polling asynchronous .

Sumber: 1. saluran tunggu proses (WCHAN) dan alarm? - 2. AskUbuntu menjawab

Maxime R.
sumber
Ulangi itu. : P
Stefano Palazzo
Sepertinya Anda perhatikan, saya menggunakan kembali jawaban Anda untuk meningkatkan yang itu ;-) Atribusi seperti apa yang ingin Anda miliki?
Maxime R.
2
Komentar Anda lebih dari cukup untuk membuat saya senang :) Jika Anda ingin belajar tentang cara kerja atribusi, ada posting blog SO yang bagus pada subjek. Tapi jangan terlalu khawatir tentang itu, saya ingin orang-orang menggunakan kembali karya saya sebanyak mungkin.
Stefano Palazzo
1
Yah, saya baru saja menulis pertanyaan tentang topik ini pada meta. (sudah membaca posting blog)
Maxime R.
Itu disini . Dan saya yakin jawaban Anda akan berakhir pada saya di beberapa titik ^^
Maxime R.