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_timeout
menunjukkan bahwa tugas sedang menunggu I / O, baik perangkat keras seperti keyboard dan mouse, perangkat suara atau bahkan soket jaringan.
- Sebuah fungsi di Kernel
- Mereka didefinisikan dalam
<linux/poll.h>
. poll
adalah implementasi yang pertama kali terlihat di Sistem V, select
adalah 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.
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_me
membutuhkan 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.
- Tugas dapat berupa Proses 3 atau Thread 2
- Thread adalah sub-bagian dari suatu Proses. Banyak utas yang dapat berjalan paralel
- Suatu proses adalah program penuh, terdiri dari satu atau lebih utas, meskipun suatu program dapat terdiri dari beberapa proses juga.
- 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.