티스토리 뷰

반응형

https://www.youtube.com/watch?v=Jjfah3t_xWk&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=28

 

 

프로세스

실행 중인 프로그램

보조기억장치에 있는 프로그램을 메모리로 가져오는 것을 '프로세스를 생성한다'라고 한다.

 

작업 관리자에서 프로세스 확인 가능 #ps -ef

 

프로세스의 종류

포그라운드 프로세스

사용자가 볼 수 있는 공간에서 실행되는 프로세스

백그라운드 프로세스

사용자가 볼 수 없는 공간에서 실행되는 프로세스

사용자와 상호작용하지 않고 묵묵히 실행되는 프로세스

 

사용자와 상호작용하지 않고 묵묵히 실행되는 프로세스를 데몬(daemon), 서비스(service) 라고도 부른다.

 

프로세스 제어 블록

이러한 프로세스를 어떤 식으로 관리하는가?

모든 프로세스는 실행을 위해 CPU가 필요하다. 그러나 CPU의 자원은 한정되어 있다.

 

프로세스들은 돌아가며 한정된 시간 만큼만 CPU를 이용한다.

  • 자신의 차례에 정해진 시간만큼 CPU 이용
  • 시간이 끝나면 다음 프로세스에게 양보한다.
  • 타이머 인터럽트가 발생하면 차례 양보
  • 타이머 인터럽트 : 클럭 신호를 발생시키는 장치로 인해서 주기적으로 발생되는 하드웨어 인터럽트

 

이렇게 빠르게 번갈아 수행되는 프로세스들을 관리해야 한다.

이를 위해 사용하는 자료구조(자료를 저장하는 형태)가 프로세스 제어 블록(이하 PCB) 라고 한다.

PCB

  • 프로세스 간련 정보를 저장하는 자료 구조
  • 마치 상품에 달린 태그와 같은 정보
  • 프로세스 생성 시 커널 영역에 생성, 종료 시 폐기

PCB에 담기는 대표적인 정보

  • 프로세스 ID (=PID) - 특정 프로세스를 식별하기 위해 부여한 고유 번호(학교의 학번, 회사의 사번)
  • 레지스터 값 
    • 프로세스는 자신의 실행 차례가 오면 이전까지 사용한 레지스터 중간 값을 모두 복원 -> 실행 재개
    • 인터럽트가 왔을 때, 이전에 프로그램 카운터 값을 까먹어 버린다면 의미가 없다.
    • 그래서 이전까지 실행했던 내용을 다시 자기 차례가 오면 실행을 재개하기 위해서 필요하다.
    • 프로그램 카운터, 스택 포인터
  • 프로세스 상태 - 입출력 장치를 사용하기 위해 기다리는 상태, CPU를 사용하기 위해 기다리는 상태, CPU 이용 중인 상태
  • CPU 스케줄링 정보 - 프로세스마다 CPU를 돌아가면서 사용하기 때문에, 언제 어떤 순서로 CPU를 할당받는지에 대한 정보
  • 메모리 정보 - 프로세스가 어느 주소에 저장되어 있는지에 대한 정보
    • 프로그램 카운터, 스택 포인터
    • 페이지 테이블 정보(메모리 주소를 알 수 있는 정보)
  • 사용한 파일과 입출력장치 정보 - 할당된 입출력장치, 사용 중인(열린) 파일 정보

 

문맥 교환(context switch) - 가장 중요

한 프로세스(A)에서 다른 프로세스(B)로 실행 순서가 넘어가면, 어떤 작업이 이루어질까?

 

기존에 실행되던 프로세스 A는 지금까지의 중간 정보(context)를 백업

  • 프로그램 카운 터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력 장치 등
  • 이러한 중간 정보가 문맥(context)다.
  • 즉, 문맥은 다음 차례가 왔을 때, 언제든지 해당 프로세스를 재개하기 위한 장치이다.
  • 실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다.

뒤이어 실행할 프로세스 B는 문맥을 복구

  • 자연스럽게 실행 중인 프로세스가 바뀜

이 과정을 문맥 교환(context switching)이라 한다.

  • 여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리

ex) A의 문맥을 PCB에 저장, 프로세스 B의 PCB로부터 문맥 가져오기

프로세스 B의 문맥을 PCB에 저장, 프로세스 A의 PCB로부터 문맥 가져오기

 

PCB는 커널영역에 있는 꼬리표와 같은 자료구조다.

그러면 사용자 영역에는 어떻게 저장되는가?

 

프로세스의 메모리 영역

사용자 영역에서 프로세스는 특정 영역을 나눠서 저장된다.

크게 코드 영역(=텍스트 영역), 데이터 영역, 힙 영역, 스택 영역

 

코드 영역(=텍스트 영역)

  • 실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장되는 곳
  • 데이터가 아닌 CPU가 실행할 명령어가 담긴 공간이기에, 쓰기가 금지된 영역이다(read-only)

데이터 영역

  • 잠깐 썻다가 없애 데이터가 아닌, 프로그램이 실행되는 동안 유지할 데이터 저장
  • e.g = 전역 변수
  • 데이터 영역은 크기가 변하지 않고, 고정된다(정적 할당 영역이라고도 부른다)
  • 실행되는 동안 명령어가 바뀔 일은 없으므로

힙 영역

  • 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간
  • 이만큼의 저장공간을 직접 할당하고 싶다.
  • 참고로 힙 영역에 할당했다면 언젠가는 그 메모리 공간을 반환해야 한다.
  • 이를 가비지 컬렉션(garbage collection)이라고 한다.
  • 옛날 프로그래밍 언어(C언어) 같은 경우는 가비지 컬렉션이 없다.
  • 그러면 메모리 낭비를 초래하는 데, 이를 메모리 누수(memory leak)라고 한다.

스택 영역

  • 데이터가 일시적으로 저장되는 공간
  • 데이터 영역에 담기는 값과는 달리, 잠깐 쓰다가 말 값들이 저장되는 공간
  • e.g = 매개 변수, 지역 변수

힙 영역과 스택 영역은 동적으로 변할 수 있다.

 

일반적으로 힙 영역은 낮은 주소 -> 높은 주소로 할당

일반적으로 스택 영역은 높은 주소 -> 낮은 주소로 할당

만약 힙 영역과 스택 영역이 붙어있다면, 언젠가 부딪히고, 그리고 메모리에서 영역이 좁아진다.

그래서 아예 반대 방향에 두고서 각각 할당시킨다.

반응형