보조기억장치에 있는 프로그램 데이터를 메모리에 적재하고 실행하면 프로세스가 된다
CPU는 이 프로세스를 잠깐 실행했다가 저 프로세스를 잠깐 실행했다가 돌아가면서 실행하는데, 그럼 프로세스 구분은 어떻게 할것이며,,, 그 프로세스에 지금까지 뭐를 했는지는 어떻게 알것이며,,, 프로세스마다 알아야 하는 정보들이 있는데 얘네를 프로세스 제어 블록 이라는거에 저장한다.
이름 | 설명 |
---|---|
프로세스 ID (PID) | 특정 프로세스를 식별하기 위해 부여하는 고유번호 |
레지스터 값 | 프로그램 카운터 등 사용했던 레지스터들의 값을 백업 |
프로세스 상태 | 어떤 자원을 사용하기 위해 기다리고 있는지, 어떤 자원을 이용하고 있는지 등 |
CPU 스케줄링 정보 | 언제 어떤 순서로 CPU를 할당 받을지 기록 |
메모리 관리 정보 | 해당 프로세스가 저장된 주소 (베이스 레지스터, 한계 레지스터, 페이지 테이블 등) |
사용한 파일과 입출럭장치 목록 |
기존 프로세스 문맥을 백업하고 새로운 프로세스 문맥을 복구하는 것
CPU가 이 프로세스를 실행하다가 시간이 다돼서 저 프로세스를 실행하려고 가버리면? 아니면 인터럽트가 발생하면? 이 프로세스에 대한 정보는 PCB에 저장해둬야 한다. 이 정보들을 어렵게 문맥 이라고 부른다. 문맥을 저장해두면 언제든 프로세스 실행을 재개할 수 있다.
프로그램이 메모리에 적재되어야 프로세스가 된다고 했는데, 그럼 프로세스는 메모리에 어떻게 적재되는걸까?
실행하는데 필요한 정보, 또 실행하면서 생길 정보들을 실을 공간이 필요하다. 이 공간들을 용도에 따라 분리해서 적절한 자료구조를 사용할건데, 아래처럼 영역을 나눈다. 프로세스가 생성되면 PCB는 커널 영역에 생성되고, 이런 것들은 사용자 영역에 배치된다.
힙 영역과 스택 영역은 실행하면서 데이터가 생성됐다가 삭제됐다가 하는 곳이라 차지하는 범위가 계속 바뀐다. 그림처럼 힙 영역은 낮은 주소에서 높은 주소로, 스택 영역은 높은 주소에서 낮은 주소로 할당된다.
그런데 만약 얘네의 크기가 너무 커지면..?
함수가 너무 많이 실행되거나, 함수 크기가 커서 지역변수가 너무 많아지면 스택이 커지게 된다. 또 힙에 너무 많은 데이터를 집어넣어서 힙이 커질 수 있다. 지나치게 커버리면 당연히 안된다. 서로의 영역을 침범하면 오버 플로우가 발생하게 된다.