프로그램이란?
- 프로그램이란 어떤 작업을 하기 위해 실행할 수 있는 파일(코드 덩어리)
- 파일이 저장 장치에는 있지만 메모리에는 올라가 있지 않은 정적인 상태
프로세스란?
실행 중인 프로그램을 의미. (같은 프로그램도 별도의 프로세스가 될수있다.)
- 커널에 등록되고 커널의 관리하에 있는 작업
- 각종 자원을 요청하고 할당 받을 수 있는 개체
- PCB를 할당 받은 개체
- 능동적인 개체 ( 실행 중 각종 자원을 요구, 할당, 반납하며 진행)
- 예를 들어, 우리가 컴퓨터에서 웹 브라우저를 켜면, 그 브라우저가 프로세스로 실행되는데. 프로세스는 프로그램이 실제로 CPU에서 돌아가면서 작업을 수행하는 독립적인 단위
프로세스 제어블록(PCB) - Process Controle Block
- 프로세스 제어블록(PCB)는 운영체제가 각 프로세스를 관리하기 위해 프로세스의 상태정보를 저장하고 있는 자료구조 (여권처럼, 프로세스에 대한 신분증 역할)
- 운영체제는 PCB에 담긴 프로세스 고유 정보를 통해 프로세스를 관리하여 프로세스의 실행상태, 우선순위, 스케줄링을 수행하고 다른 프로세스와의 동기화를 제어한다.
- PCB에는 다음과 같은 정보를 포함한다.
정보 | 설명 |
포인터 (Pointer) | 프로세스의 현재 위치를 저장하는 포인터 정보 |
프로세스 상태 (Process state) |
프로세스의 각 상태 - 생성(New), 준비(Ready), 실행(Running), 대기(Waiting), 종료(Terminated) 를 저장 |
프로세스 아이디 (Process ID, PID) |
프로세스 식별자를 지정하는 고유한 ID |
프로그램 카운터 (Program counter) |
프로세스를 위해 실행될 다음 명령어의 주소를 포함하는 카운터를 저장 |
레지스터 (Register) | 누산기, 베이스, 레지스터 및 범용 레지스터를 포함하는 CPU 레지스터에 있는 정보 |
메모리 제한 (Memory Limits) |
운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보 |
열린 파일 목록 (List of open file) |
프로세스를 위해 열린 파일 목록 |
프로세스의 자원 구조 (코드, 데이터, 힙, 스택 영역)
프로그램이 실행되어 프로세스가 만들어지면 4가지의 메모리 영역으로 구성되어 할당받는다.
프로세스는 사용자 영역과 커널 영역으로 나뉘는데, 사용자가 작성한 프로그램은 사용자 영역에서 실행되고, 운영체제의 중요한 기능은 커널 영역에서 처리된다.
- 사용자영역
- 코드 영역: 프로그램의 실행 코드가 저장된 곳으로 CPU가 해석 가능한 기계어로 이루어짐( Read Only)
- 데이터 영역: 프로그램이 실행되는 동안 유지되는 데이터(전역 변수나 정적 변수)
- 힙 영역: 사용자가 직접 동적으로 할당되는 메모리 공간. 할당 후에 해제해야됨 (안하면 메모리 누수 문제가 발생할 수 있음) 직접해제, 자동해제(가비지 컬렉션 gc)
- 스택 영역: 함수 호출 시 생성되는 지역 변수와 함수 호출 기록이 쌓이는 곳.( 임시로 저장 )
- 코드영역과 데이터 영역은 정적 할당영역 , 힙과 스택 영역은 동적할당영역
- 힙 영역은 낮은 주소→ 높은 주소로 할당, 스택 영역은 높은 주소에서 낮은 주소로 할당한다. (주소의 중복을 방지)
프로세스의 상태(Process States)
프로세스의 상태는 자원간의 상호작용에 의해 결정
프로세스 상태 및 특성
프로세스는 실행 도중 여러 상태를 오가며 실행
- Created (생성 상태): 프로세스가 생성된 상태.
- 작업을 커널에 등록
- PCB 할당 및 프로세스 생성
- Ready (준비 상태): CPU에서 실행되기를 기다리고 있는 상태.
- 프로세서 외의 다른 모든 자원을 할당 받은 상태( 할당 대기상태, 즉시 실행가능 상태)
- Running (실행 상태): CPU에서 실행되고 있는 상태.
- 프로세서와 필요한 자원을 모두 할당 받은 상태
- Blocked/Asleep State (대기 상태): 프로세서 외의 다른 자원을 기다리는 상태
- 자원 할당은 System call에서 이루어짐
- Terminated/Zombie State (종료상태): 프로세스 수행이 끝난 상태.
- 모든 자원 반납 후 커널 내 일부 PCB정보만 남아있음
- Suspended State : 메모리를 할당 받지 못한 상태프로세스의 상태(Process States)
- 프로세스의 상태는 자원간의 상호작용에 의해 결정
인터럽트(Interrupt)
예상치 못한 외부에서 발생한 이벤트로, 컴퓨터 시스템에서 예외가 발생할때, CPU에게 알려 처리할 수 있도록 하는
- 인터럽트 발생
- 외부 하드웨어나 소프트웨어에서 인터럽트가 발생하면, 현재 실행 중인 프로세스 Pi는 CPU에서 멈추고 인터럽트 핸들러(Interrupt Handler)가 실행된다.
- 문맥 저장(Context Saving)
- 인터럽트가 발생하면, CPU는 현재 실행 중인 프로세스 Pi의 상태(문맥)를 저장한다.
- 이 상태는 PCB에 저장되며, PCB는 프로세스의 현재 상태, 레지스터 값, 프로그램 카운터 등의 정보를 가지고 있으며, 이 정보를 저장함으로써 나중에 다시 해당 프로세스를 재개할 수 있다.
- 인터럽트 처리
- 인터럽트 핸들러는 커널 영역에서 실행되며, 인터럽트가 무엇인지에 따라 처리하며, 이 단계에서 ISR(Interrupt Service Routine)을 통해 필요한 작업을 처리한다.
- 스케줄러 호출
- 인터럽트 처리가 완료되면, 운영체제의 스케줄러가 다음에 실행할 프로세스를 선택한다.
- 이때, 꼭 원래 실행 중이던 프로세스 Pi다시 선택되지 않을 수도 있다. 다른 프로세스 Pj가 실행될 수 도 있음
- 문맥 복원(Context Restoring)
- 만약 스케줄러가 원래 프로세스 Pi를 재개한다면, PCB에서 저장된 문맥을 다시 CPU에 로드하여 원래 상태로 돌아간다.
- 그렇지 않다면 새로운 프로세스 Pj의 문맥이 복원된다.
CPU 작업 처리 방식
병렬성 (Parallelism) → 물리적인 동시 실행
병렬성이란 여러 프로세스가 동시에 작업을 처리하며 여러작업이 실제로 동시에 실행되는 개념
- 작업은 독립적으로 실행되며, 각각의 프로세서에서 병렬로 처리된다.
- 대규모 계산 작업이나 데이터 처리 작업에서 서능을 향상시키는데 사용된다.
- 듀얼코어, 쿼드코어 등 멀티 프로세서가 달린 컴퓨터에서 할 수 있는 방식이다.
동시성 (Concurrency) → 논리적인 동시 실행
여러 작업이 동시에 실행되는 것 처럼 보이는 상황
- 동시성은 멀티 태스킹의 기본 원리로, 단일 프로세서에서 여러 프로세스 또는 여러 스레드가 동시에 실행되는 것 처럼 보이게 한다.
- 실제로 CPU는 한 번에 하나의 프로세스만 실행할 수 있고, 빠르게 프로세스 간에 전환하면서 하나의 프로세스가 잠시 실행되고 그 다음 프로세스가 실행되는 방식이다.
- 하나의 CPU에서 각각의 프로세스 작업을 작게 쪼개어서 번갈아 처리 한다.
설명 | |
Context | 실행을 재개하기 위해 기억해야할 정보( 프로세스와 관련된 정보들 집함) → PCB에 저장 |
Context Saving | 현재 프로세스의 Register context를 저장하는 작업 |
Context Restoring |
Register context를 프로세스로 복구하는 작업 |
문맥 교환 (Context Switching)
동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관(Context Saving) 하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구(Context Restoring) 하는 작업
- 마치 여러 탭을 번갈아 가며 웹 서핑하는 것과 비슷하다. 한 탭에서 작업하던 걸 일시 중지하고 다른 탭에서 다시 작업을 시작하는 것
- 프로세스 P1이 실행 중이었다가, 프로세스 P2로 전환해야 할 때, P1의 상태를 PCB에 저장하고 P2의 상태를 다시 CPU에 로드하는 과정이 문맥 교환
- 문맥교환 과정은 오버헤드(성능 비용)가 있기 때문에 문맥 교환이 너무 자주 일어나면 성능이 저하될 수 있다.
- 대표적인 컨텍스트 스위칭 오버헤드
- PCB 저장 및 복원 비용
- CPU 캐시 메모리 무효화에 따른 비용
- 프로세스 스케줄링 비용
문맥교환의 시점
- 멀티 태스킹
- 다수의 프로세스가 하나의 CPU자원을 나누어 사용하는 것
- 실행 가능한 프로세스들이 운영체제의 스케줄러에 의해 조금씩 번갈아 수행됨
- CPU를 할당받을 때 문맥 교환이 일어남
- 매우 빠른 속도로 처리되기 때문에 동시에 처리되는 것처럼 느낌
- 인터럽트 처리
- I/O request : 입출력 요청
- time slice expried : CPU 사용시간 만료
- fork a child : 자식 프로세스 생성
- wait for an interrupt : 인터럽트 처리 대기
- 사용자 및 커널 모드 전환
- 운영 체제에서 사용자 모드와 커널 모드 사이의 전환이 필요할 때 필수는 아니지만 운영체제에 따라 문맥 교환이 발생
스레드란?
프로세스 내에서 독립적으로 실행되는 흐름
- 프로세스는 여러 스레드를 가질 수 있고, 스레드들은 코드와 데이터를 공유하며, CPU에서 실행되는 작업의 최소 단위
- 크롬 브라우저가 실행되면 프로세스 하나가 생성되고, 우리는 브라우저에서 파일을 다운받으며 게임도 하고, 쇼핑도 할수있다. 이런 일련의 작업들 흐름을 쓰레드라 한다.
스레드의 자원 공유
- 프로세스의 4가지 메모리 영역(코드, 데이터, 힙, 스택) 중 스레드는 Stack만 할당받아 복사하고,Code, Data, Heap은 프로세스내의 다른 스레드들과 공유된다.
- 따라서 각각의 스레드는 별도의 stack을 가지고 있지만 heap 메모리는 고유하기 때문에 서로 다른 스레드에서 가져와 읽고 쓸 수 있게 된다.
스레드의 장점
- 사용자 응답성 : 일부 스레드가 처리가 지연되어도, 다른 스레드는 작업을 계속 처리 가능
- 자원 공유 : 자원을 공유해서 효율성 증가(커널의 개입을 피함)
- 경제성 : 프로세스의 생성, 문맥교환에 비해 효율적
- 멀티 프로세서 활용 : 병렬처리를 통해 성능 향상
✅ 프로세스와 스레드의 차이점
구분 | 프로세스 (Process) | 스레드 (Thread) |
메모리 구조 | 독립된 메모리 공간 (코드, 데이터, 힙, 스택 모두 분리) | Stack만 개별 할당, 나머지(코드, 데이터, 힙)는 공유 |
자원 공유 | 다른 프로세스와 자원 공유 불가 | 같은 프로세스 내 다른 스레드와 자원 공유 |
데이터 교환 | 프로세스 간 통신(IPC) 필요 → 복잡하고 느림 | 자원 공유로 빠르고 간단한 데이터 교환 가능 |
충돌 위험성 | 낮음 (격리됨) | 높음 (공유 자원에 대한 동기화 필요) |
문맥 교환 비용 | 큼 (CPU 캐시 초기화, 메모리 로딩 등) | 작음 (자원 공유 및 가벼운 TCB로 인해 빠름) |
제어 블록 구조 | PCB (Process Control Block) - 상대적으로 무거움 |
TCB (Thread Control Block) - Stack 및 레지스터 포인터만 저장 |
최소 실행 단위 | 최소 1개의 스레드를 포함 | 프로세스 내 실행 단위로 존재 |
✅ 멀티프로세스 vs 멀티스레드
구분 | 멀티 프로세스 | 멀티 스레드 |
실행 구조 | 여러 개의 독립적인 프로세스가 동시에 실행 | 하나의 프로세스 내 여러 스레드가 동시에 실행 |
자원 격리 | 완전한 격리 (프로세스 간 자원 공유 없음) | 자원 공유 (메모리, 힙 등 공유) |
안정성 | 한 프로세스가 죽어도 다른 프로세스는 영향 없음 | 하나의 스레드가 문제 생기면 전체 프로세스에 영향 가능 |
메모리 사용 | 많음 (프로세스마다 별도 메모리 필요) | 적음 (공유 메모리 구조) |
문맥 교환 비용 | 큼 | 작음 |
속도 및 효율 | 느림, 자원 소모 큼 | 빠르고 효율적 |
동기화 필요성 | 낮음 | 높음 (경합 조건 발생 가능) |