Linux&OS

[운영체제] 메모리 구조 정리

Alex, Yoon 2022. 4. 5. 16:28

출처 : https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/

출처 : https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

프로그램 실행 순서

위의 순서에 따라 HDD 저장장치에 있는 데이터를 RAM으로 가져오게 되면 아래와 같은 공간처럼 할당되어 집니다. 

 

메모리 구조 

출처: https://jinshine.github.io/

코드영역 (Code)

* 소스코드 저장 공간 (텍스트 영역)

텍스트 영역이라고도 불리우는 이 저장 공간에는 개발자가 작성한 프로그램의 '코드'가 저장되어 지는 영역. 

함수, 제어문, 상수 등의 저장공간. 

데이터 영역 (Data) 

* 전역변수, 정적변수가 저장되는 공간

프로그램 시작과 동시에 할당, 종료될 때 까지 남아있는 영역. 

힙 영역 (Heap)

* 사용자가 입력하는 동적 정보를 할당. 

* 런타임 시, 크기가 결장된다. 

개발자가 할당&해제하는 메모리 공간

자바에서는 가비지 컬렉터가 자동으로 해제,

파이썬에서는 gc.collect( ) 명령어로 힙 영역 해제 및 메모리 조정.

 

힙 영역에 메모리를 할당하는 것을 '동적' 할당이라고 부른다.

스택 영역 (Stack)

* 함수 정보, 함수 내에서 사용하는 지역 변수, 매개 변수 -> 함수 호출이 완료되면 사라진다. 

* Stack 영역은 후입선출(LIFO) 방식으로 이루어져 있음. -> 자료구조의 개념

  • 만약 여러개의 함수가 차례로 실행되어야 하는 구조가 되었을 때 -> 자료구조 (차곡차곡 쌓이는 구조 : 차례대로 함수가 실행되어야 하는 구조)

프로그램이 자동으로 사용하는 임시 메모리 영역. 

함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역. 

함수 호출이 완료되면 사라짐. 

위의 힙, 스택 영역은 사실 같은 공간을 공유한다. 

HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOWSTACK OVERFLOW라고 칭함. 

즉, Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아지낟.

프로세스, 스레드 

프로세스 : 실행중인 프로그램 

스레드 : 프로세스 안 실행 단위

프로세스 안에서는 실행단위가 스레드 임. 

프로세스의 특징. 

각각의 독립된 메모리 영역(코드, 데이터, 스택, 힙)을 할당받는다. 

즉, 메모리와 CPU를 '프로세스' 마다 할당받아서 사용함. 

기본적으로 프로세스 당 최소 1개의 스레드를 가지고 있다. 

스레드의 특징. 

스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 코드, 데이터, 힙 영역공유한다. 

스레드는 Stack을 독립적으로 사용한다.

즉, 프로세스가 할당받은 메모리와 CPU는 공유하되, 다른 스레드와 Stack은 공유하지 않는다.

한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

CPU 스케줄러 

다중 프로그램 OS의 기본으로, 여러 프로세스들이 CPU를 교환하며 보다 생산적으로 동작한다.

CPU를 선점한 프로세스가 대기하는 시간을 보다 효율적으로 사용하기 위하여 사용한다.

준비 큐에 있는 프로세스를 프로세서에 할당하는 과정을 조율. 

비선점 스케줄링

FCFS (First Come First Served)

먼저 CPU를 요청하는 프로세스를 먼저 처리하는 방법

P1 → P2 → P3 순으로 프로세스가 CPU를 요청할 때, CPU는 아래와 같이 시간을 쓴다.

https://hyunah030.tistory.com/4

  • P3는 P1보다 걸리는 시간(Burst time)이 짧지만, CPU를 늦게 요청했기 때문에 총 걸리는 시간(Turnaround Time)이 길다.

SJF (Shortest Job First) 

평균 웨이팅 타임을 최소화하기 위해 사용. 

버스트 시간(cpu 사용시간)이 짧은 프로세스부터 CPU를 할당. 

프로세스 버스트 시간이 '짧은' 프로세스 순으로 구동. 

 

선점 스케줄링 

SRT (Shortest Remaining Time)

최단 잔여시간을 우선으로 하는 스케줄링

진행 중인 프로세스가 있어도, 최단 잔여시간인 프로세스를 위해 sleep시키고 짧은 프로세스를 먼저 할당한다.

 

RR(Round Robin)

공평하게 할당하여 사용. 

Time Sharing System을 위해 설계된 스케줄링 

모든 프로세스가 같은 우선순위를 가지고, time slice를 기반으로 스케줄링. 

타임 슬라이스 burst가 일어나면 해당 프로세스는 스케줄링 큐의 끝으로 이동. 

# 중요

타임 슬라이스/퀀텀이 심하게 크다면, FCFS와 다를게 없다. 

혹은 너무 짧다면, 불필요한 Context switch가 많이 일어난다. 

타임 퀀텀을 적당하게 하는 것이 중요함. 

우선순위 스케줄링(Priority Scheduleing) .

 

반응형