1️⃣콘텍스트 스위칭
- 인터럽트(interrupt): CPU에서 프로세스 처리 중 입출력 관련 이벤트 or 예외 상황이 발생할 때 대응할 수 있게 CPU에 처리를 요청하는 것. -> 입출력 발생 시, CPU 사용 시간이 만료될 시, 자식 프로세스를 생성할 시 발생.
- 콘텍스트: CPU가 처리하는 프로세스의 정보
- 콘텍스트 스위칭: 멀티 프로세스 or 멀티 스레드 환경에서 CPU가 처리 중인 프로세스의 정보를 바꾸는 것.
- 프로그램 카운터: 프로세스가 이어서 처리해야 하는 명령어의 주소 값
- 스택 포인터: 스택 영역에서 데이터가 채워진 가장 높은 주소 값
- PCB에 프로그램 카운터와 스택 포인터 값 저장 -> 처리 중인 프로세스 변경되어도 이전에 실행하던 코드를 이어서 실행 가능!
2️⃣프로세스 동기화
1. 경쟁 상태
: 여러 프로세스 or 스레드에서 하나의 공유 자원에 동시에 접근해 경쟁하는 상태
2. 임계 영역
: 공유 자원에 접근할 수 있고 접근 순서에 따라 결과가 달라지는 코드 영역
- 임계 영역에서 경쟁 상태가 발생하는 것을 방지하려면 여러 프로세스가 공유 자원에 접근해도 데이터의 일관성이 유지되도록 프로세스 동기화를 해야 함!
- 임계 영역에 여러 접근이 동시에 발생하는 것을 방지하려면?
(1) 상호배제 기법: 어떤 프로세스가 임계 영역을 실행 중일 때 다른 프로세스가 임계 영역에 접근할 수 없다. ex) 뮤텍스, 세마포어
(2) 진행: 임계 영역을 실행 중인 프로세스가 없을 때 다른 프로세스가 임계 영역을 실행한다.
(3) 한정된 대기: 임계 영역에 접근을 요청했을 때 무한한 시간을 기다리지 않는다.
- 뮤텍스: 락(lock, 공유 자원에 접근할 수 있는 권한)을 가진 프로세스만이 공유 자원에 접근할 수 있게 하는 방법. 임계 영역에 접근한 프로세스가 임계 영역에 락을 건다고 해서 락킹 메커니즘이라고도 함. ex) 화장실 하나, 키 하나.
- 스핀락: 락을 얻기 위해 프로세스가 반복문을 돌면서 기다리는 것. 바쁜 대기의 한 종류.
- 세마포어: 공유 자원에 접근할 수 있는 프로세스의 수를 정해 접근을 제어하는 방법. 공유 자원에 접근한 프로세스가 접근을 해제하면 다른 프로세스가 접근할 수 있도록 신호를 보낸다고 해서 시그널링 메커니즘이라고도 함.
+ 동기(여러 작업 처리 시 작업 순서 보장) <-> 비동기(여러 작업 처리 시 작업 순서 보장X)
+ 블로킹(작업을 수행할 때 대기할 수 있음. 작업 순서 보장X) <-> 넌블로킹(작업을 시작하면 대기 없이 수행)
3️⃣교착 상태(deadlock)
: 2개 이상의 프로세스가 각각 자원을 가지고 있으면서 서로의 자원을 요구하며 기다리는 상태
- 교착 상태가 발생하는 필요 충분 조건(4)
(1) 상호 배제: 하나의 공유 자원에 하나의 프로세스만 접근
(2) 점유와 대기: 프로세스가 최소 하나의 자원을 점유하고 있는 상태에서 추가로 다른 프로세스에서 사용 중인 자원을 점유하기 위해 대기
(3) 비선점: 다른 프로세스에 할당된 자원을 뺏을 수 없음
(4) 환형 대기: 프로세스가 자신의 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원을 요구
- 교착 상태를 막으려면 네 가지 중 한 가지라도 제거하면 됨! (자원 공유, 필요한 자원을 처음부터 모두 제공, 가진 자원이 없는 경우에만 자원을 할당, 자원을 뺏을 수 있도록 함, 각 프로세스에서 요구할 수 있는 번호의 방향을 정해서 일방향으로만 요구하게 함 등...)
4️⃣스레드 안전
: 멀티 스레드 환경에서 하나의 변수, 함수, 객체에 스레드 여러 개가 동시에 접근해도 문제가 없음을 의미
- 스레드 안전을 위한 조건(4)
(1) 상호배제: 공유 자원 접근 시 상호배제 기법을 사용해 접근을 통제해야 함(뮤텍스, 세마포어 등)
(2) 원자 연산: 공유 자원 접근 시 원자 연산(연산 했다 or 안했다만 존재)을 이용하거나 원자적으로 정의된 연산을 이용해 연산 도중에 다른 스레드가 접근할 수 없게 해야 함
(3) 재진입성: 특정 함수를 하나의 스레드에서 실행 중일 때 다른 스레드가 해당 함수를 실행해도 각 스레드에 올바른 결과가 나올 수 있게 해야 함
(4) 스레드 지역 저장소: 각 스레드에서만 접근할 수 있는 저장소를 사용해서 공유되는 자원을 줄여야 함
5️⃣IPC(Inter Process Communication)
: 프로세스 간에 자원을 공유하는 방식(4)
(1) 공유 메모리: 프로세스 간에 공유 가능한 메모리를 구성해 자원을 공유하는 방식 -> 동기화 문제 발생할 수 있음!
(2) 소켓: 네트워크 소켓을 이용하는 프로세스 간 통신. 외부 시스템과도 이용할 수 있음. 클라이언트와 서버 구조로 자원을 주고 받음.
(3) 세마포어: 접근하는 프로세스를 제어해 공유 자원을 관리
(4) 파이프: FIFO 형태의 메모리인 파이프를 이용해 프로세스 간 자원을 공유하는 방식. 단방향 통신만 지원(양방향 통신을 하려면 읽기 파이프와 쓰기 파이프 각각 생성해야 됨)
(5) 메시지 큐: FIFO 형태의 큐 자료구조를 이용해 프로세스 간 메세지를 주고받는 방식
6️⃣좀비 프로세스
: 부모 프로세스가 자식 프로세스의 종료 상태를 회수하지 않았을 경우에 남겨진 자식 프로세스. 자식 프로세스가 종료될 때 부모 프로세스에 시그널을 보내는데 이때 부모 프로세스에서 시스템콜을 호출해 자원을 회수하지 못해 발생->자원낭비
7️⃣고아 프로세스
: 부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우의 자식 프로세스. 자식 프로세스의 부모 PID를 init 프로세스의 PID인 1로 바꿔주면 부모가 init 프로세스로 바뀌고 좀비 프로세스가 되는 것을 방지할 수 있음!
8️⃣스케줄링
- 목적: 멀티 프로세스 환경에서 모든 프로세스를 공평하게 실행하는 것.
- 단계
(1) 장기 스케줄링( = 잡 스케줄링, 승인 스케줄링): 준비 큐에 어떤 프로세스를 넣을지 결정해 메모리에 올라가는 프로세스 수를 조절.
(2) 중기 스케줄링: 메모리에 로드된 프로세스 수를 동적으로 조절. 로드된 프로세스가 많을 시 일부 프로세스를 통째로 SSD와 같은 저장 공간에 저장하는 스왑아웃 -> 중단 상태로 변경됨
(+ 스왑인: 스왑아웃된 프로세스를 통째로 메모리에 로드 -> 이 둘을 스와핑이라고 함.)
(3) 단기 스케줄링( = CPU 스케줄링): 준비 큐에 있는 대기 상태 프로세스 중 어떤 프로세스를 다음으로 실행할지 스케줄링 알고리즘으로 결정. 즉, 어떤 프로세스를 디스패치할지 결정
-> 스케줄러가 스케줄링 알고리즘을 이용해 준비 큐에 있는 프로세스 중 하나를 선택해 CPU에 디스패치 -> CPU에서 프로세스를 실행 -> 일정시간 초과 or 입출력 요청시 인터럽트 발생 -> 준비 큐로 들어감 -> fork() 호출되어 자식 프로세스 생성
9️⃣ 스케줄링 알고리즘
: CPU 스케줄러가 준비 큐에 있는 프로세스 중 어떤 프로세스를 실행시킬지 결정하는 데 사용. CPU 사용율, 처리량, 응답 시간, 반환 시간, 대기 시간 등을 기준으로 평가함.
(1) 비선점형 스케줄링: 실행 중인 프로세스가 종료될 때까지 다른 프로세스를 실행할 수 없음
ex) FCFS(먼저 들어온 프로세스를 먼저 실행), SJF(실행시간이 짧은 프로세스 먼저 실행. 평균 대기 시간이 가장 짧지만, 실행 시간이 긴 프로세스는 기아 상태(우선순위 밀려서 계속 실행x)가 될 수 있음), HRRN
(2) 선점형 스케줄링: 실행 중인 프로세스를 중단시키고 다른 프로세스를 실행할 수 있음
ex) RR(우선순위x 모든 프로세스를 순서대로 일정 시간 동안 실행. 응답 속도가 빠르지만 콘텍스트 스위칭이 빈번하게 일어나서 오버헤드가 큼), SRTF(준비 큐에서 대기 시간이 가장 짧게 남은 프로세스 우선 실행. 평균 대기 시간이 짧지만 기아 상태 발생 가능성), 멀티 레벨(준비 큐를 목적에 따라 여러 개로 분리. 분리한 큐는 각각 우선순위가 있고 각자 다른 스케줄링 알고리즘 적용 가능)
'Cs' 카테고리의 다른 글
2. 컴퓨터 네트워크 (0) | 2024.10.26 |
---|---|
1. 운영체제 (3) (0) | 2024.10.26 |
1. 운영체제(1) (0) | 2024.10.23 |
GET과 POST의 차이 (0) | 2024.10.15 |
라이브러리와 프레임워크의 차이 (0) | 2024.06.11 |