2009-07-22 2 views
8

나는 기계 스택 메모리에 다운 성장 또는 여부를 확인하는 C 프로그램이기계의 스택이 메모리에서 위아래로 커지면 어떻게 알 수 있습니까? (JAVA)

그것은 그런 식으로 진행됩니다.

#include <stdio .h> 

void sub(int *a) { 
int b; 

if (&b > a) { 
    printf("Stack grows up."); 
} else { 
    printf("Stack grows down."); 
} 
} 

main() { 
int a; 
sub(&a); 
} 

지금 내가 자바에서 동일한 작업을 수행 할 . :-)

아무도 네이티브 코드를 작성하지 않고도 해결책을 알고 있습니까 ???

감사

어떤 네이티브 코드를 수행하지 않는 경우
+0

Btw, 왜 Java에서 똑같은 일을하고 싶니? 순수한 호기심? –

+0

아무것도, 나는이 질문을 구글에서 물었다. 그런 다음 면접관은 java에서이 것을 구현하도록 요청했습니다. :-) – Roman

+0

이 코드는 깨졌습니다. 아래 내 대답에 대한 자세한 내용. – sigjuice

답변

14

, 나는 그것이 가능한 순수 자바 코드에 문제가 할 수있는 상황을 상상할 수 없다. 결국, Java 스택은 엄격하게 인접한 메모리 블록 (기계 스택과 같은)이 아닌 모든 방향으로 할당 될 수 있습니다.

+7

그냥 그 사람이 의미하는 바를 깨달으십시오. * 올라 가야한다는 규칙이 없습니다. 원하는 경우 힙 할당 위치에 각 호출 프레임을 저장하고 모든 곳으로 이동할 수 있습니다. GC/JIT 협력을 통해 프로그램이 실행되는 동안 스택 프레임을 이동할 수도 있습니다. *이 유연성을 지원하는 기능은 프로그래머가 직접 검사 할 수있는 기능을 제거하여 제공되었습니다. * –

+2

"각 호출 프레임을 힙 할당 위치에 저장할 수 있습니다." 나는이 작업을 수행했다.실제로 그것은 모든 프레임에 대한 할당을 만들지 않았고, 청크를 사용하고 다른 프레임으로 연결되었습니다. 그래서 간단한 테스트에서 (가능하다면) 내려간 것처럼 보였을 것이지만 실제로는 조금 내려 갔다가 새로운 블록에 "옆으로"내려 갔다가 다시 내려갔습니다. 이유는 JVM이 가상 메모리가없는 아키텍처에서 작동하도록 설계 되었기 때문입니다. 따라서 스택에 대해 큰 연속 범위를 예약하는 유일한 방법은 모든 스레드에 대해 모든 사전 할당을 수행하는 것이 었습니다. –

+0

...이 전략이 일반화되어 있는지 여부는 알지 못합니다. 그 중 하나만 구현했기 때문에 제가 뚜껑을 벗었을뿐입니다. 그러나 우리는 어떤 적합성 테스트도 확실히 실패하지 않았으므로이를 배제 할 수는 없습니다. –

2

woah, 당신은 자바에서 그런 간단한 코드 중에서 유용한 정보를 얻을 수 없을 것입니다.

코드는 실제로 C 에서조차 사실 일 수도 있고 아닐 수도있는 많은 가정을합니다. 프로그램을 실행하는 플랫폼 및 OS에 따라 다릅니다.

자바에서는 주소 지정을위한 JVM의 구현에 전적으로 의존하게되므로이 작업을 수행 할 수 없습니다.

첫 번째 대답은 프로파일 러를 사용하는 것입니다. 이 목적으로 API provided (JVMTI)을 사용하여 고유 한 프로파일 링 에이전트를 만들 수도 있습니다. 그것은 당신의 접근보다 훨씬 더 복잡하지만 당신이 필요로하는 것을 얻을 수 있어야합니다.

IBM에 도움이 될 수있는 page도 있습니다.

이 거의 모두 내가 가지고있는 주제에, 나는 당신이

6

자바 소스 코드는 JVM에서 실행되는 언어와 같은 조립 자바 바이트 코드로 컴파일 도움이되기를 바랍니다. JVM은 가상 머신이므로 스택 업 및 스택 다운을 사용하는 컴퓨터에서이라는 정의로 정확히 과 똑같이 보입니다.

특정 기계 스택이 Java 코드에서 위 또는 아래로 늘어 났는지 여부를 알 수 없기 때문입니다.

6

Java 코드에서는 수행 할 수 없습니다. C 코드로도 수행 할 수 없습니다. 게시 한 코드가 정의되지 않은 동작 (&b > a)을 호출합니다. 표준에 따르면 포인터가 동일한 배열 내의 요소를 가리 키지 않는 한 두 포인터를 비교 한 결과는 정의되지 않습니다. 이 표준은 스택 증가의 방향이나 스택의 존재 여부에 대해서는 아무 것도 말하지 않습니다.

+0

스택이 C에서 위 또는 아래로 자라고 있는지 여부를 알 수있는 방법이 없습니까? –

관련 문제