2009-11-12 4 views
4

데스크톱 프로그램이 있습니다. 대부분의 운영 체제는 자체 주소 공간에서 프로그램을 실행합니다.어떤 운영 체제가 메모리 누수를 없애 냅니까?

프로그램이 종료되면 대부분의 운영 체제는 프로그램에서 할당 한 메모리를 해제하고 메모리 스택으로 다시 보내 재사용 할 수 있다고 생각합니다.

내가 알지 못하는 것은 프로그램에 메모리 누수가 있는지, 재사용을 위해 메모리가 유출되거나 컴퓨터가 재부팅 될 때까지 손실되는지 여부입니다.

오늘 제가 질문 한 질문에 대한 답변입니다 : Do Small Memory Leaks Matter Anymore?, 그리고 거기에 몇 가지 의견이 있는데 프로그램 종료시 프로그램 메모리가 해제된다는 내용이 있습니다. 프로그램이 완료되었을 때 누출이 해소된다면, 내 프로그램에 가장 작은 누출을 엄격히 제거하는 데 대한 부담을 덜어줍니다.

특히 저는 Windows 프로그래머이며 Windows 98, 2000, XP, Vista 및 7에서 어떤 일이 발생했는지 알 필요가 있습니다. 그러나 Mac에서도 무슨 일이 일어나는지 듣고 싶습니다. 및 유닉스 기계.


설명 : 나는 비 성장 누출에 대해 이야기하고 있습니다. 이것은 프로그램이 실행될 때 한 번 발생하는 일정한 크기의 누수입니다.

프로그램에서 지속적으로 증가하는 누수가 심각하고 고정되어야한다는 것을 알고 있습니다.

어느 쪽이든, 누설을 수정해야하는지 여부는 문제가 아닙니다. 프로그램이 끝나면 운영체제가 누출 된 메모리를 돌려 줄지 여부입니다.

답변

5

메모리 누수는 프로그램이 메모리를 할당 할 때 단순히 해당 메모리가 손실되는 것을 나타냅니다. 운영 체제는 여전히이 메모리를 프로그램의 주소 공간에있는 것으로 간주하므로 프로그램이 끝나면 다시 사용됩니다.

모든 최신 운영 체제는 가상 메모리라는 메커니즘을 사용하여 프로그램 메모리를 추적합니다.

여기서 가상 메모리에 대해 아주 자세히 알게되었습니다. CS3231.

기본적으로 운영 체제는 응용 프로그램 메모리의 청크를 실제 메모리에 둘 수 있으며이 청크가 가리켜 야 할 위치에 매핑을 유지합니다.

응용 프로그램 측면에서 볼 때 메모리는 물리적 메모리가 적더라도 하드웨어에 제한 될 때까지 계속 할당 할 수 있습니다 (32 비트 OS에서는 4GB, 64 비트에서는 대용량) (일반적으로 스왑 파일에 디스크의 일부 내용을 디스크에 저장해야합니다.)

이것은 일반적으로 MMU (메모리 관리 장치)라고하는 모듈 인 CPU의 하드웨어에 의해 용이 해집니다. , 때로는 가상 메모리 연산 속도를 높이기위한 TLB (Translation Lookaside Buffer)가 있습니다.

또 다른 page은 가상 메모리의 내부 동작에 대해 자세히 설명하는 메모리 보호에 대해 좀 더 자세히 설명합니다.

+1

+1하지만 K & R은 코드 누출시에도 아무리 작아도 울부 짖습니다! – phoebus

+0

모든 운영 체제에서 그게 사실입니까? 언제 OS가 공유 메모리 공간에서 전환 했습니까? – lkessler

+3

제한된 장치 (예 : 로우 엔드 8 비트 임베디드 컨트롤러)에서 실행되지 않는 모든 최신 운영 체제에 해당됩니다. 이 기능을 사용 가능하게 한 주요 요소는 가상 메모리 및 하드웨어 메모리 관리 장치 (MMU)입니다. 모든 시스템에서이 작업을 수행 할 수 있지만 VM/MMU 하위 시스템을 사용하면 훨씬 쉽게 처리 할 수 ​​있습니다. 그리고 "보호 된"메모리는 이것을 제거하기위한 요구 사항이 아닙니다. 예를 들어 구형 Mac OS는 메모리 보호 기능이 없었습니다. 한 프로세스가 다른 프로세스의 메모리 이미지를 강타 할 수 있었지만 프로세스가 종료 될 때 프로세스가 연결되지 않았습니다. 7 to go –

2

이 를 종료하지만, 누출이 응용 프로그램의 성능과 안정성에 어떤 영향을 후 그들이 때문에 윈도우, 작은 누수가 큰 사람보다 더 몇 가지면에서

(크기에 따라) 프로세스의 메모리를 사용할 수있게됩니다 피할 수없는 죽음에 이르기까지 소프트웨어에서 크롤링 성능이 저하 될 수 있습니다.

메모리 누수에 대해 잘 알고 있다면 문제를 해결하고 제거하는 것이 좋습니다. OS 또는 프로그래밍 언어의 어떤 부분도 효과적이지 않을 것입니다. 누수를 정확하게 지적 할 수있는 몇 가지 도구가 있습니다.

2

저는 전문가로서 저들의 직업을 혐오스럽게 생각하는 사람을 돌보지 않는 사람을 생각합니다. 당신은 당신의 직업을 잘하기 위해 노력해야하며, 그것은 당신에게 더 나은 프로그램을 쓰는 것으로 해석 될 것입니다. 메모리 누출을 "중요하지 않음"으로 허용하거나 무시하면 문서, 성능 또는 사용자 편의성과 같이 중요하지 않다고 여겨지는 다른 것들도 동일하게 처리 할 수 ​​있습니다.

자유 방임 태도가 문제를 일으 킵니다. 그래서 저는 메모리 누출이 당신이 당신의 일에 얼마나 가난한지를 보여주는 표식이라고 생각합니다.

그러나 모든 것을 언급하면서 메모리 누수를 무시하지 않는 매우 실질적인 이유가 있습니다. 예를 들어, 사용자가 프로그램을 실행할 기간을 알 수 없습니다. 5 분 또는 5 주일 수 있습니다. 메모리 누수가 쌓이고 다른 일이 실패하기 시작할 때까지 점점 더 많은 리소스를 사용합니다.

사용자가 프로그램을 실행할 때뿐만 아니라 다른 점도 유의해야합니다. 다른 앱도 실행하고 있으며 앱에서 사용하는 리소스가 많을수록 다른 프로그램에서 사용할 수있는 리소스가 적습니다. 메모리 누수를 무시하는 것은 기본적으로 이기적이며 사용자가 문제를 겪고 있지 않은 경우 돌보지 않습니다.

+0

나는 메모리 누수를 무시하지 않을 것이다. 나는 그들의 98 %를 찾아서 고치고있다. 그러나 마지막 2 %는 해결하기가 매우 어렵습니다. 대부분 내 실수는 아니지만 제 3 자 소프트웨어 또는 개발 도구 (Delphi)와 함께 제공되는 루틴에 있습니다. 남은 것은 큰 것이 아니지만 0이 아닙니다. – lkessler

+0

아마도 "누수"가 무엇인지에 대한 다른 정의가있을 것입니다. "누출"은 새는 양동이가 물을 잃는 것처럼 기억을 상실한 경우입니다. 응용 프로그램에 절대로 사용하지 않는 일회성 할당이있는 경우 실제로는 "누출"이 아니지만 대부분의 경우 여전히 나쁜 습관입니다. 여러 가지 프레임 워크, 특히 MFC와 VCL은 운영체제에서 사용되는 메모리를 사전에 준비하지 못했습니다. 왜냐하면이 얼라이먼트가 앱의 초기에 만들어져 프로그램의 수명 동안 지속되기 때문입니다. 그것들은 "누출"이 아니지만 가능하면 피해야합니다. –

+0

네, 생각합니다. 일회성 배정에 대해 이야기하고 있습니다. 질문에 설명을 추가하겠습니다. – lkessler

관련 문제