• 균등 분배/데이터 종속성/변수가 많아 어려운 테스트
• parallelism: 시스템이 둘 이상 task를 동시 수행
-코어가 2개 이상이라 정말 동시에 수행
• concurrency: 단일 코어. 여러 작업 진행을 지원
-같은 순간에 돌아가고 있는 상태로 인지될 때
• 하나의 프로세스에 두 가지 특성
실행 흐름이 여러 개면 여러 일을 하지 않을까? 스레드.
• 자원 소유권의 단위는 보통 “프로세스” 또는 “task”.
• 디스패치 단위는 “스레드” 또는 “LWP”.
-스택, 레지스터는 각자 가짐.
-스레드도 ID를 가짐(TID)
-Thread control block(TCB)
-실행 상태: running, ready, stopped(blocked)
-실행하지 않을 때 스레드 context 저장
-지역 변수에 대한 pthread 정적 메모리와 실행 스택 가짐.
-프로세스의 메모리 주소 공간 및 리소스 접근 가능
-한 스레드가 메모리 수정->다른 스레드가 확인 가능
-스레드에서 연 파일을 다른 애들이 이용 가능
• MS-DOS는 멀티스레드 지원X
• 예전 Unix는 여러 사용자 프로세스+하나의 스레드
• 현대 Unix와 윈도우 등은 멀티스레드 지원
① data parallel execution
-동일한 일. 데이터값만 다름. 수치 연산 일 사이즈 줄여 속도 높이기 ex)행렬 곱
-장점) 성능이 증가
② task parallel execution
-하는 일이 다름. 각 스레드 하는 일 독립적(물론 데이터는 공유)
-장점) 비용이 저렴해짐
• 핵심 상태: running, ready, blocked(다른 이유로 쫓겨난 애들)
• 메모리를 공유하므로 보류 상태(스와핑)가 없음
-단일 스레드 suspending은 같은 프로세스의 모든 스레드 다 일시 중단
• 프로세스 종료->모든 스레드 종료
메모리 공간 부족으로 메모리에서 쫓겨난 상태.
swap out 스왑 영역
CPU에 자리가 없는 게 아님.
이 개념이 프로세스에는 있는데 스레드에는 없고 blocked 상태만 있다.
① 초창기 단일프로세스 때 interatice server 아키텍처:
-서버 자체가 쿼리 직접 처리
-코드 구현 간단. 유지 보수 쉬움
-새로운 쿼리가 들어오면 바로 대응 못하고 성능 낮음
② concurrent server 아키텍처:
-서버는 쿼리가 큐에 들어오는 지만 확인하고, 일하는 프로세스를 만들어 넘겨줌. (서버도 프로세스)
-성능은 높음
-쿼리가 들어오면 프로세스 수 증가(제거 비용이 큼)
-프로세스끼리 메모리 공유X이므로 통신에 커널 개입(오버헤드 발생)
③ concurrent server with 스레드 아키텍처:
-똑같은 구조인데 프로세스가 아니라 스레드로.
-장점은 똑같이 누리고, 비용이 훨씬 저렴
-메모리 공간 공유하므로 통신에 커널 개입 감소
-서버의 성능을 높이는 형태는 아님. concurrency를 저렴하게 얻을 수 있는 것.
• 응답성 증가
• 리소스 공유
-IPC가 필요없이 저렴해짐. 커널 개입x
• 비용 저렴
-프로세스 생성, 소멸, 문맥 교환 시간 줄어듦.
-메모리 공간을 더 적게 씀. stack만 따로 관리해서 리소스 사용량 적음.
• 확장성
• 사용자가 나누는 일의 단위. 커널-레벨의 개입 X
• 사용자는 스레드를 여러 개 만들어 쓰지만, 시스템은 구별 못하고 하나의 프로세스로 인식
• 스레드 라이브러리:
-프로세스 코드에 연결된 user-level 라이브러리
-코드 포함 (스레드 생성 및 소멸, 스케줄링, 문맥 전환, 스레드 간 소통). 이 모든 일들이 유저 레벨에서
• 스레드 상태는 프로세스 상태와 독립적 / 다같이 잠.
• user-level과 kernel-level이 1-to-1 매핑
• 커널에서 제공하는 스레드 기능에 대한 시스템 콜 API, 커널 기능
• 단위가 스레드 기반 할당
• 장점: 많은 코어, blocking이 스레드 수준으로, 커널 루틴이 다중 스레드로 가능.
• 단점: ..(속도 저하 조금)
• user50개, kernel40개이면 스레드 라이브러리 필요
• 스레드 기반 할당
• user space에서 만들어짐. 구현 복잡
• API 제공 (어떤 API가 있는지 알아야 사용 가능)
• pthread_create()
• pthread_exit()
• pthread_join() - 특정 스레드 종료되길 대기
• pthread_yield() - 다른 스레드에게 CPU 양보 선언
• pthread같은 명시적 스레드는 일이 잘못되면 바로잡기 어려움.
• OpenMP:컴파일러 지시문 및 API세트
-사용자는 병렬 영역만 명시해주면 된다.
-#pragma omp parallel num_threads(2)
-for문은 뒤에 for붙이기. for->스레드마다 다른 일.
프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위