System calls vs. libc [RESOLVIDO]

1. System calls vs. libc [RESOLVIDO]

Vinícius Vitor dos Santos Dias
vvsdias

(usa Ubuntu)

Enviado em 12/03/2012 - 09:54h

Olá, gostaria de saber as principais diferenças de performance entre system calls e funções de biblioteca no Linux (UNIX-like). Fiz alguns experimentos aqui (trabalho da univ.) e percebi que muitas vezes o uso de libcs ao invés de system calls diretamente é melhor em termos de tempo de execução, considerando que ambas realizem a mesma operação, como por exemplo, read/fread. Aí vem minha dúvida: porque que isso acontece? O meu primeiro instinto foi pensar o contrário, já que um acessa diretamente o kernel e o outro passa antes pela camada de libs. Cheguei a pensar que pode ter algo a ver com a mudança de contexto user-mode/kernel-mode, mas num consegui entender bem exatamente. Podem me dar algumas dicas?

Outros detalhes do experimento: Usei o "time" pra medir os tempos e constatei que com system calls o tempo "sys" (kernel) predomina, e para libcs o contrário: tempo "user" sempre dominante.

Obs. Em relação às libcs, estou considerando apenas aquelas que necessariamente precisam de uma system call para realizar uma operação. Basicamente, dois pedaços de código que fazem a mesma coisa: um com uso apenas de system calls e o outro apenas funções de bibliotecas (libc).

Desde já agradeço,

Vinícius V.


  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 12/03/2012 - 20:57h

Opa, beleza?
Sim, na maioria das vezes ha ganho de desempenho quando se utiliza as bibliotecas diretamente. As system calls nao acessam tao diretamente assim as funcoes do kernel. Elas geralmente passam por uma API, como por exemplo o unistd.h, que tem padrao POSIX, e ai sim sao chamadas as funcoes. O caso do printf() por exemplo, ele e' invocado, passa para um printf() do C, que passa para o write() do C, que finalmente faz a system call.
O caso das libc's sao mais rapidos, ja que tu chama a funcao e ela se vira em tempo de usuario e passa mais rapidamente para o kernel. Elas sao feitas assim justamente para ganhar tempo e nao precisam chamar uma API intermediaria do system para resolver algumas indefinicoes, como por exemplo, 'chamarei o write() do VFAT ou do Ext2?'.

Recomendo a leitura de:
BOVET, D.; CESATI, M. Understanding the Linux Kernel. 1. ed. Sebastopol, EUA: O’Reilly, 2000. e
PATE, S. Unix Filesystems: Evolution, Design and Implementation. 1. ed. Indianapolis, EUA: Wiley Publishing, 2003.

O segundo explica muito bem isso.

3. Re: System calls vs. libc [RESOLVIDO]

Vinícius Vitor dos Santos Dias
vvsdias

(usa Ubuntu)

Enviado em 15/03/2012 - 12:08h

marangon escreveu:

Opa, beleza?
Sim, na maioria das vezes ha ganho de desempenho quando se utiliza as bibliotecas diretamente. As system calls nao acessam tao diretamente assim as funcoes do kernel. Elas geralmente passam por uma API, como por exemplo o unistd.h, que tem padrao POSIX, e ai sim sao chamadas as funcoes. O caso do printf() por exemplo, ele e' invocado, passa para um printf() do C, que passa para o write() do C, que finalmente faz a system call.
O caso das libc's sao mais rapidos, ja que tu chama a funcao e ela se vira em tempo de usuario e passa mais rapidamente para o kernel. Elas sao feitas assim justamente para ganhar tempo e nao precisam chamar uma API intermediaria do system para resolver algumas indefinicoes, como por exemplo, 'chamarei o write() do VFAT ou do Ext2?'.

Recomendo a leitura de:
BOVET, D.; CESATI, M. Understanding the Linux Kernel. 1. ed. Sebastopol, EUA: O’Reilly, 2000. e
PATE, S. Unix Filesystems: Evolution, Design and Implementation. 1. ed. Indianapolis, EUA: Wiley Publishing, 2003.

O segundo explica muito bem isso.


Humm, ficou bem mais claro agora. Eu não tinha conhecimento dessa API que vc mencionou.

Vou dar uma olhada na bibliografia pra mais detalhes.

Vlw kra.


4. Re: System calls vs. libc [RESOLVIDO]

Rafael Junio da Cruz
rafajunio

(usa Outra)

Enviado em 03/04/2013 - 19:11h

Estou com um duvida parecida, como eu faço uma syscall direta em c? Sem que o compilador use o libc para não chamar minha syscall na hora, ou seja, sem que haja uma casca intermediaria (função printf por exemplo)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts