공유된 자원에 여러 개의 쓰레드가 동시 접근 하는 문제를 해결하기 위해선 여러가지 방법들이 있다. 첫 째로, Lock이 해제 될 때 까지 무한히 기다리는 방법이 있을 것이며 이것이 오늘 설명할 스핀락의 기조다. 둘 째로 콜백 방식이 있을 것이며 셋 째로 특정 시간 뒤에 다시 찾아가는 방식이 있다. 여러 방식 중 오늘은 첫 번째 방식인 스핀락에 대해 설명하고자 한다. 간단히 그림과 같이 2개의 쓰레드가 공유된 자원에 접근 시, Task A가 먼저 접근하였다고 가정하자. Task B는 A가 unlock을 할 때 까지 무한히 대기하다가, unlock이 되면 접근하는 구조다. 문제 사항으로는 당연히, Task B는 쓸대 없이 A가 끝날 때 까지 기다려야 하므로 오버헤드가 발생하고 CPU 점유율에 영향을 미친다...
공유된 자원에 여러 개의 프로세스가 동시에 접근하는 현상을 막고자 전 시간엔, Atomic을 배웠다. 하지만 Atomic의 단점을 복습해보자면 연산이 느리고, 어디에서든 사용해선 안된다고 하였다. 그 어디에서든이 어떤 상황인지 C++ 코드를 통해 알아보자. atomicav; void Push() { for (int32 i = 0; i < 10'000; i++) { av.push_back(i) } } 가령 STL vector를 사용한다고 했을 때, 해당 STL은 모두 싱글 쓰레드 기준으로 만들어진 라이브러리다 보니 에러가 발생한다. 이 해당 에러에 대해선 바로 다음에 설명하겠고, 여하튼 atomic을 사용해서 vector의 push_back을 사용하고 싶지만, 위 코드에서는 문법 에러가 날 것이다. 즉 A..
글을 쓰기 앞 서, 쓰레드(Thread)에 대한 개념만 간단하게 설명하고자 한다. 왜 필요한가? 여러 작업을 동시에 수행하려면, 병렬로 처리해야 하기 때문에. 멀티 프로세스와 멀티 쓰레드의 차이는? Heap 영역 혹은 Data 영역의 자원을 공유할 수 있다. 쓰레드 별로 각각의 Stack 메모리를 갖고 있다. Atomic을 쓰는 이유와 멀티 쓰레드의 문제점 자원을 공유하기에 생기는 문제로 경합문제가 있다. void Add() { for (int32 i = 0; i < 100'0000; i++) { sum++; } } void Sub() { for (int32 i = 0; i < 100'0000; i++) { sum--; } } int main() { thread t1(Add); thread t2(Sub)..
오늘은 C++ 단골 문제, 스마트 포인터에 대해 다뤄 보려한다. 일단 이 스마트 포인터라는 것이 왜 쓰이는가에 대해 알아야 한다. RAII ( Resource Acquisition Is Initialization ) 직역하자면, 리소스 획득은 초기화다. => Object 와 Resource의 Life Cycle을 일치 시킨다. 라는 개념으로 간단히 정리하자면 Object -> 동적으로 객체 생성 후 delete를 해주지 않아. Resource-> Heap Memory에 쌓이는 Memory Leak(메모리 누수) 현상을 원천적으로 차단 해줄 수 있기 때문이다. 이를 알기 위해선, 각 언어별 메모리 관리 방법에 대해서 알아야한다. C#, JAVA등 상기 언급한 언어들의 경우, ..