공유메모리에서 dest ...
글쓴이: alonecrow / 작성시간: 화, 2003/08/19 - 9:24오후
공유메모리를 사용한 후에 삭제를 하면 아래와 같이 status에 dest가 붙고
프로그램을 종료할 때 까지 그대로 있습니다.
dest가 붙는 이유가 무엇이며 왜 없어지지 않고 있는지, 시스템에 미치는 영향이 무엇인지 알고 싶습니다.
------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x00000000 917505 ora920 660 47 1 dest 0x00000000 950274 ora920 660 2750 1 dest
Forums:
이미 삭제명령(IPC_RMID)가 내려진 경우입니다.
아무도 답변을 안해주는군요... 혹시 밑보인 일이라도... ^^* 농담이고요.
일반적으로 IPC_RMID로 지우게 되면 바로 지워지는게 정상이지만, 대부분 공유메모리는 여러 프로세스가 사용하므로 nattach 수(어태치한 프로세스 갯수)가 1개 이상인 경우가 대부분입니다.
그런데 하나의 프로세스에서 지우는 명령을 날렸다고 하더라도 바로 지워지면 현재 작동하는 다른 프로세스들을 망가뜨리게 됩니다. 따라서 nattach가 0 이 될때까지 기다렸다고 지운다는 의미입니다. dest 는 destroyed 의 약자겠죠.
시스템에 아무런 문제는 없습니다. attach한 프로세스들이 다 종료되면 바로 없어집니다.
실제로 프로그램을 짤때 fork() 모델에서는 이렇게 프로그램을 짜기도 하는데(유난히 리눅스쪽만 이렇게 프로그램을 많이 짭니다) 부모가 shm을 생성하고 자식을 다 fork()한뒤에 IPC_RMID로 지워버리면 자식들이 어떤 경우에 죽게 되거나 비정상적으로 죽더라도 SHM이 정상적으로 없어지게 되죠.
PS)정확하게 확인해보진 않았지만 다른 유닉스는 RMID명령이 내려지는 즉시 shm 영역은 삭제되고, 다른 프로세스들은 SHM이 아닌 로컬영역으로 해당 영역을 복사한다고 알고 있습니다. 틀렸나? 흠... 확인은 안해봤으니 이것은 100% 믿진 마세요. 하지만 위의 dest는 사실임~~
PS2) PS에 올린 것을 아는 사람에게 물어보니 진실이라고 하더군요. 적어도 솔라리스하고 AIX에서는요...
========================================
* The truth will set you free.
댓글 달기