프로세스의 개념, 상태 및 PCB
프로세스의 개별 구성요소를 이해
프로세스
•
실행 중인 프로그램
•
디스크에 저장된 수동적 파일(실행 파일)이 메모리에 적재 될 때, 비로소 프로세스가 됨!
ex) 크롬(프로그램) → 크롬으로 실행한 인터넷 페이지(프로세스)
프로세스 스케쥴링 과 잡(job) 스케쥴링은 같은 용어(term)이다.
메모리 상에서의 프로세스
•
스택(Stack) 세션
◦
함수 호출 시 임시 데이터 저장
◦
라스트 인 라스트 아웃
예) 함수 매개 변수, 반환 주소, 지역 변수
•
힙 세션
◦
프로그램 실행 시 동적으로 할당되는 메모리
•
데이터 세션
◦
전역변수
◦
프로그램을 실행~종료까지 지워지지 않는 데이터들을 저장
•
텍스트 세션
◦
실행 코드
데이터, 힙, 스택 세션 → 다른 주소값을 가진다.
텍스트 섹션(코드) → 같은 주소값을 가진다.
사용자가 관리 할 수 있는, 관리 해야 하는 힙(Heap) 영역
사용자는 힙 메모리에 참견이 가능하다
[CASE]
Q. WAS(Web Application Server)에 배포한 엔터프라이즈 코드에 대용량 엑셀 업/다운로드 기능이 있어요. 문제는 해당 기능을 실행하기만 하면, 서버에 OOM(Out Of Memory) 에러가 발생해요!
A. 우선 Tomcat 프로세스 기동할 때 Java 힙 메모리 설정에 –Xms2048m –Xmx2048m 옵션을 적용해봅시다!
⇒ 힙메모리가 자동으로 할당한 메모리가 부족해서 사용자가 미리 설정해야한다
프로세스 상태
프로세스 상태 별 설명
new
•
job을 커널에 등록
•
PCB 할당 및 프로세스 생성
•
커널
◦
가용 메모리 공간 체크 및 프로세스 상태 전이(new → ready)
ready
•
프로세서 외에 다른 모든 자원을 할당 받은 상태 (프로세서만 할당되면 즉시 실행 가능 상태)
•
dispatch : ready → running
running state
•
프로세서와 필요한 자원을 모두 할당 받은 상태
•
I/O 가 필요할 때 running → waitting으로 상태 전환
waiting
•
프로세스가 어떤 사건(입출력 완료 또는 신호의 수신 같은)이 일어나기를 기다림
•
프로세서 외에 다른 자원(사건 혹은 입출력)을 기다리는 상태
•
자원 할당은 system call에 의해 이루어짐
•
wake up : waiting → ready
terminated
•
프로세스 수행이 끝난 상태
•
모든 자원 반납 후
•
커널 내에 일부 PCB 정보만 남아 있는 상태
◦
프로세스 수행 후 terminated 상태에 들려 커널이 해당 프로세스 정보를 수집하게 함
◦
정보 수집 후 커널이 위의 프로세스 삭제
Process Control Block (PCB) ⇒ 프로세스 제어 블록
각 프로세스는 운영체제에서 프로세스 제어 블록(Process Control Block)에 의해 표현
•
OS가 프로세스 관리에 필요한 정보(데이터)를 저장하는 블록
•
프로세스 생성 시, 커널에 생성 됨
•
각 프로세스들에 대한 상태정보 저장
프로세스 상태 : New, Ready, Running, Waiting, Halted등
프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
CPU 레지스터 : 누산기, 인덱스 레지스터, 스택 레지스터, 범용 레지스터, 상태 코드 정보 포함
메모리 관리 정보 : 기준 레지스터와 limit레지스터의 값, 페이지 테이블, 세그먼트 테이블 등
CPU 스케쥴링 정보 : 프로세스 우선 순위, 스케쥴링 큐에 대한 포인터와 다른 매개변수들을 포함
PCB가 관리하는 정보 (프로세스의 동작 상태)
•
PID : Process Identification Number
◦
프로세스 고유 식별 번호
•
스케줄링 정보
◦
프로세스 우선순위 등과 같은 스케줄링 관련 정보들
•
프로세스 상태
◦
자원 할당, 요청 정보 등
•
메모리 관리 정보
◦
Page table, segment table 등
•
입출력 상태 정보(I/O status)
◦
할당 받은 입출력 장치, 파일 등에 대한 정보 등
•
문맥 저장 영역 (context save area)
◦
프로세스의 레지스터 상태를 저장하는 공간 등
•
계정 정보
◦
자원 사용 시간 등을 관리 (다중 사용자)
•
PCB 정보는 OS 별로 서로 다름
•
PCB 참조 및 갱신 속도는 OS의 성능을 결정 짓는 중요한 요소 중 하나
프로세스 스케쥴링
스케쥴링의 목적 및 종류와 흐름을 확인한다
어떻게 CPU 이용을 최대화 할 수 있을까?
→ 쉬지 않고 일을 해야 함. 항상 어떤 프로세스가 실행 될 수 있도록 함(다중 프로그래밍)
→ 프로세스 스케쥴러는 CPU에서 실행 가능한 여러 프로세스들 중에서 하나의 프로세스를 선택
→ 목적 : 대기시간 최소화, 최대한 공평하게, idle 최소화
프로세서 스케쥴링을 표현하는 큐잉 도표
단기 스케쥴러
•
CPU 스케쥴러
•
타이머 인터럽트가 발생 시 호출
•
실행 빈도 높음
•
선점형
•
비선점형
중기 스케쥴러
•
일부 운영체제가 도입
•
너무 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 경우 이를 해결하기 위해 메모리에 적재된 프로세스의 수를 동적으로 조절하기 위해 추가된 스케줄러
◦
실행중인 프로세스의 수 제어
◦
메모리에 적재된 프로세스 수 관리
•
스왑아웃(swap out)
•
Suspended(stopped)
장기 스케쥴러
•
메모리와 디스크 사이의 스케줄링을 담당
•
실행 빈도 낮음
•
실행 중인 프로세스의 수 제어
•
입출력 중심 + CPU 중심 적절한 혼합 중요
•
시분할 시스템에서 사용되는 운영 체제에는 일반적으로 장기 스케줄러를 두지 않는 경우가 대부분
컨텍스트 스위치
인터럽트를 떠올려보자
•
인터럽트는 운영체제가 현재 작업에서 CPU(프로세서)를 빼앗아 커널 루틴을 실행할 수 있게 함
•
종료 후 본래 작업중이던 프로세스를 재개함
그렇다면 프로세스를 재개하려면…
•
어떤 값을 저장해야 할까? 실행 중이던 프로세스의 문맥(Context)
◦
context : 프로세스와 관련된 정보들의 집합
▪
cpu 레지스터 값, 프로세스 정보, 메모리 관리 정보 등
▪
CPU 레지스터 컨텍스트 ⇒ CPU
▪
code, data, stack, pcb ⇒ memory
•
어느 곳에 저장해야 할까? PCB
•
이 작업을 어떻게 칭해야 할까? 컨텍스트 스위치
•
실행 중이던 작업 중간에 다른 작업의 수행이 필요할 때,
이전 프로세스 상태를 보관, 프로세스 재개 시 참조할 수 있도록 한다
•
컨텍스트 복구 작업, 다른 프로세스로 교환하는 작업
•
PCB에 실행중이던 프로세스 레지스터 context를 저장
컨텍스트 스위치가 진행될 동안의 시스템
→ 그 동안 시스템은 아무런 유용한 일을 하지 못한다
→ 컨텍스트 스위치 소요시간은 순수한 오버헤드
프로세스 생성
•
실행되는 동안 프로세스는 여러 개의 새로운 프로세스들을 생성함
◦
프로세스를 생성하는 주체는 부모 프로세스, 새로운 프로세스는 자식 프로세스
•
대부분의 운영체제는 고유의 프로세스 식별자(pid)를 사용하여 프로세스를 구분
•
프로세스가 자식 프로세스를 생성할 때
◦
자식 프로세스는 운영체제에게 자원을 직접 얻을 수 있고,
◦
부모 프로세스가 가진 자원의 부분 집합만을 사용하도록 제한
•
프로세스가 새로운 프로세스를 생성할 때
◦
부모 프로세스는 자식 프로세스와 동시에 구동
◦
부모 프로세스는 자식 프로세스 전부/일부가 종료될 때까지 대기
일반적인 Linux 시스템의 프로세스 트리
프로세스 연산(생성, 종료)
UNIX예제를 통해 알아보는 fork(), exec()
1.
fork() 시스템 콜로 새로운 프로세스 생성
2.
두 프로세스 중 한 프로세스가 exec() 시스템 콜을 사용
exec() 시스템 콜 : 자신의 메모리 공간을 새로운 프로그램으로 교체
3.
exec() 시스템 콜은 바이너리 파일을 메모리로 적재
프로그램 실행 시작
4.
자식 프로세스가 종료될 때까지 부모 프로세스는 wait()
•
자식프로세스에게 보이는 pid는 0 / 부모프로세스에게 보이는 pid값은 0보다 큰
정수값(리턴값)
•
자식프로세스는 리소스 권한, 스케쥴링 속성을 부모 프로세스로부터 상속
•
부모는 wait() 시스템콜로 자식 프로세스가 종료되기를 대기
•
자식 프로세스 종료 후 부모는 wait()으로부터 프로세스를 재개하여 exit()으로 종료
프로세스 연산(생성, 종료)
•
최종 실행이 종료된 뒤 exit()을 통해 운영체제에 삭제를 요청
◦
대기 중인 부모 프로세스에게 상태 값을 리턴
◦
운영체제에 의해 모든 프로세스의 자원들은 할당 해제
•
부모 프로세스가 자식 프로세스를 종료 시키는 경우(abort())
◦
자식이 할당된 자원의 사용량을 초과하는 경우
◦
자식 task가 더 이상 필요하지 않은 경우
◦
부모가 종료되었고, 자식은 종료되지 않았을 때 자식만 실행될 순 없음
•
좀비 프로세스(zombie process)
◦
종료되었지만 부모 프로세스가 아직 wait() 콜을 하지 않은 프로세스
◦
부모가 wait()콜을 하면 좀비 프로세스의 pid와 프로세스 테이블 항목(PCB)이 운영체제에게 반환
•
고아 프로세스(orphan process)
◦
부모 프로세스가 wait()을 콜하는 대신 종료하게되면 자식은 고아프로세스가 됨
◦
Linux, UNIX 계열은 고아 프로세스의 새로운 부모 프로세스로 init프로세스를 지정하여 문제를 해결
IPC
프로세스 간 통신 (IPC)
•
프로세스들은 독립적이거나, 협력적
•
협력 프로세스는 데이터 공유를 포함하여, 프로세스들에게 영향을 주거나 받음
•
협력을 허용하는 환경을 제공하는 이유
→ 정보 공유, 계산 가속화, 모듈성, 편의성
•
프로세스 간 통신(Inter Process Communication, IPC) 기법을 필요로 함
IPC의 두 가지 모델
•
공유 메모리 : 공유 메모리를 활용한 프로세스 간 통신
•
메세지 전달(메세지큐) : 메세지 큐를 이용한 프로세스 통신
•
공유 메모리
◦
통신하는 프로세스들이 공유 메모리 영역을 구축해야 함
◦
생산자 – 소비자 문제
▪
해결책 : 공유 메모리 사용. 버퍼가 반드시 사용 가능해야 함.
▪
무한 버퍼 : 버퍼의 크기에 실질적인 한계가 없음
▪
유한 버퍼 : 버퍼 크기 고정
버퍼가 비어있으면 ➔ 소비자는 반드시 대기
모든 버퍼가 채워져 있으면 ➔ 생산자가 대기
▪
공유메모리는 속도에 유리
프로세스 간 통신
코드로 보는 생산자 / 소비자 프로세스
•
메세지 전달(메세지 큐)
◦
동일한 주소 공간을 공유하지 않는다
◦
프로세스들이 통신을 하고, 그 동작을 동기화할 수 있도록 허용하는 기법
◦
send(message) / receive(message) 연산 제공
◦
논리적 구현 방법
▪
직접, 간접 통신
▪
동기식, 비동기식 통신
▪
자동, 명시적 버퍼링
1.
직접 통신, 간접 통신
•
직접 통신
◦
통신을 원하는 각 프로세스는 통신의 수신자 또는 송신자의 이름을 명시해야 함
◦
연결(link)이 자동적으로 생성
◦
연결은 정확히 두 프로세스들 사이에만 연관
◦
프로세스들의 각 쌍 사이에는, 정확히 한 연결만 존재
◦
대칭 주소 지정 : 발신자, 수신자 프로세스 모두 이름 지정하여 통신
◦
비대칭 주소 지정 : 발신자만 수신자의 프로세스 이름 지정
•
간접 통신
◦
메일함 또는 포트로 메시지 송수신
◦
두 프로세스는 프로세스가 공유된 경우에만 통신 가능
◦
두 구성원이 모두 있는 경우에만 연결 설정(공유 메일함 존재)
◦
연결은 두 개 이상의 프로세스와 연결 가능
◦
프로세스의 각 쌍 상태에는 여러가지 서로 다른 연결이 존재
◦
공유 메일함 : 프로세스 혹은 운영체제에게 소유권이 존재
Q. A 메일함을 공유하는 P1, P2, P3 중 P1이 A에 메시지를 보낸다면,
누가 메시지를 받아야 할까요?
1) 최대 2개의 프로세스가 링크를 공유하도록 구성
2) 한번에 한 프로세스만 receive 연산을 수행할 수 있도록 함
3) 송신자가 수신자를 선택할 수 있도록 함
2.
메시지 큐 – 동기화 (동기, 비동기)
•
Blocking 모드(동기)
◦
Send: 송신된 메시지가 수신될 때까지 송신자를 블록(정지)
(혹은 큐에 메시지가 가득 차 있을 때 블록)
◦
Receive: 이용 가능한 메시지가 있을 때까지 수신자를 블록(정지)
•
Non-Blocking 모드(비동기)
◦
Send: 메시지를 전달한 뒤 다른 작업을 처리
◦
Receive: 유효한 메시지를 받거나 null 메시지를 수신
◦
통신 프로세스 간 교환되는 메시지는 임시 대기열에 존재
3.
메시지 큐(메세지 전달) – 자동, 명시적 버퍼링
•
용량 Zero (최대 길이 0)
◦
발신자는 수신자가 메시지를 받을 때까지 차단
•
제한된 용량 (유한 길이 n)
◦
연결이 가득 차면 발신자는 대기열 공간이 확보될 때까지 차단
•
무한 용량
◦
발신자는 절대 차단하지 않음
공유 메모리, 메시지 큐
•
공유메모리
◦
속도에 유리
•
메세지 큐
◦
구현 용이성, 분산 환경
원격 프로시저 호출(Remote Procedure Call, RPC)
•
네트워크로 연결된 서버 상의 프로시저(함수, 메소드 등)을 원격으로 호출할 수 있는 구조