Post

메모리 할당할 때 저수준 계층에서 일어나는 일


컴퓨터 구조

컴퓨터 구조를 공부하면서 알게된 내용을 요약해서 작성해보자.

커널 상태와 사용자 상태

  • CPU가 운영 체제의 코드를 실행할 때 커널 상태에 놓인다.
  • 커널 상태일 때 CPU의 동작
    • 모든 기계 명령어를 실행할 수 있다.
    • 모든 주소 공간에 접근할 수 있다.
    • 제한 없이 하드웨어에 접근할 수 있다.
  • 운영 체제는 커널 상태에 놓인다.
  • 프로그래머가 작성한 일반적인 코드를 CPU가 실행할 때는 사용자 상태에 해당된다.
  • 사용자 상태는 여러 곳에서 제한을 받는다.
  • 특정 주소 공간에 절대 접근할 수 없다.
  • 제한이 없다면 운영 체제를 kill하는 세그멘테이션 오류가 발생한다.

시스템 호출

  • CPU는 커널 상태에서는 응용 프로그램을 실행할 수 없다.
  • 사용자 상태에서는 운영 체제의 코드를 실행할 수 없다.
  • 시스템 호출을 이용하여 운영 체제가 파일의 읽기, 쓰기, 네트워크 데이터 통신 같은 작업을 응용 프로그램 대신 처리한다.
  • 시스템 호출을 실행할 때 CPU는 사용자 상태에서 커널 상태로 전환되어 운영 체제의 코드를 실행하는 방법으로 사용자 요청을 실행한다.
  • 이런 관점으로 본다면 프로세스는 네트워크 통신에서 클라이언트에 비할 수 있고, 운영 체제는 서버에 비할 수 있다. 시스템 호출은 네트워크 요청에 해당한다.
  • 시스템 호출은 별도의 장소에 담겨 있어 보통은 프로그래머가 직접 시스템 호출을 할 필요가 없다.

표준 라이브러리

  • 시스템 호출은 운영 체제와 매우 밀접하다.
  • 리눅스의 시스템 호출은 윈도우의 시스템 호출과 완전 다르다.
  • 사용자 상태에서 시스템 호출을 사용하면 리눅스의 프로그램은 윈도에서 직접 실행할 수 없게 된다.
    • 시스템 호출 방식이 다르기 때문에 같은 소스 코드를 그대로 가져다 컴파일해서 실행할 수 없다.
  • 사용자에게서 저수준 계층 간 차이를 감추는 일종의 표준이 필요하다.
  • 이것으로 프로그래머가 작성한 프로그램을 추가적인 수정 없이 서로 다른 운영 체제에서 실행할 수 있다.
  • 표준 라이브러리의 코드는 사용자 상태에서도 실행된다.
  • 일반적으로 프로그래머는 표준 라이브러리를 호출하여 파일의 읽고 쓰기 작업과 네트워크 통신을 수행하며, 표준 라이브러리는 실행 중인 운영 체제에 따라 대응되는 시스템 호출을 선택한다.
  • 계층 구조
    • 응용 프로그램
    • 표준 라이브러리
    • 운영 체제
    • 하드웨어
  • 계층 관점에서 보면 전체 시스템 모습은 위 처럼 햄버거 형태를 이룬다.
  • 고수준 계층에는 응용 프로그램이 자리하고 있고, 일반적으로 표준 라이브러리만 의사소통 대상으로 간주한다.
  • 표준 라이브러리는 시스템 호출로 운영 체제와 소통하며, 운영 체제는 저수준 하드웨어를 관리한다.

힙 영역에서 메모리가 부족할 때

  • 힙 영역과 스택 영역 사이에는 여유 공간이 있다.
  • 스택 영역이 함수 호출 단계가 깊어질 수록 아래쪽으로 메모리 점유 공간이 늘어나는 것처럼, 힙 영역의 메모리가 부족하면 위쪽으로 더 많은 메모리를 점유하게 된다.

운영 체제에 메모리 요청하기

  • 리눅스에서는 brk라는 전용 시스템 호출을 제공하는데, 힙 영역의 상단 주소를 brk 시스템 호출을 이용하여 조절하는 방식으로 힙 영역 크기를 늘리거나 줄일 수 있다.

가상 메모리

  • 프로세스 입장에서 사용하는 메모리는 모두 가상 메모리다.
  • 물리 메모리 안에는 구조가 존재하지 않는다.
  • 할당한 메모리가 사용되는 순간에 물리 메모리에 할당된다.
  • 가상 메모리가 아직 실제 물리 메모리와 연결되어 있지 않으면 내부적으로 페이지 누락 오류가 발생할 수 있다.
  • 운영 체제가 이 오류를 감지하면 페이지 테이블을 수정하여 가상 메모리와 실제 물리 메모리의 사상 관계를 설정하며 이것으로 실제 물리 메모리가 할당된다.
  • 이 과정이 완료가 되어야 프로그램에서 할당받은 메모리를 사용할 수 있다.
  • 프로그램이 할당된 가상 메모리를 사용할 때 이 메모리는 반드시 실제 물리 메모리와 사상 관계에 있어야 하며, 이 시점이 되어야 커널 상태에서 실제 물리 메모리가 할당된다.
  • 운영 체제만 실제 물리 메모리를 할당할 수 있다.