개요
게임을 실행한다고 가정해보자! 우선 게임을 컴퓨터에 설치해놨을 것이다! 뭐 HDD든, SSD든 보조기억장치에 게임에 필요한 프로그램이 저장됐겄지! 우리가 이 게임 프로그램을 실행하기 전까진, 설치된 모든 코드와 데이터들은 디스크 용량을 차지할 뿐 아무 것도 하지 않는다!! 더블 클릭해서 딱 게임을 켠 시점, 즉 프로그램을 실행하는 순간부터 뭔가뭔가 일어나기 시작한다!
프로세스
프로세스는 쉽게 생각하면 컴퓨터가 "지금 하고 있는 일"이다!! 어떤 프로그램을 실행하면, 컴퓨터는 이를 처리해주어야하니 뭔가뭔가 해야할 일이 생기는 것이다! 때문에 프로그램 실행은 사실 프로세스 생성과 같은 말이다!! 우리가 게임 프로그램을 더블 클릭하는 순간, 얘네의 몸에 생기가 돌면서 게임 프로세스가 생성되는 것이다!!
프로세스가 생성될 때, 운영체제는 크게 두 가지 일을 처리한다! 하나는 커널 영역에 프로세스 제어블록을 기록하기 시작하는 것이고, 다른 하나는 사용자 영역에 프로세스를 위한 메모리 영역을 할당해주는 것이다!
프로세스 제어 블록
PCB는 운영체제가 프로세스들을 관리 감독하기 위해서 기록하는 프로세스 관련 정보들이다!! 한 학급의 학생들마다 생활기록부가 있듯, 프로세스 별로 하나씩 존재하고, 프로세스가 생성될 때 함께 만들어졌다가, 프로세스가 종료되면 폐기된다!! PCB를 구성하는 정보는 다양하고, 운영체제마다도 또 유형이 조금씩 상이하지만, 대표적인 녀석들을 짚어보자!!
프로세스 아이디
PID는 말 그대로 각 프로세스를 식별하기 위한 고유 번호다! 학생마다 학번이 있듯, 1번 프로세스!! 2번 프로세스!! 이렇게 구분해 호출하기 위한 식별자되시겠다!!
레지스터 값
CPU에는 수많은 레지스터들이 있고, 이곳엔 CPU를 위한 여러 임시 데이터들이 저장된다!! 실행 중인 명령어나 피연산자 자체 등이 저장되거나, 그 녀석들이 메모리 상에 저장된 주소가 저장된다거나 등등!! 프로그램 역시 데이터 집합이기 때문에, 이 레지스터들에 관련 데이터가 임시 저장되게 되는데, 이때 이 프로세스를 위해 어떤 레지스터에 어떤 값이 보관되고 있는지에 대한 정보들이 기록되는 곳이 바로 PCB의 레지스터 값이다!
CPU 스케줄링 정보
프로세스의 명령어들을 실행하기 위해선 CPU가 힘을 내주어야하는데, CPU도 사람인지라 몸이 하나기 때문에, 여러 프로세스를 한꺼번에 다루기엔 한계가 있다!! 때문에, 프로세스들은 차례를 번갈아가며 CPU에 몸을 맡기게 되고, 이 순서와 한 번당 CPU를 차지하고 있는 시간 등을 정해주는 걸 CPU Scheduling이라 한다!! 물론 요즘 CPU는 코어라는 분신을 여럿 가지고 있어서 프로세스들을 동시에 처리해주고 있지만, 실행해야할 프로그램의 수가 코어 수보다 훨씬 많기 때문에, 여전히 CPU Scheduling은 필요하다!! 아무튼 PCB에서 이 프로세스가 어떤 순서로, 언제 CPU를 차지하게되는지에 대한 정보가 기록되는 곳이 바로 이곳이다!!
메모리 정보
이후 이야기하겄지만, 프로그램을 실행하면 전체 메모리에서 특정 구역을 이 녀석을 위해 할당해주게 되고, 이 녀석의 데이터 뭉치가 지정된 구역으로 이사를 오게된다!! 이때 이 프로세스가 메모리 상에서 차지하고 있는 구역의 위치 정보, 즉 메모리의 몇 번 주소부터 몇 번 주소까지 할당받았고, 각 주소엔 어떤 것들이 보관되고 있는지 등에 대한 정보가 기록되는 곳이 바로 PCB의 메모리 정보다!!
파일 및 입출력장치 정보
설치된 게임 프로그램의 디렉토리를 구경해보면, 이미지, 사운드 등등부터 코드 등등까지, 수많은 파일들이 존재하는 걸 알 수 있다!! 또, 게임 화면을 보여주기 위해선 모니터가 필요할 것이고, 플레이를 하기 위해선 키보드나 마우스 등이 필요하듯이, 하나의 프로그램은 여러 입출력장치를 활용하게 된다!! 즉 하나의 프로세스는 여러 파일들과 입출력 장치들을 사용하고, 할당받는데, 어떤 파일을 사용 중이었고, 어떤 입출력 장치들을 필요로 하는 지에 대한 정보들이 담기는 곳이 바로 PCB의 파일 및 입출력장치 정보란이다!!
프로세스의 메모리 영역
커널 영역엔 PCB가 기록된다면, 사용자 영역엔 이 프로세스가 실제로 처리될 때 활용하는 정보들을 보관하는데, 이 데이터들은 유형에 따라 메모리 공간을 분할해 저장된다!! 크게 네 가지 영역으로 나뉘며, 하나하나 알아보도록 하자!!
텍스트 영역
코드 영역이라고도 하는데, 게임이 켜진 동안 쉬지않고 실행되는 코드들이 보관되는 곳이다!! 정확히는 프로그래밍 언어 형태는 아니고, 기계어로 해석된 수많은 명령어들이 보관되게 된다!! 프로그램 실행 도중에 이 코드들이 바뀐다거나 하면 안 되고, 그럴 수도 없기 때문에, 텍스트 영역은 수정이 불가능한 read-only 영역이란 특징이 있다!!
데이터 영역
프로세스가 처리되는 동안 변치 않고 유지돼야하는 중요 데이터들이 저장되는 곳이다!! 예를 들어 어느 함수든 접근이 가능한 전역 변수라든가, 값이 변해선 안되는 상수 등등이 이곳에 저장된다!!
참고로 프로세스 생성 시에 텍스트 영역과 데이터 영역이 메모리를 차지한 크기는 프로세스 종료 때까지 변하지 않기 때문에, 두 영역을 정적 할당 영역이라고 묶곤 한다!!
힙 영역
배열이나 객체 등, 프로세스 동안 크기가 변하게 될 녀석들이 저장되는 공간!! 힙 영역의 주요 특징은 개발자인 우리가 직접 크기를 정하게된다는 것이다!!
스택 영역
프로세스 내내 필요한 녀석들이 아니라, 어떤 함수 실행 시라든지 잠깐잠깐 필요한 데이터들이 저장되는 곳!! 대표적으로 매개 변수나, 함수 내부에서 선언된 지역 변수 등이 이곳에 저장된다!!
힙 영역과 스택 영역은 프로세스가 처리되는 동안 지속적으로 차지하는 크기가 변하기 때문에, 두 영역을 동적 할당 영역이라고 묶는다!! 이때, 메모리 상에서 힙 영역은 낮은 주소에서 높은 주소로, 스택 영역은 높은 주소에서 낮은 주소로 영역을 넓혀가는데, 만약 스택 영역이 힙의 영역을 침범하게 되는 경우가 바로 그 유명한 스택 오버플로우다!!
스레드
스레드는 사실 미니 프로세스다!! CPU에 여러 코어들이 있을 수 있듯, 프로세스에는 여러 스레드들이 있을 수 있다!! 전통적인 CPU는 한 번에 하나씩의 명령어 처리만 가능했지만, 멀티코어 CPU들은 동시에 여러 명령어를 처리할 수 있는 것처럼, 단일 스레드로 이루어진 프로세스와 멀티 스레드로 이루어진 프로세스의 차이도 이와 같다!!
스레드 역시 프로세스와 마찬가지로 컴퓨터가 "지금 하고 있는 일"들이지만, 프로세스에 속한 처지라 좀 더 단위가 작을 뿐이고, 소속 프로세스의 자원을 스레드끼리 공유한다는 점 정도가 차이라 볼 수 있겠다!! 리눅스 창시자는 사실 프로세스와 스레드를 구분하길 원치 않을 정도...!
스레드 제어블록
운영체제가 PCB를 통해 프로세스를 관리했듯, 스레드 역시 스레드마다의 TCB가 존재한다!! 스레드는 프로세스에 종속된 몸이기 때문에, TCB는 소속 프로세스의 PCB에 보관되며, 스레드가 생성될 때 TCB가 기록되기 시작하고, 스레드가 종료되면 폐기된다!! PCB와 마찬가지로, 스레드들을 식별하기 위한 TID, 스레드 처리를 위한 CPU의 레지스터 값, 스레드의 상태 등의 정보가 기록된다!! 조금 다른 점으로는 소속 프로세스에 대한 정보라든지, 스레드마다의 처리 우선순위 등의 정보가 존재한다는 것 정도!!
스레드의 메모리 영역
스레드는 프로세스에 속한 몸이기 때문에, 프로세스가 차지한 메모리 공간 내부에서 놀게된다!! 때문에 하나의 프로세스에 속한 스레드들은 그 프로세스의 텍스트 영역, 데이터 영역, 힙 영역을 공유해서 활용하게 된다!! 각자 별도로 가지는 것은 바로 스택 영역!!
컨텍스트 스위치
위에서 PCB의 CPU 스케줄링 정보에 대해 이야기하면서, 프로세스들은 차례로 번갈아가며 CPU를 차지하게 된다고 했는데, 이때 이 번갈아가는 걸 컨텍스트 스위치라고 한다!! 스레드 역시 프로세스와 마찬가지로 서로 돌아가며 CPU를 차지하기 때문에, 둘 모두 컨텍스트 스위치를 겪게 된다!! 설명은 프로세스 기준으로 하겠다!!
먼저 처리 중이던 프로세스의 차례가 끝나면, 이 프로세스는 진행중이던 중간 정보(=context)를 PCB에 기록한다!! 중간 정보에는 레지스터 값, 메모리 정보, 파일 및 입출력장치 정보 등이 있고, 이 녀석들이 기록이 돼야(=백업), 이후 다시 차례가 돌아왔을 때 기존 처리를 이어서 할 수 있다!!
새로 CPU를 차지한 프로세스 역시, 생성 단계가 아니라면 기존에 진행하던 처리 내역들이 있을 것이기 때문에, 이를 그 프로세스의 PCB를 바탕으로 복구해야한다!! 그렇게 복원한 진행 사항을 바탕으로 다시 실행을 재개하고, 또 이 녀석의 차례가 끝나면 또 다른 프로세스가 동일한 절차로 CPU를 차지한 후 처리되게 된다!!
다만 이 백업 및 복원 절차가 컴퓨터 입장에선 꽤나 부담이 되는 과정이기 때문에, 멀티 스레드나 멀티 프로세스 등으로 개발된 프로그램이 마냥 성능이 우월하다고는 할 수 없다!! 스레드나 프로세스가 많아지는 만큼 컨텍스트 스위치도 자주 발생하기 때문!! 그러니 상황에 맞게 개발하는 것이 중요하다!!
'CS 공부' 카테고리의 다른 글
컴퓨터 구조 개요와 CPU (0) | 2025.01.05 |
---|---|
IOCP 겉핡기 - Blocking과 Non-blocking I/O, Multiplexing, IOCP (0) | 2024.12.23 |