프로세스의 개념
- 프로그램
- 저장장치에 저장되어 있는 정적인 상태
- 프로세스
- 실행을 위해 메모리에 올라온 동적인 상태
프로그램에서 프로세스로의 전환
- 태스크
- 프로세스에서의 컴퓨터 시스템의 작업 단위
- 운영체제는 프로그램을 메모리의 적당한 위치로 가져온다. 동시에 프로세스 제어 블록(PCB)을 만든다.
- PCB
- 프로세스 구분자(PID)와 메모리 관련 정보, 각종 중간값 등이 저장
- 해당 프로세스를 관리하는 데이터 구조이기 때문에 운영체제 영역에 만들어진다
- 프로세스 = 프로그램 + 프로세스 제어 블록
- 프로그램 = 프로세스 - 프로세스 제어 블록
프로세스의 상태
- 생성 상태
- 실행 준비를 완료한 상태
- 프로그램이 메모리에 올라오고 운영체제로 부터 프로세스 제어 블록이 생성
- 준비 상태
- 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태
- 프로세스 제어 블록은 준비 큐에서 기다리며 CPU 스케줄러에 의해 관리된다
- 디스패치
- 준비 상태에서 실행 상태로 옮겨가는 것
- CPU 스케줄러가 dispatch(PID) 명령을 통해 실행 상태로 옮긴다.
- 실행 상태
- 준비 상태에 있는 프로세스가 CPU를 얻어 실제 작업을 수행하는 상태.
- 실행 상태에 있는 프로세스는 일정 시간 동안만 작업할 수 있는데 그 시간을 다 쓰면 timeout(PID)명령을 통해 준비 상태로 옮긴다.
- 작업을 완료하면 exit(PID)를 실행해 종료 / 입출력을 요청하면 block(PID)로 대기 상태로 옮긴다
- 대기 상태
- 입출력이 완료될 때까지 기다리는 상태
- 입출력이 완료되면 인터럽트가 발생하고 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾는데 wakeup(PID)를 통해 준비 상태로 이동한다.
- 완료 상태
- 실행 상태의 프로세스가 주어진 시간 동안 작업을 마치고 프로세스 제어 블록을 폐기
- exit()를 통해 처리
- 코어 덤프(core dump)
- 오류나 비정상적으로 종료되는 강제종료(abort)를 만나면 디버깅하기 위해 강제 종료 직전의 메모리 상태를 저장장치로 옮기는 것
- 코어 덤프를 통해 종료 직전의 메모리 상태를 확인해서 오류를 수정할 수 있게 한다
- 휴식 상태
- 프로세스가 작업을 일시적으로 쉬고 있는 상태 (ctrl + z)
- 재시작을 통해 다시 실행될 수 있다.
- 보류 상태
- 메모리에서 잠시 쫓겨난 상태로 일시 정지 상태라고도 한다
- 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 보낼 때
- 프로그램에 오류가 있을 때
- 바이러스 프로세스라고 판단될 때
- 보류 상태에 들어간 프로세스는 메모리 밖으로 쫓겨나 스왑 영역에 보관
- 보류 대기 상태와 보류 준비 상태로 구분
- 메모리에서 잠시 쫓겨난 상태로 일시 정지 상태라고도 한다
프로세스 제어 블록(PCB)
- 프로세스 제어 블록은 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료 구조
- 모든 프로세스는 고유의 프로세스 제어 블록을 가지고, 프로세스가 끝나면 폐기된다.
- 포인터
- 준비 상태나 대기 상태에서 큐에 연결할 포인터이다.
- 프로세스 상태
- 각 프로세스의 생성, 준비, 실행, 대기, 보류 준비, 보류 대기 상태를 나타낸다.
- 프로그램 구분자
- PID로 어떤 프로세스인지 구분한다.
- 프로그램 카운터
- 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값을 저장한다.
- 프로세스 우선순위
- 준비 상태에 있는 프로세스 중 우선순위가 높은 프로세스를 실행 상태로 옮긴다.
- 각종 레지스터
- 누산기, 색인 레지스터, 스택 포인터 등 레지스터의 값을 저장한다.
- 메모리 관리 정보
- 메모리의 위치 정보, 경계 레지스터와 한계 레지스터의 값, 세그멘테이션 테이블, 페이지 테이블의 정보 등을 저장한다.
문맥 교환
- CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업
P1 -> P2 -> P1 --- 문맥 교환
- P1이 자신에게 주어진 시간을 모두 사용하여 타임아웃이 되면 P1의 프로세스 제어블록에 현재까지의 작업 결과가 저장되고, P1은 준비 상태로 쫓겨난다.
- 준비 상태에 있던 P2가 실행 상태로 가면 CPU의 레지스터가 P2의 프로세스 제어 블록값으로 채워져 다음 작업을 하게 된다.
프로세스의 연산
프로세스의 구조
- 코드영역
- 프로그램의 본문이 기술된 곳으로 텍스트 영역이라고도 한다.
- 프로그래머가 작성한 프로그램은 코드영역에 탑재되며 읽기 전용으로 처리된다
- 데이터 영역
- 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓는 곳이다.
- 기본적으로 읽기와 쓰기가 가능하다.
- 스택 영역
- 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳이다.
- 예시로 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아 올 위치를 이 영역에 저장한다.
- 스택 영역은 사용자에게는 보이지 않는다.
프로세스의 생성과 복사
fork() 시스템 호출
- 개념
- 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수
- 동작 과정
- 부모와 자식 프로세스의 프로세스 구분자가 바뀐다.
- 부모와 자식 프로세스가 차지하고 있는 메모리의 위치가 다르기에 메모리 관련 정보가 바뀐다.
- 부모 프로세스 구분자(PPID)와 자식 프로세스(CPID)가 바뀐다
- 장점
- 프로세스의 생성 속도가 빠르다
- 하드디스크로부터 프로그램을 새로 가져오는 것이 아닌 기존 메모리에서 복사하기 때문에 자식 프로세스의 생성 속도가 빠르다.
- 추가 작업 없이 자원을 상속할 수 있다
- 부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속하여 예시로 부모 프로세스가 파일 A를 사용하기 위해 초기화 했다면 자식 프로세스는 파일 A를 바로 사용할 수 있다.
- 시스템 관리를 효율적으로 할 수 있다
- 부모 자식 프로세스가 각 구분자로 연결되어 있기 때문에 자식 프로세스를 종료하면 자식이 사용하던 메모리 영역, 하드웨어 정리를 부모 프로세스에 맡김으로써 시스템이 효율적으로 관리될 수 있다.
- 프로세스의 생성 속도가 빠르다
프로세스의 전환
- 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출로 현재의 프로세스가 완전히 다른 프로세스로 전환된다.
- 이미 만들어진 프로세스 제어 블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다.
- 새로운 코드 영역만 가져오면 되기 때문에 운영체제의 작업이 수월하다.
exec() 시스템 호출의 동작 과정
- 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버린다.
- 데이터 영역이 새로운 변수로 채워지고 스택 영역이 리셋된다.
exec() 호출 시 변하지 않는것.
- 프로세스 구분자(PID)
- 부모 프로세스 구분자(PPID)
- 자식 프로세스 구분자(CPID)
- 메모리 관련 사항
프로세스의 계층구조
유닉스의 프로세스 계층구조
- 유닉스에서 커널이 처음 메모리에 올라와 부팅이 되면 커널 관련 프로세스를 여러 개 만드는데, 그중 init 프로세스는 전체 프로세스의 출발점이 된다.
- 운영체제는 프로세스를 효율적으로 관리하기 위해 init프로세스를 만든 다음 나머지 프로세스를 init 프로세스의 자으로 만들기에 운영체제의 모든 프로세스는 init 프로세스의 자식이 된다.
- init프로세스는 일반 사용자 프로세스의 맨 위에 위치하여 자식으로는 login프로세스, shell프로세스 등이 있다.
프로세스 계층 구조의 장점
여러 작업의 동시처리
- 사용자 3명이 동시에 컴퓨터에 접속한다면 한번에 1명만 처리할 수 있는 login프로세스를 여러 개 만들어(fork()) 사용자에 나누어 주어 여러 사용자를 동시에 처리할 수 있다.
- login 프로세스를 통과하고 나면 shell 프로세스가 필요한데 이때 exec() 시스템 호출을 사용하여 login 프로세스의 구조를 shell 프로세스로 다시 활용하면 자원을 효율적으로 관리할 수 있다.
- shell 프로세스에서 명령어로 응용 프로그램을 실행할 때도 fork()와 exec() 시스템 호출을 이용한다.
용이한 자원 회수
- 모든 프로세스를 부모-자식 관계로 만들면 자식 프로세스가 작업을 마쳤을 때 사용하던 자원을 부모 프로세스가 회수함으로 자원의 회수능력이 용이해진다.
고아 프로세스 와 좀비 프로세스
- 고아 프로세스
- 프로세스가 종료된 후에도 비정상적으로 남아 있는 프로세스
- 부모 프로세스가 자식보다 먼저 죽는 경우에 발생
- 좀비 프로세스
- 자식 프로세스가 종료 했음에도 부모가 뒤처리를 하지 않을 때 발생
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 프로세스 동기화 (0) | 2024.03.26 |
---|---|
[운영체제] CPU 스케줄링 (1) | 2024.03.26 |
[운영체제] 스레드 (0) | 2024.03.26 |
[운영체제] 컴퓨터 구조 / 성능 향상 (0) | 2024.03.26 |
[운영체제] 운영체제 개요 (0) | 2024.03.26 |