2008-09-22 39 views
15

Khi Mac OS X chuyển sang chế độ ngủ, do đóng máy tính xách tay hoặc chọn "Ngủ" từ menu Apple, làm thế nào để tạm dừng quá trình thực thi?Điều gì xảy ra với ứng dụng của tôi khi máy Mac của tôi chuyển sang chế độ ngủ?

Tôi cho rằng các quy trình không cửa sổ chỉ đơn giản là bị tạm dừng tại một điểm thực thi tùy ý. Điều đó cũng đúng đối với các ứng dụng Cocoa hay hệ điều hành chờ cho đến khi điều khiển quay trở lại bộ điều phối vòng lặp chạy và đi ngủ ở vị trí "đã biết"? Có bất kỳ hệ điều hành hiện đại nào làm điều đó, hoặc là nó thường an toàn, đủ để chỉ đơn giản là đình chỉ một ứng dụng không có vấn đề gì nó đang làm gì?

Tôi tò mò, bởi vì cho phép giấc ngủ xảy ra bất kỳ lúc nào, từ góc nhìn của ứng dụng, đồng hồ hệ thống đột nhiên có thể nhảy vọt lên một lượng đáng kể. Đó là một khả năng tôi không thường xem xét khi viết mã.

Trả lời

20

Ứng dụng của bạn bị gián đoạn chính xác vào thời điểm đó nếu CPU thực sự đang thực thi mã ứng dụng của bạn. Ứng dụng của bạn liên tục nhận được thời gian thực hiện bởi công cụ lập lịch tác vụ, quyết định ứng dụng nào nhận thời gian CPU, trên lõi nào và trong bao lâu. Khi hệ thống thực sự chuyển sang chế độ ngủ, trình lên lịch chỉ đơn giản là không cung cấp thời gian cho ứng dụng của bạn nữa, do đó nó sẽ dừng thực thi ở bất cứ nơi nào tại thời điểm đó, điều này có thể xảy ra ở mọi nơi. Tuy nhiên, hạt nhân phải ở trạng thái sạch. Điều đó có nghĩa là nếu bạn vừa thực hiện cuộc gọi vào hạt nhân (nhiều chức năng libC) và cuộc gọi này không ở điểm an toàn (ví dụ như ngủ, chờ điều kiện trở thành sự thật, v.v.) hoặc có thể giữ khóa hạt nhân quan trọng (ví dụ: các kênh), hạt nhân có thể tạm ngưng giấc ngủ cho đến khi cuộc gọi này quay trở lại không gian người dùng hoặc việc thực hiện đạt đến điểm an toàn trước khi nó hủy bỏ ứng dụng của bạn từ trình lập lịch tác vụ.

Bạn có thể mở cổng hạt nhân và đăng ký các sự kiện ngủ/đánh thức. Trong trường hợp đó, ứng dụng của bạn sẽ nhận được một sự kiện, khi hệ thống muốn đi ngủ. Bạn có nhiều khả năng.Một là để trả lời nó, rằng hệ thống có thể tiến triển. Một người khác là đình chỉ giấc ngủ; tuy nhiên, Apple cho biết một số sự kiện nhất định có thể bị đình chỉ tối đa 30 giây, sau đó, hệ thống sẽ tiếp tục, cho dù ứng dụng của bạn có thích hay không. Và cuối cùng, bạn có thể hủy nó; mặc dù không phải tất cả các sự kiện đều có thể bị hủy. Nếu hệ thống đã quyết định sẽ chuyển sang chế độ ngủ, bạn chỉ có thể tạm ngưng tối đa 30 giây hoặc cho phép cùng một lúc, bạn không thể hủy nó. Tuy nhiên, bạn cũng có thể nghe một sự kiện, nơi hệ thống hỏi các ứng dụng, nếu bạn có thể ngủ ngay bây giờ và ở đó bạn có thể trả lời "không", khiến giấc ngủ bị hủy.

Sự khác biệt giữa "Có ngủ được không" và "Tôi dự định đi ngủ" là: Cài đặt đầu tiên được gửi nếu cài đặt tiết kiệm điện được áp dụng, nghĩa là nếu người dùng chưa di chuyển chuột hoặc gõ bất cứ điều gì cho thời gian cấu hình ở đó. Trong trường hợp đó, hệ thống sẽ hỏi, nếu giấc ngủ không sao. Một ứng dụng như DVD Player của Apple sẽ nói "không", bởi vì nhiều khả năng người dùng xem DVD và do đó không tương tác với máy tính, vẫn không có lý do gì để đi ngủ. OTOH, nếu người dùng đóng Mac Book của mình, các ứng dụng sẽ không được hỏi, hệ thống sẽ chuyển sang chế độ ngủ chắc chắn và chỉ thông báo cho các ứng dụng, hiện có tối đa 30 giây để phản ứng với nó.

Sự kiện đánh thức cũng có thể khá thú vị để bắt. Ví dụ. nếu hệ thống của bạn tỉnh dậy, các tệp mở có thể không truy cập được (ổ đĩa ngoài đã được rút phích cắm) hoặc ổ cắm mạng sẽ không hoạt động nữa (mạng đã thay đổi). Vì vậy, bạn có thể khởi động lại một số phần ứng dụng nhất định trước khi sử dụng chúng và chạy vào các lỗi ít nhiều được mong đợi.

Apple's page regarding catching these events.

1

Tôi tin rằng nó sẽ chỉ tạm dừng tất cả các ứng dụng ở bất cứ đâu.

Hãy nhớ rằng, điều này xảy ra mọi lúc. Các ứng dụng liên tục bị tạm ngưng và tiếp tục do chuyển đổi ngữ cảnh. Vì vậy, thực sự, đồng hồ có thể chuyển đổi giữa 2 hướng dẫn trong ứng dụng của bạn, mặc dù thường không theo cách đáng chú ý/đáng kể.

Nếu hệ điều hành chờ ứng dụng quay trở lại một số vòng lặp chính, bạn có thể gặp phải tình huống mà các ứng dụng khiến giấc ngủ bị treo. Nếu họ đang làm rất nhiều công việc và không quay trở lại điều phối vòng lặp chạy thì họ sẽ ngăn máy ngủ. Điều đó sẽ không tốt lắm. :)

+0

Nhưng nó sẽ không phải là chưa từng có cho hệ điều hành để yêu cầu ứng dụng đình chỉ bản thân, sau đó buộc nó nếu nó không trong một khoảng thời gian nhất định. Vì vậy, công dân tốt được phép làm sạch và công dân xấu không được phép gây rắc rối. – benzado

0

Và nếu bạn đặt thời gian, nó cũng xuất hiện để nhảy tới các chương trình đang chạy. Không có gì đặc biệt.

3

Tùy thuộc vào ứng dụng của bạn.
Nếu bạn đang tương tác với các hệ thống bên ngoài (nghĩ mạng hoặc làm điều gì đó qua usb/firewire, vv) thì nó có thể bị ảnh hưởng. Một ứng dụng chạy trên OSX được chạy trong một thời gian giới hạn (tối đa 10ms), sau đó nó bị gián đoạn bởi hạt nhân lập lịch trình một tiến trình mới từ hàng đợi xử lý để chạy trên CPU. Điều này là minh bạch cho ứng dụng, mà "nghĩ" rằng nó chạy tất cả thời gian trên CPU. Do đó, sự chuyển tiếp sang giấc ngủ không khác biệt - ngoài thời gian nhảy lên phía trước.
Nếu bạn cần phải nhận thức rằng có một chuyển đổi sang chế độ ngủ vui lòng tham khảo lưu ý công nghệ này định chi tiết làm thế nào để nhận được thông báo về sự thay đổi trạng thái: Registering and unregistering for sleep and wake notifications

0

Check-out Wikipedia này article. Cavver là chính xác trong việc nói rằng những thứ như kết nối mạng có thể thời gian ra, và do đó những dịch vụ có thể bị gián đoạn.

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