GNOMEシステムモニターの[プロセス]タブには、[待機チャネル]列があります。ここで最も一般的な値はpoll_schedule_timeoutですが、他の値も表示されます:0、do_exit、do_wait、futex_wait_queue_me、pipe_wait、__ skb_recv_datagram、unix_stream_data_wait。
では、この「待機チャネル」列はどういう意味ですか?そして、おそらくその中のそれらの値のいくつかはどういう意味ですか?
The waiting channel is the place in the Kernel where the task is currently waiting. A task has to wait for a Resource, which can be data or processing time. These two include network sockets, hardware, files, and so on; since most of them are just files, in Unix-like systems.
0
: The process isn't waiting
poll_schedule_timeout
poll()
is a system call1 used to handle I/O. It's similar to select()
.2
Applications that use non-blocking I/O use these calls to see if they can read from or write to a file, withouth having to block it. They are often used for input/output streams, which may not be blocked (otherwise, perhaps your mouse would stop to move).
The waiting channel poll_schedule_timeout
indicates that a task is waiting for I/O, either hardware like keyboards and mice, sound devices or even network sockets.
<linux/poll.h>
. poll
was an implementation first seen in System V, select
is the BSD UNIX equivalent. futex_wait_queue_me
:
To explain this, we have to look at Locks. A lock is a saved state in the system that indicates that a task works with a resource. There can be, for example, only one task that reads a file. This task would lock the file, any other task1 that tries to read the file would know it's locked, and wait for the lock to go away, before it can access it. The same thing happens for processor time.
Modern version of Linux (on most architectures) use a Futex (fast userspace mutex) lock in the kernel. Mutex, mutual exclusion, refers to the idea that a common resource can only be accessed by one task at any time. For this, flags in the system are set.
If a process is waiting for a locked resource, this is called Busy Waiting or "Spinning", refering to the fact that it tries to access it over and over, until it can. A task is said to be blocked when it spins.
Futex locks can be thought of as a number in userspace, that can be incremented or decremented by a task (in cases where the resource can be accessed by multiple tasks, this number can become greater than one). This is the number shown in the diagram4.
These tasks enqueue themselves in the wait queue, a simple queue of tasks that need to do some work, once processing time is available, the tasks do their work and are removed from the queue.
futex_wait_queue_me
enqueues a tasks. It then waits for a signal, a time out or a wakeup. Task that are in this waiting channel are waiting not on the wait queue, they are waiting to be enqueued.
__skb_recv_datagram
Wait for some data on a locked network socket.
sk_wait_data
Wait for some data on a network socket.
do_exit
これは、プロセスを終了する最後の部分です。nextをdo_exit()
呼び出して、schedule()
別のプロセスをスケジュールします。ときdo_exit()
に呼び出され、プロセスがありますZOMBIE
。
do_wait
プロセスがスケジューラの待機キューに追加されます。
pipe_wait
、 unix_stream_data_wait
プロセスはサブプロセスからのデータを待機しています。これは、たとえば、次の種類のコードを実行したときに発生します。
echo | sleep 10 && echo hallo # pipe
または
cat < hello.c # unix data stream
hrtimer_nanosleep
hrtimer_nanosleep()
メソッドを使用して、プロセスはスリープ状態です。この方法は、プログラムがナノ秒の精度で特定の時間間隔でスリープするために使用できます。
これらがすべてではありませんが、私は他のものを観察しませんでした。私が何かを逃した場合はコメントを投稿してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加