Differenza tra chiamate di sistema lente e chiamate di sistema veloci


13

Qual è la differenza tra chiamate di sistema lente e chiamate di sistema veloci? Ho imparato che la chiamata di sistema lenta può bloccare se il processo rileva alcuni segnali, perché i segnali catturati possono riattivare la chiamata di sistema bloccata, ma non riesco a capire esattamente questo meccanismo. Qualsiasi esempio sarebbe apprezzato.

Risposte:


19

Ci sono infatti tre gradazioni nelle chiamate di sistema.

  1. Alcune chiamate di sistema ritornano immediatamente. "Immediatamente" significa che l'unica cosa di cui hanno bisogno è un po 'di tempo del processore. Non vi è alcun limite rigido al tempo necessario (tranne che nei sistemi in tempo reale ), ma queste chiamate ritornano non appena sono state programmate per un tempo sufficientemente lungo.
    Queste chiamate sono generalmente chiamate non bloccanti . Esempi di chiamate non bloccanti sono chiamate semplicemente leggere un po 'di stato del sistema, o fanno una semplice modifica dello stato del sistema, quali getpid, gettimeofday, getuido setuid. Alcune chiamate di sistema possono essere bloccanti o non bloccanti a seconda delle circostanze; ad esempio, readnon si blocca mai se il file è una pipe o un altro tipo che supporta letture non bloccanti e il O_NONBLOCKflag è impostato.
  2. Il completamento di alcune chiamate di sistema può richiedere del tempo, ma non per sempre. Un tipico esempio è sleep.
  3. Alcune chiamate di sistema non torneranno finché non si verifica un evento esterno. Si dice che queste chiamate siano bloccate . Ad esempio, readchiamato su un descrittore di file di blocco sta bloccando, e così è wait.

La distinzione tra chiamate di sistema "veloci" e "lente" è vicina al non blocco rispetto al blocco, ma questa volta dal punto di vista dell'implementatore del kernel. Una syscall veloce è quella che è in grado di completare senza bloccare o attendere. Quando il kernel incontra un syscall veloce, sa che può eseguire immediatamente il syscall e mantenere lo stesso processo pianificato. (In alcuni sistemi operativi con multitasking non preventivo , le syscall veloci possono essere non preventive; questo non è il caso dei normali sistemi unix.) D'altra parte, una syscall lenta richiede potenzialmente di attendere il completamento di un'altra attività, quindi il kernel deve prepararsi a mettere in pausa il processo di chiamata ed eseguire un'altra attività.

Alcuni casi sono un po 'di un'area grigia. Ad esempio un disco letto ( readda un normale file) viene normalmente considerato non bloccante, perché non è in attesa di un altro processo; sta solo aspettando il disco, che normalmente richiede solo un po 'di tempo per rispondere, ma non ci vorrà per sempre (quindi questo è il caso 2 sopra). Ma dal punto di vista del kernel, il processo deve attendere il completamento del driver del disco, quindi è sicuramente un syscall lento.


grazie mille! ma se il file è una pipe, la lettura del file non è bloccante? vedi che www2.hawaii.edu/~esb/2007spring.ics612/apr10.html
KayKay

indica "letture / scritture lente (ad es. su una pipe o un terminale)"
KayKay

@KayKay: per una pipe, puoi avere entrambi, a seconda dello stato della O_NONBLOCKbandiera. Se il flag è impostato, il syscall può essere completato senza attendere nient'altro, quindi non si blocca e il kernel può trattarlo come un syscall veloce.
Gilles 'SO- smetti di essere malvagio' il

vuoi dire che dipende dalla bandiera O_NONBLOCK!
KayKay,

3

Una chiamata di sistema lenta è qualcosa come un socket TCP read () - se non hai impostato O_ASYNC (o qualsiasi altra cosa), può aspettare per sempre.

Una chiamata di sistema veloce è qualcosa come gettimeofday () o getpid (), entrambi i quali restituiscono informazioni al processo che il kernel ha immediatamente disponibile.

Le letture del disco rientrano nella categoria delle chiamate di sistema lente. Se un processo esegue read () su un vero file su disco, descrittore di file, il kernel potrebbe dover leggere in uno o più blocchi su disco per soddisfare la lettura. A seconda della struttura su disco del file system sottostante, ciò può significare leggere l'inode su disco per ottenere il numero di blocco del disco di un "blocco indiretto", leggere il blocco indiretto per ottenere il blocco di dati e quindi leggere il blocco di dati stesso . Abbastanza tempo, almeno in termini di cicli della CPU per accesso al disco, probabilmente oggi peggiore di quanto non fosse nei Good Old Days.

Non lo vedo da anni, ma la "metà inferiore" del vecchio codice del driver del dispositivo di unità disco Unix bloccherebbe i segnali / interruzioni in modo che fosse più facile mantenere l'integrità del filesystem su disco. Di tanto in tanto, un driver difettoso o un disco guasto non consegnavano mai il blocco del disco richiesto da un processo e il processo dormiva per sempre. Anche un'uccisione -9 non ha fatto nulla.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.