하드웨어, 컴파일러들은 우리가 필요한만큼의 속도를 따라오고 있다. 현재는 Shared memory programs
와 Distributed memory programs
로 이루어져있다.
SPMD(Single Program Multiple Data) Programming은 조건문을 통해 다수의 다양한 프로그램인 것처럼 행동하는 단일 실행파일로 구성되어있다. 각 스레드에게 다른 일들을 시켜서 마치 다양한 프로그램이 돌아가는 것처럼 보인다고 생각하면 된다.
Dynamic Threads
마스터 스레드가 작업을 대기하고 새로운 스레드들을 Fork하고, 스레드가 끝났을 때 그들을 terminate한다.
리소스를 효율적으로 사용할 수 있지만, 매순간마다 스레드을 생성하고 제거하기 때문에, 이에 대한 오버헤드가 발생할 수 있음.
Static Threads
스레드 풀을 만들어두고 작업을 할당한다. 퍼포먼스는 좋지만, 시스템 리소스를 낭비할 가능성이 있다(예를 들어, 100개의 스레드가 있는데 10개만 사용할 경우..)
실행 순서가 결정이 안되있다. 위 내용처럼 병렬적으로 printf를 처리했을 때, Thread 1과 Thread 0의 출력순서가 다르게 나올 수도 있다.
Race Condition
이렇게 순서가 정해지지 않아서, 스레드나 프로세스들이 동시에 하나의 자원을 접근할 수도 있다. 이러한 접근은 에러로 이어진다.
Critical section
그 순간에만 하나의 스레드만 실행될 수 있는 하나의 코드 공간
상호배타적
mutex나 simply lock 사용 -> 자원 제한
실행결과가 항상 일치하도록 동기화를 해주기 때문에 처리속도가 느리다.
송수신 메세지를 통해 병렬처리를 하는 방식이다.
프로세서가 커져서 하나의 프로세서의 여러 개의 코어가 들어가는데, 이 상황에서 shared memory
와 Distributed memory
시스템을 융합하여 사용한다. 코어끼리는 Shared memory
, 프로세서끼리는 Distributed Memory
의 성격을 지니고 있다. 이건 그냥 이런게 있다고만 알아두면 된다.