Die CPU führt die Nutzungsberechnungen nicht selbst durch. Es verfügt möglicherweise über Hardwarefunktionen, die diese Aufgabe erleichtern, ist jedoch hauptsächlich Aufgabe des Betriebssystems. Daher variieren die Details der Implementierungen offensichtlich (insbesondere bei Multicore-Systemen).
Die allgemeine Idee ist zu sehen, wie lange die Warteschlange der Dinge ist, die die CPU tun muss. Das Betriebssystem kann den Scheduler regelmäßig überprüfen, um die Anzahl der zu erledigenden Aufgaben zu bestimmen.
Dies ist eine Linux-Funktion in (aus Wikipedia gerippt), die diese Berechnung durchführt :
#define FSHIFT 11 /* nr of bits of precision */
#define FIXED_1 (1<<FSHIFT) /* 1.0 as fixed-point */
#define LOAD_FREQ (5*HZ) /* 5 sec intervals */
#define EXP_1 1884 /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5 2014 /* 1/exp(5sec/5min) */
#define EXP_15 2037 /* 1/exp(5sec/15min) */
#define CALC_LOAD(load,exp,n) \
load *= exp; \
load += n*(FIXED_1-exp); \
load >>= FSHIFT;
unsigned long avenrun[3];
static inline void calc_load(unsigned long ticks)
{
unsigned long active_tasks; /* fixed-point */
static int count = LOAD_FREQ;
count -= ticks;
if (count < 0) {
count += LOAD_FREQ;
active_tasks = count_active_tasks();
CALC_LOAD(avenrun[0], EXP_1, active_tasks);
CALC_LOAD(avenrun[1], EXP_5, active_tasks);
CALC_LOAD(avenrun[2], EXP_15, active_tasks);
}
}
Was den zweiten Teil Ihrer Frage betrifft, sind die meisten modernen Betriebssysteme multitaskingfähig . Das bedeutet, dass das Betriebssystem nicht zulässt, dass Programme die gesamte Verarbeitungszeit in Anspruch nehmen und keine für sich selbst haben (es sei denn, Sie lassen dies tun) . Mit anderen Worten, selbst wenn eine Anwendung hängen bleibt , kann das Betriebssystem noch einige Zeit für seine eigene Arbeit stehlen.