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_timeout
cho 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.
- Một hàm trong Kernel
- Chúng được định nghĩa trong
<linux/poll.h>
. poll
là một triển khai lần đầu tiên nhìn thấy trong System V, select
là 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.
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_me
tranh 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ý.
- Một tác vụ có thể là Quá trình 3 hoặc Chủ đề 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
- 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.
- 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ì.