2009-12-07 35 views
19

Hãy sửa tôi nếu tôi sai. Dưới đây là hiểu biết của tôi về tín hiệu:Làm thế nào để một quy trình biết rằng nó đã nhận được tín hiệu

Theo như tôi biết, tạo tín hiệu và gửi tín hiệu là 2 khác nhau điều. Để tạo ra một tín hiệu, hệ điều hành chỉ đơn giản là đặt một chút trong một bitarray được duy trì trong Quy trình kiểm soát Khối (PCB) của quy trình. Mỗi bit tương ứng với một tín hiệu cụ thể, và khi bit được đặt, điều đó có nghĩa là tín hiệu tương ứng với bit là đang chờ xử lý.

Phân phối: Trước khi chuyển quyền kiểm soát quay lại quy trình trong chế độ người dùng, hạt nhân luôn kiểm tra tín hiệu đang chờ xử lý cho quá trình này. Kiểm tra này phải xảy ra trong không gian hạt nhân vì một số tín hiệu không bao giờ có thể bị bỏ qua bởi một quá trình - cụ thể là SIGSTOP và SIGKILL.

Vậy điều này có nghĩa là các tín hiệu chỉ có thể được gửi đến một quá trình khi hạt nhân đang lên lịch cho quá trình đó, tức là cấp phát CPU của nó? Một quá trình có thể nhận được một tín hiệu khi nó thực sự thực hiện trên CPU? Nếu vậy, làm thế nào là nó có thể tức là làm thế nào quá trình đến để biết rằng một tín hiệu đang chờ xử lý cho nó (vì nó đang thực hiện trong chế độ người dùng và không thể truy cập PCB)

Nói rằng có nhiều bộ xử lý máy và vì vậy có thật song song tức là nhiều quá trình đang thực hiện cùng một lúc. Quy trình P1 đang thực hiện trên cpu 1 và quá trình P2 đang thực thi trên cpu2 và bây giờ quá trình P2 (có đủ đặc quyền) gửi một tín hiệu để xử lý P1. Liệu tín hiệu này có được chuyển tới P1 ngay bây giờ hay không sẽ được phân phối sau khi P1 từ bỏ CPU vì một lý do nào đó và được nhân lại sau một thời gian sau đó và sau đó tín hiệu này được phân phối để xử lý P1.

Vui lòng không nói câu hỏi này phụ thuộc vào việc triển khai. Nếu bạn thấy rằng câu trả lời đúng là thực hiện được xác định sau đó tôi đang tìm kiếm câu trả lời trong Linux, FreeBSD hoặc bất kỳ nền tảng * nix mà bạn có kiến ​​thức về.

Cảm ơn rất nhiều sự giúp đỡ và sự kiên nhẫn của bạn :)

Trân

lali

Trả lời

12

Câu trả lời là thực hiện :) phụ thuộc. Trên Mac OS X (và FreeBSD), các tín hiệu được xử lý không đồng bộ - hạt nhân tìm thấy một luồng không chặn tín hiệu và đặt cờ Trap Hệ thống Không đồng bộ trên chuỗi đó. Lần kế tiếp hạt nhân lên lịch luồng đó, nó xử lý bẫy (bỏ quá trình, bỏ qua bẫy, hoặc gọi trình xử lý tín hiệu trong không gian người dùng khi thích hợp) thay vì sắp xếp việc tiếp tục luồng thông thường trong không gian người dùng.

Trên Solaris, việc triển khai có phần tương tự, mặc dù nó cũng cung cấp tín hiệu đồng bộ dựa trên bẫy phần cứng - tín hiệu đồng bộ được gửi tới luồng nâng bẫy, trong khi tín hiệu không đồng bộ hoạt động theo cách được mô tả ở trên.

Linux does something similar để Solaris (Tôi không chắc chắn kết luận trong tham chiếu đó sau từ cuộc thảo luận như thế nào, nhưng đó là cuộc thảo luận hữu ích).

Posix.4 cũng xác định tín hiệu thời gian thực, nhưng tôi chưa làm việc với những tín hiệu đó.

+0

Điều này có nghĩa là tín hiệu chỉ được gửi khi quá trình đó được lên lịch? Điều gì xảy ra nếu quá trình này là CPU chuyên sâu và hiện đang chạy trên cpu1 của một máy có 2 CPU và lập kế hoạch không phải là năm đầu tiên, vì vậy quá trình sẽ không nhận được bất kỳ tín hiệu nào ngay cả khi quá trình chạy trên cpu2 gửi cho nó một tín hiệu (như quá trình trên cpu1 không bao giờ từ bỏ cpu1)? Là nó ? – ghayalcoder

+0

@Graham: Tại sao quá trình # 2 không bao giờ chạy trên máy 2+ lõi? – SiegeX

+0

Xin lỗi @SiegeX, bạn đã chính xác, vì vậy tôi đã xóa nhận xét của mình. Tôi bối rối khi cố gắng phân tích câu của Iali. –

3

Câu trả lời ngắn gọn là - có, quá trình nhận kiến ​​thức về tín hiệu chỉ trên CPU được lập lịch tiếp theo.

Cách biết quy trình đã nhận được tín hiệu - nó có thể gọi sigprocmask (2).

0

Quy trình P1 đang thực thi trên cpu 1 và quá trình P2 đang thực thi trên cpu2 và hiện tại quá trình P2 (có đủ đặc quyền) gửi tín hiệu để xử lý P1. Liệu tín hiệu này có được chuyển tới P1 ngay bây giờ hay không sẽ được phân phối sau khi P1 từ bỏ CPU vì một lý do nào đó và được nhân lại sau một thời gian sau đó và sau đó tín hiệu này được phân phối để xử lý P1.

Theo như tôi biết về việc thực hiện hạt nhân cuối cùng của P1 có thể bị tạm dừng khi tín hiệu phát ra P2 và tín hiệu sẽ được gửi ngay lập tức. Có thể điều này chỉ đúng với tín hiệu thời gian thực

0

Nếu tôi nhớ chính xác, bit đến ngắt được kiểm tra trong trạng thái T cuối cùng của lệnh 8085. Vì vậy, phải có một cách để tạo ra một ngắt thực sự khi đến tín hiệu, hoặc phải có một lát mã (hằng số?) Trước khi bit tín hiệu được kiểm tra.

Thật không may, có vẻ như cách duy nhất để trả lời một số câu hỏi liên quan đến hành vi hạt nhân là đi qua mã nguồn, vì chúng quá "phụ thuộc thực hiện". Lập trình máy tính thực sự là không có gì ngắn của quấy rối - những gì một nghề để lựa chọn!

Chỉ cần cố gắng hoàn hảo và hy vọng trang web này sẽ hữu ích.

Các vấn đề liên quan