파이프 버퍼 크기가 4k 또는 64k입니까?
파이프의 기본 버퍼 사이즈는 4kB(여기 등)이며,ulimit -a
다음과 같은 진술을 확인하는 경향이 있습니다.
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15923
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8 // 8 * 512B = 4kB
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
그러나 작은 프로그램을 사용하여 버퍼 크기를 테스트하면(write()가 차단될 때까지 파이프에 쓰임으로써) 64kB의 제한이 표시됩니다.
다음 프로그램 보기:
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
int main(void)
{
int tube[2];
char c = 'c';
int i;
fprintf(stdout, "Tube Creation\n");
fprintf(stdout, "Theoretical max size: %d\n", PIPE_BUF);
if( pipe(tube) != 0)
{
perror("pipe");
_exit(1);
}
fprintf(stdout, "Writing in pipe\n");
for(i=0;; i++)
{
fprintf(stdout, "%d bytes written\n", i+1);
if( write(tube[1], &c, 1) != 1)
{
perror("Write");
_exit(1);
}
}
return 0;
}
그 결과:
$ ./test_buf_pipe
Tube Creation
Theoretical max size: 4096
Writing in pipe
1 bytes written
2 bytes written
3 bytes written
4 bytes written
[...]
65535 bytes written
[blocks here]
파이프 버퍼 크기가 실제로 64k임을 강력히 시사합니다.여기서 무슨 일이 일어나고 있는 거야?
다른 답변에서는 파이프 크기가 64KB임을 알 수 있습니다.PIPE_B가 필요한 이유UF는 PIPE_B의 4KB입니다.UF는 쓰기가 원자성이 보장되는 최대 크기입니다.http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html 를 참조해 주세요.
이제 프로그래밍이 되었습니다.
Linux 2.6.35 이후로는 fcntl (2)를 사용하여F_SETPIPE_SZ
파이프 버퍼 설정 작업/proc/sys/fs/pipe-max-size
디폴트로는 1 MB입니다.proc(5)를 참조해 주세요.
내 경험상, 한 번의 쓰기 테스트로 총 65536개의 사이즈가 생성되었지만, 2700개를 한 번에 쓸 수 있는 사이즈는 16번밖에 되지 않았고, 그 다음 시도도 중단되었습니다.'원자' 쓰기는 하나의 4K 블록 내에 있어야 하며, 각각의 쓰기에 대해 요청을 충족하기 위해 다음 전체 블록으로 이동합니다.따라서 실제로 사용 가능한 파이프 크기는 쓰기 크기에 따라 달라집니다.
커널은 최대 16개의 버퍼를 사용하여 64k를 더하는 것으로 보입니다.ulimit 출력과 실제 버퍼 크기에 대한 설명은 이 링크를 참조하십시오.
맞아요.2.6.11 커널 이후 Linux의 파이프 크기는 64kB입니다.왜 ulimit이 4Kb로 보고하는지는 모르겠지만, 그건 틀렸어요.
언급URL : https://stackoverflow.com/questions/4624071/pipe-buffer-size-is-4k-or-64k
'programing' 카테고리의 다른 글
Laravel vue.js 및 vuex 본문 텍스트를 ID별로 링크하여 새 구성 요소에 표시 (0) | 2022.08.28 |
---|---|
Vue-auth가 vuex 작업 내 $auth에 액세스합니다. (0) | 2022.08.28 |
Vue 컴포넌트의 모든 필드를 다른 컴포넌트와 함께 검증하는 방법(Vee-Validate 사용) (0) | 2022.08.28 |
스프링 데이터 JPA GROUP BY 쿼리에서 사용자 지정 개체를 반환하는 방법 (0) | 2022.08.28 |
Vue mapState 상태 이름 변경 (0) | 2022.08.28 |