2009-07-03 68 views
16

Chỉ tò mò thôi. Thực tế chức năng Sleep() hoạt động như thế nào (được khai báo trong windows.h)? Có lẽ không chỉ việc thực hiện đó, mà là bất cứ ai. Với điều đó tôi có nghĩa là - nó được thực hiện như thế nào? Làm thế nào nó có thể làm cho mã "dừng" trong một thời gian cụ thể? Ngoài ra tò mò về cách cin >> và những người thực sự làm việc. Họ làm gì chính xác? Cách duy nhất tôi biết làm thế nào để "chặn" một cái gì đó từ tiếp tục chạy là với một vòng lặp while, nhưng xem xét rằng phải mất một lượng lớn sức mạnh xử lý so với những gì đang xảy ra khi bạn đang gọi phương thức để đọc từ stdin (chỉ cần so sánh một thời gian (đúng) với một đọc từ stdin), tôi đoán đó không phải là những gì họ làm.C++ - Sleep() và cin hoạt động như thế nào?

Trả lời

27

Hệ điều hành sử dụng cơ chế được gọi là bộ lập lịch để giữ tất cả các luồng hoặc quy trình mà quản lý hoạt động tốt với nhau.

vài lần mỗi giây, đồng hồ phần cứng của máy tính ngắt CPU, điều này làm cho trình lên lịch của hệ điều hành được kích hoạt. Sau đó, trình lên lịch sẽ xem xét tất cả các quy trình đang cố gắng chạy và quyết định cái nào được chạy cho lát thời gian tiếp theo.

Những thứ khác nhau mà nó sử dụng để quyết định phụ thuộc vào từng quy trình, và thời gian trước đó. Vì vậy, nếu quá trình hiện tại đang sử dụng CPU nhiều, ngăn cản các tiến trình khác thực hiện tiến trình, nó sẽ làm cho quá trình hiện tại chờ và hoán đổi trong một tiến trình khác để nó có thể thực hiện một số công việc.

Thông thường, hầu hết các quy trình sẽ ở trạng thái đợi. Ví dụ, nếu một quá trình đang chờ đợi đầu vào từ bàn điều khiển, hệ điều hành có thể xem xét các thông tin quy trình và xem cổng io nào đang đợi. Nó có thể kiểm tra các cổng đó để xem chúng có bất kỳ dữ liệu nào cho quá trình làm việc hay không. Nếu họ làm, nó có thể bắt đầu quá trình lên một lần nữa, nhưng nếu không có dữ liệu, sau đó quá trình đó được bỏ qua cho thời gian hiện tại.

như đối với sleep(), bất kỳ quá trình nào cũng có thể thông báo cho hệ điều hành mà bạn muốn đợi trong một thời gian. Trình lên lịch sau đó sẽ được kích hoạt ngay cả trước khi ngắt phần cứng (cũng là điều xảy ra khi quá trình cố gắng thực hiện chặn đọc từ luồng không có sẵn dữ liệu để đọc) và hệ điều hành ghi lại quá trình đang chờ. Đối với một giấc ngủ, quá trình này đang chờ đợi một báo động để đi tắt, hoặc nó chỉ có thể mang lại một lần nữa mỗi khi nó khởi động lại cho đến khi bộ đếm thời gian được lên.

Vì hệ điều hành chỉ tiếp tục quy trình sau khi điều gì đó làm cho nó bị chặn trước một quá trình đang chạy, chẳng hạn như quá trình sinh hoặc gián đoạn phần cứng gián đoạn tôi đã đề cập, sleep() không chính xác, chính xác như thế nào phụ thuộc vào hệ điều hành hoặc phần cứng. thường vào thứ tự của một hoặc nhiều mili giây.

Nếu cần có độ chính xác cao hơn hoặc chờ đợi rất ngắn, tùy chọn duy nhất là sử dụng cấu trúc vòng lặp bận mà bạn đã đề cập.

+0

Câu trả lời hay. +1 – WolfmanDragon

3

Hệ điều hành lập lịch trình các quy trình chạy (các quy trình nào đủ điều kiện để chạy, theo thứ tự, ...). Sleep() có thể phát ra lời gọi hệ thống cho nhân "không cho phép tôi sử dụng bộ xử lý cho x mili giây".

+0

Rất tò mò. Làm thế nào để bạn thực hiện cuộc gọi như vậy cho mình? Nếu bạn không thể trên cửa sổ vì thực hiện ẩn, có thể là một ví dụ linux? – quano

+0

GNU/Linux tuân theo các cuộc gọi hệ thống Posix. Các cuộc gọi hệ thống Posix được chỉ định là các hàm C, nhưng nói chung chúng chỉ là một trình bao bọc xung quanh cuộc gọi hệ thống cơ bản. Nếu bạn có một cái nhìn tại /usr/include/asm/unistd_32.h, bạn sẽ thấy rằng có lời gọi hệ thống cho nanosleep(). Đó là khá có thể xảy ra rằng sleep() được thực hiện bằng cách gọi hệ thống này gọi. Trên Windows cũng có các cuộc gọi hệ thống, nhưng chúng không có giấy tờ nên hầu như không có lý do gì để tìm hiểu cách chúng hoạt động. –

0

Câu trả lời phụ thuộc vào hệ điều hành, nhưng nói chung, hệ điều hành hoặc lập lịch một số mã khác để chạy ở nơi khác trong chuỗi khác hoặc nếu nó không có gì để làm, nó sẽ cho CPU đợi cho đến khi sự kiện phần cứng xảy ra, làm cho CPU chuyển sang một số mã được gọi là trình xử lý ngắt, sau đó có thể quyết định mã nào sẽ chạy.

2

Tóm lại, Sleep() yêu cầu hệ điều hành bỏ qua quá trình/luồng trong một thời gian.

+0

Điều gì sẽ xảy ra nếu nó là một quá trình đa luồng? – user457015

+0

nó sẽ ảnh hưởng đến chủ đề hiện tại chỉ có –

0

Nếu bạn đang tìm cách kiểm soát chặn luồng/quy trình trong chương trình đa luồng hơn, hãy xem Semaphores, Mutexes, CriticalSections and Events. Đây là tất cả các kỹ thuật được sử dụng để chặn một quá trình hoặc luồng (mà không cần tải CPU qua một thời gian xây dựng).

Về cơ bản, chúng hoạt động trong thành phần Chờ/Tín hiệu trong đó chuỗi bị chặn đang chờ và một quá trình khác báo hiệu nó để yêu cầu nó bắt đầu lại. Những (ít nhất trong các cửa sổ) cũng có thể có thời gian chờ, do đó cung cấp một chức năng tương tự như Sleep().

+0

phiên bản thời gian chờ có sẵn trên hệ thống POSIX. – SingleNegationElimination

1

'cin' sử dụng rất nhiều toán tử quá tải. Các '>>', mà thường là đúng bit-shift, là quá tải cho khá nhiều loại toán hạng bên phải trong C + +. Một chức năng riêng biệt được cung cấp cho mỗi cái, mà đọc từ bàn điều khiển và chuyển đổi đầu vào thành bất kỳ loại biến nào bạn đã đưa ra. Ví dụ:

std::cin::operator>> (int &rhs); 

Đó không phải là C++ thực - Tôi không nhớ loại trả về hoặc thứ tự chính xác của đối số. Tuy nhiên, hàm này được gọi khi bạn chạy cin >> một biến số nguyên.

Việc triển khai cơ bản chính xác tùy thuộc vào hệ điều hành.

0

Ở mức thấp, hệ thống có một thường trình được gọi là "bộ lập lịch" gửi các hướng dẫn từ tất cả các chương trình đang chạy tới (các) CPU thực sự chạy chúng. Các cuộc gọi hệ thống như "Ngủ" và "ngủ" khớp với các hướng dẫn cho trình lập lịch biểu biết KHÓA chuỗi hoặc quá trình đó trong một khoảng thời gian cố định.

Đối với dòng C++, "cin" ẩn bộ xử lý tệp thực sự (stdin và stdout thực sự là các xử lý) bạn đang truy cập và toán tử ">>" để ẩn các cuộc gọi cơ bản để đọc và ghi. Kể từ khi một giao diện của nó thực hiện có thể được hệ điều hành cụ thể, nhưng khái niệm nó vẫn còn làm những việc như printf và scanf dưới mui xe.

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