Các kênh chờ đợi của người khác là gì?


36

Trong tab Quy trình của Trình giám sát hệ thống Gnome có cột "Kênh chờ". Cho đến nay, các giá trị phổ biến nhất tôi thấy ở đây là poll_schedule_timeout , nhưng tôi cũng thấy các giá trị khác: 0 , do_exit , do_wait , futex_wait_queue_me , pipe_wait , __skb_recv_datagramunix_stream_data_wait .

Vậy cột "Kênh chờ" này có ý nghĩa gì? Và có lẽ một số giá trị trong đó có nghĩa là gì?

Ảnh chụp màn hình

Câu trả lời:


42

Kênh chờ là nơi trong Kernel nơi tác vụ hiện đang chờ. Một tác vụ phải chờ Tài nguyên, có thể là dữ liệu hoặc thời gian xử lý. Hai cái này bao gồm ổ cắm mạng, phần cứng, tập tin, v.v. vì hầu hết chúng chỉ là các tệp, trong các hệ thống giống Unix.

  • 0: Quá trình không chờ đợi

  • poll_schedule_timeout

    poll()là một cuộc gọi hệ thống 1 được sử dụng để xử lý I / O. Nó tương tự như select(). 2

    Các ứng dụng sử dụng I / O không chặn sử dụng các cuộc gọi này để xem liệu chúng có thể đọc hoặc ghi vào tệp hay không, ngoài ra phải chặn nó. Chúng thường được sử dụng cho các luồng đầu vào / đầu ra, có thể không bị chặn (nếu không, có lẽ chuột của bạn sẽ dừng để di chuyển).

    Kênh chờ poll_schedule_timeoutcho biết rằng một tác vụ đang chờ I / O, có thể là phần cứng như bàn phím và chuột, thiết bị âm thanh hoặc thậm chí là ổ cắm mạng.

    1. Một hàm trong Kernel
    2. Chúng được định nghĩa trong <linux/poll.h>. polllà một triển khai lần đầu tiên nhìn thấy trong System V, selectlà tương đương BSD UNIX.
  • futex_wait_queue_me:

    Để giải thích điều này, chúng ta phải xem xét Khóa. Khóa là một trạng thái được lưu trong hệ thống chỉ ra rằng một tác vụ hoạt động với tài nguyên. Chẳng hạn, chỉ có một tác vụ đọc một tập tin. Tác vụ này sẽ khóa tệp, mọi tác vụ 1 khác cố đọc tệp sẽ biết nó bị khóa và đợi khóa biến mất, trước khi có thể truy cập tệp. Điều tương tự xảy ra cho thời gian xử lý.

    Phiên bản hiện đại của Linux (trên hầu hết các kiến ​​trúc) sử dụng khóa Futex (mutex không gian người dùng nhanh) trong kernel. Mutex, loại trừ lẫn nhau, đề cập đến ý tưởng rằng một tài nguyên chung chỉ có thể được truy cập bởi một nhiệm vụ bất cứ lúc nào. Đối với điều này, cờ trong hệ thống được thiết lập.

    Nếu một quá trình đang chờ tài nguyên bị khóa, thì điều này được gọi là Chờ bận hoặc "Quay", đề cập đến thực tế là nó cố gắng truy cập nó nhiều lần, cho đến khi có thể. Một tác vụ được cho là bị chặn khi nó quay.

    Nếu bạn có thể đọc điều này, bạn có nghĩa vụ phải sửa ít nhất một lỗi trong câu trả lời này: P

    Khóa Futex có thể được coi là một số trong không gian người dùng, có thể tăng hoặc giảm bởi một tác vụ (trong trường hợp tài nguyên có thể được truy cập bởi nhiều tác vụ, số này có thể lớn hơn một). Đây là con số hiển thị trong sơ đồ 4 .

    Các tác vụ này tự xử lý trong hàng đợi , một hàng nhiệm vụ đơn giản cần thực hiện một số công việc, khi thời gian xử lý có sẵn, các tác vụ sẽ thực hiện công việc của chúng và được xóa khỏi hàng đợi.

    futex_wait_queue_metranh thủ một nhiệm vụ. Sau đó nó chờ đợi một tín hiệu, hết thời gian hoặc thức dậy. Nhiệm vụ trong kênh chờ này đang chờ không nằm trong hàng chờ, họ đang chờ để được xử lý.


    1. Một tác vụ có thể là Quá trình 3 hoặc Chủ đề 2
    2. Một chủ đề là một phần phụ của một quá trình. Nhiều luồng có thể chạy song song
    3. Một tiến trình là một chương trình toàn diện, nó bao gồm một hoặc nhiều luồng, mặc dù một chương trình có thể bao gồm nhiều tiến trình.
    4. Hãy nhớ rằng, đây vẫn là một cái nhìn rất cao về mọi thứ, nó không xem xét các chi tiết thực hiện
  • __skb_recv_datagram

    Đợi một số dữ liệu trên một ổ cắm mạng bị khóa.

  • sk_wait_data

    Đợi một số dữ liệu trên một ổ cắm mạng.

  • do_exit

    Đây là phần cuối cùng của việc bỏ một quá trình. do_exit()gọi schedule()tiếp theo, để sắp xếp một quá trình khác. Khi do_exit()được gọi, quá trình là a ZOMBIE.

  • do_wait

    Một quy trình được thêm vào hàng đợi lên lịch.

  • pipe_wait, unix_stream_data_wait

    Một quy trình đang chờ dữ liệu từ một quy trình con. Điều này xảy ra, ví dụ, khi bạn chạy loại mã này:

    echo | sleep 10 && echo hallo              # pipe
    

    hoặc là

    cat < hello.c                              # unix data stream
    
  • hrtimer_nanosleep

    Quá trình đang ngủ, sử dụng hrtimer_nanosleep()phương pháp. Phương pháp này có thể được sử dụng cho một chương trình để ngủ trong những khoảng thời gian cụ thể, với độ chính xác đến nano giây.

Đây không phải là tất cả, nhưng tôi đã không quan sát bất kỳ người khác. Gửi bình luận nếu tôi bỏ lỡ bất cứ điều gì.


Tôi đã đi qua ngủ_on_page_killable?
Ông Axilus

Nguyên nhân rất có thể gây ra cho ngủ_on_page_killable là quá trình đang cố tải một trang không có trong bộ nhớ, do đó nó gây ra lỗi trang và quá trình này phải được chuyển sang chế độ ngủ cho đến khi trang được tải. Nếu hệ thống con I / O bị quá tải (có thể do bạn đang thực hiện nhiều I / O), điều này có thể xuất hiện thường xuyên.
tsuna

những gì về signal? Tôi đã chạy vào đó. Là quá trình chết? thây ma? hay cái gì? Điều gì sẽ xảy ra với quá trình?
itnotmyrealname

11

Giá trị kênh chờ là tên của hàm kernel trong đó quá trình hiện đang bị chặn.

Tên thường liên quan đến một cuộc gọi hệ thống, sẽ có một trang thủ công.

  • futex_wait_queue_me có liên quan đến futex . Nó đề cập đến một loại khóa mutex (loại trừ lẫn nhau trong không gian người dùng nhanh) được sử dụng để lên lịch cho nhiều quy trình hoạt động trên một bộ xử lý. Trạng thái chỉ ra rằng quy trình của bạn được yêu cầu để nhận được khóa. 2
  • do_wait có liên quan đến chờ đợi .
  • v.v.

Nếu bạn thực sự muốn biết thêm thông tin chi tiết, bạn có thể kiểm tra nguồn kernel .

Nếu bạn nhập cat /proc/some_pid/stackvào một thiết bị đầu cuối, bạn sẽ nhận được một số đầu ra như thế:

[<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

Và trên dòng đầu tiên bạn có được những gì hiển thị trên màn hình hệ thống. Theo như tôi biết, poll_schedule_timeout chỉ ra rằng quá trình của bạn đang chờ đợi điều gì đó.

Nó liên quan đến I / O không đồng bộbỏ phiếu .

Nguồn (s): 1. kênh chờ quá trình (WCHAN) và báo động? - 2. AskUbuntu câu trả lời



Có vẻ như bạn nhận thấy tôi đã sử dụng lại câu trả lời của bạn để cải thiện câu trả lời đó ;-) Bạn muốn có loại thuộc tính nào?
Maxime R.

2
Nhận xét của bạn là quá đủ để giữ cho tôi hạnh phúc :) Nếu bạn muốn tìm hiểu về cách phân bổ hoạt động, có một bài đăng blog SO đẹp về chủ đề này. Đừng lo lắng quá nhiều về điều đó, tôi muốn mọi người sử dụng lại công việc của tôi nhiều nhất có thể.
Stefano Palazzo

1
Chà, tôi chỉ đang viết một câu hỏi về chủ đề này trên meta. (đã đọc bài đăng trên blog)
Maxime R.

đây rồi . Và tôi cá rằng câu trả lời của bạn sẽ kết thúc với tôi vào một lúc nào đó ^^
Maxime R.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.