Computer Science 기본 지식/운영체제 27

[C++ Thread] 약속과 미래 객체, std::promise / std::future

C++11에 도입된 std::promise와 std::future 객체를 알아본다. 약속 객체 (std::promise) 약속 객체는 주로 비동기적으로 실행되는 다른 쓰레드로 부터 계산된 값이나 예외를 저장할 수 있는 공간을 가지고 있다. 약속 객체가 쓰레드의 완료로 저장한 값을 전달하기 위해 미래 객체가 필요하고 미래 객체는 약속 객체에 의해 생성된다. 또한 약속 객체는 결과 전달을 한번만 하도록 설계되었다. 템플릿 정의 template class promise; // 기본 템플릿 template class promise; // 쓰레드간 객체를 통신하기위해 사용한다. template class promise; // 상태없는 이벤트를 통신하기위해 사용한다. - 템플릿 인수에 전달받을 값의 타입을 명시하여..

[C++ Thread] memory order 와 atomic 객체

메모리 수정 순서와 동기화 방법을 제공하는 atomic 객체 ※ 다음 글들을 참고하였습니다. modoocode.com/271 en.cppreference.com/w/cpp/atomic/memory_order#Relaxed_ordering 메모리가 수정되는 순서에 관하여 - 단일 스레드에서 1) 동적 파이프라인 스케줄링에 의해 다음 함수를 컴파일하여 실행했을 시 a 대입과 b 대입의 순서에 대한 문제 #include int a = 0; int b = 1; int func(int* arr) { a = arr[1] + b; b = 5; return a; } int main() { int arr[5] = { 0,1,2,3,4 }; int result = func(arr); return 0; } 코드 흐름 상으로..

[C++ Thread] 생산자 소비자 문제

멀티 스레드를 이용하여 생산자-소비자 문제를 구현해보고 문제가 되는 부분을 해결해본다. 1. 생산자는 매 0.5마다 data chunk(char)를 큐에 넣는 것으로 데이터를 생산한다. 2. 소비자는 매번 마다 큐에 데이터가 있다면 자신의 데이터에 추가하고 업다면 1초 대기한다. n 생산자 m 소비자를 여러 쓰레드로 구현한다면 공유 변수 문제는 다음과 같고 쉽게 해결할 수 있다. - 공유 변수 : 큐를 접근할 때 하나의 쓰레만 읽고 쓸 수 있도록한다. - mutex의 사용으로 해결 #include #include #include #include #include #include #include #include using std::thread; using std::queue; using std::mutex;..

[C++ Thread] 공유 변수와 경쟁 조건

멀티 쓰레드를 이용한 프로그래밍을 할 경우 공유 자원을 병행적으로 읽고 쓰기 때문에 경쟁 조건 (race condition)이 발생할 수 있다. Worker Thread 예제 #include #include #include #include #include #include using std::thread; class Worker { public: int _total = 0; Worker() {} void DoWork(int* out) { for (int i = 0; i < _total; ++i) *out += 1; } }; int main() { Worker* workers = new Worker[5]; for (int i = 0; i < 5; ++i) workers[i]._total = 100000000..

[C++ Thread] C++ Thread 관리하기

C++ Thread를 관리하는 방법 쓰레드도 엄연한 운영체제 자원으로 프로세스보다는 가볍지만 메모리를 할당받아 스택 메모리, 레지스터를 사용한다. 자동적으로 레지스터가 복구되고 스택이 팝 되는 일반 함수의 종료와 다르게 쓰레드 "객체"는 함수 종료 후 다른 쓰레드에서 계산 결과를 전달하는 등을 위해 자동적으로 자원을 반납하지 않는다. 즉 객체가 소멸되지 않는 이상 자원은 할당되어 있는 상태이다. 쓰레드의 생성 fork thread는 추가적으로 생성하는 자원이다. 왜냐하면, 모든 프로그램은 시작시 진입 프로시저를 가지고 보통 main 함수가 그러한 프로시저이다. 즉 추가적인 thread를 생성하지 않는다면 main 함수가 유일한 쓰레드가 된다. 여기서 추가적으로 생성하는 thread는 main 쓰레드의 자..

[C++ Thread] C++ Thread 생성하기

쓰레드란 Thread 프로세스를 구성하는 독립적인 실행을 보장하는 객체이다. 프로세스의 흐름을 더 작은 단위로 나누고 프로세스에 할당된 자원, 데이터 세그먼트, 힙에 할당된 객체 등을 공유하여 사용할 수 있다. 쓰레드는 독립적인 실행을 보장하므로 자신이 실행하는 함수가 존재한다. 함수의 실행을 위해 자동 변수(쓰레드 로컬) 변수를 사용하기 위한 스택 메모리를 사용하게 된다. 프로세스 단위가 작으므로 문맥 교환에 더 적은 비용이 들기 때문에 멀티 쓰레드 프로그래밍이 자주 사용된다. 운영체제는 여러 쓰레드를 실행하기 위해 CPU의 전체 하드웨어 실행 시간를 나누어 각 쓰레드에게 CPU 사용가능 시간을 부여한다. 이를 타임 퀀텀(time quantum)이라고 한다. 또한 운영체제의 스케줄러가 쓰레드 실행 순서..

[운영체제] 가상 메모리 (3) 페이지 교체 알고리즘과 프로세스 적재 정책

독학사 운영체제 편을 공부하고 정리한 글입니다. 페이지 교체 알고리즘 페이지 부재 발생 시, 메모리가 꽉 찼을 경우 스왑 영역으로 내보낼 페이지를 결정하는 알고리즘 메모리에서 앞으로 사용할 가능성이 적은 페이지를 희생자 페이지로 선정한다. 페이지 교체 알고리즘 종류 - 이론적 페이지 교체 알고리즘 미래 메모리 접근 패턴을 전부 안다는 가정 하에 대상(희생자) 페이지를 결정한다. 가장 이상적인 교체 알고리즘으로 실제 구현이 불가능하지만 다른 알고리즘과 비교하기 위해 사용한다. - 최적 페이지 교체 근접 알고리즘 LRU/LFU/NUR/2차 기회 페이지 알고리즘 - 간단한 알고리즘 FIFO 알고리즘 1) FIFO 페이지 교체 알고리즘 선입 선출 형식으로 메모리에 가장 먼저 들어온 페이지를 대상 페이지로 선정하..

[운영체제] 가상 메모리 (2) 페이지 부재

독학사 운영체제 편을 공부하고 정리한 글입니다. 페이지 호출 기법 가져오기 정책(fetch): 데이터를 언제 메모리로 가져올 것 인가 1) 요구 페이징 프로세스가 요청할 때 메모리에 가져온다. 가급적 적은 양의 프로세스만 유지하기 때문에 메모리를 효율적으로 관리한다. 필요한 모듈만 실행하기 때문에 응답속도가 향상된다. 2) 예상 페이징 예상 되는 페이지를 미리 가져오는 방식 캐시 메모리는 예상 되는 데이터르 미리 메모리에 가져온다. 예상이 실패 했을 경우 효율이 낮으므로 현대 운영체제는 요구 페이징을 기본으로 한다. 페이지 테이블 엔트리 페이지는 물리 메모리에 있거나 스왑 영역(하드디스크)에 보관되어 있다. 스왑 아웃: 물리 메모리에 있던 페이지를 스왑 영역으로 내보내는 것 스왑 인: 스왑 영역에 있던 ..

[운영체제] 가상 메모리 (1) 페이징과 세그먼테이션

독학사 운영체제 편을 공부하고 정리한 글입니다. 가상 메모리 주 기억장치의 메모리 공간보다 큰 주소 지정을 할 수 있도록 함 하나의 프로세스 전체가 주 메모리에 있지 않고 일부만 있어도 실행 가능하게 함 가상 메모리를 통하여 주 메모리의 실제 주소 공간 크기에 구애받지 않고 프로그래밍을 할 수 있음 - 가상 메모리의 크기 = 물리 메모리와 스왑 영역을 합한 크기 - 메모리 분할 방식 가변 분할 방식: 세그먼테이션 고정 분할 방식: 페이징 페이징 기법 고정 분할 방식을 이용한 가상 메모리 관리 기법 물리 주소 공간을 같은 크기로 나누어 사용한다. 가상 주소의 분할된 각 영역은 페이지 / 물리 메모리의 각 영역은 프레임이라고 한다. 가상 주소 페이지 번호에 대응하는 물리 주소 프레임 번호를 저장하는 페이지 ..

[운영체제] 주 메모리 관리

독학사 운영체제 편을 공부하고 정리한 글입니다. 메모리 관리 메모리의 구조는 1바이트 단위로 나뉘고 주소로 구분하는데 0번지 부터 시작한다. CPU는 메모리 주소 레지스터를 통해 데이터를 메모리에서 읽어오거나 쓰기가 가능하다. 오늘날 시분할 시스템에서 많은 응용프로그램이 동시에 메모리에 올라와있으므로 관리가 복잡하다. 메모리 관리자 다중 프로그래밍 환경에서 효율적으로 메모리를 사용하기위해 메모리 할당 및 해제 등의 작업을 수행한다. 메모리 관리 유닛(Memory Manage Unit, MMU)라는 하드웨어가 메모리 관리를 담당한다. 메모리 관리 작업은 가져오기(fetch), 배치(placement) 그리고 재배치(replacement)로 나뉜다. 1. 적재 정책 - 프로세스와 데이터를 메모리로 가져오는 ..