Existem, de fato, três gradações nas chamadas do sistema.
- Algumas chamadas do sistema retornam imediatamente. "Imediatamente" significa que a única coisa de que precisam é um pouco de tempo de processamento. Não há limite para o tempo que eles podem levar (exceto em sistemas em tempo real ), mas essas chamadas retornam como assim que eles estiverem agendados por tempo suficiente.
Essas chamadas geralmente são chamadas de sem bloqueio . Exemplos de chamadas sem bloqueio são as chamadas que apenas lêem um pouco do estado do sistema ou fazem uma alteração simples no estado do sistema, comogetpid
,gettimeofday
,getuid
ousetuid
. Algumas chamadas do sistema podem estar bloqueando ou não bloqueando dependendo das circunstâncias; por exemploread
nunca bloqueia se o arquivo for um canal ou outro tipo que suporte não as leituras de bloqueio e aO_NONBLOCK
flag estão definidas. - Algumas chamadas do sistema podem demorar um pouco para serem concluídas, mas não para sempre. Um exemplo típico é
sleep
. - Algumas chamadas do sistema não retornam até que algum evento externo aconteça. Essas chamadas são chamadas de bloqueio . Por exemplo,
read
chamado de um descritor de arquivo de bloqueio está bloqueando e, portanto, éwait
.
A distinção entre as chamadas de sistema “rápidas” e “lentas” está próxima de não bloqueio vs. bloqueio, mas desta vez do ponto de vista do implementador do kernel. Um syscall rápido é aquele que é conhecido por ser capaz de completar sem bloquear ou aguardar. Quando o kernel encontra um syscall rápido, ele sabe que pode executar o syscall imediatamente e manter o mesmo processo agendado. (Em alguns sistemas operacionais com multitarefa não preemptiva , o syscalls rápido pode não ser preventivo; isso não é o caso em sistemas unix normais.) Por outro lado, um syscall lento requer potencialmente aguardar que outra tarefa seja concluída, portanto, o kernel deve se preparar para pausar o processo de chamada e executar outra tarefa.
Alguns casos são um pouco cinzentos. Por exemplo, uma leitura de disco ( read
de um arquivo normal) é normalmente considerada sem bloqueio, porque não está aguardando outro processo; ele está apenas esperando pelo disco, que normalmente leva apenas um pouco de tempo para responder, mas não levará uma eternidade (então é o caso 2 acima). Mas do ponto de vista do kernel, o processo tem que esperar que o driver de disco seja concluído, então é definitivamente um syscall lento.