프로그래밍
-
세마포어(Semaphore)프로그래밍/기록, 개념, 용어 2015. 2. 5. 01:44
세마포어(Semaphore) 세마포어는 카운터다. 증가/감소가 있을 수 있다.특정 리소스의 개수가 한정되어 있고, 여러 스레드에서 그 자원을 이용하려 할 때 사용하곤 한다. 세마포어는 열차 선로를 운영할때 기관사에게 해당 선로로의 진입 가능 여부를 알려주던 깃발을 뜻하는 용어로,세마포어를 획득하는 것을 wait, down, acquire이라 하고 해제하는 것을 post, up, signal, release라고 한다. 세마포어로 관리되는 리소스스를 다른 스레드가 접근하려 할때, 가용 가능한 리소스가 없다면 리소스를 요청한 스레드는 가용 가능하질 때까지 블로킹 된다.
-
포인터 에일리어스(Pointer Alias)프로그래밍/기록, 개념, 용어 2015. 2. 4. 21:20
포인터 에일리어스(Pointer Alias) 두 개 이상의 포인터 변수가 같은 메모리 위치를 담고 있을 때 그 포인터들을 에일리어스(alias)라고 부른다.컴파일러 입장에선 모든 포인터 변수가 서로의 에일리어스 일 수도 있다 생각하는 것이 안전하다. 포인터 에일리어스 발생 가능성이 높은 코드 void any_func( int* a, int* b ){ *b = *b + *a; *a = *a + 2; } 포인터 a, b가 에일리어스 상태가 아니라면 a의 값은 한 번만 로딩되면 된다. 에일리어스일 경우에는 포인터 b가 지칭하는 값에 대한 수정이 a가 지칭하는 값에 대한 수정일 수 있으므로 a의 값이 두 번 로딩되어야 한다. 포인터 에일리어싱이 가능한 코드 void func( int* a, int* b ) { ..
-
32비트 OS(운영체제)에서 64비트 OS로 바꾸면 성능이 꼭 향상만 될까?프로그래밍/의문 2015. 2. 4. 18:08
꼭 그렇지는 않다. 64비트의 넓은 주소 공간은 성능을 떨어뜨리는 요인이다. 포인터가 4바이트에서 8바이트로 커지고, 일부 변수는 크기가 커지기도 한다. 변수의 크기가 늘어났다는 것은 메모리 소요량이 커졌다는 것과 같아서 캐시, 레지스터의 공간을 더 빠르게 소모하게 되므로 이런 부분에서 성능 저하가 일어난다. struct s{ int* ptr[8];}; 구조체 pod가 32비트로 컴파일이 된다면 4(size of 32bit ptr)*8 의 사이즈로 총 32바이트를 차지하므로 64바이트 캐시라인 하나에 구조체가 두 개 들어갈 수 있지만, 64비트로 컴파일이 되면 크기가 2배로 되고 캐시라인에 하나의 구조체밖에 들어가질 못한다. 따라서 이러한 메모리 점유율 증가는 오히려 프로그램의 구동 성능을 떨어뜨릴 수 ..
-
C++ 오브젝트 생성시 {}와 () =의 구분프로그래밍/c++ 2015. 2. 2. 00:07
C++11에서의 초기화 방법들은 다음과 같은것이 있다. int a = 0;int a(0);int a{0}; 여기에서 int a = { 0 } 이와 같은 문법은 {}만 같이 쓴거처럼 처리된다. 즉, int a = {0} == int a{0} {}는 C++11부터의 초기화 문법으로, {}를 사용하는 초기화를 유니폼 초기화(uniform initialization)라고 한다. * 모든 non static value의 초기화는 {}를 이용해서 가능하다 class widget{ int a(0); // error int b{0}; // ok int c = 0; // ok }; * 복사가 안 되는 오브젝트에 대해서는 ()는 되지만 =는 안 된다. std::atomic a{0}; // okstd::atomic b(0)..
-
스핀락(Spinlock)프로그래밍/기록, 개념, 용어 2015. 1. 23. 14:15
스핀락(Spinlock) 스핀락(spinlock)은 바쁜 대기의 개념을 이용한 락으로, 임계 구역(critical section)에 진입이 불가능할 때 진입이 가능할 때까지 루프를 돌면서 재시도하는 방식으로 구현된 락을 가리킨다. 스핀락이라는 이름의 유래는 락을 획득할 때까지 해당 스레드가 빙빙 돌고 있다(spinning)는 것을 의미한다. 뮤텍스 락과의 차이점은 락을 얻을 수 없을때 스레드 슬립 모드로 빠지지 않고, 반복문을 계속 돌며 락을 얻으려는 시도를 한다는 것으로,락이 해제될 때 별도의 스레드 문맥교환(context switching)에 대한 오버헤드 없이 임계구역에 접근을 한다는 점이다. 뮤텍스 락의 경우, 락이 해제되더라도 운영체제에 의해 스레드가 다시 깨어나야하지만, 스핀락은 락을 얻을때까..
-
session의 send부분에 대한 고찰프로그래밍 2014. 11. 23. 22:01
push_data 부분을 size만큼 메모리를 할당하고 데이터 복사를 하는 방식으로 구현한다면 여러 thread에서 send를 호출하더라도 queue에 순차적인 데이터 push가 보장된다. push_data(data, size){ memory = new byte[size] // size만큼 메모리 할당 copy(data, memory) // 데이터 복사 send_queue.push(memory) // queue에 메모리를 push } 반면, push_data를 재귀하며 데이터를 고정된 버퍼에 담는 방식을 취한다면 순서가 섞일 수 있다. push_data(data, size){ byte buf[128] copy(data, buf) send_queue.push(buf) ... push_data(end, re..