Tôi hiện đang nghiên cứu về lịch trình của Linux như thế nào. Về mối quan hệ cốt lõi của CPU, tôi muốn biết những điều sau đây:Mỗi quá trình được gắn vào một lõi cụ thể bằng cách lên lịch (Linux)
1) Mỗi quy trình (luồng) được gắn vào lõi như thế nào?
có một hệ thống gọi sched_setaffinity
để thay đổi mối quan hệ cốt lõi mà trên đó một quá trình được thực hiện. Nhưng trong nội bộ, khi một tiến trình (hoặc một luồng) được tạo ra, thì trình lên lịch Linux mặc định gán quy trình (luồng) cho một lõi cụ thể như thế nào? Tôi đã sửa đổi sched_setaffinity
cuộc gọi hệ thống để kết xuất thông tin về nhiệm vụ đang được chuyển từ lõi này sang lõi khác.
printk(KERN_INFO "%d %d %ld %lu %s\n", current->pid, current->tgid,
current->state, current->cpus_allowed,
current->comm);
Dường như không có thông tin trên ở đây trong /var/log/messages
. Vì vậy, trình lên lịch mặc định ghim từng quy trình theo một cách khác, nhưng tôi không thể tìm ra cách.
2) Có thể lấy ID lõi của PID hoặc thông tin khác không?
Đây là những gì tôi muốn triển khai bên trong nhân Linux. Trong số task_struct
, có một thành viên được gọi là cpus_allowed
. Nhưng đây là mặt nạ để đặt mối quan hệ chứ không phải ID lõi. Tôi muốn lấy một dữ liệu xác định lõi mà quy trình được chỉ định đang chạy.
Cảm ơn,
Cảm ơn bạn đã trả lời của bạn. Nhưng điều này khác với những gì tôi muốn. Tôi đã tự hỏi nếu mô tả của tôi là gây hiểu lầm ... Trước hết, tôi không sử dụng lệnh gọi hệ thống 'sched_setaffinity' (không phải sched_set_affinity nhưng sched_setaffinity) vì tôi không tạo một ứng dụng đang chạy trong không gian người dùng. – akry
Thứ hai, trường 'cpus_allowed' (không phải cpu_allowed) không đủ thông tin để xác định lõi CPU mà quá trình đang chạy. cpus_allowed được đặt là 1 theo mặc định để quá trình có khả năng di chuyển tất cả các lõi có sẵn. Nếu có bất kỳ trường/phương thức nào nói cho vị trí nơi tiến trình đang chạy, đây là điều tôi thực sự muốn biết. – akry
Dù sao, cảm ơn bạn đã trả lời câu hỏi của tôi. – akry