Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Rutyna czasomierza systemowego zwykle umożliwia wywołującym określenie bezwzględnego lub względnego czasu wygaśnięcia czasomierza. Na przykład zobacz KeWaitForSingleObject, KeSetTimer lub KeDelayExecutionThread. Dokładność, za pomocą której system operacyjny może mierzyć czas wygaśnięcia, jest ograniczona przez stopień szczegółowości zegara systemowego.
Czas systemowy jest aktualizowany na każdym znaczniku zegara systemowego i jest dokładny tylko do najnowszego znacznika. Jeśli obiekt wywołujący określa bezwzględny czas wygaśnięcia, czasomierz zostanie wykryty podczas przetwarzania pierwszego znacznika zegara systemowego, który występuje po upływie określonego czasu. W związku z tym czasomierz może wygasnąć nawet o jeden okres zegara systemowego później niż określony bezwzględny czas wygaśnięcia. Jeśli zamiast tego określono interwał czasomierza lub względny czas wygaśnięcia, wygaśnięcie może wystąpić do okresu wcześniejszego niż lub później niż określony czas, w zależności od tego, gdzie dokładnie czas rozpoczęcia i zakończenia tego interwału przypada między znacznikami zegara systemowego. Niezależnie od tego, czy określony jest czas bezwzględny czy względny, moment wygaśnięcia timera może zostać wykryty dopiero później, gdy przetwarzanie przerwań zegara systemowego jest opóźnione przez przetwarzanie przerwań innych urządzeń.
Gdy obiekt wywołujący określa względny czas wygaśnięcia, rutyna czasomierza dodaje bieżący czas zegara systemowego do określonego względnego czasu wygaśnięcia, aby obliczyć bezwzględny czas wygaśnięcia do użycia dla czasomierza. Ponieważ czas systemowy jest dokładny tylko do najnowszego uderzenia zegara systemowego, obliczony czas wygaśnięcia może być o okres zegara systemowego wcześniejszy niż czas wygaśnięcia oczekiwany przez użytkownika wywołującego. Jeśli określony względny czas wygaśnięcia jest bliski lub mniejszy niż okres zegara systemowego, czasomierz może wygasnąć natychmiast, bez opóźnień.
Możliwym sposobem dokładniejszego obsługi krótszych czasów wygaśnięcia jest skrócenie czasu między znacznikami zegara systemowego, ale może to zwiększyć zużycie energii. Ponadto, skrócenie czasu zegara systemowego może nie zapewnić niezawodnego osiągnięcia dokładniejszej granularności zegara systemowego, chyba że można zagwarantować, że przetwarzanie przerwań dla innych urządzeń na platformie nie będzie opóźniać przetwarzania przerwań zegara systemowego.
Począwszy od systemu Windows 8, KeDelayExecutionThread używa bardziej precyzyjnej techniki do obliczenia bezwzględnego czasu wygaśnięcia z czasu wygaśnięcia względnego określonego przez obiekt wywołujący. Po pierwsze, aby uzyskać dokładniejsze oszacowanie bieżącego czasu systemowego, rutynowe używa licznika wydajności systemu do pomiaru czasu, który upłynął od ostatniego znacznika zegara systemowego. Następnie rutyna dodaje bardziej precyzyjne oszacowanie czasu systemowego do względnego czasu wygaśnięcia w celu obliczenia bezwzględnego czasu wygaśnięcia. Bezwzględny czas wygaśnięcia obliczony przez tę technikę jest dokładny w mikrosekundach. W związku z tym czasomierz nie wygaśnie przed upływem określonego względnego czasu wygaśnięcia. Czasomierz nadal może wygasnąć do okresu zegara systemowego później niż określony czas i może wygasnąć nawet później, jeśli przetwarzanie przerwania zegara systemowego jest opóźnione przez przetwarzanie przerwań dla innych urządzeń.
Jeśli czas systemowy zmieni się przed wygaśnięciem czasomierza, czasomierz względny nie jest dotknięty, ale system dostosowuje każdy bezwzględny czasomierz. Względny timer zawsze wygasa po upływie określonej liczby jednostek czasu, niezależnie od czasu systemowego. Czasomierz bezwzględny wygasa w określonym czasie systemowym, więc zmiana czasu systemowego zmienia czas oczekiwania bezwzględnego czasomierza.