프로세스
프로세스(process)란 '실행 중인 프로그램'을 의미한다. 보조기억장치에 있는 프로그램이 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 되며, 이 과정을 '프로세스를 생성한다'라고 표현한다.
윈도우 작업관리자 창을 통해 확인할 수 있으며, 유닉스에 경우 `ps` 명령어를 통해 확인 가능하다. 아래 이미지 보면 메모장이 두 개가 켜져 있다. 프로세스는 같은 프로그램도 별로의 프로세스가 될 수 있음을 나타낸다.
프로세스의 유형으로는 사용자가 보는 공간에서 사용자와 상호작용하며 실행되는 포그라운드 프로세스(foreground process)와 사용자가 보지 못하는 곳에서 실행되는 백그라운드 프로세스(background process)가 있다.
백그라운드 프로세스에는 사용자와 별다른 상호작용 없이 할 일을 처리하는 데몬(demon)이 있고, 이것을 윈도우에선 서비스(service)라고 부른다.
프로세스의 유형을 막론하고 하나의 프로세스를 구성하는 메모리 구성의 정보는 크게 다르지 않다. 커널에선 프로세스 제어 블록(PCB)이라는 정보가 저장되고, 사용자 영역은 코드영역, 데이터영역, 스텍영역, 힙영역으로 나뉘어 저장된다.
커널 영역과 사용자 영역에서의 프로세스
1. 프로세스 제어 블록 (PCB) - 커널 영역
모든 프로세스는 CPU를 필요로 하지만, CPU의 자원은 한정적이다. 즉, 동시에 모든 프로세스를 실행할 수 없다. 그렇기에 차례대로 한정된 시간만큼 CPU를 이용한다.
운영체제는 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다. 이러한 작업을 수행하기 위해 운영체제는 `프로세스 제어 블록(PCB)`을 이용한다.
PCB는 프로세스와 관련된 정보를 저장하는 자료구조이다. 상품에 달린 태그와 비슷한 역할을 수행하며, 프로세스를 식별하기 위한 정보들이 저장되어진다.
이러한 PCB는 커널영역에 생성된다. 운영체제에선 수많은 프로세스들을 PCB를 통해 식별하고 그것을 처리하는데 필요한 정보를 판단하게 된다.
2. PCB 구성 요소
PCB 구성요소는 크게 프로세스 ID, 레지스터 값, 프로세스 상태, CPU 스케줄링 정보, 메모리 관리 정보, 사용자 파일과 입출력장치 목록으로 구성된다.
프로세스 ID
프로세스 ID(이하 PID)는 특정 프로세스를 식별하기 위해 부여하는 고유한 번호이다. 위에서 같은 프로그램도 여러 개가 실행될 수 있다고 했는데 이러면 각각 다른 PID를 가진 프로세스가 생성되게 된다.
레지스터 값
프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원한다. 그래야지만 이전 작업을 이어서 진행이 가능하다. 그래서 PCB 안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
CPU 스케줄링 정보
프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록된다.
메모리 관리 정보
프로세스마자 메모리에 저장된 위치가 다르다. 그래서 PCB에는 프로세스가 어느 주소에 저장되어 있는지에 대한 정보가 있다.
사용한 파일과 입출력장치 목록
프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용하면 PCB에 해당 내용이 명시된다. 즉, 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 PCB에 기록된다.
3. 문맥교환
A 프로세스가 실행 중 CPU 할당 시간이 끝나 B 프로세스로 넘어야 가한다면, A 프로세스는 다음 할당 시에 이전 작업을 이어나가기 위해선 지금까지 한 중간 정보를 백업해야 한다. 이러한 중간 정보, 즉 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 `문맥(context)`라고 한다.
문맥 정보는 PCB에 표현되어 있으며, PCB에 기록되는 정보가 문맥이라 봐도 무방하다.
그럼 문맥교환을 생각해 보자. 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위한 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 `문맥교환(context switching)`이라고 한다.
문맥교환은 여러 프로세스가 끊임없이 빠르게 번갈아 실행되는 원리이다. 문맥교환이 자주 일어난다면 동시에 프로세스가 실행되는 것처럼 보이게 된다. 단, 너무 자주 하면 오버헤드가 발생된다.
4. 프로세스 메모리 영역 - 사용자 영역
프로세스가 생성되면 커널 영역에 PCB도 생성이 된다. 사용자 영역도 마찬가지로 프로세스가 구성이 되는데 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다. 이 부분은 프로그래밍과 기술 면접 등에 매우 중요한 내용이다.
코드 영역
`코드 영역(code segment)`는 `텍스트 영역(text segment)`라고 부른다. 이곳엔 말 그래도 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장된다. 코드 영역에는 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있다. (읽기 전용, read-only)
데이터 영역
`데이터 영역(data segment)`은 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장된다. 이런 데이터로는 `전역 변수(global variable)`가 대표적이다.
코드 영역과 데이터 영역은 크기가 변하지 않는다. 프로그램을 구성하는 명령어들은 바뀔 일이 없고 데이터 영역에 있는 데이터들도 프로그램 실행 간 유지되는 데이터이기 때문이다. 그래서 두 영역을 `크기가 고정된 영역`이라는 점에서 `정적 할당 영역`이라고 부른다. 반대로 나머지 영역은 스택과 힙 영역은 크기가 변할 수 있어 `동적 할당 영역`이라고 부른다.
힙 영역
`힙 영역(heap segment)`은 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 공간을 의미한다. 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 한다.
메모리 공간을 반환한다는 것은 '더 이상 해당 메모리 공간을 사용하지 않겠다'라고 운영체제한테 선언하는 것이다.
만약 메모리를 반환하지 않는다면 해당 공간은 메모리에 계속 남아 메모리 낭비를 초래하며, 이런 문제를 `메모리 누수(memory leak)`이라고 한다. (프로그래밍 언어 별 메모리 누수를 처리하는 것은 중요한 업무 중 하나이다.)
스택 영역
`스택 영역(stack segment)`은 데이터를 일시적으로 저장하는 공간이다. 데이터 영역에 담기는 값과 달리 잠깐 쓰다가 사라지는 값(일시적으로 사용할 데이터)들이 저장된다. 주로 함수 실행이 끝나면 사라지는 매개변수, 지역변수 등이 있다.
스택 자료구조처럼 값을 PUSH 하고, 필요가 없어진다면 POP 해서 영역에 사라진다.
위에서 잠깐 이야기했듯이, 힙과 스택 영역은 실시간으로 크기가 변할 수 있으므로 `동적 할당 영역`이라고 한다. 일반적으로 힙 영역은 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다. (주소 중복 방지)
출처
'Knowledge > 컴퓨터구조&운영체제' 카테고리의 다른 글
[운영체제] 멀티 프로세스와 멀티 스레드 (0) | 2024.12.10 |
---|---|
[운영체제] 프로세스 상태와 계층 구조 (0) | 2024.12.06 |
[운영체제] 운영체제의 역할과 앞으로 학습할 내용 정리 (1) | 2024.12.04 |
[컴퓨터구조] 입출력장치 - 장치 컨트롤러, 드라이버, DMA (0) | 2024.12.02 |
[컴퓨터구조] 보조기억장치와 RAID (0) | 2024.12.02 |