일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- fork 시스템 콜
- 3Ds max 기초
- pane & desktop
- 뷰포트
- bg 명령어
- mmap
- background process
- exec 시스템 콜
- Redirection
- Standard Stream
- 생활코딩 복습
- bash shell 반복문
- 추가 업로딩 중
- bash shell 변수
- foreground process
- atexit()
- ps 명령어
- msync
- bash shell 조건문
- Symmetry
- exit()
- 섭페에서 텍스처 추출
- copy-on-write
- 3D 배경 그래픽
- 섭페
- 후디니
- wait 시스템 콜
- houdini
- substance painter
- 개체 외곽 하이라이트 기준선 없애는 법
- Today
- Total
Researcher to Developer
04. Thread의 이해 본문
#Thread
- Light Weight Process 라고도 함
- 소규모 프로세스, 구조가 작다.
#Thread vs Process
프로세스
각각 독립적인 자원을 가짐
자신만의 주소 영역을 가짐
프로세스 간에는 데이터 접근이 불가 → IPC 기법을 필요로 했었음
스레드
프로세스의 서브셋, 프로세스 자원 공유
주소영역 공유
하나의 프로세스에 여러 개의 스레드 생성 가능, 개별적으로 동작 가능
IPC 기법 필요 X
#Thread 특징
- 스레드들은 동시에 실행 가능
- 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능 (가장 큰 장점) → IPC가 필요하지 않다.
- 하나의 프로세스안에서 생성된 스레드끼리만 공유가 가능하다! 다른 프로세스의 스레드끼리는 X
- 각기 실행은 가능한 존재(운영 체제마다 운영 방법이 다름)
- 스레드는 각각의 Stack영역을 갖고 있는 함수라고 보면서, 각 스레드를 위한 PC, Stack Pointer가 존재한다.
HEAP, BSS, DATA, CODE 영역은 각 스레드가 공유한다.
STACK 영역만 각 스레드가 분리되어 있다.
#멀티 스레드
소프트웨어 병행 작업 처리를 위해 멀티 스레드를 사용함
#멀티 프로세싱과 스레드
멀티 태스킹 - 하나의 CPU에서 여러 개의 프로세스가 동시에 진행되는 것처럼 보임
멀티 프로세싱 - 여러 CPU에서 하나, 여러 개의 프로세스를 병렬 실행으로 실행 속도를 높임 - 스레드를 여러 개 만들면 가능
최근 CPU는 멀티 코어를 가지므로, Thread를 여러 개 만들어 실행 속도를 높임으로써 멀티 코어의 활용도를 높임
#운영체제를 만들 때
one process - one thread : 배치
one process - multiple thread
multiple process - one thread per process : 멀티 태스킹
multiple process - one thread per process : 멀티 프로세싱 - Window, Linux, Mac
#Thread 장점
1. 사용자에 대한 응답성 향상 - 응답시간이 짧아짐
ex. Thread A는 특정 작업을 하고, Thread B는 사용자와 커뮤니케이션 하는 경우
2. 자원 공유 효율 - 프로세스는 별도의 공간이 있고 프로세스 끼리는 IPC 기법을 사용해야만 공유할 수 있는데
스레드는 그런 기법이 없어도 서로 공유 가능하고, 프로세스 안에 있으므로 프로세스의 데이터에 모두 접근 가능하다.
3. 작업이 분리되어 코드가 간결 - 작성하기 나름
+ CPU 활용도를 높이고, 성능 개선 가능
#Thread 단점
1. 스레드 중 한 스레드만 문제가 있어도, 전체 프로세스가 영향을 받음
2. 스레드를 많이 생성하면, Context Switching이 많이 일어나, 성능 저하
ex. 리눅스 OS에서는 스레드를 프로세스와 같이 다룸 → 스레드를 많이 생성하면, 모든 스레드를 스케줄링해야 하므로,
Context Switching이 많이 일어날 수 밖에 없음.
#PThread
POSIX 스레드(POSIX Thread)
Thread 관련 표준 API
시스템 프로그래밍에서 다룰 내용
#Thread 동기화 문제(Synchronization)
동기화 : 작업들 사이에 실행 시기를 맞추는 것
프로세스 안에 여러 개의 스레드가 존재, 이 스레드들은 프로세스 내부 데이터를 공유함
→ 스레드 실행 순서는 정해져 있지 않음 → 때문에 실행 순서가 꼬이게 되면 비정상적인 동작을 하게 될 수 있음.
혹은 동일 장원을 여러 스레드가 동시 수정하게 될 경우, 각 스레드 결과에 영향을 준다.
그러므로 스레드 관리가 필요함!
- 스케줄러 기준 시간과 관련하여 컨텍스트 스위칭이 발생하게 될 경우에 어느 부분에
컨텍스트 스위칭이 발생하는지 알 수 없기 때문에 비정상적인 동작을 하게 될 수 있음
#동기화 이슈 해결 방안
Mutual exclusion (상호 배제 혹은 Locking 메커니즘)
스레드는 프로세스 모든 데이터를 접근할 수 있으므로,
여러 스레드가 변경하는 공유 변수에 대해 exclusive access 필요
어느 한 스레드가 공유 변수를 갱신,수정하는 동안 다른 스레드가 동시 접근하지 못하도록 막는다.
- 임계 자원
- 임계 영역
#Mutex 와 세마포어(Semaphore)
Critical section(임계 구역)에 대한 접근을 막기 위해 Locking 메커니즘 필요
- Mutex(Binary semaphore) : 임계 구역에 하나의 스레드만 들어갈 수 있음
- Semaphore(리눅스의 함수) : 임계 구역에 여러 스레드가 들어갈 수 있음, Counter를 두어서 동시에 리소스에 접근 할 수 있는 허용 가능한 스레드 수를 제어 → 임계 구역에 하나만 들어가게 되면 다른 스레드는 기다려야하니
성능의 저하가 일어날 수 있어서
P : 검사 (임계 영역에 들어갈 때)
S값이 1이상이면 임계 영역 진입, S값 1차감 (S값이 0이면 대기)
V : 증가 (임계 영역에서 나올 때)
S값을 1 더하고 임계 영역을 나옴
S : 세마포어 값
초기 값만큼 여러 프로세스가 동시 임계 영역 접근 가능
세마포어 - 바쁜 대기(Busy waiting)
wait()은 S가 0이라면, 임계 영역에 들어가기 위해 반복문을 수행함
Loop를 돈다는 것은 CPU를 실행한다는 얘기, 즉 성능의 저하
바쁜 대기를 해결하기 위한 운영 체제 기술
세마포어 - 대기큐
S가 음수일 경우, 바쁜 대기 대신에 대기큐에 넣는다.
이렇게 되면 Loop를 돌지 않기 때문에 성능의 저하가 일어나지 않음
그리고 wakeup()함수를 통해 대기큐에 있는 프로세스 재실행!
sem_open() : 세마포어를 생성
sem_wait() : 임계 영역 접근 전, 세마포어를 잠그고 세마포어가 잠겨있다면 풀릴 때까지 대기
sem_post() : 공유 자원에 대한 접근이 끝났을 때 세마포어 잠금을 해제한다.
#Thread 교착상태와 기아상태 (Deadlock & Starvation)
임계 영역을 설정하고 임계 영역에 스레드가 하나만 접근하거나, 특정 갯수만 접근할 수 있기 때문에
나머지는 기다리고 있는데, 순서를 잘못매기면 어떤 스레드도 접근하지 못하고 대기하는 상태가 되거나,
특정 스레드들은 실행한 기회도 얻지 못하는 경우를 말함
Deadlock - 무한 대기 상태
두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태(둘 다 waiting)
배치 처리 시스템에서는 일어나지 않는 문제
프로세스, 스레드 둘 다 Deadlock 상태가 일어날 수 있음
Deadlock 발생조건
다음 네 가지 조건이 모두 성립될 때, 교착상태 발생 가능성이 있음
1. 상호배체(Mutual exclusion)
2. 점유대기(Hold and wait)
3. 비선점(No preemption) : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
4. 순환대기(Circular wait)
Starvation
동기화 상태에서만 일어나는 것은 아님
특정 프로세스의 우선 순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태 따라서 실행이 안되는 상태
Starvation 해결 방안
우선 순위 변경
Deadlock vs Starvation
Deadlock은 여러 프로세스가 동일 자원 점유를 요청할 때 발생
Starvation은 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는
영원히 자원 할당이 안되는 경우를 주로 의미함
'코딩 > Basic' 카테고리의 다른 글
06. 파일 시스템의 이해 (0) | 2020.12.20 |
---|---|
05. 가상 메모리의 이해 (0) | 2020.12.20 |
01. 프로세스와 스케쥴러 4 (0) | 2020.12.14 |
01. 프로세스와 스케쥴러 3 (0) | 2020.12.13 |
01. 프로세스와 스케쥴러 2 (0) | 2020.12.10 |