일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- DirectX12
- 디자인패턴
- directx
- 운영체제
- 렌더링 파이프라인
- 컨디션 변수
- 멀티쓰레드
- 그리디 알고리즘
- 다이나믹프로그래밍
- codility
- 스케줄링
- 병행성 관련 오류
- 파일시스템 구현
- DirectX 12
- 알고리즘
- 영속성
- 병행성
- 그리디알고리즘
- 백준
- 멀티프로세서
- I/O장치
- 락
- 타입 객체
- OS
- 동적계획법
- 쓰레드
- 자료구조
- 프로그래머스
- Direct12
- 다이나믹 프로그래밍
- Today
- Total
목록락 (4)
기록공간

Fetch-And-Add 마지막 하드웨어 기반의 기법은 Fetch-And-Add 명령어로 원자적으로 특정 주소의 예전 값을 반환하면서 값을 증가시킨다. C, C++ 코드로 표현하면 다음과 같다. // C int FetchAndAdd(int *ptr) { int old = *ptr; *ptr = old + 1; return old; } // C++ #include int FetchAndAdd(std::atomic_int &ptr) { return ptr++; } C++ 코드를 보면 atomic_int이 보일 것이다. 이건 무엇일까? C++11부터 지원하는 Atomic 자료구조이다. 이것은 기본 자료 구조의 일부를 원자적으로 구현해놓은 것이다.(char, int, short, bool) Atomic 자료구조..

위에서 살펴봤듯 멀티 프로세서에서는 인터럽트를 중지시키는 것이 의미가 없기 때문에 시스템 설계자들은 락 지원을 위한 하드웨어 설계를 하기 시작했다. 오늘날 모든 시스템들은 하드웨어 지원 기능을 가지고 있으며, 단일 CPU 시스템 또한 이런 기능이 존재한다. Test-And-Set (Atomic Exchange) 하드웨어 기법 중 가장 기본은 Test-And-Set 명령어 또는 원자적 교체(atomic exchange) 라고 불리는 기법이다. Test-And-Set 명령어를 사용하면 락을 간단하게 구현할 수 있다. ptr이 가리키는 이전 값을 old로 받아 리턴(TEST)한다. 동시에 그 값을 new로 바꾼다(SET). 이 동작은 원자적으로 수행되어야 하며 중간에 인터럽트 될 수 없다. 때문에, 소프트웨어..

여러 개의 명령어들을 원자적(atomic)으로 실행해보고 싶지만 병행성으로 인한 여러 쓰레드의 개입으로 인해(임계영역) 그렇게 할 수가 없었다. 여기서는 앞서 다룬 락(lock)을 이용하여 이 문제를 직접적으로 다루고자 한다. 프로그래머들은 소스 코드의 임계 영역을 락으로 둘러 그 임계 영역이 하나의 원자 단위 명령어인 것처럼 실행되도록 한다. 락 : 기본 개념 예를 위해 다음의 임계 영역이 있다고 하자. 공유 변수의 갱신이다. balance = balance + 1; 그리고 락으로 임계 영역을 다음과 같이 감쌌다. mutex mylock; // 전역 변수로 선언된 mylock ... mylock.lock(); balance = balance + 1; mylock.unlock(); 락은 하나의 변수이므로..

이번 장에서는 프로세스를 위한 새로운 개념인 쓰레드(thread)를 소개한다. 프로그램에서 한 순간에 하나의 명령만을 실행하는 고전적인 관점에서 벗어나 멀티 쓰레드 프로그램은 하나 이상의 실행 지점(독립적으로 실행 가능한 Program Counter값)을 가지고 있다. 멀티 쓰레드와 프로세스의 차이가 있다면 주소 공간을 공유하기 때문에 동일한 값에 접근할 수 있다. 하나의 쓰레드 상태는 프로세스의 상태와 매우 유사하다. 쓰레드는 프로그램 카운터(PC)와 연산을 위한 레지스터들을 가지고 있다. 만약 두 개의 쓰레드(T1, T2)가 하나의 프로세서에서 실행 중이라면 실행하고자 하는 쓰레드(T1)는 반드시 문맥 교환(context switch)을 통해서 실행 중인 쓰레드(T2)와 교체되어야 한다. 문맥 교환은..