문제

Linux 시스템의 여유 RAM을 임의의 데이터로 채울 수 있는 방법이 있습니까?

제가 이렇게 묻는 이유는 다음과 같습니다.저는 Fortran으로 수치 프로그래밍을 하는 그룹에서 일하고 있습니다.때때로 사람들은 배정밀도 실수로 작업을 망쳐 배정밀도 결과를 제공해야 하는 프로그램이 단정밀도 결과만 제공하는 경우가 있습니다.

내 이해가 정확하다면 그러한 프로그램에서 단일 정밀도 한계 이후에 결과가 무작위로 변동하는 것을 볼 수 있습니다.즉, 동일한 입력으로 동일한 프로그램을 여러 번 실행하면 매번 무작위로 다른 결과가 나타납니다.표시되는 내용(임의의 부분)은 시스템의 사용 가능한 RAM에 있는 임의의 값에 따라 달라집니다.그러나 실제로 동일한 머신에서 프로그램을 반복적으로 실행하면 메모리의 동일한 부분이 반복적으로 사용되는 경향이 있으며, 여기에는 동일한 무작위 데이터가 포함되어 매번 동일한 출력이 발생합니다.

내 생각은 임의의 데이터로 메모리를 덮어쓸 수 있다면 실제로 프로그램 출력에서 ​​임의의 변동을 볼 수 있다는 것입니다.그러면 이러한 버그를 찾는 것이 훨씬 쉬워질 것입니다.

이 아이디어가 엉망인가요? 아니면 기억을 어떻게 채울 수 있나요?/dev/random을 RAM 등으로 파이프할 수 있나요?

도움이 되었습니까?

해결책

리눅스는 당신에게 다음을 제공합니다 /proc/pid/maps 그리고 /proc/pid/mem, 당신의 즐거움을 위해.물론 거기에 글을 쓸 때는 각별히 주의해야 합니다.또한 각 프로세스에서 사용할 수 있는 유일한 메모리 세그먼트는 자체 메모리 세그먼트이므로 원하는 위치에 도달하려면 연결 및 코드 패치를 수행해야 할 수도 있습니다.어쨌든 행운을 빕니다.:)

편집하다:코드 감사보다 여전히 몇 배 더 복잡합니다. 또한 문제의 실제 원인을 밝힐 가능성도 더 큽니다.

다른 팁

귀하의 이해가 잘못되었습니다.프로그램이 실행되기 전에는 프로그램의 메모리를 임의의 데이터로 채울 수 없으며, 가능하더라도 문제가 해결되지는 않습니다.

Fortran 프로그램이 단정밀도 부동 소수점 변수를 선언하는 경우 컴파일러는 값을 보관하기 위해 메모리에 32비트 셀을 할당합니다.프로그램이 변수를 읽을 때마다 프로세서는 셀에서 32비트 값을 가져옵니다.변수에 할당할 때마다 프로세서는 32비트 값을 셀에 씁니다.어떤 상황에서도 임의의 비트가 셀 앞이나 뒤의 셀 값에 "흘려"져서는 안 됩니다.

부동 소수점 연산은 정확하지 않지만 무작위도 아닙니다.계산해보면 1.0 / 3.0 + 1.0 / 3.0 + 1.0 / 3.0) 1000번이라도 얻을 것이다 0.99999... 매번.

두 번째 요점은 Linux에서 프로그램이 실행될 때 운영 체제에 의해 모든 데이터 메모리가 조심스럽게 0으로 사전 초기화된다는 것입니다.이는 프로그램을 실행할 때마다 프로그램이 다르게 동작하는 것을 방지하기 위해 수행됩니다.그것은 나쁜 일이 될 것입니다.편집하다:이것이 수행되는 또 다른 이유는 한 프로세스에서 다른 프로세스로 개인 정보가 유출되는 것을 방지하기 위한 것입니다.

(댓글 작성자:설명을 간단하게 하기 위해 의도적으로 여러 가지 문제를 다루었습니다.)

최근(>=2.4인 것 같습니다) glibc가 있는 경우 환경 변수 MALLOC_PERTURB_를 사용하여 malloc()이 어떤 값으로 설정된 메모리를 반환하도록 할 수 있습니다.보다 http://udrepper.livejournal.com/11429.html 그리고 내부 http://people.redhat.com/drepper/defprogramming.pdf

그렇다면 문제는 Fortran 프로그램이 glibc malloc()을 사용하는지 여부입니다. Fortran 컴파일러에 따라 달라지는 것 같습니다.

다음과 같은 것을 사용하여 단위 테스트를 작성해 보겠습니다. f단위 단정밀도 결과가 자주 저장되는 경우 배정밀도 결과가 필요한 일부 테스트를 작성하여 배정밀도 값이 항상 예상대로 작동하는지 확인합니다.

예:배정밀도 출력을 생성해야 하는 다양한 입력으로 함수를 호출하는 테스트를 작성하고 이것이 Assert()와 함께 작동하는지 테스트합니다.

당신이 성취하고 싶은 것은 의도가 고귀하고 흥미롭게 생각되었지만 Wile E를 기억합니다.코요테는 로드러너를 잡을 계획이지만 소총과 저격 행동이 최선의 선택이었을 것입니다.

현재 문제가 발생한다면 이는 코드에 구조적 문제가 있으며 프로그램에 대한 통제력을 상실하고 있음을 의미합니다.나는 학계와 포트란에서 소프트웨어가 어떻게 개발되는지 완벽하게 알고 있지만, 세상 사람들이 한다고 해서 자신을 절벽 아래로 내던지는 것은 문제가 있습니다.

당신이 해야 할 일은 코드를 감사하는 것입니다.그리고 대학원생이 또 실수하면 때려요.

나는 무작위 데이터가 디버깅을 훨씬 더 어렵게 만들 것이라고 생각합니다.답변의 무작위성은 메모리의 무작위 값으로 인해 발생합니까, 아니면 계산 버그입니까?나는 생각할 것이다 결정된 그리고 모두 다 아는 가치관이 더 좋을 것입니다.

FORTRAN 측에서 '혼합 정밀도' 숫자가 서로 바꿔서 사용된다는 말씀이신가요?실제 문제가 명확하지 않습니다.

그러나 나는 Linux에서 여유 메모리를 채우는 방법을 전혀 모릅니다.

당신은 문제에 대한 해결책, 즉 메모리 무작위화를 구현하는 데 도움을 요청했습니다.그러나 나는 이것이 이상하고 디버깅하기 어려운 솔루션이라고 생각합니다.

정적 코드 분석 도구 - 특정 단위 테스트 - 코드 검토를위한 점검 목록, 특히이 문제를 대상으로하는 것입니다.

때로는 더 간단한 솔루션을 생각할 수도 있습니다.단정밀도 수학 없이 작업을 수행할 수 있다면 해당 라이브러리의 연결을 방해할 수 있으므로 오류에 링크 오류가 표시됩니다.개발 프로세스 초기에.행운을 빌어요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top