프로세스가 이 특수 파일에 쓸 때 무슨 일이 일어나는지 이해가 되지 않습니다. 모든 바이트는 어떻게 되나요? /dev/null에 쓰는 것이 CPU 리소스를 차지하지 않는 이유는 무엇입니까? Linux 소스코드를 참고하여 답변해주시면 좋을 것 같습니다.
Arch 포럼에 다음 답변이 있습니다.
버퍼는 단순히 무시됩니다.
그러나 예를 들어 cat /dev/urandom > /dev/null을 수행하면 write_null 함수를 여러 번 또는 한 번만 호출해야 하며 버퍼가 어떻게 작동하는지 이해하지 못합니다.
답변1
Linux에서는 /dev/null
다음을 포함한 많은 기능으로 구현됩니다.write_null
:
static ssize_t write_null(struct file *file, const char __user *buf,
size_t count, loff_t *ppos)
{
return count;
}
보시다시피, 버퍼는 완전히 무시되고 함수가 하는 일은 쓰기 요청된 바이트 수를 반환하는 것뿐입니다.
이 함수는 여러 번 호출할 수 있으며 각 호출에는 약간의 비용(커널 호출 비용)이 발생합니다. 당신이 달리면
cat /dev/zero > /dev/null
이 비용이 지배적일 수 있습니다. cat
읽을 콘텐츠가 부족하거나 쓸 수 없을 때까지 입력(또는 지정된 파일)에서 반복적으로 읽고 출력을 씁니다. /dev/urandom
그러나 읽을 때읽기는 더 복잡하다, 나는 이것이 지배적일 것이라고 기대합니다. 두 경우 모두 모든 "I/O"는 CPU 기반이며 cat
결국 상당한 양의 CPU(논리 CPU의 100%)를 사용하게 됩니다. 궁극적으로 write_null
커널 호출은 최대한 빠르게 수행되지만 어떤 작업도 수행되지 않습니다. 최대한 빨리.
프로그램의 정보 출력을 폐기하는 데 사용되는 것과 같은 보다 일반적인 경우에는 /dev/null
쓰기 횟수가 훨씬 적고 프로그램이 수행하는 다른 작업에 비해 전체 비용은 무시할 수 있습니다.
/dev/zero
(그런데 위에 링크된 코드 바로 뒤에 의 구현이 나와 있습니다 .)/dev/null