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

효율적인 메모리 가상화 우리는 앞에서, CPU 가상화를 위한 제한적 직접 실행(LDE)에 대해서 자세하게 살펴봤다. https://lipcoder.tistory.com/55?category=834992 2-2장. Mechanism : 제한적 직접 실행 원리 CPU를 가상화하기 위해서 운영체제는 여러 작업들이 동시에 실행되는 것처럼 보이도록 물리적인 CPU를 공유한다. 한 프로세스를 잠시 동안 실행하고 다른 프로세스를 또 잠깐 실행하고, 이런 식으로 계속해서 잠깐.. lipcoder.tistory.com 메모리 가상화에서도 비슷한 전략을 추구할 것이다. 가상화를 제공하는 동시에 효율성(Efficiency)과 제어(Control) 모두를 추구한다. 효율성을 높이려면 하드웨어 지원을 활용할 수밖에 없다. 처음..

메모리 공간의 종류 C 프로그램이 실행되면, 두 가지 유형의 메모리 공간이 할당된다. 첫 번째는 스택(Stack) 메모리라고 불리며 할당과 반환은 프로그래머를 위하여 컴파일러에 의해 암묵적으로 이루어 진다. 이러한 이유 때문에 때로는 자동(Automatic) 메모리라고 불린다. C 프로그램에서 스택에 메모리를 선언하는 것은 쉽다. 예를 들어, func() 라는 함수 안에서 x라 불리는 정수를 위한 공간이 필요하다고 하자. 이러한 메모리를 선언하려면 다음과 같이 하면 된다. void func() { int x; // 스택에 int 형을 선언 // .... } 컴파일러가 나머지 작업을 수행하여, func()가 호출될때 스택에 공간을 확보한다. 함수에서 리턴하면 컴파일러는 프로그래머 대신에 메모리를 반환한다...

초기에는 컴퓨터 시스템을 구현하는 것이 쉬웠다. 사용자가 많은 것을 기대하지 않았기 때문이다. 하지만 시대가 변화하면서 사용자들은 점점 편의성, 고성능, 신뢰성을 추구하게 되었다. 초기 시스템 메모리 관점에서 초기 컴퓨터는 많은 개념을 사용자에게 제공하지 않았다. 컴퓨터의 물리 메모리는 다음과 같이 생겼다. 운영체제는 메모리에(그림에서는 물리주소 0부터) 상주하는 루틴(라이브러리)의 집합이였다. 물리 메모리에 하나의 실행 중인 프로그램(프로세스)이 존재하였고(그림에서는 물리 주소 64KB부터 시작하여) 나머지 메모리를 사용하였다. 특별한 가상화는 거의 존재하지 않았고 사용자는 운영체제로부터 그리 많은 것을 기대하지 않았다. 멀티프로그래밍과 시분할 시간이 흐른 후, 컴퓨터는 고가 장비였기 때문에, 사람들이..

고사양 컴퓨터에만 존재했던 멀티프로세서(Multiprocessor) 시스템은 일반적이 되었으며, 데스크톱 컴퓨터, 노트북, 심지어 모바일 장치에도 사용되고 있다. 여러 개의 CPU 코어가 하나의 칩에 내장된 멀티코어(Multicore) 프로세서가 대중화의 근본 원인이다. 싱글코어 CPU의 성능 개선이 한계에 봉착하면서 멀티코어 기술이 각광을 받게 되었다. 우리는 다수의 CPU를 사용할 수 있게 되었다. 이로 인해 운영체제가 새롭게 직면한 문제는 멀티프로세서 스케줄링이다. 지금까지 다뤘던 많은 원칙들은 단일 CPU를 전재로 하고 있었다. 그러면 여러 CPU에서 동작하도록 어떻게 확장할 수 있을까? 해결해야 하는 새로운 문제는 무엇이 있을까? 배경 : 멀티프로세서 구조 멀티프로세서 스케줄링에 대한 새로운 문..

멀티 레벨 피드백큐(Multi Level Feedback Queue) 스케줄러가 해결하려고 하는 기본적인 문제는 두 가지이다. 첫째, 짧은 작업을 먼저 실행시켜 반환시간을 최적화하고자 한다. 전 장의 SJF나 STCF 같은 알고리즘은 작업의 실행 시간 정보를 필요로 하지만, 불행히도 운영체제는 이 실행 시간을 미리 알 수 없다. 둘째, MLFQ는 대화형 사용자(즉, 컴퓨터 사용자)에게 응답이 빠른 시스템이라는 느낌을 주고 싶기 때문에 응답 시간을 최적화 한다. 불행히도 RR과 같은 알고리즘은 응답시간을 단축시키지만 반환 시간은 거의 최악이다. 그러면 프로세스에 대한 정보가 없다면 이러한 스케줄러를 어떻게 만들 수 있을까? 실행 중인 작업의 특성을 알아내고 이를 이용하여 더 나은 스케줄링 결정을 하기 위한..

이제부터 다양한 스케줄링 정책(Scheduling policy)을 소개할 것이다. 이러한 정책은 원칙이라고도 불리며 많은 똑똑하고 부지런한 사람들이 오랫동안 개발한 정책이다. 스케줄링의 기원은 컴퓨터 시스템 개발 이전으로 거슬러 올라간다. 초기의 방법들은 생산 관리 분야에서 개발되었으며 컴퓨터에 적용되었다. 이 사실은 그렇게 놀라운 일은 아니다. 생산 공정과 기타 많은 인간의 행동 역시 스케줄링이 필요하고, 효율성에 대한 요구 등, 공통된 해결 사항이 존재하기 때문이다. 스케줄링 정책을 생각하기 위한 기본적인 프레임워크를 어떻게 만들어야 할까? 핵심 과정은 무엇일까? 워크로드에 대한 가정 가장 먼저 프로세스에 대해서 몇 가지 가정을 할 것이다. 일련의 프로세스들이 실행하는 상황을 워크로드(Workload..

CPU를 가상화하기 위해서 운영체제는 여러 작업들이 동시에 실행되는 것처럼 보이도록 물리적인 CPU를 공유한다. 한 프로세스를 잠시 동안 실행하고 다른 프로세스를 또 잠깐 실행하고, 이런 식으로 계속해서 잠깐씩 실행시키면 된다. 이렇게 CPU 시간을 나누어 씀으로써 가상화를 구현할 수 있다. 그러나 이러한 가상화 기법을 구현하기 위해서는 몇 가지 문제를 해결해야 한다. 첫 번째는 성능저하이다. 시스템에 큰 오버헤드를 주지 않으면서 가상화를 구현할 수 있을 것인가? 두 번째는 제어 문제이다. CPU에 대한 통제를 유지하면서 프로세스를 효율적으로 실행시킬 수 있는 방법은 무엇인가? 운영체제의 입장에서는 자원 관리의 책임자로서 특히 제어 문제가 중요하다. 제어권을 상실하면 한 프로세스가 영원히 실행을 계속할 ..
이번 장에서는 UNIX 시스템의 프로세스 생성에 관해 논의한다. UNIX는 프로세스를 생성하기 위해서 fork()와 exec() 시스템 콜을 사용한다. wait()는 프로세스가 자신이 생성한 프로세스가 종료되기를 기다리기 원할 때 사용된다. 그러면 본격적으로 이 인터페이스에 대해 예제를 통해 더 자세하게 알아보자. fork() 시스템 콜 프로세스 생성에는 fork() 시스템 콜이 사용된다. 다음 코드는 fork()를 호출하는 코드(p1.c)이다. #include #include #include int main(int argc, char *argv[]) { printf("hello world (pid:%d)\n", (int) getpid()); int rc = fork(); if(rc < 0) // for..