갬장장이
'os/multithreading, parallel computing' 카테고리의 글 목록

os/multithreading, parallel computing

os/multithreading, parallel computing

메모리 정책(memory order), 메모리 장벽(memory fence/barrier)

Memory model에 대한 정책 세 가지 (더 있으나 보편적으로 세 가지를 주로 사용) 1) Sequentially consistent (seq_cst) 2) Acquire-Releasse (acquire, release) 3) Relaxed (relaxed) 위에 있을 수록 더 엄격한 정책, 컴파일러의 최적화가 적다. 아래로 갈 수록 컴파일러 최적화의 여지가 많다. 예시 코드 atomic ready; int32 value; void Producer() { value = 5; ready.store(true, memory_order::메모리 정책); } void Consumer() { while(ready.load(memory_order::메모리 정책) == false); cout

os/multithreading, parallel computing

lock-free atomic calculation

CPU에 따라서 int64같은 데이터에 대해 atomic한 연산을 지원해줄 수도 있고, 안해줄 수도 있다. 만약 안해주는 CPU의 경우, C++ 등에서 atomic한 연산으로 int64 데이터에 연산을 실행하면, 컴파일러가 별도로 락을 만들고 락을 걸어 원자성을 보장해주는 형태로 구현된다. (당연히 더 느리다) 특정 상황에서 어떤 연산의 atomic 연산이 CPU단에서 락없이 처리가 가능한지를 확인하려면 다음과 같이 확인해보면 된다. atomic v; cout

os/multithreading, parallel computing

멀티스레드 환경에서 발생하는 문제들

스레드 경합 및 동기화로 인한 문제 https://cheetile.tistory.com/entry/OS-%EC%8A%A4%EB%A0%88%EB%93%9C-%EB%8F%99%EA%B8%B0%ED%99%94-%EB%AC%B8%EC%A0%9C-Race-Condition-Deadlock-Starvation-Livelock [OS] 스레드 동기화 문제 - Race Condition, Deadlock, Starvation, Livelock 스레드 동기화 문제 멀티프로세싱이나 멀티스레딩을 개발할 때 프로세스나 스레드들의 상태 제어 처리하는 부분에 까다로운 점이 많습니다. 스레드의 개수가 많아질수록 더욱 정교한 처리가 cheetile.tistory.com 경합 상황(여러 스레드가 동일한 메모리에 동시 접근 후 writ..

os/multithreading, parallel computing

스레드의 race condition

static int number = 0; (static이므로 스레드끼리 공유함) thread 1에서 for loop을 통해 100000번 number++; thread 2 '' number--; 이 경우 number은 0이 안나올 가능성이 아주 높다. 아마 27690 이런 값이 나올 가능성이 높다. 이유: ++나 --는 그 자체가 컴퓨터 행동의 최소단위(atomic)가 아니기 때문이다. 즉 number++는 사실 int temp = number; temp -= 1; number = temp; 의 세 단계의 최소단위, 혹은 atomic 한 operation으로 이루어져있는데, 스레드2에서 number가 -1로 초기화되었다가 바로 다음 차례에 스레드1에서 +1로 초기화되는 경우가 발생할 수 있다는 것이다. ..

os/multithreading, parallel computing

쓰레드와 프로세스, CPU 병렬 처리와 동시 처리

프로세스(Process) 운영체제로부터 메모리를 할당받아 실행되는 작업(task)의 단위. 더보기 Task vs Process 호기심에 찾아보았는데, task와 process는 거의 같은 의미로 사용되지만 엄밀히 따졌을 때 약간의 차이가 있다고 한다. Process는 메모리 상에서 Input/output 작업을 포함하지 않고 실행되는 작업을 의미하고, Task는 Input/output을 포함하는 작업을 의미한다. 따라서 "멀티태스킹" 이 가능하다는 것은 동시에 여러 I/O Stream을 실행할 수 있다는 것을 의미하고, "멀티프로세싱"이 가능하다는 것은 동시에 여러 프로세스에서 연산이 일어날 수는 있지만, I/O Stream은 하나만 존재하며 이를 여러 프로세스에서 바꿔가며 사용한다는 것을 의미한다. "..