📌 1. 프로세스와 쓰레드
프로세스는 운영체제로부터 자원을 할당받아 실행중인 프로그램을 의미하는데, 프로세스의 작업 단위는 쓰레드이다.
쓰레드들은 프로세스로부터 자원을 할당받아 실행하고, 같은 프로세스 내의 쓰레드들은 자원을 공유한다.
쓰레드는 프로세스 내에서 각각 Stack만 따로 할당받고, Code, Data, Heap 영역은 공유한다.
각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, Heap영역은 공유하기에 서로 읽고 쓸 수 있다.
🔥 Java Thread
자바 스레드는 JVM에 의해 스케쥴되는 실행 단위 코드 블럭이다.
Java에는 process가 존재하지 않으며, Thread만 존재한다. JVM이 운영체제 역할을 한다.
🔥 멀티 프로세스
하나의 응용 프로그램을 여러 개의 프로세스로 구성하는 것
🌎장점 : 하나의 프로세스가 죽어도 다른 프로세스로 확장이 되지 않기 때문에 안정성이 좋을 수 있다
🌎단점 : Context Switching 과정에서 비용이 발생하고, 오버헤드가 발생할 수 있다. 또한 프로세스간 데이터 교환(IPC기법)은 어렵다.
🔥멀티 쓰레드
하나의 응용 프로그램을 여러 개의 쓰레드로 구성하는 것
윈도우, 리눅스 등 멀티 프로세싱을 지원하고 있지만 멀티 쓰레딩을 기본으로 하고있다.
Web Server는 대표적인 멀티 쓰레드 응용 프로그램
🌎 장점 : 시스템 자원 소모 감소, 처리량 증가
🌎 단점 : 멀티 쓰레드의 경우 자원 공유의 문제 발생. 하나의 스레드가 문제가 생기면 전체 프로세스가 영향을 받는다.
🔥 Context Switching
CPU에서 여러 프로세스들을 돌아가면서 작업을 처리하는 과정
동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기 하고 있던 프로세스의 상태를 동작시키는 행위
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
📌 2. 교착상태(deadlock)
무한 대기 상태 : 두 개 이상의 작업이 서로의 작업이 끝나기를 기다리고 있기 때문에 다음 단계로 진행하지 못하는 상태
🔥 교착상태 발생조건 4가지
1. 상호배제 : 배타적 통제권 요구 ( 한 번에 한개만 사용할 수 있다 )
2. 점유대기 : 할당된 자원을 가진 상태에서 다음 자원을 기다린다.
3. 순환대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 갖고 있다.
4. 비선점 : 프로세스가 어떤 자원의 사용을 끝낼 때까지 해당 자원을 뺏을 수 없다.
🌎 상점순비
상점의 순대가 비싸다.
🌎 예방 기법으로 교착상태 4가지 조건 중에서 어느 하나를 제거함으로써 수행되지만, 자원 낭비가 심하다.
🔥 회피기법 - 은행원 알고리즘
다익스트라가 제안한 기법, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래한 기법
은행원 알고리즘은 모든 요구를 유한한 시간안에 실행하는 것을 보장해준다.
https://coding-factory.tistory.com/311
📌 3. Mutex & Semaphore
여러 쓰레드나 프로세스가 공유자원에 접근하는 것을 제어하는 방법
병행처리를 위한 쓰레드, 프로세스 동기화 방법
뮤텍스는 오직 하나의 프로세스나 쓰레드만 접근할 수 있는 반면, 세마포어는 세마포어에 설정된 변수만큼 프로세스나 쓰레드가 접근할 수 있다.
https://velog.io/@conatuseus/OS-%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4%EC%99%80-%EB%AE%A4%ED%85%8D%EC%8A%A4
📌 4. 경쟁상태
공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과값의 일관성에 대해 영향을 줄 수 있는 상태
커널 작업 중 인터럽트가 발생하거나, 공유 메모리에 동시에 접근할 때 등의 경우에 발생할 수 있다.
https://gyoogle.dev/blog/computer-science/operating-system/Race%20Condition.html
📌 5. 프로세스 || 쓰레드 동기화
https://gbs1995.tistory.com/43
📌 6. 사용자 수준 쓰레드 - 커널 수준 쓰레드 차이
CPU에는 권한모드가 있다. 커널 모드에서만 실행 가능한 기능들이 있기 때문에 사용자 수준에서 커널 수준의 쓰레드를 실행시키려면 시스템콜을 이용해야 하는데, 시스템 콜은 비용이 든다.
커널에 의존적인 쓰레드를 커널 수준 쓰레드, 의존적이지 않은 쓰레드를 사용자 수준 쓰레드라고 한다.
커널 레벨 쓰레드의 장점은 커널이 직접 제공하기 때문에 안정성과 다양한 기능을 사용할 수 있다. 단점은 유저모드에서 커널모드로의 전환이 빈번히 일어나서 성능저하가 발생한다.
사용자 수준 쓰레드의 장점은 커널의 쓰레드의 존재조차 모르기 때문에 모드 간의 전환이 없고, 성능 이득이 발생한다. 단점은 쓰레드가 커널에 의해 blocking 되면 프로세스 전체가 blocking 된다는 것이다.
https://junghyun100.github.io/%EC%82%AC%EC%9A%A9%EC%9E%90%EC%88%98%EC%A4%80ThreadVS%EC%BB%A4%EB%84%90%EC%88%98%EC%A4%80Thread/
🔥 더 좋은 설명
사용자 레벨 쓰레드 -> #include <stdio.h> 처럼 import를 통해 쓰레드를 이용하는 것을 의미
커널 레벨 쓰레드 -> 커널 내에 있는 쓰레드를 의미
🔥 사용자 쓰레드 : 커널 쓰레드 1개당 사용자 쓰레드 N개를 의미
이 방식 같은 경우 사용자 쓰레드가 100개가 있어도 커널 입장에서는 알 수가 없기 때문에 만약 Blocking이 발생하면 프로세스 전체가 멈춘다.
라이브러리를 활용하는 방식.
🌎 장점:
1. 인터럽트가 발생할 때 커널 레벨 쓰레드보다 오버헤드가 적다.
2. OS Scheduler의 context switch가 없다 ( 유저레벨 Thread Scheduler 이용 )
3. 커널이 사용자 레벨의 쓰레드를 알지도 못하기 때문에 성능상의 이득이 발생
🌎 단점:
1. Schduling 우선순위가 적용되지 않아서 어떤 쓰레드가 먼저 동작할 지 모른다.
2. I/O Blocking 등의 이유로 하나라도 Block이 걸린다면 전체 쓰레드가 Block된다.
🔥 커널 쓰레드 : n개의 커널 쓰레드가 n개의 사용자 쓰레드를 담당한다. 즉 1대1방식.
1대1방식이기에 병렬성은 좋으나, 효율성이 떨어진다.
🌎 장점 :
1. 프로세스 쓰레드를 몇몇 프로세스에 한꺼번에 Dispatch할 수 있기 때문에 멀티 프로세서 환경에서 매우 빠르게 동작할 수 있다.
2. 커널이 쓰레드를 개별적으로 관리할 수 있다.
🌎 단점:
무겁고, 성능저하가 발생할 수 있고, 자원을 더 많이 소비한다.
https://www.crocus.co.kr/1255
📌 7. Cpu Scheduling이란?
어떤 프로세스에 CPU를 배정할 지 결정하는 일을 하는 것
선점형 - 비선점형
선점형 : 다른 프로세스가 진행중인 프로세스를 뺏을 수 있다
비선점형 : 한 번 프로세스가 할당되면 끝날 때까지 뺏을 수 없다.
🔥 스케쥴링 알고리즘
🌎 FCFS
Queue 방식. 비선점
🌎 SJF
Short Job First. 비선점. 기아현상 발생가능
🌎 HRN
Highest Response Ratio Next
SJF + Aging 기법. 비선점.
🌎 RR ( Round Robin )
프로세스에게 각각 동일한 할당시간을 부여해서 해당 시간동안만 CPU를 사용하게 두는 방식
선점형.
https://bnzn2426.tistory.com/65
📌 8. 동기 - 비동기 ( Blocking - Non Blocking )
🌎 동기 - 요청에 들어온 순서에 맞게 하나씩 처리하는 방식
🌎 비동기 - 요청에 따른 작업이 종료되지 않더라도, 다음 작업을 진행하는 방식
동기 - 카페 : 손님들 온 순서대로
비동기 - 카페 : 음료가 만들어진 순서대로
https://webheck.tistory.com/entry/Java%EB%8F%99%EA%B8%B0%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B0%A9%EC%8B%9DAsynchronous-processing-model
🌎 Blocking :
호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 갖고 있어서 호출한 함수에게 돌려주지 않는 것
🌎 Non-Blocking :
호출된 함수가 자신이 할 일을 모두 끝내지 않았더라도 제어권을 바로 건내줘서 호출한 함수가 다른 일을 진행할 수 있도록 하면 Non-Blocking
🌎 동기 - 비동기 :
호출하는 함수가 호출된 함수의 수행 결과 및 결과를 신경쓴다면 동기
호출된 함수의 수행 결과 및 종료를 호출된 함수 혼자 신경쓰고 처리한다면 비동기
출처
https://musma.github.io/2019/04/17/blocking-and-synchronous.html
1. Block + SYN
결과가 나올 때 까지 기다림
2. Non-Block + Asyc
호출 후 제어권 바로 반환. 끝나면 callback 호출
3. Non-Block + Sync
결과가 생길 때까지 계속 확인
4. Block + Async
MySQL + Node.js
https://velog.io/@wonhee010/%EB%8F%99%EA%B8%B0vs%EB%B9%84%EB%8F%99%EA%B8%B0-feat.-blocking-vs-non-blocking
'CS > 기본기 탄탄 🔥시리즈' 카테고리의 다른 글
🔥6 - 데이터 베이스 (1) | 2021.06.08 |
---|---|
🔥5 - 네트워크 (0) | 2021.06.03 |
🔥3. Spring (1) (0) | 2021.05.31 |
🔥2. Java(2) (0) | 2021.05.27 |
🔥1. Java (0) | 2021.05.25 |
댓글