///
Search
🛶

프로세스 관리

프로세스의 개념, 상태 및 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)
네트워크로 연결된 서버 상의 프로시저(함수, 메소드 등)을 원격으로 호출할 수 있는 구조