프로세스 vs 스레드, 멀티 프로세스 vs 멀티 스레드
- 프로세스
- 프로그램이 메모리로 올라와 운영체제로부터 CPU를 할당받고 실행되고 있는 상태
- 하나의 프로그램(애플리케이션)은 하나 이상의 프로세스를 가짐
- 각 프로세스는 별도의 주소 공간에서 실행되고 프로세스끼리 지원을 공유하지 않기 때문에 다른 프로세스의 변수나 자료구조에 접근할 수 없음
- 각각 독립된 메모리 영역(Code, Data, Stack, Heap)을 할당 받음
- 스레드
- 프로세스 내에서 실행되는 흐름의 단위
- 하나의 프로세스는 하나 이상의 스레드를 가짐
- 각각의 스레드는 프로세스 내에서 Stack 영역만 따로 할당받고 Code, Data, Heap 영역은 서로 공유함
- 멀티프로세스
- 하나의 애플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
- 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 해당 프로세스만 죽는 것으로 다른 프로세스에게 영향을 주지 않음 (독립적)
- 각각의 자식 프로세스는 독립된 메모리 영역을 할당받았기 때문에 문맥 교환 시 캐시에 있는 모든 데이터를 리셋하고 다시 캐시 정보를 불러와야해 오버헤드 발생
- 멀티스레드
- 하나의 애플리케이션을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하도록 하는 것
- Stack을 제외한 자원을 공유하여 CPU 스케줄링 과정 Context Switching(문맥 교환) 시 비용과 부담이 적음
- 여러 스레드가 동시에 하나의 자원에 접근하는 경우에 대한 동기화 문제 발생
- 여러 개의 스레드 중 하나에 문제가 발생하면 해당 스레드 뿐만 아니라 다른 스레드의 작업에도 영향을 줌
프로세스 메모리 구조
- Code(Text)
- 사용자가 작성한 프로그램 코드가 저장되는 공간
- 수행할 수 있는 기계어 명령의 형태로 변환되어 저장
- Data
- 전역 변수나 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간
- 컴파일 시 데이터가 저장되며 프로그램 종료 시 삭제됨
- Heap
- 프로그래머가 필요할 때마다 사용할 수 있는 메모리 공간
- 동적으로 메모리를 할당-해제
- 동적 메모리 할당이 일어나면 주소값이 커지는 방향으로 영역 확장
- Stack
- 데이터를 일시적으로 저장하는 공간
- 호출된 함수가 수행을 마치고 복귀할 주소나 지역 변수, 매개 변수, 리턴값 등이 임시로 저장
- 프로그램 실행 중 함수 호출 시 데이터가 저장되고 함수의 수행이 완료되면 삭제됨
- 데이터가 임시로 저장되면 주소값이 작아지는 방향으로 영역 확장 (Heap과 반대)
- Stack 영역과 Heap 부분이 만난다면 메모리가 소진되었다는 의미로 계속해서 데이터를 저장하면 메모리 초과로 stack overflow 발생
동기와 비동기, Blocking과 Non-Blocking
- 동기/비동기는 일을 처리하는 순서(시점)과 결과(처리)와 관련 → 함수 호출 후 리턴값을 기다리냐 마냐
- 블로킹/논블로킹은 제어권과 관련
- 동기(Synchronous)
- 요청 작업의 종료 시점과 나머지 작업 요청 시작 시점이 같아 끝나는 동시에 시작
- 호출한 함수의 작업 완료 응답이 필요해 작업 완료 여부를 계속해서 묻거나 응답을 기다리고 응답에 대해 즉각적으로 처리
- 비동기(Asynchronous)
- 요청 작업의 종료와 다른 요청의 시작 시점이 일치하지 않으며 끝나는 동시에 시작하지 않음
- 함수를 호출하여 실행만 시킬 뿐 작업의 완료 여부에는 관심을 갖지 않으며 자신의 작업을 계속해서 이어가며 응답(리턴값)에 대해 즉각적으로 처리하지 않을 수 있음
- 요청 및 함수 호출 시 콜백 함수를 함께 전달하고, 응답이 준비되면 함께 보낸 콜백 함수가 실행됨
- 블로킹(Blocking)
- A 함수가 B 함수를 호출하면 A는 B에게 제어권을 넘겨주고, B는 자신의 작업이 끝날 때까지 제어권을 가지고 있음
- A 함수는 B 함수의 실행이 끝날 때까지 멈추고 기다림
- 논블로킹(Non-Blocking)
- A 함수가 B 함수를 호출하면 제어권은 넘어가지 않은 채 B 함수가 실행
- A 함수는 여전히 제어권을 가지고 있으므로 B 함수의 실행/종료 여부와 관계없이 계속해서 자신의 작업 수행
데드락(교착상태)
교착 상태(Dead Lock, 데드락)
- 두 개 이상의 프로세스들이 서로가 가진 자원을 무한정 기다리며 멈추어 있는 상태
발생 조건
- 상호 배제(Mutual Exclusion)
- 한번에 하나의 프로세스만이 공유 자원을 사용할 수 있어야 함
- 점유와 대기(Hold and Wait)
- 모든 프로세스는 최소 하나의 자원을 점유하면서 다른 프로세스가 가지고 있는 자원을 기다리고 있어야 함
- 비선점(Non Preemption)
- 다른 프로세스가 자신에게 할당된 자원을 모두 사용해 반환할 때까지 강제로 뺏어올 수 없어야 함
- 환형 대기(Circular Wait)
- 공유 자원과 해당 자원을 사용하기 위해 대기하는 프로세스들이 원형으로 구성되어 있어야 함
- 자신에게 할당된 자원을 점유하면서 앞 or 뒤 프로세스의 자원을 요구
해결 방안
- 예방
- 교착 상태가 발생하지 않도록 발생 4가지 조건 중 하나를 제거하는 방법
- 공유 자원을 여러개의 프로세스가 한번에 사용할 수 있도록 하거나, 자원을 점유하지 않은 상태에서만 자원을 요구할 수 있도록 하거나 프로세스가 다른 자원을 요구할 때 이미 점유하고 있던 자원은 다른 프로세스가 선점할 수 있도록 하는 등
- 회피
- 은행원 알고리즘 → • 프로세스의 자원 할당량을 미리 파악해 최소한 하나의 프로세스에게 할당해줄 만큼의 자원은 CPU가 보유하고 있어야 한다는 개념 (안전 상태 유지)
- 탐지
- 자원 할당 그래프
- 회복
- 프로세스 강제 종료 (모든 프로세스 중단, 하나씩 중단)
- 교착상태에 있는 프로세스로부터 자원 회수 후 다른 프로세스에게 할당
프로세스 동기화 (뮤텍스/세마포어)
- 뮤텍스
- 잠금 또는 잠금 해제라는 상태만을 가지는 Boolean 타입의 Lock 변수를 사용하여 다중 스레드들의 접근을 조율
- 동기화 대상이 오직 1개일 때 사용
- Lock을 통해 자원을 소유할 수 있음
- Lock을 하여 소유권을 가진 스레드만 뮤텍스를 해제할 수 있음
- 프로
- 세마포어
- 0이상의 정수를 담고 있는 세마포어 변수를 통해 공유 자원에 접근할 수 있는 최대 허용치 만큼 접근 허용 (자원을 이용할 때 세마포어 변수 - 1, 빠져나올 때 세마포어 변수 + 1
- 동기화 대상이 1개 이상일 때 사용
- 세마포어는 자원을 소유할 수 없음
- Lock을 하지 않은 스레드도 Signal을 통해 뮤텍스를 해제할 수 있음
- 이진 세마포어(세마포어 변수 초기값 = 2)는 뮤텍스처럼 동작
CPU 스케줄링
CPU 스케줄링
- 비선점형 방식
- 다른 프로세스가 CPU를 점유하고 있다면 이를 뺏을 수 없어 CPU 소유권을 포기하는 방식
- 문맥 교환으로 인한 부하가 적지만 프로세스 배치에 따라 효율성 차이가 많이남
- Ex) FCFS, SJF, 우선순위 등
- 선점형 방식
- 다른 프로세스가 CPU를 점유하고 있다면 이전에 실행 중이던 프로세스를 중단시키고 CPU 소유권을 넘기는 방식
- 처리 시간이 매우 긴 프로세스의 CPU 독점을 막을 수 있지만 잦은 컨텍스트 스위칭으로 부하가 발생할 수 있음
- Ex) Round Robin, SRF, MLQ/MLFQ
- FCFS(First Come First Served)
- 큐에 도착한 순서에 따라 가장 먼저 요청한 프로세스에게 CPU를 할당해주는 알고리즘
- 기아 현상 X, 반환 시간 Good
- 호위 효과(소요시간이 긴 프로세스가 먼저 도달하면 효율성 Bad), 평균 대기 시간과 응답 시간 Bad
- SJF(Shortest Job First)
- 큐에 도착한 프로세스 중 실행 시간(Burst Time)이 가장 짧은 프로세스를 먼저 실행하는 알고리즘
- 평균 대기 시간이 짧고 짧은 작업에 유리
- 실행 시간이 긴 프로세스의 경우 기아 현상 발생, 프로세스의 실제 실행 시간을 예측하기 어려움
- Round Robin(RR)
- 각 프로세스에게 동일한 할당 시간(Time Quantum)을 부여해서 해당 시간 동안만 CPU를 이용하도록 하는 알고리즘
- n개의 프로세스에 대해 할당 시간이 q라면 어떤 프로세스도 (n-1)q 이상의 시간을 기다리지 않아도되고 응답 시간이 빠름
- 할당 시간 q가 커지면 FCFS처럼 동작, 할당 시간 q가 작아지면 컨텍스트 스위칭이 찾아져서 오버헤드가 커짐
- MFQ/MLFQ(Multi-Level Feedback Queue)
- 여러 종류의 준비 큐(Ready Queue)를 활용하고 각 준비큐마다 다른 타임 퀀텀 적용
- 자신의 타임 퀀텀을 모두 사용한 프로세스는 아래 준비큐로 내려감
페이징 vs 세그멘테이션
- Paging은 고정 크기의 분할 단위(프레임), Segmentation은 가변 크기의 분할 단위(세그먼트)를 가짐
- Paging은 내부 단편화 발생 가능, Segment은 외부 단편화 발생 가능
- Paging은 외부 단편화 해결, Segment은 내부 단편화 해결
페이지 교체 알고리즘
- 필요한 페이지가 메모리에 없을 때 페이지 부재(page fault)가 발생하면 요청된 페이지를 디스크에서 메모리로 읽어와야 함(Swapping, 페이지 교체)
- 메모리 내 페이지 부재율을 최소하하기 위한 목적으로 디스크의 스왑 영역으로 보낼 페이지를 결정하는 알고리즘을 의미
- FIFO(First In First Out)
- 가장 먼저 메모리에 올라온 페이지를 가장 먼저 내보내는 알고리즘
- 구현이 간단하지만 페이지의 향후 참조 가능성을 고려하지 않기 때문에 비효율적인 상황이 발생할 수 있음
- Belady's Anomaly(FIFO Anomaly) 현상 발생 가능
- 메모리 증가로 더 많은 프레임을 사용했는데도 페이지 부재 횟수가 오히려 증가하는 이상 현상
- LRU(Least Recently Used)
- 가장 오랫동안 사용하지 않은 페이지를 교체하는 알고리즘
- 성능이 좋은 편이지만 프로세스가 주기억장치에 접근할 때마다 참조된 페이지 시간을 기록해야해 오버헤드 발생 가능
- LFU(Least Frequently Used)
- 참조횟수가 가장 적은 페이지를 교체하는 알고리즘
- 가장 최근에 불러온 페이지가 교체될 수 있으며, 이에 따른 오버헤드가 발생할 수 있음
https://www.tistory.com/event/write-challenge-2024
작심삼주 오블완 챌린지
오늘 블로그 완료! 21일 동안 매일 블로그에 글 쓰고 글력을 키워보세요.
www.tistory.com
'🎈 > 면접 준비' 카테고리의 다른 글
[기술 면접] 네트워크 (2) | 2024.11.07 |
---|---|
[CS 지식] CI/CD에 대해서 (8) | 2024.11.06 |
[CS 지식] 소프트웨어 개발 보안 (0) | 2024.11.04 |
[CS 지식] OSI 7계층 (5) | 2024.10.11 |
[CS 지식] INNER JOIN과 OUTER JOIN의 차이 (0) | 2024.09.30 |