저번학기에 배운 건데도 기억이 안나다니
공부는 진짜 유산소와 같다
계속 해야함
면접용 CS 정리라서 운영체제 시험 준비를 하시는 분들은 안맞을 수도 있어용
프로세스와 스레드
- 간단히 생각하면 프로세스>스레드. 프로세스 안에 스레드 있음
- 프로세스
- 실행 중인 프로그램의 인스턴스
- 독립적인 메모리 공간을 가짐
- 운영체제가 자원을 할당하는 기본 단위
- 스레드
- 프로세스 내에서 실행되는 작은 실행 단위
- 같은 프로세스 내에서 다른 스레드들과 메모리 공유(코드, 데이터, 힙)
- 공유 메모리 때문에 데이터 접근 시 동기화가 필요함
- 스레드마다 독립적인 스택과 레지스터 가짐
- 통신
- 프로세스 간 통신 - IPC inter process communicaiton
- 독립적인 메모리 공간을 사용하므로 통신 이 복잡함
- 파일, 소켓, 파이프, 메시지 큐, 공유 메모리 등을 사용
- 스레드 간 통신
- 같은 메모리 공간을 공유하므로 간단하게 통신
- 변수나 메모리 직접 사용 가능
- 프로세스 간 통신 - IPC inter process communicaiton
- 오버헤드
- 프로세스
- 독립적인 메모리와 자원을 관리하므로 오버헤드가 큼
- 문맥 전환(context switch) 시 프로세스의 메모리 맵핑 필요
- 스레드
- 메모리 공유 덕에 문맥 전환 비용이 상대적으로 낮음
- 프로세스
- 안정성
- 프로세스
- 한 프로세스의 문제는 다른 프로세스에 영향 x. 독립적임. 높은 안정성
- 스레드
- 한 스레드의 오류가 프로세스 전체에 영향 줄 수 있음. 낮은 안정성.
- 프로세스
- 사용 사례
- 프로세스
- 독립적인 작업이 필요하거나 보안, 안정성이 중요한 경우
- 예: 브라우저 각 탭은 프로세스 별로 분리해서 관리
- 스레드
- 작업이 밀접히 관련되어 있고, 자원을 효율적으로 공유해야 하는 경우
- 예: 멀티스레드 웹 서버
- 프로세스
동시성 제어의 필요성
- 동시성 제어가 왜 필요한가?
- 여러 작업이 동시에 실행되며 동일한 자원을 수정하면 결과에 문제가 생길 수 있음
- 예시: 두 개의 은행 계좌 이체가 같은 계좌에 접근해 잔액을 잘못 계산
- Race Condition 방지
- 여러 스레드가 동시에 공유 자원에 접근해 실행 순서에 따라 결과가 달라지는 문제 방지
- Deadlock 회피
- 두 개 이상의 프로세스/스레드가 서로 자원을 기다리면서 무한 대기가 되는 상황을 방지
- 성능 최적화
- 효율적으로 동시성을 관리해 불필요한 대기 시간을 줄이고 시스템 성능 최대화
동시성 제어 주요 개념
- 임계 구역 critical section
- 공유 자원을 접근하거나 수정하는 코드 영역
- 한 번에 하나의 스레드만 이 영역에 들어가도록 제한
- 뮤텍스 mutex
- 상호 배제를 통해 한 번에 하나의 스레드만 임계 구역에 접근하도록 보장하는 매커니즘
- 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고, 사용한 후에는 unlock()으로 해제함
- 자금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고, 해제는 접근할 수 있음
- 오직 잠금 or 해제의 상태만을 가짐
- 상호배제: 여러 프로세스나 스레드가 공유자원에 동시에 접근하지 못하도록 제어하는 개념
- 상호배제 조건
- 한 번에 하나의 프로세스/스레드만 자원에 접근 가능
- 임계 구역에 자원을 요청한 프로세스가 있다면, 하나는 반드시 진입할 수 있어야 함
- 유한 대기 조건, 어떤 프로세스도 무한히 대기해서는 안됨
- 비선점 조건, 임계 구역에서 작업 중인 프로세스를 강제로 종료하거나 자원을 뺏으면 안됨
- 세마포어 semaphore
- 카운팅 방식으로 자원 접근 제어
- 동시에 N개의 스레드가 자원에 접근할 수 있도록 허용
- 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리함
- wait()은 자신의 차례가 올 때까지 기다리는 함수이고, signal()은 다음 프로세스로 순서를 넘겨주는 함수
- 바이너리 세마포어
- 0과 1만 가지고 있어서, 뮤텍스와 비슷해보임
- 그러나 뮤텍스는 잠금을 기반으로 상호배제를 하는 '잠금 매커니즘'이고
- 세마포어는 신호를 기반으로 상호배제를 하는 '신호 매커니즘'
- 신호 매커니즘의 예시는 어떤 작업을 하다가 새로운 작업 요청이 들어오면 이전 작업이 중단되고 새 작업이 실행되는... 그런 신호 베이스
- 카운팅 세마포어
- 여러 개의 값을 가질 수 있음. 여러 자원에 대한 접근을 제어함
- 락
- 특정 자원을 다른 스레드/프로세스가 접근하지 못하도록 잠금
- monitor
- 뮤텍스와 조건 변수를 활용해 임계 구역을 제어하는 고수준 동기화 기술
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 접근 인터페이스만 제공
- 모니터는 모니터 큐를 통해 공유 자원에 대한 작업을 순차적으로 처리함
- 세마포어보다 구현하기 쉽고, 상호배제가 자동으로 일어남
- 스핀락
- 락이 풀릴 때까지 대기하면서 cpu를 계속 점유하는 기법. 짧은 대기인 경우 유리
동시성 제어에서 발생하는 문제
- race condition
- 여러 작업이 동시에 자원에 접근하면서 실행 순서에 따라 예기치 않은 결과가 발생
- 해결방법: 락, 뮤텍스, 세마포어 사용
- deadlock
- 두 개 이상의 작업이 서로 자원을 기다리면서 무한 대기 상태에 빠짐
- 해결 방법: 락 오더링으로 순서 고정, 타임아웃 설정, 데드락 탐지 알고리즘 사용
- starvation
- 한 스레드가 계속해서 자원을 얻지 못하고 대기 상태에 빠지는 문제
- 해결 방법: 공정한 자원 할당
- live lock
- 두 개 이상의 작업이 서로의 상태를 바꾸며 진전 없이 계속 대기하는 상태
- 해결 방법: 작업 중단 타이머 설정
동시성 제어 기법
- 락 기반
- 락, 뮤텍스, 세마포어 등 전통 기법
- 간단하지만 데드락, 기아 상태, 성능 저하의 우려가 있음
- 낙관적 동시성 제어
- 작업이 충돌하지 않을 것이라고 가정하고 실행한다
- 출동 시 롤백
- 데이터베이스 트랜젝션에서 사용
- 비관적 동시성 제어
- 자원 접근 전 락을 걸어 충돌 예방
- 충돌 가능성이 높은 경우에 적합
- 락프리 또는 cas
- 락 대신 하드웨어 지원을 이용해 상태를 원자적으로 업데이트
- java의 atomicInteger 등
- 트랜잭션
- 데이터베이스에서 동시성 관리에 사용
- ACID 원자성 일관성 고립성 지속성을 기반으로 함
동시성 제어 예시
- 파일 시스템
- 여러 프로그램이 같은 파일에 접근할 때 공기화 필요
- 예: 파일 읽기-쓰기 중 락을 걸어 충돌 방지
- 웹 서버
- 다수의 사용자 요청을 처리해 동일 데이터를 조회/수정하는 경우 동시성 제어
- 데이터 베이스
- 두 개의 트랜잭션이 동시에 같은 데이터를 업데이트 하려는 경우
DEADLOCK
- 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
- 교착 상태 원인
- 상호배제: 한 프로세스가 자원을 독점. 다른 프로세스는 접근 불가
- 점유대기: 특정 프로세스가 점유한 자원을 다른 프로세스가 요청함
- 비선점: 다른 프로세스의 자원을 강제적으로 가져오지 못함
- 환형 대기: 프로세스 a는 프로세스 b의 자원을 요구, 프로세스 b는 프로세스 a의 자원을 요구
- 교착 상태 해결
- 자원 할당 시 애초에 조건이 성립되지 않도록 설계함
- 교착 상태 가능성이 없을 때 자원 할당, 프로세스당 요청 자원의 최대치를 통해 자원 할당 여부 파악하는 은행원 알고리즘
- 은행원 알고리즘: 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정/불안정 상태를 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘
- 교착 상태가 발생하면 사이클이 있는지 확인하고, 관련된 프로세스를 하나씩 지움
- 교착 상태는 매우 드물게 일어나므로, 이를 처리하는 비용이 더 큼. 그냥 작업을 종료하는 방법. "시스템 응답 없음"
CPU 스케줄링 알고리즘
- CPU 스케줄러는 CPU 스케줄링 알고리즘에 따라 프로세스에서 해야하는 일을 스레드 단위로 CPU에 할당
- 비선점 방식
- 프로세스가 CPU 소유권을 스스로 포기하기 전까지 강제로 프로세스를 중지하지 않음
- 문맥 전환 부하가 적음
- FCFS
- 선입선출, 가장 먼저 온 것 가장 먼저 처리
- 긴 프로세스가 오래 점유해버리면 준비 큐에서 오래 기다리는 convoy effect가 있을 수있음
- SJF
- 실행이 짧은 프로세스 먼저 실행
- 긴 시간을 가진 프로세스가 뒤로 계속 밀리는 기아 현상이 일어날 수 있음
- 평균 대기 시간이 가장 짧음
- 실제로는 실행 시간을 알 수 없기 때문에 과거 실행 시간을 토대로 추측해서 사용
- 우선순위
- 오래된 작업일수록 우선순위를 높여서 보완함
- 선점형도 있고 비선점형도 있음
- 선점형 방식
- 현대 운영체제 채택
- 지금 사용하고 있는 프로세스를 알고리즘에 의해 강제 중단 후 다른 프로세스에 cpu 할당
- 라운드 로빈
- 각 프로세스에 동일한 할당 시간을 주고, 그 시간 안에 안끝나면 준비 큐로 돌려보냄
- q만큼 할당시간, n개의 프로세스 = (n-1)*q 시간 후에는 반드시 자기 차례가 옴
- 할당 시간이 너무 크면 FCFS랑 다를 게 없고, 짧으면 문맥 전환이 잦아서 오버헤드
- 일반적으로 전체 작업 시간은 길어지지만 평균 응답시간은 짧아짐
- 로드밸런서에서 트래픽 분산 알고리즘으로도 쓰임
- SRF
- SJF는 실행 중에 더 짧은 작업이 들어와도 기존 짧은 작업은 모두 수행함
- 그러나 SRF는 중간에 더 짧은 게 들어오면 프로세스 중지하고 짧은거 수행
- 다단계 큐
- 우선순위에 따른 준비 큐를 여러 개 사용
- 큐마다 라운드 로빈이나 FCFS 등 다른 스케줄링 알고리즘을 적용
- 큐 간의 프로세스 이동이 안되므로 스케줄링 부담이 적지면 유연성이 떨어짐
- 운영체제의 역할
- CPU 스케줄링과 프로세스 관리
- 메모리 관리
- 디스크 파일 관리
- 입출력 디바이스 관리
- PCB
- 프로세스 컨트롤 브록
- 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터
- 프로세스가 생성되면 PCB를 생성함
- 프로세스 생성 시 스택, 힙 구조 기반으로 메모리 할당되고, 이 메타데이터들을 PCB에 저장함
- 프로세스의 중요한 정보를 포함하므로 일반 사용자가 접근하지 못하게 커널 스택의 가장 앞부분에서 관리함
- 메모리 계층
- 레지스터: CPU 안에 있는 작은 메모리, 휘발성, 속도 가장 빠름, 기억용량 가장 작음
- 캐시: L1,L2캐시, 휘발성, 속도 빠름, 기억 용량 작음
- 저장장치
- 주기억: RAM, 휘발성, 속도 보통, 기억 용량 보통
- 보조기억: HDD, SSD, 비휘발성, 속도 낮음, 기억 용량 높음
'개발자 강화 > CS 개념' 카테고리의 다른 글
디자인패턴 MVC MVP MVVM FLUX (0) | 2024.12.12 |
---|---|
HTTP (0) | 2024.12.12 |
TCP와 UDP부터 출발하는 컴퓨터 네트워크의 생활 (0) | 2024.12.11 |