일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 그리디 알고리즘
- 병행성
- 다이나믹프로그래밍
- 파일시스템 구현
- 쓰레드
- 타입 객체
- 영속성
- 멀티쓰레드
- 알고리즘
- 멀티프로세서
- 프로그래머스
- 스케줄링
- 디자인패턴
- 동적계획법
- directx
- I/O장치
- 병행성 관련 오류
- 자료구조
- 컨디션 변수
- 백준
- OS
- 운영체제
- 다이나믹 프로그래밍
- 렌더링 파이프라인
- 락
- codility
- DirectX 12
- Direct12
- DirectX12
- 그리디알고리즘
- Today
- Total
목록OS (14)
기록공간

파일 시스템은 순수한 소프트웨어다. 이점은 앞부분에서 다룬 CPU 가상화, 메모리 가상화 부분과 다른 점이다. CPU 가장화나 메모리 가상화에서는 하드웨어가 필요하다. (특권 모드로의 변환을 위한 명령어, 페이징을 위한 하드웨어 등이 그것이다) 파일 시스템의 종류는 매우 다양하다. 모든 파일 시스템들이 서로 다른 자료 구조를 가지고 있으며 각각은 장단점이 있다. 여기서는 간단한 파일 시스템 (Very Simple File System, vsfs)을 사용하여 개념을 소개하고, 파일 시스템에 대한 사례들을 다루며 현실에서 어떻게 동작하는지 이해해 보도록 하겠다. 생각하는 방법 파일 시스템에 대해 학습할 때, 두 가지 측면에서 접근할 것을 권장한다. 그 두 측면을 다 이해하게 되면 파일 시스템이 기본적으로 어..

수년 동안 병행성 관련 오류 해결을 위해 연구자들이 엄청난 시간과 노력을 들였다. 대부분의 초기 연구는 교착 상태(deadlock)에 초점이 맞추어져 있었다. 최근 연구들은 다른 종류의 병행성 버그들을 다루고 있다. 실제 프로그램에서 발견된 사례를 중심으로 어떤 오류가 있는지를 살펴보고자 한다. 오류의 종류 첫 번째 질문은 이것이다 : 복잡한 병행 프로그램에서 발생하는 병행성 오류들은 어떤 것들이 있는가? 이 질문에 대한 답을 구하는 것은 어렵지만, 다행히 다른 사람들이 이미 비슷한 작업을 해놓았다. 실제 상황에서 어떤 종류의 오류들이 발생하는지 이해하기 위해 그들은 많이 사용되는 병행 프로그램들을 자세히 분석하였다. 이 연구는 대표적인 오픈소스 프로그램 4개에 집중하였다. 유명한 DBMS(데이터 베이스..

세마포어는 정수 값을 갖는 객체로서 두 개의 루틴으로 조작할 수 있다. 이 두 개의 루틴은 각각 sem_wait()와 sem_post()이다. 세마포어는 초기값에 의해 동작이 결정되기 때문에, 사용하기 전 "제일 먼저" 값을 초기화해야 한다. class semaphore { int value; semaphore() {value = 1;} }; 세마포어 객체 정수 값을 1로 초기화 한다. 이제 세마포어 내에 있는 sem_wait()와 sem_post() 메서드를 살펴보도록 하겠다. 이 둘은 원자적으로 실행된다. 레이스 컨디션 (쓰레드 간의 공유하는 값을 서로 쓰려고 하는 경쟁상태)이 발생할 수 있다는 사실은 걱정하지 말자. 그것은 곧 락과 컨디션 변수를 사용하게 될 것이다. * sem_wait() int ..
지금까지 락의 개념을 학습하고 하드웨어와 운영체제의 적절한 지원을 통해 제대로 된 락을 만드는 법을 살펴보았다. 불행히도 "락"만으로는 병렬 프로그램을 제대로 작성할 수 없다. 쓰레드가 계속 진행하기 전에 어떤 조건(Condition)이 참인지를 검사해야 하는 경우가 많이 있다. 예를 들어 부모 쓰레드가 작업을 시작하기 전에 자식 쓰레드가 작업을 끝냈는지를 검사하기를 원할 수 있다.(보통 join() 연산이라고 불린다) 이러한 대기문은 어떻게 구현해야 할까? void child() { std::cout

흔하게 사용되는 자료 구조에서 락을 사용하는 방법을 살펴보도록 하겠다. 자료 구조에 락을 추가하여 쓰레드가 사용할 수 있도록 만들면 그 구조는 쓰레드 사용에 안전(thread safe)하다고 할 수 있다. 물론 락인 어떤 방식으로 추가되었느냐에 따라 자료 구조의 정확성과 성능을 좌우할 것이다. 병렬 카운터 카운터는 가장 간단한 자료 구조 중 하나이다. 보편적으로 사용되는 구조이면서 인터페이스가 간단하다. 간단하지만 확장성이 없음 동기화되지 않은 카운터는 몇 줄 안되는 코드로 작성할 수 있는 평범한 자료 구조이다. 다음은 락이 없는 카운터의 코드이다. class counter_t { int value; public: counter_t() {value = 0:} void increment() {value++..

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). 이 동작은 원자적으로 수행되어야 하며 중간에 인터럽트 될 수 없다. 때문에, 소프트웨어..

쓰레드 생성 멀티 쓰레드 프로그램을 작성 시, 가장 먼저 할 일은 새로운 쓰레드 생성이다. 쓰레드 생성을 위해서는 해당 인터페이스가 존재해야 한다. 우선 thread 라이브러리를 포함시켜야 한다. 그리고 std::thread 클래스의 thread_object를 만든다. thread_function에는 생성된 쓰레드가 실행할 함수가 들어간다. arg는 thread_function에 넘길 매개변수이다. 다만 thread_function 선언에 사용된 매개변수와 일치해야 한다. 다음은 예시 코드이다. #include #include void thread_function(int a, int b) { std::cout