CS - 3. 프로세스 생명주기와 프로세스 메모리
Sparta 내일배움캠프 학습으로, CS강의에 대한 공부를 위한 필기입니다.
01. 프로그램과 프로세스
프로그램이 저장되어 있는 곳 = 보조기억장치 ex) HDD
프로그램이 로딩되는 곳 = 주기억장치 -> OS에서 켜져있는 프로그램
- 프로그램을 실행해주는 주체 = 프로세스
프로세스 : 컴퓨터에서 실행 중인 프로그램
- 작업을 처리해 주는 주체 = 쓰레드
카카오톡에서 메시지 발생을 처리하는 작업 : 쓰레드 , 카카오톡 : 프로세스
02. 프로세스 생명주기
2-1. 프로세스 상태 (Status)
📌 신규(New) :
프로세스가 이제 막 메인 메모리에 올라온 상태
- 아직 실행 불가능
- 수용 동작을 거쳐야 준비 단계로 넘어감
📌 준비(Ready)
변수 초기화 등 기초 준비작업을 모두 끝나고 실행을 할 수 있는 상태
스케줄러를 통해 발송(dispatch)되어야 수행 상태가 됨.
준비상태 - 신규 프로세스가 수용됨. - 대기 프로세스의 입출력/이베트가 완료됨 - 수행 프로세스가 중단됨.
📌 수행(Running)
CPU가 실제로 프로세스를 수행하고 있는 상태
- 선점 스케줄링에 의해 중단되면 준비상태로
- 입출력/이벤트가 필요하면 대기상태로
- 수행이 완료되면 종료상태로
1
2
3
4
5
6
7
💡 수행상태 해제되는 경우
- 수행 -> 준비(중단)
- CPU의 과부하가 판단되는 경우
- 수행 -> 대기
- I/O event wait가 있을 경우
- 이후 I/O나 event가 끝나면 ready 상태로 복구
📌 대기(Watinig)
프로세스 도중에 I/O 작업이 필요하여 I/O 작업을 수행하는 상태
- CPU는 I/O를 기다리며 다른 프로세스를 수행
- 대기 상태가 끝나면 프로세스는 다시 준비 상태가 되고, 잠시 후 다시 수행 상태가 됨.
📌 종료(Terminated)
- 최종적으로 프로세스가 종료된 상태로 사용하던 메모리 영역이 해제됨.
2-2. 대기큐(Waiting Queue)
1️⃣ Job Queue
- HDD에 있던 프로그램들이 메모리에 올라올 때, 메인 메모리가 가득 찼거나 CPU가 다른 작업을 수행 중이라면 메모리에 올라오기 전에 어느정도 기다려야 하는데 HDD의 프로그램들이 잠시 기다리는 곳을 Job Queue라고 함.
2️⃣ Ready Queue
- 메인메모리에 프로그램이 올라왔다고 하더라도 바로 CPU의 서비스를 받을 수 있는 것은 아님
- 다른 프로그램이 수행 중이면 기다렸다 해당 프로그램이 I/O를 시작하거나, 시공유 시스템의 경우 기존 프로세스가 시간 초과되면 실행됨
- 이미 메모리에 올라온 프로세스들이 실행을 위해 대기하는 곳을 Ready Queue라고 함
3️⃣ Device Queue
- I/O장치를 이용하려면 기존 I/O 작업이 끝나기를 기다렸다가 밀려있던 모든 작업이 끝나면 I/O 장치를 사용할 수 있음.
- 각각 I/O 장치들(프린터는 프린터큐, 마우스는 마우스 큐 둥)은 각자의 대기 큐를 가지고 있는데 이러한 I/O 장치들을 통틀어서 Device Queue라고 함.
1
2
❓ Terminated는 왜 대기큐가 없을까?
: 프로세스가 종료될 때는 기다릴 필요 없이 바로 종료되기 때문에
2-3. 스케줄링(Scheduling)
1️⃣ Job Scheduler
- Job Queue의 프로그램들은 어떤 순서로 메모리에 올릴 것인지 결정함.
- 프로그램이 새로 시작될 때, 메인 메모리가 가득찬 경우 등의 상황에만 발생해서 자주 일어나지 않고 어쩌다 한번 일어남.
- Long Term Scheduler
- 2️⃣ CPU Scheduler
- Ready Queue의 프로그램들을 어떤 순서로 서비스 할 것인지에 대한 스케줄러
- 모든 스케줄러 중에 가장 중요
- Short Term Scheduler : 이러한 과정은 1초에도 수십번, 많게는 수백번도 일어남
- 3️⃣ Device Scheduler
- Device Queue의 프로세스들을 어떤 순서로 I/O장치를 처리할 것인지에 대한 스케줄러
2-4. 주-보조 교환 (Swapping)
- Swapping
서버와 같이 여러 사용자가 하나의 메모리를 공유하는 경우, 만약 한 사용자가 자리를 비우면 그 사용자가 돌아올 때까지 해당 프로세스에 메모리를 할당할 이유가 없음
PCB의 CPU Time등을 확인해 오랫동안 동작이 없는 프로세스는 잠시 HDD로 내려놓고, 다른 프로세스를 실행하거나 기존 프로세스에 메모리를 더 할당하는 등 메모리를 더 효율적으로 활용
동작이 없던 프로세스 사용자가 돌아와서 작업을 수행하면 다시 HDD에서 메모리로 프로세스를 올림
- Swap Out
- 메모리에서 HDD로 내리는 작업
- Swap In
- HDD에서 다시 메모리로 올리는 작업
- 임시 메모리의 목적으로 사용되는 HDD 공간을 Backing Store 혹은 Swap Device 라고 함.
1
2
3
4
💡 Midium Term Sheduler
- Swapping 역시 여러 프로세스들이 HDD로 내려가고
다시 메모리로 올라오고 하기 때문에 어떤 순서로 프로세스를
먼저 내리고 올릴지 결정해야 함.
2-5. 문맥 교환 (Context Switching)
1️⃣ Context Switching :
- CPU 시간공유 시스템의 경우 일정 시간이 지나면 기존 프로세스를 준비 상태로 만들고 다른 프로세스를 수행 상태로 만들어서 실행함.
- 이렇게 실행하는 프로세스를 Switch 하는 것을 통틀어서 Context Switching 이라고 함.
- 2️⃣ Scheduler
- Context Switching을 전문적으로 담당하는 스케줄러는 CPU Scheduler
- 3️⃣ Dispatcher
만일 프로세스 A의 코드 중 100번 라인까지 실행했고 작업 중에 10개의 데이터를 레지스터에 저장했었다면, 스위치 할 때 이 정보들을 보존해야 A의 차례가 돌아왔을 때 이전에 수행하던 작업이 끊기지 않고 수행될 수 있음.
프로세스 A를 수행하다가 B로 넘어가면 그러한 정보를 저장하고 다시 A의 차례가 왔을 때 정보를 다시 꺼내서 PC, SP, Register 등에 할당함. 이러한 작업을 수행하는 프로그램을 Dispatcher라고 함
03. 프로세스 메모리
3-1. 프로세스 메모리 구조
위에서부터 아래로 갈수록 높은 메모리 주소로 감
1️⃣ Code 영역
- 실행할 프로그램의 코드가 저장, CPU는 명령어를 하나씩 가져와 처리
- 2️⃣ Data 영역
전역변수와 정적변수가 저장, 이 변수들을 프로그램이 시작될 때 할당되어 프로그램 종료 시 소멸
BSS 영역
- 초기화 되지 않은 전역변수가 저장
- 초기화된 전역변수는 Data영역에 저장되어 비휘발성 메모리인 ROM에 저장되는데 이 부분은 비용이 많이 들기 때문에 RAM, ROM 영역을 구분해 사용
- 3️⃣ Stack 영역
호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 공간
- 함수 호출시 기록, 함수 수행이 완료되면 사라짐, 메커니즘은 자료구조(stack)에서 배운 LIFO 방법으로 저장/출력
- 컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 할 수 없음
- 재귀함수가 반복해서 호출하거나 함수가 지역변수 메모리를 초과할 정도로 너무 많이 가지고 있다면 stack overflow 발생
- 4️⃣ Heap 영역
동적 데이터 영역
- 메모리 주소 값에 의해서만 참조되고 사용되는 영역으로 프로그램 동작 시에 크기가 결정
- heap 영역은 런타임에 결정되고 자바에서는 객체가 heap 영역에 생성되고 GC에 의해 정리됨.
GC(Garbage Collector) : 안쓰는 heap영역을 치움
3-2. 커널 프로세스 메모리
📌 커널(Kernel)
- 커널은 OS의 주요 구성 요소로 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스, 두가지 관리 리소스에서 최대한 효과적으로 통신함
커널 != 운영체제로, 커널은 운영체제의 주요 구성요소임
커널은 메모리 관리, 프로세스 관리, 하드웨어와 프로세스 사이에서 명령을 즉시 실행할 수 있는(인터프리터) 역할을 수행하거나 시스템의 호출이나 보안 등의 기능 수행
- 대부분 OS에서 커널은 하나의 프로세스가 아니라 컴퓨터 하드웨어와 프로세스를 잇는 인터페이스로 봐야 함.
1️⃣ Code 영역
시스템 콜, 중단(인터럽트) 처리 코드
- CPU, 메모리 등 자원관리를 위한 코드
- 편리한 인터페이스 제공을 위한 코드
- 2️⃣ Data 영역
CPU, Memory 등 HW 자원을 관리하기 위한 자료구조가 저장
PCB(Process Controll Block) 자료구조가 저장
현재 수행 중인 프로세스 상태, CPU 사용 정보 등을 유지하기 위한 자료구조
- OS가 프로세스에 대한 정보를 담고있는 구조체
- 중요한 정보들이 담겨있기 때문에 OS-> 커널 내부에 담겨짐
- 3️⃣ Stack 영역
- 각 프로세스의 커널 스택을 저장
- 프로세스는 함수 호출시 자신의 복귀 주소를 저장하지만, 커널 내의 주소가 됨
- 각 프로세스의 커널 스택을 저장
1
2
3
4
5
6
❓ 커널은 힙메모리가 없는가?
- 커널은 힙메모리를 사용하지 않음.
- 커널은 OS에서 동적메모리 할당을 위해 필요한 기능들을 커널이
제공하는데 OS는 커널에서 제공하는 기능을 사용해서 메모리 풀
(memory pool)을 관리함