본문 바로가기

컴퓨터/Server21

read-write lock Reader-Writer LockRead와 Write는 자원을 사용하는 일반적인 방법이다. 기존의 Mutex 방식 Lock은 같은 자원에 대해서 Read이건 Write이건 배타적인 사용방식을 고수했다. 자원을 Read하고 있으면 다른 스레드가 그 자원에 Write작업을 수행할 수 없고, 그 반대의 경우도 마찬가지이0다. 누군가 새로 메모리에 새로운 값을 입력하는 도중에 그 값을 읽으면 내용의 일관성이 깨지기 때문에 일견 타당할 수 있다. 하지만 Read와 Read의 관계에서 다시 한번 생각해보자. 단순 읽기 동작은 내용의 일관성을 해치지 않기 때문에 서로 동시에 같은 내용을 읽어도 동기화 문제가 발생하지 않는다. Read끼리는 락을 하지 않는다면, 좀더 자원을 효율적으로 사용할 수 있지 않을까? 이런 아.. 2015. 4. 26.
DeadLock Deadlock프로세스 또는 쓰레드는 운영체제(또는 다른 관리자)가 관리하는 자원(메모리, 파일, 디바이스 등등)을 사용하는데, 다중 프로세스/쓰레드 프로그래밍을 하면 이 자원을 공유하게 되는 일이 자주 발생한다. 각 쓰레드 또는 프로세스는 각기 독립적인 실행 흐름을 가지고 있기 때문에 자원에 동시 접근하는 경우가 발생할 수 있다. 공유자원이 비일관적으로 사용되는 것을 막기 위해서 자원의 관리자는 자원의 배타적 소유권을 유지하는 방법을 사용한다. Lock을 걸어서 여러 스레드가 동시에 공유자원을 사용하는 것을 막는 것이다. 그런데 관리자가 Lock을 잘못 사용하는 경우 어느 쓰레드도 자원을 영원히 사용할 수 없는 상태, 즉 Deadlock(교착상태)에 빠질 수 있다.Deadlock이 발생하는 이유위 그림.. 2015. 4. 25.
Pooling 메모리 풀메모리 풀을 쓰는 이유메모리 Pool은 메모리 할당/해제/최적화 작업등을 유저가 직접 다룰 수 있도록 만든 객체이다. OS에게 메모리 할당/해제을 요청하면 시스템 콜이 발생한다. 빈번한 메모리 요청이 발생할 때, 하나하나 OS에게 작업을 맞긴다면 지나치게 많은 비용이 발생할수도 있다. 그리고 LFH파트에서 본것처럼 시스템이 유저에게 메모리를 할당할때, 데이터 뿐만 아니라 기타 관리 정보까지 포함해서 메모리를 할당하기 때문에, 작은 메모리를 자주 요청하는 경우 필요 이상의 메모리를 사용하게 된다. 그리고 LFH같은 훌륭한 관리체계가 없는 OS의 경우 빈번한 할당/해제는 파편화 문제를 발생시킬 것이다.메모리 풀은 이런 문제들을 해결할 수 있는 좋은 방법이다. 미리 유저가 큰 메모리를 할당 받은뒤에 .. 2015. 4. 17.
Windows Low Fragmentation Heap Windows LFHLFH : Low Fragmentation Heap, 단편화가 적은 힙windows 2k SP4, windows XP, windows 2k3 부터 적용Heap Fragmentation (힙 단편화) 사용자가 힙의 메모리를 할당받아서 사용하면, 메모리 관리자는 가능한 영역에서 연속된 공간을 사용자한테 할당해줄 것이다. 단일 객체는 연속된 메모리 공간을 사용하기 때문이다. 사용자가 메모리를 사용하는 패턴을 생각해보면, 메모리의 할당 순서는 연속적이어서 착착 힙을 순서대로 사용하는 것 같지만, 할당한 해제 순서는 뒤죽 박죽이다. 그렇기 때문의 위 그림처럼 쓸수 있는 공간이 파편화되는 현상이 발생한다. 이것을 Heap Fragmentation이라고 한다. 문제는 이렇게 파편화된 메모리 상황에.. 2015. 4. 17.