What did Windows NT have when it came out that Unix hadn't?

This was my answer on Quora. I moved it here.

In addition to Joel Spolsky's excellent points, NT had these features from the day one (1993):

  • A journaling file system, NTFS. It was crash resilient and performant. For example Linux started to have the same set of journaling capabilities six years after NT’s release with ext3. (External implementations were available earlier but were not "out of the box").
  • "Services". In UNIX world "daemons" were regular processes. To start a daemon you had to know where it is, its own syntax and its dependencies. NT allowed you to manage service processes centrally and managed their dependencies automatically. As Miguel De Icaza correctly pointed out, GNOME and KDE had NT-like service concept in 2000, later standardized with DBus a couple of years later. MacOS had launchd in 2005. SystemD was introduced in 2011.
  • "Registry" was a uniform model to store and retrieve application configuration data. UNIX had arbitrarily formatted text files scattered around in /etc. The idea of standardizing configuration access was sound but didn't work as well in practice, causing versioning/isolation problems. A radical divergence from UNIX regardless.
  • Strong distinction between threads and processes. UNIX had processes as units for both execution and the address space. Some UNIX implementations had support for threads (or LWPs, lightweight processes) but they were more expensive to create and non-standard until POSIX threads came along two years after NT’s release. So, they were unpopular. The “process as execution unit” approach caused common problems like zombie processes on systems.
  • Modular device driver architecture allowed loading of device drivers after the system initialization. UNIX systems of the time usually had drivers compiled into the kernel. I remember dynamic driver loading was possible in Linux 1.2.13 as an experimental feature but only worked with the exact kernel version which the driver was compiled against. NT also supported PnP and "device trees" so it could figure out driver initialization dependencies correctly. Linux got "unified device model" capability ten years later in 2003.
  • An O(1) scheduler. I don't know how many UNIX systems lacked this but I know that Linux didn’t have it until 2003, ten years after NT’s release.
  • The kernel was "preemptible" from day one, so used no "Big Kernel Lock"s. OS X had very limited preemption (coarse-grained locking) until, I guess, OS X Leopard. Linux finally got rid of its giant lock in 2011. BSD systems got the ability in 2009 with NetBSD 5. Ability of kernel preemption caused much better system responsiveness and better parallel processing performance.