Process와 Thread
Process와 Thread의 정의
- Process는 실행 중에 있는 프로그램을 의미하고,
- Thread는 프로세스 내에서 실행되는 흐름의 단위다.
- 하나의 프로세스 안에서 여러 스레드가 생성 가능하며,(최소 1개인 메인 스레드를 보유) 완전히 독립적이어서 메모리 영역을 다른 프로세스와 공유하지 않는다.
- 각 스레드는 개별 스택을 할당받고, 나머지 영역(코드/데이터/힙)은 스레드끼리 서로 공유하며 실행한다.
<Process의 메모리 영역>
- Code : 실행할 프로그램의 코드가 저장되는 영역 (Read-Only)
- Data : 전역변수와 static 변수
- Heap : 사용자가 직접 관리할 수 있는 메모리 영역 (메모리 할당, 해제)
- Stack : 함수의 호출과 관계되는 지역변수, 매개변수, 리턴 값 -> Stack Overflow
<Process의 문제점>
- 프로세스 생성에 큰 오버헤드가 있다
- 프로세스 사이에 통신이 어려움 (IPC 사용해야함)
- IPC : Inter-Process Communication
ex). socket
<Thread의 특징>
- 스레드가 여러개 있는 것을 멀티스레드라고 한다.
- 멀티스레드에서 각 스레드끼리 프로세스의 일정 메모리를 공유해서 사용한다.
- 즉, 프로세스의 Context Switchig보다 스레드 Context Switching이 빠르다.
<Thread가 메모리를 공유함으로써 생기는 Process와의 차이점>
- 동시에 여러 작업을 할 때, 멀티 스레드가 시스템 자원을 더 적게 사용함
- 프로세스는 메모리 공유를 하지 않으므로, 프로세스 간 통신은 스레드 간 통신에 비해 복잡함
- 스레드의 경우 공유 자원에 대한 동기화 이슈 발생
<동기화>
동기화 = 스레드의 단점
멀티 프로세스 멀티 스레드
<Context Switching 관점>
Stack 영역만 교체하면 되기 때문에 멀티 스레드의 속도가 빠름
Context Switching이란?
- CPU가 다음 우선순위의 프로세스 실행을 위해 Context를 저장하고 다음 실행을 위해서 Context를 교체하는 작업
- Context : CPU가 해당 프로레스를 실행하기 위한 해당 프로레스의 정보들
<안정성 측면>
- 멀티 프로세스 : 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않음 -> 안정성 높음
- 멀티 스레드 : 하나의 스레드 장애가 전체 스레드에 영향을 끼칠 수 있음 -> 동기화 이슈가 발생 가능 (자원 공유)
Process의 생명주기(상태변화)
1) New로 생성된 이후에 Ready Queue에 들어감
2) 스케줄러에 의해서 Ready <-> Runing 변화
3) Event 발생시 Running -> Blocked
4) Blocked에서 Event 종료 시 Ready
교착상태(DeadLock)
- 두 개 이상의 프로세스나 스레드가 서로 자원을 기다리면서 무한히 기다리게 되는 상태
- 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태
< DeadLock 발생 조건 >
1) 상호 배제(Mutual Exclusion)
- 한 자원에 대한 여러 프로세스의 동시 접근은 불가능
2) 점유와 대기(Hold and Wait)
- 하나의 자원을 소유하고 다른 프로세스 혹은 스레드의 자원 요청
3) 비선점(Non preemptive)
- 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없음
4) 환형 대기(Circle Wait)
< DeadLock 해결 방법 >
1) 예방 (Prevention)
- 교착 상태 발생 조건 중 하나를 제거하면서 해결
- 시스템의 효율성이 떨어지는 단점 존재
2) 회피 (Avoidance)
- 교착 상태에 빠질 가능성이 있는지 확인 후 자원 할당
- Safe sequence, Safe state -> 은행원 알고리즘 -> 사용 제약조건이 많음
3) 탐지 (Detection)
- 교착 상태 발생을 허용 후 탐지한다.-> 복구로 이어짐
4) 복구 (Recovery)
- 프로세스 종료 : 교착 상태의 프로세스 모두 중지, 하나씩 제거해보기
- 자원 선점 : 점유된 자원을 선점해 다른 프로레스에 할당
CPU 스케줄링
선점형 (Preemptive)
- 선점형 스케줄링은 높은 우선순위의 프로세스가 들어올 경우 현재 프로세스를 중지시키고, 높은 우선순위의 프로세스를 처리
비선점형 (Non-Preemptive)
- 비선점 스케줄링은 한번 할당하면 끝날 때까지 다른 프로세스가 들어오지 못함
FCFS (First Come First Serve)
- 비선점형
- Ready Queue에 도착한 순서에 따라 CPU를 할당하는 기법
- 공평성은 유지되지만 짧은 작업이 긴 작업을, 중요한 작업이 중요하지 않은 작업을 기다림
- 장점 : 평균 응답시간이 길다
- 단점 : 도착순서에 따라 공평하다
SJF (Shortest Job First)
- 비선점형
- 실행시간이 가장 짧은 프로세스에 먼저 CPU를 할당하는 기법
- 가장 적은 평균 대기 시간을 제공하는 최적 알고리즘
- 장점 : 평균 응답 시간을 최소화 할 수 있다.
- 단점 : 실행 시간이 긴 프로세스는 CPU를 할당받지 못하고 무한히 대기하는 현상 발생(starvation)
HRN (Highest Response Ratio)
- SJF를 보완하는 알고리즘
- 우선순위 계산 결과값이 높으면 우선순위 부여
- 우선순위 = (대기시간 + 서비스시간) / 서비스시간
SRT (Shortest Remaining Time first)
- 선점형
- 새로운 프로세스가 도착할 때마다 새로운 스케줄링이 이루어진다.
- 현재 실행 중인 프로세스의 남은 시간과 대기 큐에 프로세스의 실행시간이 가장 짧은 프로세스에게 CPU를 할당하는 기법
- 비선점 기법인 SJF를 선점 형태로 변경한 기법
- 단점 : 잦은 선점으로 인한 Context switching 부담, starvation의 위험
RR (Round Robin)
- 선점형
- 각 프로세스는 동일한 크기의 할당 시간 (time wuantum)을 갖게 된다.
- 할당 시간이 지나면 프로세스는 선점당하고 ReadyQueue의 제일 뒤로 간다.
- 설정한 time quantum이 너무 커지면 FCFS와 같아진다.
- 반대로 너무 작아지면 스케줄링 알고리즘의 목적에는 이상적이지만 잦은 context switching으로 overhead가 발생한다.
Priority Scheduling
- 우선순위가 가장 높은 프로세스에게 CPU를 할당
- 우선순위 산정 방식에 따라 앞에 나온 알고리즘과 유사해질 수 있음
- 선점형 방식 : 더 높은 우선순위의 프로세스가 도착하면 실행중인 프로세스를 멈추고 CPU를 선점
- 비선점형 방식 : 더 높은 우선순위의 프로세스가 도착하면 Ready Queue의 Head에 넣음
뮤텍스, 세마포어
페이징 세그먼트
동기(Sync)와 비동기(Async)
컴파일 언어와 스크립트 언어의 예시와 차이점
-
컴파일 언어 : C, C++, JAVA 등
-
스크립트 언어 : python, PHP
-
컴파일 언어는 컴파일러를 통해 사전에 컴파일되어, 기계어 상태로 실행되므로 실행이 빠름
-
또한 컴파일 단계에서 전체코드를 기계어로 변환할 때, 최적화작업을 진행하여, 실행 시간을 보다 빠르게 할 수 있음
-
이에 반해 스크립트 언어는 컴파일 단계 없이, 실행 단계에서 한 줄씩 기계어로 번역 후, 실행되므로 통상 컴파일 언어보다 실행이 느림
-
또한 전체 코드에 대한 실행 코드 최적화가 어려움