C++
-
TLS(Thread Local Storage)C++/C++ 멀티스레드 2022. 11. 8. 20:47
안녕하세요. 오늘은 Thread Local Storage에 대해서 알아보겠습니다. 개념 게임을 만드는 예를 들어볼게요. 멀티스레드 환경에서 스레드들은 DB관리도 하고, 클라이언트 세션을 처리하기도 하고, 게임로직을 처리하기도 하는 등 다양한 작업을 처리하게 됩니다. 그런데, 이 스레드들은 우리가 생각하는 것처럼 이상적으로 동작하지 않습니다. 우리는 스레드가 공평하게 여러 작업에 투입되길 바라는데 현실은 한, 두개의 작업에 많은 스레드가 몰리게 됩니다. 멀티스레드 프로그래밍의 이상과 현실이라고 유명한 사진이 있습니다. 여튼 이렇게 하나의 작업에 여러 스레드가 몰리게 되면 비효율적인 상황이 발생합니다. Lock때문인데요. 멀티스레드 환경에서는 특정 작업을 처리할 때 Lock을 걸고 작업을 하는 경우가 많습니..
-
파이프라인과 멀티스레드C++/C++ 기타 2022. 10. 25. 22:25
오늘은 파이프라인의 개념에 대해서 간단히 알아보겠습니다. 컴퓨터구조에서 파이프라인 개념의 핵심은 코드의 실행순서가 임의로 바뀔 수 있다는 것입니다. CPU에서는 Fetch Decode Excute Write-Back 의 순서로 명령이 실행 됩니다. 그런데, 실행순서가 바뀌어도 서로 연관이 없는 명령들이라면 순서를 바꿈으로써 속도가 더 빨라질 수 있다면 CPU는 임의로 실행순서를 바꾸기도 합니다. 예를 들어서 int x=5; y=y+1; 과같은 코드는 두 순서를 바꾸어도 아무런 문제가 없습니다. 그래서 필요하다면 순서가 바뀌기도 하는거구요. 이게 싱글스레드 상황에서는 아무런 문제가 발생하지 않습니다. 그런데 멀티스레드 상황이라면 이야기가 달라집니다. int x = 0; int y = 0; int r1 = ..
-
캐시(Cache)(feat. Hit Rate, 메모리 계층구조, Locality)C++/C++ 기타 2022. 10. 24. 18:36
안녕하세요. 오늘은 컴퓨터의 메모리 중 캐시에 대해서 알아보겠습니다. 이 캐시는 아니구요. 시작해보겠습니다. 컴퓨터의 메모리계층구조 컴퓨터에는 다양한 저장장치가 있습니다. SSD, HDD, RAM(일반적으로 메모리라고 하면 RAM을 뜻합니다.), 캐시, 레지스터 등등 이렇게 저장장치들이 다양하게 나뉘게 된 이유는 이러한 저장장치들의 특징이 각기 다르기 때문입니다. 컴퓨터는 기본적으로 CPU가 연산을 수행합니다. CPU는 연산에 필요한 데이터를 저장장치로부터 가지고 와서 작업을 하는데요. 이때 필요한 데이터가 있는 저장장치가 CPU와 가까울수록 효율이 높아집니다. 가깝다는 말은, CPU가 작업에 필요한 데이터를 꺼내오는데에 걸리는 시간이 적다는 뜻입니다. CPU는 컴퓨터에서 가장 빠른 부품입니다. 그에 반..
-
C++ future(promise, async, packaged_task)C++/C++ 멀티스레드 2022. 10. 15. 13:00
오늘은 C++의 future에 대해서 알아보겠습니다. 우리는 일반적으로 코드가 실행된다고 하면, 순차적으로 실행되는 것을 생각합니다. 1~10번까지의 코드가 있다면, 1번이 실행되고 2번이 2번이 실행되고 3번이 이렇게 말입니다. 그런데 만약 1번 명령문을 수행하는데에 아주 오랜 시간이 걸리면 어떻게 될까요? 2~10번코드는 1번 명령문이 완료되기를 기다리게 됩니다. 아주 오랜시간동안요. 하지만, 1번 명령문이 나머지 2~10번 코드에 영향을 미치는 코드가 아니라면? 1번이 반환하는 결과가 당장 필요하지 않다면? 그럴 때는 1번 명령을 어떤 스레드에게 맡겨놓고, 1번 명령이 완료되기 전에, 나머지 2~10번을 수행할 수 있을것입니다. 그리고, 이 때 1번 명령의 결과값을 저~기 7이나 8번즈음에서 받기 ..
-
C++ Conditional Variable(조건변수)C++/C++ 멀티스레드 2022. 10. 14. 12:54
C++표준에서 제공하는 Conditional Variable을 이용하면 멀티스레드간 동기화를 구현할 수 있습니다. 조건변수를 사용하는 대표적인 패턴인 생산자-소비자 패턴을 예시로 들어보겠습니다. #include #include #include #include #include queue q; mutex m; void Producer() { while (true) { { unique_lock lock(m); int pushData = rand() % 100; q.push(pushData); cout
-
C++ 멀티스레드 동기화, 이벤트 사용법C++/C++ 멀티스레드 2022. 10. 12. 20:38
저번 시간까지 멀티스레드 환경에서 lock을 기다릴 때 사용할 수 있는 방법으로 두 가지를 알아보았습니다. 1. spinlock(무한정대기) 2. sleep(랜덤한 시간동안 대기) 이번에는 3번째 방법인 이벤트를 사용하는 방법에 대해서 알아보도록 하겠습니다. 저번에 들었던 헬스장 예시를 다시 들어볼게요. 사용하고 싶은 헬스기구를 다른 사람이 사용하고 있다. 나는 헬스기구에 자리가 나면 사용할 예정이다. 1. spinlock은 기구 뒤에서서 무작정 기다리는 방법이고 2. sleep은 일정시간동안 다른 곳에서 기다리다가 자리가 났는지 확인하는 방법입니다. 세 번째방법인 이벤트 방법은 이런겁니다. 어이~ 김비서! 나 밖에서 쉬고있을테니까 여기 자리나면 나한테 알려줘! 이 개념을 C++에서 나타내면 다음과 같이..
-
C++, Sleep을 이용한 Lock구현C++/C++ 멀티스레드 2022. 10. 10. 11:52
이전 포스팅에서는 spinlock을 구현해봤다. spinlock은 lock을 얻기위해서, 기한없는 대기를 하는 방법이다. https://bethetitan.tistory.com/9 C++ SpinLock구현 SpinLock은 앞선 포스팅에서 말한 존버메타 lock이다. 즉, lock을 다른 스레드가 사용중이면, 그 앞에서 lock이 풀릴때까지 계속 기다리는 것이다. 이거를 한 번 구현해보자. 들어가기에 앞서, 멀티스 bethetitan.tistory.com spinlock을 이용할 경우, CPU를 더 효율적인 곳에 사용하지 못하고, 가만히 놀게 하는 것과 다름없으므로, lock을 가진, thread가 lock을 빨리 해제하지 않는 경우에는 비효율적이라는 단점이 있다. 그래서 오늘은 lock이 잠겨있다면,..
-
C++, volatileC++/C++ 기타 2022. 10. 9. 14:25
c++에서 volatile의 의미는 컴파일러에게 최적화를 하지 말라는 의미이다. visual studio에서 실행모드를 release모드로 바꾸고 다음과 같은 코드를 실행해보자. 출력하는 곳에 중단점을 찍고 디버그를 해서, 디스어셈블리해보면, 이렇게 나온다. a에 값을 할당하는 일련의 코드들이 실행되지않는것이다. 이는, 컴파일러가 "어차피 출력하는 건 a에 3이 들어간것이고, 그 이전의 값은 사용되지도 않는데, 뭐하러 하나??" 라고 생각하여 최적화한 결과이다. 이 때 volatile 키워드를 사용하면, 다음과같이 변경된다. a의 값에 1, 2, 3을 차례로 할당해주고 있다. 그러니까 volatile은 아니 비효율적인거 아는데, 일부러 한거니까 최적화 하지말고 냅둬! 라는 것이다. 잘 사용하진 않지만 대..