프로세스: 실행 중인 프로그램사용자는 하나 이상의 프로그램을 동시에 실행시키기를 원함그러나 CPU는 한정되어 있음그렇다면 어떻게 CPU가 여러개 존재한다는 것처럼 느끼게 할 수 있을까?가상화 - 운영체제는 CPU를 가상화 하여 CPU가 여러개 존재하는 것처럼 느끼게 할
사용자 프로그램의 프로그램 실행, 메모리 할당, 파일 접근과 같은 가상 머신과 관련된 기능들을 운영체제에게 요청할 수 있도록, 운영체제는 사용자에게 API를 제공한다. 보통 운영체제는 응용 프로그램이 사용 가능한 수백 개의 시스템 콜을 제공한다.운영체제가 프로그램 실행
CPU를 가상화하기 위해서 운영체제는 여러 작업들이 동시에 실행되는 것처럼 보이도록 물리적인 CPU를 공유한다.어떻게? CPU 시간을 나누어 쓰는 것으로 (시분할 기법)한 프로세스를 잠시동안 실행시키고, 다른 프로세스를 또 잠깐 실행 ...이런 식으로 가상화 하면 몇가
스케줄링: 다중 프로그래밍을 가능하게 하는 운영체제의 동작 기법.즉, 어떤 프로세스를 실행시키거나 중단할지 결정하는 것다양한 스케줄링 정책이 있고, 이는 discipline이라고도 볼림핵심질문: 스케줄링 정책은 어떻게 개발하는가?스케줄링 정책의 핵심 가정은?어떠한 평가
Multi-level Feedback Queue (MLFQ)Compatible Time-Sharing System에 사용됨MLFQ가 해결하고자 하는 문제짧은 작업을 먼저 실행시켜 "반환시간" 최적화SJF, STCF 알고리즘은 실생시간 정보를 필요로 하지만, 실제론 실행
이번 장에서는 시간을 최적화 하는 것보다는, 작업의 비율 배분에 초점을 맞춘 스케줄러를 알아볼 것이다.비례 배분 (공정 배분, fair share): 반환시간이나 응답시간을 최적화하는 대신 스케줄러가 각 작업에게 CPU의 일정 비율을 보장하는 것추첨 스케줄링 (lott
멀티프로세서 스케줄링(multiprocessor scheduling)은 어려운 주제이므로 기본적인 내용만 다룰 것이다. 병행성(concurrency)에 대해 어느정도 공부를 한 후에 다루는 것이 가장 좋다.멀티프로세서 시스템: 두 개 이상의 CPU를 가진 컴퓨터 시스템
초기에는 컴퓨터 시스템을 구현하는 것이 쉬웠다.사용자가 많은 것을 기대하지 않았기 때문이다.하지만 이후 "사용자 편이", "고성능", "신뢰성" 등을 기대한 사용자들이 등장하였고, 그때부터 시스템을 구축하는 것이 복잡해졌다.메모리 관점에서 초기 컴퓨터는 비교적 단순하게
메모리 관리 API 이번 장에서는 UNIX/C의 메모리 관리 인터페이스에 대해 논의한다. (여기서의 메모리는 "사용자 주소 공간"을 의미함) > 핵심 질문: 어떻게 메모리를 할당하고 관리해야 하는가 일반적으로 어떤 인터페이스가 사용되는가? 어떤 실수를 해서는 안 되
주소 변환의 원리 제한적 직접 실행 (LDE) 사용자 모드와 커널 모드로 구분하여 명령어 실행 커널 모드에서만 특권 명령어(privilege command) 실행 가능 프로세스가 시스템 콜을 호출하거나 타이머 인터럽트가 발생할 때 등의 특정 순간에는 운영체제가 개입하
세그멘테이션 프로세스를 물리 메모리에 재배치하는 방법으로는 베이스/바운드 레지스터를 사용하는 방법이 있다. 이 방법에는 단점이 있는데, 스택과 힙 사이에 사용되지 않는 공간이 크다는 것이다. 즉, 메모리 낭비가 심하고, 유연성이 없다는 단점이 존재한다. > 핵심질문
빈 공간 관리 (Free Space Management) > 핵심 질문: 빈 공간을 어떻게 관리하는가 관리하고 있는 공간이 고정 크기의 단위로 나뉜 경우엔 관리 쉬움 하지만 가변 크기의 요구를 충족시키긴 어려움 세그멘테이션으로 물리 메모리를 관리하는 운영체제에서는 필
운영체제는 공간 관리 문제를 해결할 때 크게 두 가지 방법으로 세그멘테이션이나 페이징을 사용한다.세그멘테이션: 가상 메모리를 "가변 크기"의 조각들로 분할공간을 다양한 크기의 청크로 분할할 때 공간 자체가 단편화 되는 단점단편화로 인해 할당이 점점 어려워짐페이징: 공간
페이징은 잘못 설계하면 상당한 성능 저하를 가져올 수 있다.페이징은 프로세스 주소공간을 고정 크기의 페이지로 나누고, 각 페이지의 실제 위치(매핑 정보)를 메모리에 저장매핑 정보를 저장하는 자료구조를 페이지 테이블이라고 함근데 이 페이지 테이블이 잡아먹는 메모리 공간이
페이징: 더 작은 테이블
쓰레드(thread): 프로세스 내에서 실제로 작업을 수행하는 주체멀티 쓰레드 프로그램은 하나 이상의 실행 지점을 가지고있다.멀티 쓰레드 프로그램은 단일 PC값을 사용하는 고전적인 관점에서 벗어나 독립적으로 Load/Execute 될 수 있는 여러 PC 값을 갖는다.
쓰레드 API의 주요 부분을 간략하게 알아보자.핵심 질문: 쓰레드를 생성하고 제어하는 방법운영체제가 쓰레드를 생성하고 제어하는데 어떤 인터페이스를 제공해야 할까?어떻게 이 인터페이스를 설계해야 쉽고 유용하게 사용할 수 있을까?첫번째 인자 thread: pthread_t
병행 프로그램의 근본적인 문제여러 개의 명령어들을 원자적으로 실행하고 싶지만, 단일 프로세서의 인터럽트로 인해 불가능이 장에서는 앞서 다룬 락(Lock)을 이용하여 임계 영역을 하나의 원자 단위 명령어인 것처럼 실행되도록 해볼 것이다.락을 사용하여 임계 영역(balan
자료구조에 락을 추가하여 쓰레드가 사용할 수 있도록 만들면, 그 구조는 쓰레드 사용에 안전(thread safe)하다고 할 수 있다.핵심 질문: 자료구조에 락을 추가하는 방법자료구조에 어떤 방식으로 락을 추가해야 정확하게 동작하게 만들 수 있을까?자료구조에 락을 추가하
컨디션 변수 1. 정의와 루틴들 2. 생산자/소비자(유한버퍼) 문제 불완전한 해답 개선된, 하지만 아직도 불완전한: if문 대신 while문 단일 버퍼 생산자/소비자 해법 최종적인 생산자/소비자 해법 3. 컨디션 변수 사용 시 주의점 4. 요약
다양한 범주의 병행성 문제 해결을 위해서는 락과 조건 변수가 모두 필요하다. 이번 장에서는 세마포어(semaphore) 라는 동기화 기법에 대해 알아볼 것이다. 세마포어는 락과 컨디션 변수로 모두 사용할 수 있다.핵심 질문: 세마포어를 어떻게 사용하는가락과 컨디션 변수
병행성 관련 오류 이번 장에서는 실제 코드들을 예로 사용하여 병행성 문제들을 살펴보고 어떤 문제들을 조심해야 하는지 보도록 하겠다. 참고) 대부분 초기 연구는 교착상태(deadlock)에 초점 > 핵심 질문: 일반적인 병행성 관련 오류들을 어떻게 처리하는가 병행성
쓰레드를 사용하는 것이 병행 프로그램을 제작하는 유일한 방법은 아니다. 이벤트 기반의 병행성(Event-based Concurrency) 스타일로 프로그래밍을 하여 병행 프로그램을 작성할 수 있다. 이벤트 기반의 병행성(Event-based Concurrency) 대표
핵심 질문 : 어떻게 I/O를 시스템에 통합할까시스템에 I/O를 어떻게 통합해야 하는가? 일반적인 방법은 무엇인가? 어떻게 효율적으로 통합할 수 있을까?논의를 시작하기 위해 일반적인 시스템 구조를 살펴보자.메모리 버스: CPU와 주메모리를 연결해주는 버스범용 I/O 버
이 장에서는 하드디스크 드라이브에 대해서 자세히 살펴볼 것이다.핵심 질문 : 디스크에 있는 데이터를 어떻게 저장하고 접근하는가현대 하드 디스크 드라이브는 어떻게 데이터를 저장하는가? 인터페이스는 무엇인가?데이터는 실제로 어떻게 배치되고 접근되는가? 디스크 스케줄링은 어
Redundant Array of Inexpensive Disk (RAID) 디스크를 사용할 때 개선되면 좋은 점 속도: I/O 작업은 느리기 때문에 전체 시스템의 병목이 되기도 함 용량: 많으면 좋음 안정성: 디스크 고장 시 백업 없으면 데이터 손실 > 핵심 질문
이번 장에서는 HDD나 SSD와 같은 영속 저장 장치(persistent storage)에 대해 알아볼 것이다.핵심 질문 : 어떻게 영속 장치를 관리하는가운영체제가 영속 장치를 어떻게 관리해야 할까? API들은 어떤 것이 있는가?구현의 중요한 측면은 무엇인가?저장 장치
이번 장에서는 Unix 파일 시스템을 단순화한 vsfs(Very Simple File System)라는 간단한 파일 시스템 구현에 대해 소개하겠다.파일 시스템은 순수한 소프트웨어다. 이점이 이책의 앞부분에서 다룬 CPU 가상화, 메모리 가상화 부분과 다른점이다. (여기