[OS]프로세스와 메모리

신동하·2024년 5월 20일

운영체제

목록 보기
2/4
post-thumbnail

프로세스: 현재 메모리에 적재되어 실행중인 프로그램을 의미한다.
보조기억장치(HDD, SSD)에 저장된 프로그램을 메모리에 적재하고 실행되는 관정-> '프로세스를 생성한다.'라고 표현한다.

운영체제는 현재 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분을 하는데, 이때 운영체제는 프로세스 제어 블록(PCB)를 이용한다.

Process Control Block(프로세스 제어블록)

프로세스와 관련된 정보를 저장하는 자료 구조를 의미한다.(옷에 달려 있는 태그에 상품을 식별할 수 있는 정보와 같이 PCB에서는 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장이 됨!)

이전 게시글에 작성을 했듯이 메모리는 OS가 구동되는 커널 영역과 사용자 영역으로 나누어져 있고, PCB는 커널 영역에 생성이 된다. 이때 OS는 수 많은 프로세스들을 PCB를 통하여 특정한 프로세스를 식별하고 어떻게 프로세스를 처리하는 데 필요한 정보를 판단하게 된다.

PCB는 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기가 된다. 즉, 새로운 프로세스가 생성 되었다라는 것은 OS가 PCB를 생성했다라는 말과 같고 프로세스가 종료되었다. 라는 것은 OS PCB를 폐기했다라는 말과 동일하다!🙂

PCB에 저장되는 요소들

프로세스 ID: 특정 프로세스를 식별하기 위해 부여되는 고유한 번호
레지스터 값: 프로세스는 자신의 실행 차례가 돌아오면 이전에 사용이 되었던 레지스터의 값들을 복구하기 위해서, PCB안에 해당 프로세서가 사용 하였던 레지스터 값들이 담는다.
프로세스 상태: 현재 프로세스가 어떤 상태인지, 즉 현재 프로세스가 I/O장치를 사용하기 위해 기다리고 있는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지, 아니면 이용하고 있는 상태인지를 PCB에 저장을 한다.
CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록이 된다.
메모리 관리 정보: 프로세스마다 메모리에 저장이 된 위치가 다르기 때문에 프로세스가 어느 주소에 위치하여 있는지에 대한 정보를 알고 있어야한다.
그렇기 때문에 PCB에서는 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담기게 된다. -> 페이지 테이블 정보 역시 담긴다(차후 장에 세세히 서술 예정!)
베이스 레지스터: 메모리 세그먼트의 시작주소가 저장이 된다.
한계 레지스터: 메모리 세그먼트의 크기가 저장이 된다.
사용한 파일과 I/O장치의 목록들: 어떤 입출력 장치가 이 프로세스에 할당이 되었는지, 어떤 파일들을 열었는지에 대한 정보를 저장한다.

문맥교환

하나의 프로세스에서 다른 프로세스로 실행 순서가 넘어가면 어떤 일들이 일어날까? 현재 프로세스 A가 CPU를 할당을 받아 실행이 되고 있다가 시간이 되어 프로세스 B에 CPU 할당이 넘어간다고 가정을 해보자.
이런 상활에서 cpu 할당 직전까지 실행되는 프로세스 A는 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력 장치들 지금까지의 중간 정보를 백업을 해야한다. -> why? 다음 cpu 할당시간에 이전까지 실행했던 내용에 이어 다시 실행을 재개할 수 있기 때문에!!!

문맥: 수행이 중간에 종료되었던 프로세스를 다시 수행시키기 위해 기억해야 할 정보를 의미한다.

이러한 정보들은 프로세스 실행 중 인터럽트가 발생할 때, 해당 프로세스의 PCB에 백업을 하고, 다음 차례에 실행이 계획된 프로세스 B의 문맥을 복구를 한다.
순서도
1. 프로세서 A를 실행함.
2. 프로세스 A의 문맥을 PCB에 저장을 한다.(다음 실행을 위해 준비를 함)
3. PCB로 부터 다음에 실행되 프로세스 B의 문맥을 가져옴.
4. 프로세스 B를 실행함.
5. 프로세스 B의 문맥을 PCB에 저장을 함.
6. 프로세스 A의 문맥을 PCB로 부터 가져옴

문맥 교환은 여러 개의 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리를 의미한다. 문맥 교환이 자주 일어나면 프로세스는 그만큼 빨리 번갈아 가며 수행이 되기 때문에 여러개의 프로세스들이 동시에 실행되는 것 처럼 보이게 된다.

프로세스의 메모리 영역

프로세스가 생성이 되면 커널 영역에 PCB가 생성이 된다. 그렇다면 사용자 영역에는 어떤 방식으로 프로세스가 배치되는 것일까? 하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장이 된다.

코드영역 (텍스트 영역): 기계어로 이루어진 명령어가 저장이 된다. 이 곳에는 데이터가 아닌 CPU가 실행할 명령어가 담겨져 있기 때문에 쓰기가 금지되어 있다. -> Read Only

데이터 영역: 프로그램이 실행되는 동안에 유지되는 데이터가 저장되는 영역을 의미한다. 전역변수가 대표적이다.

코드 영역과 데이터 영역은 그 크기가 변하지 않는다.
why?: 프로그램을 구성하는 명령어들이 바뀔리가 없으니 코드 영역의 크기가 변할리가 없고 데이터 영역에 저장이 될 내용들은 프로그램이 실행되는 동안에는 유지되는 데이터다. 즉 코드 영역과 데이터 영역은 '크기가 고정된 영역'이라는 점에서 정적 할당 영역이라고 불린다. 그와 반대로 힙 영역과 스택 영역은 프로세스 실행 과정에 크기가 변할 수 있는 영역이기 때문에 정적 할당 영역이라고 불리운다.
힙 영역: 프로그래머가 직접 할당할 수 있는 저장공간을 의미한다. 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면, 언젠가는 해당 공간을 반환해야 한다.
스택 영역: 데이터를 일시적으로 저장하는 공간을 의미한다. 함수의 실행이 끝나면 사라지는 매개 변수, 지역변수가 대표적이다. 일시적으로 저장할 데이터는 스택영역에 push되고, 더 이상 필요하지 않는 데이터는 pop됨으로써 스택 영역에서 사라지게 된다.
힙 영역과 스택 영역은 실시간으로 그 크기가 변할 수 있기 때문에 동적 할당 영역으로 불린다. 일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당이 되고, 스택 영역은 높은 주소에서 낮는 주소로 할당이 된다. ->그래야만 각각의 영역에 데이터가 쌓여도 새롭게 할당되는 주소가 겹칠 일이 없기 때문에!

profile
JAVA를 자바💥😊😀

0개의 댓글