메모리 누수 / 시스템 리소스

About_work·2024년 7월 23일
0

cs 기초

목록 보기
38/38

결론

  • 메모리 누수는 프로그램이 더 이상 필요하지 않은 메모리를 해제하지 않는 경우를 말하며, 시스템 성능 저하 및 충돌을 유발할 수 있습니다.
  • 시스템 리소스는 운영체제가 관리하는 다양한 자원(파일 핸들, 네트워크 소켓, 데이터베이스 커넥션 등)을 의미하며, 이를 올바르게 해제하지 않으면 리소스 누수가 발생할 수 있습니다.
  • 시스템 리소스를 올바르게 해제하고 메모리 누수를 방지하기 위해서는 파일, 소켓, 데이터베이스 연결 등을 사용한 후 반드시 이를 해제하거나 닫아야 합니다. Python에서는 with 문을 사용해 자동으로 리소스를 해제하는 것이 좋은 방법입니다.

메모리 누수 (Memory Leak)

메모리 누수란?

  • 프로그램이 더 이상 필요하지 않은 메모리를 해제하지 않아서 발생하는 문제
  • 사용하지 않는 메모리가 계속해서 할당된 상태로 남아 있어, 시스템의 가용 메모리가 점차 줄어들게 됨
  • 이는 결국 시스템 성능 저하나, 심한 경우 시스템이 메모리를 모두 소진해 프로그램이 충돌하거나 중단될 수 있음

예시:

def create_leak():
    leaky_list = []
    while True:
        leaky_list.append("Leak")  # 이 리스트는 끝없이 커져가며 메모리를 차지하게 됩니다.
  • 위의 코드에서는 leaky_list가 무한히 커지면서 메모리 누수가 발생합니다.
  • 이 리스트는 프로그램이 종료되기 전까지 메모리를 해제하지 않으므로 계속해서 메모리를 소모하게 됩니다.

시스템 리소스 (System Resources)

시스템 리소스란?

  • 운영체제가 관리하는 하드웨어 및 소프트웨어 자원
    • 파일 핸들, 네트워크 소켓, 데이터베이스 커넥션, 메모리, CPU 시간
  • 올바르게 관리되지 않으면 리소스 누수(Resource Leak)가 발생할 수 있습니다.

시스템 리소스의 예시:
1. 파일 핸들:

  • 파일을 열 때 생성되는 자원.
  • 예: file = open('example.txt', 'r')
  1. 네트워크 소켓:
    • 네트워크 통신을 위해 열리는 자원.
    • 예: socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  2. 데이터베이스 커넥션:
    • 데이터베이스에 연결할 때 생성되는 자원.
    • 예: connection = sqlite3.connect('example.db')

리소스를 올바르게 해제하는 예시:

파일 핸들을 사용하는 경우:

# 파일을 열고 작업한 후 닫기
file = open('example.txt', 'r')
try:
    data = file.read()
finally:
    file.close()  # 파일 핸들을 닫아 메모리 누수를 방지

더 나은 방법:

# with 문을 사용하여 파일을 자동으로 닫기
with open('example.txt', 'r') as file:
    data = file.read()
# with 블록을 벗어나면 파일이 자동으로 닫힘

네트워크 소켓을 사용하는 경우:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    sock.connect(('example.com', 80))
    # 데이터 송수신 작업
finally:
    sock.close()  # 소켓을 닫아 리소스를 해제

데이터베이스 커넥션을 사용하는 경우:

import sqlite3

conn = sqlite3.connect('example.db')
try:
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM example_table')
    results = cursor.fetchall()
finally:
    conn.close()  # 데이터베이스 커넥션을 닫아 리소스를 해제
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글