common block 질문 드립니다.

게시판 IDL Q&A common block 질문 드립니다.

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #1894 Reply
      tlseorb0111
      회원

      안녕하세요
      전역 변수가 필요해서 common 문을 쓰고 있습니다.

      그런데 common 문을 이용해서 공유된 변수들은 프로그램이 끝나도
      메모리에 남아있습니다. DEFSYSV 를 이용한 변수도 마찬가지구요.

      리셋을 해주기 전까지는 메모리가 줄어들지 않습니다.
      원래 그렇게 만들어 진건가요?

      그리고 도움말을 좀 찾아보니 shmmap, shmvar를 이용하면 common이나 defsysv를 대신해서
      쓸 수 있을 것 같습니다.
      shmmap의 경우 아무리 큰 배열을 잡아놔도 메모리가 늘어나질 않는데요.
      프로그래밍을 제대로 공부해본적이 없어서 어떻게 된일인지 이해가 가질 않습니다.
      설명 좀 부탁드려도 될런지요.

      • 이 게시글은 tlseorb0111에 의해 9 years, 10 months 전에 수정됐습니다.
    • #1896 Reply
      Jonghyuk
      회원

      원래 그렇게 만들어진 것입니다.
      IDL에서 일반적으로 Interactive 하게 사용하는 상태인 $MAIN$ 레벨도 COMMON의 설정을 공유할 수 있어야 하니까요. DEFSYSV는 시스템 변수를 만드는 것이기 때문에 이 역시 reset 전에는 없어지지 않습니다.

      Shared Memory Map 은 IDL의 바깥에 있는 메모리를 사용하는 것입니다. 운영체제가 관리하는 메모리죠. 그래서 IDL에서 메모리 체크를 했을 때는 보이지 않습니다. 이를 잘 이용하면 IDL 프로세스 간의 메모리를 공유할 수 있고, IDL과 다른 프로그램 간의 메모리를 공유할 수도 있습니다. 한쪽에서 변수를 고치면 다른 쪽에서도 그 변수의 변경이 반영되고요… 다만 일반적인 IDL 메모리와 달리 위험성이 있습니다. 잘못 건드리면 프로세스들이 다운되고 엉킬 수 있습니다.

      그런데, 하나의 프로세스(IDL 세션 하나)에서라면 굳이 Shared Memory까지 쓰실 필요는 없지 않나 생각합니다.

    • #1897 Reply
      Sangwoo
      회원

      제 개인적인 습관과 관련된 의견을 말씀드리면, COMMON을 사용하기 보다는, 공유가 필요한 변수들을 sav 파일로 저장해놓고 다른 루틴에서 그 sav 파일을 RESTORE해서 사용한 다음 변경 사항 생기면 또 그 내용을 sav로 저장하는 방식도 한번 고려해볼만 합니다. COMMON을 사용하는 것이 메모리 다루는 부분이라든지, 루틴을 오가며 변수의 값이 변하는 추이를 자칫 중간에 놓치기 쉽다든지 하는 어려움도 어느 정도 있는게 사실이어서요. 아니면 포인터와 구조체를 활용하는 방법 등등 다양한 방법들이 있습니다.

    • #1901 Reply
      tlseorb0111
      회원

      좋은 답변 감사합니다.

      말씀해 주신 save 파일을 사용하는 것도 생각해 봐야겠네요.

3 답변 글타래를 보이고 있습니다
'common block 질문 드립니다.'에 답변달기
글쓴이 정보: