Por que os soquetes TCP / IP são considerados "arquivos abertos"?

29

Preciso de ajuda para entender o que tenho certeza de que é um conceito fundamental no Linux: o limite para arquivos abertos. Especificamente, estou confuso sobre por que os soquetes abertos podem contar para o número total de "arquivos abertos" em um sistema.

Alguém pode por favor explicar o motivo? Entendo que isso provavelmente remonta ao princípio "tudo é um arquivo" no Linux, mas qualquer detalhe adicional seria apreciado.

Mike B
fonte

Respostas:

34

O limite de "arquivos abertos" não é realmente apenas para arquivos. É um limite para o número de manipuladores do kernel que um único processo pode usar ao mesmo tempo. Historicamente, a única coisa que os programas costumavam abrir muitos eram arquivos, então isso ficou conhecido como um limite no número de arquivos abertos. Há um limite para ajudar a impedir que os processos digam, abrindo muitos arquivos e acidentalmente esquecendo de fechá-los, o que causará problemas em todo o sistema.

Uma conexão de soquete também é um identificador de kernel. Portanto, os mesmos limites se aplicam pelos mesmos motivos - é possível que um processo abra conexões de rede e esqueça de fechá-las.

Conforme observado nos comentários, os identificadores de kernel são tradicionalmente chamados de descritores de arquivo em sistemas similares ao Unix.

Greg Hewgill
fonte
23
"Alças do kernel" é uma terminologia do Windows. Você prefere se referir a "descritores de arquivo", que é como essas entidades são geralmente chamadas com Unix e Linux.
Jlliagre
11
Essa resposta protege demais. Soquetes são arquivos. Eles fornecem acesso a fluxos de bytes através da interface read/ write, que é o coração do que significa ser um arquivo.
4
@ WumpusQ.Wumbley, mas você tem o shutdown(2)syscall neles, mas não nos arquivos, e não pode ler de um soquete usando cat- esse é o motivo pelo qual netcatfoi criado. Eu diria que (felizmente) soquetes em kernels semelhantes ao Unix se comportam como arquivos em termos de E / S, mas a semelhança termina aí. (Honestamente, eu também gostaria de ouvir de alguém com experiência no Plano 9, porque soube que eles conseguiram a unificação dessas coisas além dos órgãos tradicionais).
kostix 25/09/14
@ MikeB, este livro deve ajudá-lo a se familiarizar com a maioria dos conceitos relacionados ao Unix. Altamente recomendado.
Kostix
3
A idéia "tudo é um arquivo" significa que "arquivo" é um tipo de dados abstrato com muitos subtipos. A maioria dos subtipos suporta métodos extras, além dos itens básicos que todos os arquivos suportam. tomadas têm muitos extras. dispositivos de bloco e arquivos regulares têm procurado. os diretórios são realmente estranhos (a gravação não funciona e, se a leitura funcionar, não é útil). A presença de métodos extras não significa que essas coisas não fazem parte da categoria geral das coisas que chamamos de "arquivos".
27

A razão por que os descritores de arquivo usar TCP / IP soquetes é que, quando a interface soquetes foi inicialmente concebido e implementado ( em BSD Unix, em 1983 ), seus criadores sentiram que uma conexão de rede foi análogo a um arquivo - você pode read, writee closetanto , e que se encaixaria bem com a idéia do Unix de "tudo é um arquivo".

Outras implementações de pilha de rede TCP / IP não se integraram necessariamente ao subsistema de E / S de arquivos do sistema operacional, um exemplo sendo o MacTCP . Mas como a interface de soquetes BSD era tão popular, mesmo essas outras implementações optaram por replicar a API de soquete com suas funções semelhantes ao Unix, então você obteve "descritores de arquivo", usados ​​apenas para comunicação TCP / IP, em sistemas que não possui descritores de arquivo.

A outra parte da sua pergunta é por que existe um limite? Isso ocorre porque a maneira mais rápida de implementar uma tabela de pesquisa de descritores de arquivos é com uma matriz. Historicamente, o limite era codificado no kernel.

Aqui está o código do Unix, versão 7 (1979), com um limite codificado de 20 descritores de arquivos por processo:

  • user.h :struct file *u_ofile[NOFILE]
  • param.h :#define NOFILE 20

Por comparação, o Linux aloca espaço dinamicamente para a tabela de descritores de arquivos de um processo. O limite absoluto é 8192, mas você pode configurá-lo como desejar. Meu sistema lista 191072 pol /proc/sys/fs/file-max.

Apesar de não haver mais nenhum limite absoluto no Linux, mesmo assim, não queremos deixar os programas enlouquecerem, portanto o administrador (ou o empacotador de distribuição) geralmente define limites de recursos. Dê uma olhada /etc/security/limits.confou corra ulimit -n.

Stuart Caie
fonte
Uma das melhores respostas neste tópico, obrigado
user859375:
6

Arquivos não são apenas arquivos no disco ou na memória; são fluxos de dados, dos quais esses são apenas dois exemplos.

Os pontos de extremidade remotos são um terceiro exemplo e você interage com aqueles que usam soquetes.

Corridas de leveza com Monica
fonte
2
Bem-vindo à U & L.SE. Eu gosto desta resposta.
eyoung100