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

27

Eu preciso de alguma 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 por favor pode elaborar sobre o motivo? Eu entendo que isso provavelmente remonta ao princípio "tudo é um arquivo" no Linux, mas qualquer detalhe adicional seria apreciado.

    
por Mike B 25.09.2014 / 00:15

3 respostas

32

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

Uma conexão de soquete também é um identificador do 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.

Como observado nos comentários, as alças do kernel são tradicionalmente chamadas de descritores de arquivos em sistemas semelhantes ao Unix.

    
por 25.09.2014 / 00:24
23

A razão pela qual os soquetes TCP / IP usam descritores de arquivos é que, quando a interface de soquetes foi projetada e implementada pela primeira vez ( no BSD Unix, em 1983 , seus projetistas sentiram que uma conexão de rede era análoga a um arquivo - você pode read , write e close , e que ela se encaixaria bem com a ideia Unix de "tudo é um arquivo".

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

A outra parte da sua pergunta é porque existe um limite? É porque a maneira mais rápida de implementar uma tabela de pesquisa do descritor de arquivos é com uma matriz. Historicamente, o limite foi codificado no kernel.

Aqui está o código no Unix release 7 (1979) com um limite de 20 descritores de arquivo por processo:

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

Apesar de não haver limite absoluto no Linux, no entanto, não queremos deixar os programas enlouquecerem, então o administrador (ou o empacotador de distribuição) geralmente define os limites de recursos. Dê uma olhada em /etc/security/limits.conf ou execute ulimit -n .

    
por 25.09.2014 / 05:35
5

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

Endpoints remotos são um terceiro exemplo, e você interage com aqueles que usam sockets.

    
por 25.09.2014 / 19:15