728x90
프로그램 vs 프로세스
- 프로그램
- 저장장치에 저장되어 있는 정적인 상태
- 프로세스
- 실행을 위해 메모리에 올라온 동적인 상태
- 프로그램으로 작성된 작업 절차를 실행에 옮김
- 하나의 작업 단위 (=태스크, task)
- 프로그램에서 프로세스로 전환
- 프로그램이 운영체제로부터 프로세스 제어 블록 (PCB, Process Control Block)을 받으면 프로세스가 됨
- 프로세스 = 프로그램 + 프로세스 제어 블록
프로세스 상태
- 생성 상태 (create status)
- 프로그램이 메모리에 올라오고 운영체제로부터 프로세스 제어 블록 할당받은 상태
- 메모리 할당, 프로세스 제어 블록 생성
- 준비 상태 (ready status)
- 프로세스가 CPU를 얻을 때까지 기다리는 상태
- 프로세스 제어 블록은 준비 큐 (ready queue)에서 대기
- 디스 패치 (dispatch) : CPU 스케줄러가 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 작업
- 실행 상태 (runnig/execute status)
- 준비 상태에 있는 프로세스 중 하나가 CPU 스케줄러에 의해 CPU를 얻어 실제 작업을 수행하는 상태
- 실행 상태에 들어가는 프로세스 수 = CPU의 개수
- 주어진 시간(=타임 슬라이스, 타임 퀸텀) 안에 작업이 끝나면 완료상태로 진입 (exit)
- 끝나지 않았다면 프로세스는 준비 상태로 돌아와(=타임 아웃) 다음 차례를 기다림 (timeout)
- 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 대기상태로 옮김 (block)
- 대기 상태 (blocking/wait status)
- 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태
- 프로세스는 입출력장치별로 마련된 큐에서 대기하다 입출력이 완료되면 인터럽트가 발생하고, 인터럽트가 프로세스를 찾아서 준비 상태로 이동 (wakeup)
- 완료 상태 (terminate status)
- 프로세스가 종료되는 상태
- 코드, 사용했던 데이터를 메모리에서 삭제하고 프로세스 제어 블록 폐기
+)
- 휴식 상태 (pause status)
- 프로세스가 작업을 일시적으로 쉬고 있는 상태
- 프로세스가 메모리에 있으나 멈춘 상태
- 보류 상태 (suspend status)
- 프로세스가 메모리에서 잠시 쫓겨난 상태
- 스왑 영역에 있는 상태
프로세스 제어 블록
- 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조
- 프로세스 제어 블록의 구성
- 포인터 : 프로세스 제어 블록을 연결하여 준비 상태나 대시 상태의 큐를 구현할 때 사용
- 프로세스 상태 : 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 등
- 프로세스 구분자 (PID, Process IDentification)
- 프로그램 카운터 : 다음에 실행될 명령어의 위치
- 프로세스 우선순위
- 각종 레지스터 정보 : 이전 실행 시 사용한 레지스터 값을 보관해야 다음에 실행할 수 있기 때문에 중간값 보관
- 메모리 관리 정보
- 할당된 자원 정보
- 계정 정보 : 계정 번호, CPU 할당 시간, CPU 사용 시간 등
- 부모 프로세스 구분자, 자식 프로세스 구분자
문맥 교환 (context swiching)
- CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업
- 두 프로세스의 PCB 및 이와 관련된 값들을 교환하는 작업
- 타임 아웃이나 메모리 범위를 넘어선 프로세스가 생길 경우 등에 일어남
- 문맥 교환 절차
- 실행 상태의 프로세스 P1이 타임아웃
- P1의 PCB에 현재까지의 작업 결과 저장
- P1은 준비상태로 쫓겨남
- 준비 상태에 있던 프로세스 P2가 실행 상태로 바뀜
- CPU의 레지스터가 P2의 PCB 값으로 채워져서 작업
프로세스 구조
- 정적 할당 영역
- 코드 영역 : 프로그램의 본문이 기술된 곳, 프로그램의 본체가 있는 곳
- 데이터 영역 : 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳
- 프로세스가 실행되기 직전에 위치와 크기가 결정되고 실행되는 동안 변하지 않음
- 동적 할당 영역
- 스택 영역 : 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳
- 힙 영역
- 프로세스가 실행되는 동안 만들어지는 영역, 크기가 변화함
프로세스의 연산
- fork() 시스템 호출
- 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
- 기존의 프로세스가 부모 프로세스, 새로 생긴 프로세스가 자식 프로세스 (부모-자식 관계)
- 부모 프로세스 영역을 복사하지만 PCB의 다음 부분이 변경됨
- 프로세스 구분자(PID)
- 메모리 관련 정보 : 메모리의 위치가 다르므로
- 부모프로세스 구분자, 자식 프로세스 구분자 (자식 프로세스는 자식이 없으므로 -1)
- 장점
- 프로세스 생성 속도가 빠름
- 추가 작업 없이 자원 상속 가능 : 부모가 파일A를 쓰기 위해 초기화했다면, 자식은 파일A를 바로 사용가능
- 시스템 관리의 효율성 : 자식 프로세스를 종료하면 자식이 사용하던 자원을 부모 프로세스가 정리
- exec() 시스템 호출
- 기존의 프로세스를 새로운 프로세스로 전환하는 함수
- 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출
- 프로세스의 구조체를 재활용하기 위함
- 동작 과정
- 코드 영역에 있는 기존의 내용 지우고 새로운 코드로 전환
- 데이터 영역이 새로운 변수로 채워짐
- 스택 영역 리셋
- PCB의 프로세스 구분자, 부모/자식 프로세스 구분자, 메모리 관련 사항은 바뀌지 않으나 프로그램 카운터 레지스터 값을 비롯한 각종 레지스터와 사용한 파일 정보가 리셋됨 (프로세스를 처음 시작하는 것처럼)
- 프로세스 계층 구조
- 부모 프로세스를 복사하여 자식 프로세스를 만드는 방법으로 프로세스끼리 계층 구조를 갖는 것
- 장점
- 여러 작업의 동시 처리
- 자원 회수 용이
- 고아/좀비 프로세스 : 프로세스가 종료된 후에도 비정상적으로 남아있는 프로세스
- 고아 프로세스 : 부모 프로세스가 자식보다 먼저 죽는 경우 발생
- 좀비 프로세스 : 자식 프로세스가 종료했음에도 부모가 뒤처리를 하지 않을 때 발생
728x90
'CS > Operating System' 카테고리의 다른 글
[OS] 프로세스 간 통신 (0) | 2021.12.05 |
---|---|
[OS]CPU 스케줄링 알고리즘 (0) | 2021.12.02 |
[OS] CPU 스케줄링 (0) | 2021.12.02 |
[OS] 스레드 (0) | 2021.11.02 |
[OS] 운영체제 개요 (0) | 2021.11.02 |
댓글