개발계발
프로세스 본문
프로세스
메모리에 적재되어 실행 중인 프로그램('프로그램'은 보조기억장치에 있는 데이터 덩어리임)
포그라운드 프로세스 vs 백그라운드 프로세스
포그라운드 프로세스
메모장, 웹 브라우저, 워드 등 사용자 화면에 나타내는 실행되는 프로세스
백그라운드 프로세스
사용자 화면에 보이지 않는 뒤편에서 실행되는 프로세스(유닉스 체게에서는 데몬이라고 부르고, 윈도우에서는 서비스라고 브룸)
모든 프로세스는 CPU를 필요로 하지만, CPU 자원은 한정돼있기 때문에 프로세스는 정해진 시간만큼 CPU를 이용하고, 타이머 인터럽트발생하면 다른 프로세스에게 CPU를 양보한다.
-> 이를 위해 운영체제는 프로세스 제어블록(PCB)를 이용한다.
프로세스 제어블록(PCB)
프로세스와 관련된 정보를 저장하는 자료 구조(상품(프로세스)에 달려 있는 태그라고 생각하면 된다.)로 프로세스를 식별하기 위해 필요한 정보들이 저장됌.
- PCB는 메모리의 커널 영역에 생성되어 OS가 이를 통해 프로세스를 식별하고 처리한다.
- PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.
PCB에 담기는 정보
1. 프로세스 ID(PID)
- 프로세스를 식별하기 위해 부여하는 번호
2. 레지스터 값
- 프로그램 카운터를 비롯한 이전에 사용한 레지스터의 값들
3. 프로세스 상태
- 준비, 대기, 실행
4. CPU 스케줄링 정보
- 프로세스가 언제, 어떤 순서로 CPU를 할당받을 지
5. 메모리 관리 정보
- 해당 프로세스가 어느 주소에 저장돼있는지
6. 사용한 파일과 입출력장치 목록
- 어떤 입출력장치가 이 프로세스에 할당됐는지와 어떤 파일들을 열었는지
문맥 교환
기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구해 새로운 프로세스를 실행하는 것
위의 과정이 빠르게 번갈아가며 실행되기 때문에 사용자는 프로세스들이 동시에 실행되는 것처럼 보이는 것!
프로세스의 메모리 영역
프로세스가 실행되면 메모리의 커널 영역에는 PCB가 생성되고, 사용자 영역에는 코드 영역, 데이터 영역, 힙 영역, 스택 영역이 생성된다.
코드 영역(정적 할당 영역)
- 텍스트 영역이라고도 부르며, 실행할 수 있는 코드, 기계어로 이루어진 명령어가 저장된다. CPU가 실행할 명령어(프로그램을 구성하는 명령어)가 담겨 있기 때문에 쓰기가 금지된다.(읽기 전용 공간)
데이터 영역(정적 할당 영역)
- 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간으로, 대표적으로 전역 변수가 저장된다.
위 두 영역은 크기가 변하지 않음
힙 영역(동적 할당 영역)
- 사용자가 직접 할당할 수 있는 저장 공간으로 사용 후 반납해야하는 공간임(메모리를 반환하지 않을 경우 메모리 누수가 발생함
스택 영역(동적 할당 영역)
- 잠깐 쓰다가 사라질 데이터들을 일시적으로 저장하는 공간으로 대표적으로 매개 변수, 지역 변수가 저장된다.
프로세스 상태
생성, 준비, 실행, 대기, 종료 상태로 나뉜다.
생성 상태
- 프로세스를 생성중인 상태로, 메모리에 적재되어 PCB를 할당받은 상태
준비 상태
- 실행 가능한 상태이나, 아직 자신의 차례가 아니기 때문에 기다리고 있는 상태
실행 상태
- CPU를 할당받아 실행 중인 상태로, 할당된 시간을 모두 사용하면(인터럽트가 발생하면) 다시 준비 상태가 되며, 입출력 작업 등의 필요한 경우에는 대기상태가 된다.
대기 상태
- 입출력장치를 사용하는 경우(CPU에 비해 처리 속도가 느린 작업)에 해당 작업을 기다리는 상태로, 작업이 완료되면 다시 준비 상태가 된다.
종료 상태
- 프로세스가 종료되어 운영체제가 PCB와 사용한 메모리를 정리한다.
프로세스 계층 구조
프로세스는 실행 도중 시스템 콜을 통해 다른 프로세스를 생성할 수 있는데, 이 때 원본 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 한다.
터미널에서 pstree 명령어를 사용하면 현재 실행중인 프로세스들의 계층 구조를 확인할 수 있다.
위 사진을 보면 루트 프로세스(1번 프로세스)에서 모든 프로세스가 뻗어나가는 걸 확인할 수 있다.
프로세스 생성 기법
부모프로세스를 통해 생성된 자식 프로세스는 복제(fork)와 전환(exec)의 과정을 거친다.
복제 - fork()
- 프로세스 자신의 복사본을 만드는 시스템 호출로 부모 프로세스의 자원을 그대로 상속받은 프로세스가 생성된다.(PID값과 저장된 메모리 위치는 다름)
전환 - exec()
- 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출(코드 영역과 데이터 영역이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화 됌)