As I said, Windows is huge and evolving, and Sever is different from regular Windows versions; be careful when mixing and matching versions. Some of these technotes are pretty recent, like 2014 or 2015. See -

How to configure an authoritative time server in Windows Server
https://support.microsoft.com/en-us/kb/816042

How the Windows Time Service Works
https://technet.microsoft.com/en-us/library/cc773013(WS.10).aspx

Support boundary to configure the Windows Time service for high-accuracy environments
https://support.microsoft.com/en-us/kb/939322

Domain Controller Roles
https://technet.microsoft.com/en-us/library/cc786438(v=ws.10).aspx

Windows Time Service Technical Reference
https://technet.microsoft.com/windows-server-docs/identity/ad-ds/get-started/windows-time-service/windows-time-service

Kerberos (protocol)
https://en.wikipedia.org/wiki/Kerberos_(protocol)
"Kerberos has strict time requirements, which means the clocks of the involved hosts must be synchronized within configured limits. The tickets have a time availability period and if the host clock is not synchronized with the Kerberos server clock, the authentication will fail."

-Brooks

On 2017-01-08 12:59 PM, Brooks Harris wrote:
On 2017-01-08 10:15 AM, Martin Burnicki wrote:
Brooks Harris wrote:
On 2017-01-06 11:52 AM, Martin Burnicki wrote:
- OS kernels with different features (Windows doesn't even know leap
seconds, AFAIK)


It is often repeated on LEAPSECS that "Windows doesn't even know leap
seconds". That's just not true. It knows very well about Leap Seconds in
the same way other systems do but it (typical desktop versions) is lazy
about when it updates - it doesn't attempt to update for Leap Seconds
until the particular system gets round to syncing to some NTP server
(defaulting to time.windows.com, but works perfectly well if set to
time.nist.gov, for example).
Many years ago I wrote a DOS TSR which could read the time from Meinberg
PCI cards (and ISA cards at that time), and adjusted the DOS time if
there was a significant difference.

So of course the DOS time was also adjusted after the plug-in card had
stepped its time due to a leap second.

So according to your argumentation even plain old DOS was aware of leap
seconds, wasn't it?
Yeah, I think so.

Really, none of DOS, Windows, or (pure) POSIX systems "know" about Leap Seconds except in so far as the reference counter (Windows FILETIME or POSIX time_t, (I can't remember what counter DOS relied on)) has been adjusted by the system in response to NTP queries. That adjustment gets reflected to YMDhms representation through calls to win::GetSystemTime() or POSIX::gmtime(). (Again, long time since I played with DOS, not sure the analogous calls)

By the way, DOS was essentially a real-time OS; you could hammer the interrupts however you liked. You don't want to do that in a multitasking event driven OS.



In Windows, FILETIME (an unsigned 64-bit value) is directly analogous to
POSIX time_t except it has a 1601-01-01 00:00:00 epoch. struct
SYSTEMTIME is analogous to POSIX struct tm ("broken down time" or
"YMDhms" representation). FileTimeToSystemTime() is analogous to POSIX
gmtime();

Like time_t, FILETIME is "bumped" when the system syncs to a NTP server.
Yes because the time adjustment software slews or steps the time.

Which Windows API call can be used to notify Windows that a leap second
is pending, so the Windows system time can account for it at the right time?
I am unaware of any part of Windows that is "aware" of Leap Seconds. There's no register somewhere that holds current TAI-UTC, announce, or history, I'm pretty sure, not at user-level access to the OS system calls, anyway.

(I'm hesitant to state this with great authority because Windows as a whole is just huge, and there are APIs on APIs developed and exposed over the years. I keep discovering yet another API that may expose deeper and deeper access to stuff. There might be something buried somewhere that can do this somehow. And Windows is always evolving, so something new might exist. Windows Server is something of a different animal than regular Windows PC versions, certainly with respect to its file system support, so there might be something different there regarding timekeeping, I don't know. I've never seen documentation of any such thing, though.)

Combinations of SetSystemTime() and SetSystemTimeAdjustment() can adjust the system clock. I've never tried to use them to tightly adjust system time. It would probably not be an easy project because monitoring accurate cause and effect would be tricky. I've played with SetSystemTimeAdjustment(), and it definitely changes things a bit, but never explored it carefully. But SetSystemTime() certainly works in the context of setting values obtained from NTP.

These functions adjust the "System timer" which is responsible for user-level FILETIME values and such. This is not the the primary CPU clock, of course, which you'd dearly love to frequency lock to an outside time source, but I know of no OS level call to do that. Of course you could build a driver in ring-zero to give it a go, which would be fun, but not a weekend project. :-) (Recommendation: do not try anything with interrupts unless you are fond of blue-screens.)

I have never discovered any references to or documentation of exactly how Windows synchronizes with NTP. Its a black box. (Any tips on this appreciated). But from everything I've been able to observe and experiment with it behaves the same as running an NTP client application and using SetSystemTime() from the NTP results. That works fine, but I've never tried to critically evaluate just how tightly this can be done.

As you probably know, some aspects of the clock and timer behavior depend on the CPU model, BIOS, associated chip sets, and the Windows power-management scheme in use by a given installation, of which there are many from different Windows versions to support available hardware technology on a given system. For example, the minimum (average) sleep time available from ::Sleep() can vary from, like from 10 to 14 Milliseconds and higher on different systems. I've tested and verified that. (Recommendation: never use ::Sleep() for anything; you've gotta do it the hard way with thread synchronization mechanisms).

Most of my experience regarding tight timekeeping in Windows revolves around obtaining media (video and audio) and device control (things like VTR (video tape recorder) control) from external sources, displaying those locally or over networks, or emitting media and control to external devices. None of this is easy. Windows is not a real-time OS; you have to repeat that mantra. Everything needs to be buffered. Windows provides many OS systems calls, low-level interfaces, and APIs for dealing with threading, media, and serial communications. There are several "multi-media" clocks and APIs to chose from, including high level APIs like DirectShow. Then there are all the third-party media systems like Quicktime and Ffmpeg and a bunch of others. Then too there is the whole other world of .NET.

Generally speaking these sorts of applications don't require high-precision accurate date-and-time. But the new SMPTE focus on a *fixed* date-time epoch (1588/PTP) timing scheme is what came to drive my interest in this broader discussion.

-Brooks


Martin

_______________________________________________
LEAPSECS mailing list
LEAPSECS@leapsecond.com
https://pairlist6.pair.net/mailman/listinfo/leapsecs



_______________________________________________
LEAPSECS mailing list
LEAPSECS@leapsecond.com
https://pairlist6.pair.net/mailman/listinfo/leapsecs



_______________________________________________
LEAPSECS mailing list
LEAPSECS@leapsecond.com
https://pairlist6.pair.net/mailman/listinfo/leapsecs

Reply via email to