Загружаем каталог…
Загружаем каталог…
지난 글에서는 운영체제가 무엇인지, 그리고 운영체제가 CPU·메모리·입출력장치 등의 자원을 관리한다는 것을 알아봤다. 그렇다면 한 가지 궁금증이 생긴다. 운영체제는 실제로 실행 중인 프로그램을 어떻게 관리할까? 이번 글에서는 운영체제가 프로그램을 관리하기 위해 사용하는 핵심 개념인 프로세스와 스레드 를 알아본다. 프로세스의 구조부터 PCB, 문맥 교환, 프로세스 상태, 그리고 멀티프로세스와 멀티스레드까지 순서대로 정리해보자. 1. 프로세스란? 프로그램과 프로세스 먼저 프로그램과 프로세스를 구분해야 한다. 프로그램(Program) 은 저장장치에 존재하는 실행할 수 있는 파일이다. 그리고 이 프로그램을 메모리에 적재하고 실행하면 프로세스(Process) 가 된다. 즉, 프로세스 = 실행 중인 프로그램 이라고 정리할 수 있다. 예를 들어 컴퓨터에 게임 프로그램이 설치되어 있다고 생각해보자. 게임을 실행하지 않은 상태에서는 단순히 저장장치에 있는 프로그램이지만, 실행하는 순간 운영체제가 해당 프로그램을 메모리에 적재하고 실행을 관리한다. 이때 실행 중인 프로그램을 프로세스라고 한다. 2. 포그라운드 프로세스와 백그라운드 프로세스 프로세스는 사용자가 볼 수 있는 공간에서 실행되는지에 따라 크게 나누어 볼 수 있다. 포그라운드 프로세스 사용자가 볼 수 있는 공간에서 실행되는 프로세스 다. 예를 들어 우리가 직접 실행해서 사용하는 프로그램이 이에 해당한다. 백그라운드 프로세스 사용자가 직접 보고 있지 않은 공간에서 실행되는 프로세스 다. 사용자와 상호작용하지 않고 정해진 작업을 수행하는 프로세스를 데몬(daemon) 또는 서비스(service) 라고 부르기도 한다. 즉, 화면에 보이지 않는다고 해서 프로그램이 실행되고 있지 않은 것은 아니다. 3. 프로세스 제어 블록(PCB) 모든 프로세스는 실행을 위해 CPU가 필요하다. 하지만 CPU 자원은 한정되어 있다. 따라서 여러 프로세스가 CPU를 사용하려면 운영체제가 프로세스들을 관리하면서 CPU를 번갈아 할당해야 한다. 이때 운영체제가 프로세스를 관리하기 위해 사용하는 자료구조가 바로 프로세스 제어 블록(PCB, Process Control Block) 이다. PCB란? PCB는 프로세스와 관련된 정보를 저장하는 자료구조 다. 프로세스 하나하나에 붙어 있는 태그 라고 생각하면 이해하기 쉽다. 프로세스가 생성되면 커널 영역에 PCB가 생성되고, 프로세스가 종료되면 PCB도 폐기된다. PCB에는 어떤 정보가 들어 있을까? 대표적으로 다음과 같은 정보가 저장된다. 정보 설명 프로세스 ID(PID) 프로세스를 식별하기 위한 고유 번호 레지스터 값 프로그램 카운터(PC) 및 각종 레지스터 값 프로세스 상태 실행 중인지, 대기 중인지 등의 상태 CPU 스케줄링 정보 언제, 어떤 순서로 CPU를 사용할지에 대한 정보 메모리 정보 프로세스가 저장된 주소와 페이지 테이블 정보 파일·입출력장치 정보 할당된 입출력장치 및 열린 파일 목록 특히 PID(Process ID) 는 프로세스를 식별하기 위한 번호다. 학교에서 학생을 학번으로 구분하거나 회사에서 사번으로 구분하는 것과 비슷하게 생각할 수 있다. 4. 문맥 교환 CPU는 한 번에 하나의 프로세스만 실행할 수 있다. 그렇다면 여러 프로세스가 동시에 실행되는 것처럼 보이는 이유는 무엇일까? 프로세스들이 CPU를 아주 빠르게 번갈아 사용하기 때문이다. 예를 들어 다음과 같은 상황을 생각해보자. 프로세스 A 실행 ↓ 프로세스 A의 상태 저장 ↓ 프로세스 B의 상태 복구 ↓ 프로세스 B 실행 ↓ 프로세스 B의 상태 저장 ↓ 프로세스 A의 상태 복구 ↓ 프로세스 A 실행 이처럼 CPU가 한 프로세스에서 다른 프로세스로 실행을 넘길 때 기존 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 복구하는 과정을 문맥 교환(Context Switch) 이라고 한다. 문맥(Context)이란? 하나의 프로세스가 실행을 이어가기 위해 기억해야 하는 정보를 말한다. 운영체제는 이러한 정보를 PCB에 저장해두었다가 다시 해당 프로세스를 실행할 때 복구한다. 즉, 문맥 교환 = 기존 프로세스의 문맥을 저장하고 새로운 프로세스의 문맥을 불러오는 과정 이라고 이해하면 된다. 5. 프로세스의 메모리 영역 프로세스가 실행되면 메모리에는 여러 영역이 구성된다. 대표적으로 다음 네 가지 영역으로 나눌 수 있다. 영역 특징 저장되는 것 코드 영역 정적 할당, 읽기 전용 실행할 기계어 명령어 데이터 영역 정적 할당 전역 변수 등 힙 영역 동적 할당, 크기 변경 가능 프로그래머가 동적으로 할당하는 데이터 스택 영역 동적 할당, 크기 변경 가능 지역 변수, 매개변수 등 코드 영역 프로그램을 실행하기 위한 기계어 명령어 가 저장되는 영역이다. 읽기 전용으로 관리된다. 데이터 영역 프로그램이 실행되는 동안 유지되어야 하는 데이터가 저장된다. 대표적으로 전역 변수처럼 프로그램이 종료될 때까지 유지되는 데이터가 해당한다. 힙 영역 프로그래머가 직접 메모리를 할당할 수 있는 영역이다. 사용한 메모리를 제대로 반환하지 않으면 메모리 누수 가 발생할 수 있다. 스택 영역 지역 변수나 매개변수처럼 함수 실행 과정에서 잠시 사용되는 데이터가 저장된다. 힙과 스택은 어느 방향으로 자랄까? 프로세스의 메모리 구조에서는 힙과 스택이 서로 반대 방향으로 확장된다. 높은 주소 ┌─────────────┐ │ 스택 │ │ ↓ │ ├─────────────┤ │ │ │ 여유 공간 │ │ │ ├─────────────┤ │ ↑ │ │ 힙 │ ├─────────────┤ │ 데이터 │ ├─────────────┤ │ 코드 │ └─────────────┘ 낮은 주소 힙은 낮은 주소에서 높은 주소 방향으로, 스택은 높은 주소에서 낮은 주소 방향으로 쌓인다. 이렇게 서로 반대 방향으로 확장되도록 구성하면 두 영역이 효율적으로 메모리 공간을 사용할 수 있다. 6. 프로세스의 상태 프로세스는 실행되는 동안 항상 같은 상태에 머물러 있는 것이 아니다. 필요에 따라 여러 상태를 오가게 된다. 대표적인 프로세스 상태는 다음과 같다. 생성 ↓ 준비 ─────→ 실행 ─────→ 종료 ↑ │ │ │ │ ↓ └───────── 대기 생성 상태 프로세스가 이제 막 생성되어 메모리에 적재되고 PCB를 할당받은 상태다. 준비 상태 CPU를 할당받으면 바로 실행할 수 있지만, 아직 자신의 차례가 오지 않아 기다리는 상태다. 준비 상태에서 실행 상태로 넘어가는 것을 디스패치(Dispatch) 라고 한다. 실행 상태 CPU를 할당받아 실제로 실행 중인 상태다. 실행 중인 프로세스는 다음과 같은 이유로 다른 상태로 이동할 수 있다. 할당된 시간을 모두 사용함 → 준비 상태 입출력 작업이 필요함 → 대기 상태 대기 상태 입출력 작업처럼 CPU가 아닌 다른 작업이 완료되기를 기다리는 상태다. 입출력이 완료되면 다시 준비 상태로 돌아간다. 종료 상태 프로세스의 실행이 끝난 상태다. 운영체제는 프로세스의 PCB를 폐기하고 할당된 메모리를 정리한다. 7. 프로세스 계층 구조 운영체제는 프로세스를 단순히 나열해서 관리하는 것이 아니라 부모와 자식 관계 로 묶어 관리하기도 한다. 부모 프로세스 새로운 프로세스를 생성한 프로세스 자식 프로세스 부모 프로세스에 의해 생성된 프로세스 부모 프로세스 │ ├── 자식 프로세스 A │ ├── 자식 프로세스 B │ └── 자식 프로세스 C 부모 프로세스와 자식 프로세스는 서로 다른 프로세스이기 때문에 각각 다른 PID를 가진다. 일부 운영체제에서는 자식 프로세스가 자신의 부모 프로세스 PID인 PPID 를 확인할 수도 있다. 다만 운영체제마다 프로세스를 관리하는 방식에는 차이가 있으며, 원본 정리에서는 Windows는 프로세스를 계층적으로 관리하지 않는다는 차이점 을 언급하고 있다. 8. 프로세스 생성 — fork와 exec 부모 프로세스가 새로운 자식 프로세스를 만들고, 자식 프로세스가 부모와 다른 프로그램을 실행하게 만드는 과정에는 fork와 exec 시스템 호출 이 사용된다. fork fork 는 자신의 복사본을 자식 프로세스로 생성하는 시스템 호출 이다. 이 과정에서 메모리 내용이나 열린 파일 목록 등의 정보가 자식 프로세스에 상속될 수 있다. 쉽게 표현하면, fork = 부모 프로세스를 복제해서 자식 프로세스를 만든다. exec exec 는 자신의 메모리 공간을 다른 프로그램으로 교체하는 시스템 호출 이다. 이를 이용하면 자식 프로세스가 부모 프로세스와 다른 새로운 프로그램을 실행할 수 있다. 정리하면, 부모 프로세스 │ fork ↓ 자식 프로세스 │ exec ↓ 다른 프로그램 실행 즉, fork 는 복제 , exec 는 프로그램 교체 라고 기억하면 쉽다. 9. 스레드란? 이제 프로세스보다 한 단계 더 작은 실행 단위를 살펴보자. 스레드(Thread) 는 프로세스를 구성하는 실행 흐름의 단위 다. 하나의 프로세스는 하나 이상의 스레드를 가질 수 있다. 따라서 하나의 프로세스 안에서 여러 실행 흐름이 동시에 동작하도록 만들 수 있다. 예를 들어 어떤 프로그램이 다음과 같은 작업을 수행한다고 생각해보자. 프로세스 ├─ 스레드 1 → 사용자 입력 처리 ├─ 스레드 2 → 파일 처리 └─ 스레드 3 → 화면 업데이트 하나의 프로세스 안에서도 여러 작업을 나누어 처리할 수 있는 것이다. 10. 스레드는 무엇을 공유할까? 스레드는 프로세스에 속해 있기 때문에 프로세스의 자원을 공유할 수 있다. 하지만 모든 정보를 공유하는 것은 아니다. 스레드마다 독립적으로 가지는 것 스레드 ID 프로그램 카운터(PC) 레지스터 값 스택 각 스레드는 자신의 실행 흐름을 관리해야 하기 때문에 이러한 정보는 독립적으로 가지고 있어야 한다. 같은 프로세스의 스레드가 공유하는 것 코드 영역 데이터 영역 힙 영역 프로세스가 연 파일 등의 시스템 자원 즉, 스레드는 실행에 필요한 최소한의 정보는 각자 가지고, 프로세스의 자원은 공유한다. 이 구조가 멀티스레드의 중요한 특징이다. 11. 멀티프로세스와 멀티스레드 여기까지 이해했다면 두 개념을 비교해볼 수 있다. 멀티프로세스 여러 프로세스를 동시에 실행하는 방식이다. 각 프로세스는 기본적으로 독립적인 자원을 가진다. 멀티스레드 하나의 프로세스 안에서 여러 스레드를 동시에 실행하는 방식이다. 같은 프로세스에 속한 스레드들은 프로세스의 자원을 공유한다. 구분 멀티프로세스 멀티스레드 자원 공유 독립적 프로세스의 자원 공유 통신 및 협력 상대적으로 어렵고 비용이 큼 자원 공유로 상대적으로 유리 안정성 한 프로세스의 오류가 다른 프로세스에 미치는 영향이 상대적으로 적음 한 스레드의 오류가 전체 프로세스에 영향을 줄 수 있음 메모리 효율 동일 작업에서 중복 적재가 발생할 수 있음 필요한 정보만 별도로 유지하므로 상대적으로 효율적 둘 중 하나가 항상 더 좋은 것은 아니다. 각각의 구조가 가진 특징과 장단점이 있기 때문에 프로그램의 목적과 상황에 따라 적절한 방식을 선택해야 한다. 마무리 이번 글에서는 프로세스와 스레드가 무엇인지 , 그리고 운영체제가 실행 중인 프로그램을 어떻게 관리하는지 살펴봤다. 전체 흐름을 정리하면 다음과 같다. 프로그램 ↓ 실행 프로세스 ↓ PCB를 통해 운영체제가 관리 ↓ CPU를 할당받아 실행 ↓ 프로세스 상태가 계속 변화 ↓ 하나의 프로세스 안에서 여러 실행 흐름을 만들 수 있음 ↓ 스레드 특히 기억해야 할 개념을 정리하면 다음과 같다. 프로세스 → 실행 중인 프로그램 PCB → 프로세스의 정보를 저장하는 자료구조 문맥 교환 → 프로세스가 바뀔 때 상태를 저장하고 복구하는 과정 프로세스 상태 → 생성, 준비, 실행, 대기, 종료 fork → 프로세스 복제 exec → 실행할 프로그램 교체 스레드 → 프로세스를 구성하는 실행 흐름의 단위 멀티프로세스 → 여러 프로세스를 실행 멀티스레드 → 하나의 프로세스에서 여러 스레드를 실행 다음 글에서는 여러 프로세스가 CPU를 사용하려고 할 때 운영체제가 어떤 기준으로 CPU를 나누어 주는지 , 즉 CPU 스케줄링 에 대해 알아본다.
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
프로세스와 스레드 — 프로그램은 어떻게 실행되는가?. 지난 글에서는 운영체제가 무엇인지, 그리고 운영체제가 CPU·메모리·입출력장치 등의 자원을 관리한다는 것을 알아봤다. 그렇다면 한 가지 궁금증이 생긴다. 운영체제는 실제로 실행 중인 프로그램을 어떻게 관리할까? 이번 글에서는 운영체제가 프로그램을 관리하기 위해 사용하는 핵심 개념인 프로세스와 스레드 를 알아본다. 프로세스의 구조부터 PCB, 문맥 교환, 프로세스 상태, 그리고 멀티프로세스와 멀티스레드까지 순서대로 정리해보자. 1. 프로세스란? 프로그램과 프로세스 먼저 프로그램과 프로세스를 구분해야 한다. 프로그램(Program) 은 저장장치에 존재하는 실행할 수 있는 파일이다. 그리고 이 프로그램을 메모리에 적재하고 실행하면 프로세스(Process) 가…
Открыть источник