안녕하세요. 오늘은 Garbage collector에 대해 알아볼까 합니다.
2021.11.12 - [학부공부/운영체제] - 10. Process(1)
위 포스팅에서 프로세스에 대한 내용을 소개하면서 Garbage collector에 대해 흥미로운 주제로 선정하였는데요. Process의 protection domain을 설명하면서 garbage collector에 대해 소개해드렸습니다. 프로세스의 abstraction의 문제가 아닌 구현상의 약점이 존재한다고 말씀드렸는데요. 바로 메모리 leak 이슈였습니다. 이를 해결하기 위해 Garbage collector를 만들었죠.
13.01. Garbage collector
프로그램이 동적으로 할당했던 메모리 영역 중 필요없게 된 영역을 해제하는 기능인데요. 이전 포스팅에서도 말씀드렸지만 제가 알기로 C는 garbage collector를 지원하지 않습니다.(라이브러리를 통해 사용할 수 있다고 하더라고요. 디자인 자체가 수동 메모리 관리를 가정했다는 이야기도 있습니다.) 일단 프로그래밍 언어 과목에서 배웠던 ML과 같이 함수형 프로그래밍 언어는 대부분 지원하고 JAVA와 같이 객체지향 언어들은 대부분 내장하고 있습니다.
Memory leak는 coding을 해보실수록 심각하고 중요하게 고려해야 할 이슈라는 것을 느끼신 분들이 많을 것 같습니다. 메모리 할당 주기가 짧거나 공유 메모리와 같이 프로그램 종료 후에도 해제되지 않는 메모리, 메모리 만성 부족에 시달리는 시스템, 운영체제 내부(커널 메모리를 의미합니다.), 시스템 신뢰성에 영향을 끼치는 프로그램 등에서 좀 더 신중하게 고려해야 합니다.
일단 Garbage collector를 사용하면 유효하지 않은 포인터 접근, 반복 해제, 메모리 누수와 같은 버그를 최소화 할 수 있습니다.(메모리 누수는 메모리 고갈을 일으켜 프로그램 중단을 야기할 수 있습니다. 반복해제는 큰 규모의 프로젝트에서 가끔 마주칠 수 있는 문제죠.) 하지만 여러가지 단점도 있습니다. 항상 추가적인 무언갈 덧붙이면 overhead가 생기기 마련이죠. 지난 포스팅에서 C언어에서 malloc을 추적하면 어떨까라는 질문을 던지고 그에 대한 답으로 디자인 관점에서 바람직 하지 않고 새로운 attack point가 될 수도 있다고 말씀드렸습니다. 또 어떤 메모리를 해제할지 결정하는데 그만큼 CPU clock을 소모할 겁니다. Garbage collector가 동작하는 시점과 time을 예측하기 어렵기 때문에 실시간 응답이 필요한 시스템에는 적합하지 않을 수도 있죠.
13.02. Garbage collector Method
실제로 구현하는 방식에 대해서는 아래의 문서를 참고하시면 좋을 듯 합니다. 기본적으로 위키 페이지를 완전히 신뢰(?)하지는 않습니다만 개념적인 내용을 이해하는데는 도움이 되는 것 같습니다. 이 내용을 바탕으로 추가적인 검색을 실시해 신뢰도가 높은 reference를 찾아나가는 방식이죠. 어떤 topic이 주어졌을 때 곧바로 좋은 reference를 찾는 것은 대단히 어려운 일이기 때문입니다. 한가지 제가 추천해드리고 싶은 tip은 한글 위키를 마시고 영문 위키를 보시라는 것입니다. 이 경우 Reference와 Further reading을 잘 목록화해놓고 link가 걸려있기 때문에 유용합니다.
https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
한글로 된 문서는 아래의 페이지를 참고하시면 좋을 듯 합니다. Java의 garbage collector에 대해 꼼꼼하게 설명해 놓으셨고 실제 현업에서
System.gc()
메서드는 시스템의 성능이 큰 영향을 끼쳐 사용하지 않는다는 내용 등도 있어 JAVA 개발자가 되고 싶은 분들께는 읽어보면 좋은 글인 것 같습니다.
https://d2.naver.com/helloworld/1329
굳이 제가 몇 개의 Method를 소개해드리자면
Mark and sweep
이 기법은 가장 단순한 기법으로 1 bit 메모리를 추가하여 사용하는 것입니다. 표시하는 거죠. 단, Stop-the-world가 필요합니다.
Stop-the-world란?
Garbage collector를 실행하는 스레드를 제외한 스레드의 작업을 모두 멈추는 것입니다. 대부분 Garbage collector tuning은 Stop-the-world의 시간을 감소시키는 방향으로 이루어지고 있다는군요.(제가 앞선 소개했던 참고자료에선 어떠한 Garbage collector이든 Stop-the-world가 발생한다고 되어 있었습니다. 이 말은 사실이 아닐 가능성이 있을 것 같네요.)
Household-scale garbage collection
locality를 이용한 기법인데요. 일단 할당된 시간에 따라 분류하여 다른 메모리 영역에 할당합니다. 한 세대의 메모리 영역을 다 사용하면 그 중 해제되지 않은 객체를 다른 영역으로 옮기는 것이죠. 그러면 새로 할당된 영역에서 대부분의 객체들이 빠르게 해제된다는 점을 활용하여 메모리의 일부 영역만 주기적으로 수집하게 되는 장점이 있습니다. JAVA 등 대부분 언어가 이 기법을 사용한다는군요. JAVA에서는 old & young 영역 개념을 도입하여 구현합니다. 추가적인 내용은 제가 소개해드린 페이지를 참고하시면 좋을 것 같습니다.
이번 포스팅에선 garbage collector에 대해 알아보았습니다. 개발자의 덕목은 꾸준한 배움이라는 것을 느끼게 해주는 시간이였습니다.(물론 저는 개발자가 목표가 아니지만요.)
'학부공부 > OS_운영체제' 카테고리의 다른 글
15. IPC(1) (2) | 2021.11.21 |
---|---|
14. Process(3) (0) | 2021.11.17 |
12. Process(2) (0) | 2021.11.15 |
11. bss [Interesting topic to study] (0) | 2021.11.12 |
10. Process(1) (0) | 2021.11.12 |
댓글