@Sukrim: Deine Linux Theorie stimmt sowas von gar nicht!
So ziemlich jedes Linux, dass du installieren kannst, läuft auch noch auf 10 Jahre alten Rechnern, d.h. es ignoriert auf deiner modernen CPU einfach alle Befehlssätze. Ausnahmen sind dann Programme wie z.B. VLC oder FFMPEG, die spezielle Plugins besitzen, mit denen sie zur Laufzeit nachsehen können, was die CPU alles kann. Damit können sie dann z.B. die Video-Dekodierung dann doch mittels SSE4 oder AVX beschleunigen. Das selbe trifft auf die GPU-Beschleunigung zu: Die Programme schauen zur Laufzeit, was vorhanden ist, und aktivieren es dann. Man kann es schließlich nicht fest einkompilieren und erzwingen, wenn dann jemand mit nem älteren Prozessor kommt, dann würde gar nichts mehr gehen. Der kleinste Gemeinsame Nenner ist heutzutage meist i686.
Es gibt unter den Distributionen eine Ausnahme: Gentoo. Das System enthält keine vorkompilieren Pakete, sondern bei jeder Installation wird vorher kompiliert und auf den CPU-Typ optimiert, den der Anwender gern hätte. Das dauert natürlich jeweils 10x so lange, wie einfaches Runterladen und Installieren, dafür hat man dann aber die volle Kontrolle über das System (insbesondere auch setzen von USE-Flags, etc.).
Die Compiler:
Ein normaler Compiler (z.B. GCC) nimmt den Source-Code und erstellt ein Binary daraus, mit den Optionen, die man ihm mitgibt. Zu den Optionen gehören die Befehlssätze, die er verwenden darf. Die Alternative dazu wäre ein JIT-Compiler, diese Compiler gibt es in unzähligen Varianten: Im Normalfall geht es hier um Skriptsprachen, die zur effizienteren Verarbeitung kompiliert werden. Das wird meistens dann gemacht, wenn der Rechner merkt, dass ein bestimmtes Skript ziemlich oft benutzt wird oder einen Flaschenhals darstellt. Man kann das natürlich auch so konfigurieren, dass wirklich jedes Skript compiliert wird.
Der Weg vom Code über das Betriebssystem zur CPU:
Im Endeffekt läuft der Code natürlich immer direkt auf der CPU, anders lässt er sich schließlich auch nicht ausführen. Das Betriebssystem übernimmt hier die Prozessverwaltung und Speicherverwaltung. D.h. es sagt dem Programm wie viel Speicher es benutzen darf und wo sich dieser Speicher befindet. Dabei überprüft das Betriebssystem bei jeder Speicherallozkierung, ob damit kein Speicherbereich eines anderen Programms überschrieben wird.
Das Prozessmanagement macht grob Folgendes: Das Programm bekommt u.a. eine ID und eine Priorität und wird in eine Warteschlange eingereiht. D.h. das Betriebssystem kann zum einen alle Programme überwachen und zum anderen Bestimmen, wie oft und wann und wie lange die CPU das Programm abarbeiten soll bevor zum nächsten in der Liste gewechselt wird.
Insgesamt besteht ein Betriebssystem auf einer riesigen Anzahl an Schnittstellen (ausgenommen Micro-Kernel) und JEDE Basisoperationen läuft darüber. Denn irgendwer muss ja sicherstellen, dass die Operationen erlaubt sind und dass es keine Konflikte gibt. Z.B. auch beim Zugriff auf die HDD oder sonstige Geräte.