OS가 불안정해지는 원인을 찾으려고 하는데 환경 변수 때문에 고민이 됩니다.
내가 받은 소프트웨어는 사용자의 .profile
.
내가 입력하면 set | wc
결과는 다음과 같습니다.길이는 9571바이트입니다!총 184개의 글이 있습니다. 나에게 이것은 매우 큰 것처럼 보이지만 "xyz 때문에 이것은 잘못되었습니다"라고 지적하고 말할 명시적인 내용이 없습니다.
그 안에는 아무것도 보이지 않아ulimit 문서환경변수 전체 크기에 대한 얘기인데, 그게 걱정이 되네요. 전반적인 메모리 활용(필요한 작업을 수행할 수 있는 공간이 충분함)은 걱정되지 않지만 일부 내부 제한을 초과하여 OS가 이상하게 작동하는 것은 걱정됩니다(아마도 내가 묻는 질문과 밀접한 관련이 없을 수도 있지만 "이상한 동작"은 공유 메모리 대기열이 내가 다른 쪽 끝에 넣은 모든 데이터를 반환하지 않는다는 것입니다. 5% 정도 받았어요).
모든 스크립트가 시작되고, 모든 셸이 실행되고, 모든 바이너리 실행이 환경 변수의 완전한 별도 복사본을 가져오는데 9k는 너무 크다고 생각합니다.이것이 문제가 되어야 하는가, 아니면 아무것도 걱정하지 않는가?
저는 0.5GB RAM을 갖춘 임베디드 x86 QNX 6.4.1 Neutrino 시스템에서 실행 중입니다.
답변1
set | wc를 입력하면 결과는 9571바이트입니다!
당신이 얻은 숫자가 정확하다고 가정하면 실제로는 꽤 그렇습니다.작은, 아마도 QNX를 사용하고 있기 때문일 것입니다. 일반 데스크탑 시스템에서는 훨씬 더 큽니다. 이것이 내가 fedora 20에서 얻은 결과입니다.
> set | wc --bytes
133195
133KB. 소스기능이 많아서(많이 설치되어 있는 것 같더라구요) 항목을 세지 않았는데 git
, 살펴보니 별 문제는 없어보였습니다. 최대 몇 kB까지 내 사용자 정의 항목입니다.
일부 내부 제한을 초과하여 운영 체제가 이상하게 작동할까봐 걱정됩니다.
경계 검사가 부족하면 구현에 매우 중요한 버그가 있음을 나타내기 때문에 이것이 가능한지 의심스럽습니다. 누군가가 메모리에 데이터를 주입하기 위해 긴 변수를 작성하는 것을 방지하는 것은 근본적인 문제임에 틀림없습니다. 그 외에는 말씀하신 대로 9kB는 메모리와 관련이 없습니다. 나는 이들의 조회가 해시 테이블을 통해 수행된다고 가정하고 있으므로 항목 수가 성능에 영향을 미치지 않습니다.
답변2
set
환경 변수뿐만 아니라 셸 변수 및 일부 셸의 경우 함수도 보고됩니다. env | wc -c
환경의 크기를 가져오는 데 사용됩니다 .
환경 크기는 최대 매개변수 크기 execve
(환경과 명령줄 매개변수로 구성)에 의해 간접적으로 제한됩니다. 를 사용하여 이 제한에 적용 가능한 값을 얻을 수 있습니다.getconf ARG_MAX
3849바이트는 특별히 높은 것 같지는 않습니다. POSIX에서는 제한이 4096바이트까지 낮을 수 있지만 512MB의 RAM을 사용하면 시스템이 저가형이 아니며 더 많은 것을 허용하도록 설정될 수 있다고 말합니다. 그럼에도 불구하고 이 제한에 도달하면 execve
실패합니다. 이는 공유 메모리 대기열과 관련이 없습니다.