프로세스 VS 스레드
- 프로세스
- 독립된 메모리 공간과 자원을 가진 프로그램의 실행 단위
- 각 프로세스는 별도의 주소 공간을 사용
- 프로세스 간 통신은 IPC(Inter-Process Communication)을 사용해야 함
- 스레드
- 프로세스 내에서 실행되는 작은 실행 단위
- 같은 프로세스 내의 스레드들은 자원을 공유(메모리, 파일 등)
- 스레드 간 통신이 간단하고 비용이 적음
멀티스레드
- 장점
- 메모리와 자원의 공유로 효율적인 실행 가능
- 병렬 처리를 통해 응답성과 성능 향상
- 문맥 전환 비용이 적음
- 단점
- 동기화 문제로 인해 Deadlock, Race Condition 발생 가능
- 디버깅이 어렵고, 설계 복잡성이 증가
- 하나의 스레드 오류가 전체 프로세스에 영향을 줄 수 있음
- 멀티스레드 VS 멀티프로세스
3-1. 멀티스레드
- 프로세스 내의 스레드들이 자원을 공유하므로 문맥 전환 비용이 적음
- 동기화와 충동 문제가 발생할 가능성이 높음
3-2. 멀티프로세스
- 독립된 메모리 공간 사용으로 안전성이 높음
- 문맥 전환 비용이 크고, IPC가 필요하며 속도가 느릴 수 있음
DeadLock(교착 상태)
두 개 이상의 프로세스가 서로 자원을 기다리며 무한 대기 상태에 빠지는 상황, 시스템이 멈추며 더 이상 진행할 수 없는 상태가 됨.
Race Condition(경쟁 상태)
두 개 이상이 프로세스/스레드가 공유 자원에 접근하며 실행 결과가 실행 순서에 따라 달라지는 상태
스케줄러
- 장기 스케줄러(Long-term Scheduler or Job Scheduler)
: 디스크에 있는 작업 중 어떤 작업을 메모리에 올려 실행 가능 상태(Ready Queue)로 만들지 결정합니다.
- 시스템에 과도한 작업이 몰리는 것을 방지해 부하 조절 역할 수행
- 작업의 유형에 따라 I/O 바운드와 CPU 바운드 작업의 균형을 맞춥니다.
- 단기 스케줄러(Short-term Scheduler or CPU Scheduler)
: Ready Queue에 대기중인 프로세스 중 하나를 선택해 CPU를 할당합니다.
- CPU 스케줄링의 핵심을 담당
- 프로세스의 상태를 실행 상태(Running)로 전환
- 프로세스의 상태(ready -> running -> waiting -> ready
- 중기 스케줄러(Medium-term Scheduler or Swapper)
: 실행 중인 프로세스를 일시적으로 메모리에서 Swap Out 시키거나 다시 메모리 가져오는 Swap In 작업을 통해 메모리 관리를 수행
- 프로세스에게서 memory 를 deallocate
- 프로세스이 상태(ready -> suspended)
Suspended(stopped)
외부적인 이유로 프로세스의 수행이 정지된 상태로 메모리에서 내려간 상태를 의미한다.
프로세스 전부 디스크로 swap out 된다.
CPU 스케줄러
스케줄링 대상은 Ready Queue에 있는 프로세스들이다.
- FCFS(First Come First Served)
- 방식 : 도착 순서대로 처리
- 장점 : 간단하고 공정
- 단점 : 대기 시간이 길어질 수 있음
- SJF(Shortest - Job - First)
- 방식 : 실행 시간이 짧은 프로세스부터 처리
- 장점 : 평균 대기 시간 최소화
- 단점 : 실행 시간이 긴 프로세스가 무한 대기 상태에 빠질 수 있음
- SRTF(Shortest Remaining Time First)
- 방식 : 남은 실행 시간이 가장 짧은 프로세스에 CPU를 할당
- 특징 : SJF의 선점형 버전
- 장점 : 응답 시간 단축
- 단점 : Starvation 발생 가능
- Priority Scheduling
- 방식 : 우선순위가 높은 프로세스부터 실행
- 특징 : 선점형 또는 비선점형으로 구현 가능
- 단점 : 우선순위가 낮은 프로세스는 Starvation이 발생할 수 있음
- Round Robin (RR)
- 방식 : 프로세스에 일정 시간(Time Quantum)을 할당, 일정시간이 지나면 Ready Queue로 돌아가 CPU 를 다른 프로세스에 할당
- 장점 : 응답 시간이 고르게 분배되어 실시간 시스템에 적합
- 단점 : Time Quantum 설정이 매우 중요(짧으면 오버헤드, 길면 응답 시간 증가)
동기 VS 비동기
- 동기
- 작업이 순차적으로 진행되며, 작업 간 의존성이 있음
- 이전 작업이 끝날 때까지 대기
- 비동기
- 작업이 독립적으로 진행되며, 병렬적으로 실행 가능
- 작업 완료를 기다리지 않고 다른 작업 수행
프로세스 동기화
다수의 프로세스/스레드가 자원을 공유할 때 동시 접근 문제를 해결하기 위한 방법
-
Critical Section(임계 영역)
동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역
-
Critical Section Problem(임계영역 문제)
프로세스들이 Critical Section을 함께 사용할 수 있는 프로토콜을 설계하는 것
Requirement(해결을 위한 기본조건)
- Mutual Exclusion(상호 배제) : 프로세스 P1이 Critical Section 에서 실행중이라면, 다른 프로세스들은 그들이 가진 Critical Section에서 실행될 수 없다.
- Progress(진행) : Critical Section 에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 Critical Section 진입 후보로서 참여될 수 있다.
- Bounded Waiting(한정된 대기) : P1가 Critical Section 에 진입 신청 후 부터 받아들여질 때까지, 다른 프로세스들이 Critical Section 에 진입하는 횟수는 제한이 있어야 한다.
해결 방법
- Lock
- 하나의 프로세스만 공유 자원에 접근하도록 제한
- Semaphores
- Monitiors
- 동기화를 더 쉽게 구현하기 위해 공유 자원과 관련된 코드를 하나의 모듈로 캡슐화
- Busy Waiting
- 특정 조건이 충족될 때까지 CPU를 사용하며 대기
- Condition Variables
- 모니터 내부에서 특정 조건이 충족될 때까지 대기 상태를 관리
메모리 관리 전략
-
메모리 관리 배경
각각의 프로세스는 독립된 메모리 공간을 갖고, 운영체제 혹은 다른 프로세스 공간에 접근할 수 없는 제한이 걸려있다.
-
Paging
- 메모리를 동일 크기의 페이지 단위로 나누어 관리
- Segmentation
가상 메모리
프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법
- 효율적인 메모리 사용
- 프로그램의 필요한 부분만 물리 메모리에 올려 실행, 나머지는 디스크에 저장
- 논리 메모리 확장
- 실제 RAM 용량보다 큰 주소 공간을 제공하여 더 큰 프로그램 실행 가능
- 프로세스 간 격리
- 가상 주소 공간을 통해 프로세스 간 메모리 침범 방지
- 멀티태스킹 지원
- 여러 프로세스가 동시에 실행 가능하도록 메모리를 나누어 사용
구현 방식
- 페이징(Paging)
- 정의 : 메모리를 고정된 크기로 나누고, 필요한 페이지만 물리 메모리에 매핑
- 구성 요소
∘ Page : 프로세스가 사용하는 논리적 메모리 단위
∘ Frame : 물리 메모리의 고정된 크기 단위
∘ Page Table : 논리 주소를 물리 주소로 변환하는 데이터 구조
- 요구 페이징(Demand Paging)
- 정의 : 프로세스 실행 시 필요한 페이지만 로드하는 방식
- 장점
∘ 메모리 낭비를 줄이고, 실행 속도 향상
- Page Fault
∘ 필요한 페이지가 물리 메모리에 없는 경우 발생
∘ OS는 디스크에서 해당 페이지를 가져오고 실행 재게
- 페이지 교체(Page Replacement)
- 정의 : 물리 메모리가 가득 찬 경우, 새로운 페이지를 적재하기 위해 기존 페이지를 교체
- 알고리즘
∘ FIFO(First-In-First-Out) : 가장 먼저 적재된 페이지를 교체
∘ LRU(Least Recently Used) : 가장 오랫동안 사용되지 않은 페이지를 교체
∘ Optimal : 앞으로 가장 늦게 참조될 페이지를 교체(이론적 이상)
- 세그먼테이션(Segmentation)
- 정의 : 메모리를 다양한 크기의 논리적 단위로 나누는 방식
- 장점
∘ 사용자가 인식하기 쉬운 구조 제공(코드, 데이터, 스택 등)
- 단점
∘ 외부 단편화 문제 발생
장점
- 효율적인 메모리 사용
∘ 실제로 필요한 데이터만 메모리에 적재
- 프로그램 실행 기능
∘ 물리 메모리보다 큰 프로그램도 실행 가능
- 시스템 안정성 향상
∘ 프로세스 간 메모리 보호
단점
- Page Fault 비용
∘ 디스크 접근 시간이 매우 길어 성능 저하 기능
- 복잡한 관리
∘ Page Table 관리 및 교체 알고리즘 구현이 복잡
- 추가 오버헤드
∘ 메모리 매핑 및 페이지 교체로 인한 시스템 자원 소모
캐시의 지역성
프로그램 실행 중 데이터 접근 패턴을 분석하여, CPU와 메모리 간의 데이터 접근 효율을 높이는 데 중요한 개념입니다.
종류
- 시간 지역성(Temporal Locality)
- 최근에 참조된 데이터는 가까운 시간 안에 다시 참조될 가능성이 높다는 특성
- 공간 지역성(Spatial Locality)
- 특정 데이터가 참조되면, 그 주변의 데이터도 곧 참조될 가능성이 높다는 특성
- 순차 지역성(Sequentail Locality)
캐싱 라인
캐시에 데이터를 저장할 때 특정 자료 구조를 사용하여 묶음으로 저장한다.
3가지 종류
1. Full Associative
2. Set Associative
3. Direct Map