Operating System(OS)

OS 정의

컴퓨터는 크게 하드웨어와 소프트웨어로 나뉜다. 소프트웨어는 또 응용 프로그램시스템 소프트웨어로 나뉜다. 응용 프로그램은 특정 작업을 위해 사용하는 프로그램이고, 시스템 소프트웨어는 컴퓨터 하드웨어와 응용 프로그램을 관리하기 위한 소프트웨어이다. 시스템 소프트웨어는 또 운영체제(OS)유틸리티로 나뉜다. 운영체제란 컴퓨터 자원을 효율적으로 관리하고 응용 프로그램을 실행하기 위한 환경을 제공하는 소프트웨어이다. 유틸리티란 운영체제의 작업을 보조(바이러스 검사, 디스크 조각 모음, 압축 작업 등)하는 소프트웨어이다. 운영체제는 SW와 HW의 특성을 모두 가지므로 펌웨어(firmware)라고 한다.

역할과 목표

OS 구조

OS 구조

커널의 종류

운영체제 종류와 발전과정

종류

발전과정

  1. 에니악(1940년대) : 하드 와이어링 방식으로 논리회로를 구성하는 최초의 컴퓨터로 운영체제가 없다
  2. 천공카드(1950년대) : 일괄 작업 시스템 방식의 운영체제
  3. 대화형 시스템(1960년대) : 키보드와 모니터 사용
  4. 시분할 시스템(1960년대) : 멀티 프로그래밍으로 하나의 cpu로 여러 작업을 동시에 실행하는 것처럼
  5. 분산 시스템(1970년대) : 여러 컴퓨터를 네트워크로 연결해 작업을 처리
  6. 클라이언트/서버 시스템(1990년대)
  7. P2P 시스템, 클라우드 컴퓨팅, 사물 인터넷(2000년대)
  8. 자료구조 스택과 큐 기능

Computer Structure

기본 지식

컴퓨터는 필수장치인 CPU와 메인메모리, 주변장치인 입출력 장치, 저장장치로 나뉟다.

CPU

CPU 구조

CPU에서 프로그램 실행 과정

  1. 프로그램이 시작되면 PC에 프로그램의 시작 주소가 저장된다.
  2. PC의 주소에 해당하는 명령어를 IR에 저장한다.
  3. IR해석하여 데이터를 받아오거나 연산을 하는 작업을 한다.
  4. 2,3을 반복한다.

버스

버스는 시스템 버스와 CPU내부 버스로 나뉜다. 시스템 버스에는 3가지 종류가 있다.

버스에서 한번에 이동가능한 데이터의 크기인 버스의 대역폭(bandwidth)이 클수록 속도가 빠르다.

메모리

메모리는 운영체제 영역과 사용자 영역으로 나뉜다. 프로그램은 각자의 사용자 영역을 사용하는데 어떤 프로그램이 다른 프로그램의 사용자 영역을 침범하지 않도록 메모리 보호를 해야한다. 프로그램이 CPU를 사용중이면, 운영체제의 작업이 중단되므로 하드웨어의 도움을 받아야한다. 이때 경계 레지스터한계 레지스터를 사용한다. 경계 레지스터는 현재 진행 중인 메모리의 시작 주소를 저장하고, 한계 레지스터에 마지막 주소까지의 차이, 즉 크기를 저장한다. 만약 작업 중에 두 레지스터 값을 벗어났으면 CPU는 작업을 중단시키고 운영체제에게 인터럽트 신호를 보내 운영체제는 해당 작업을 강제 종료시킨다.

다음은 메모리의 종류이다.

부팅

운영체제 또한 응용 프로그램처럼 메모리에 올려서 실행을 한다. 이때 운영체제를 하드디스크에서 메모리에 올리는 과정을 부팅이라고 하고, 이를 ROM에 저장된 바이오스가 실행시킨다. 바이오스는 더불어 CPU, 메모리, 하드디스크 등 하드웨어가 정상적으로 작동하는지 확인한다. 하드웨어 점검을 완료하면 하드디스크에 마스터 부트 레코드(MBR)에 저장된 부트스트랩을 메모리로 가져와 실행한다. 부트스트랩이란 하드디스크에 저장된 운영체제를 메모리로 가져와 실행하는 역할을 하는 프로그램이다.

컴퓨터 성능 향상 기술

Process, Thread

프로세스 개요

프로그램은 저장장치에 저장된 정적인 상태이고 프로세스는 실행을 위해 메모리에 올라온 동적인 상태이다. 프로세스가 생성되면 동시에 프로세스의 정보를 담고 있는 프로세스제어블록(PCB)이 만들어진다. PCB는 운영체제 영역에 올라가고, 프로세스는 사용자 영역에 올라간다. 운영체제 또한 프로그램이기 때문에 응용 프로그램과 섞여서 메모리에 올라간다. PCB는 프로세스가 종료되면 삭제된다. 메모리에 올라온 프로세스는 CPU를 할당받아 처리가 되는데 처리하는 방식으로 대표적으로 두 가지가 있다.

프로세스 상태

프로세스에는 상태가 있다. 일괄작업시스템은 단순히 순서대로 생성,실행,완료상태인 반면, 시분할시스템은 기본적으로 생성,준비,실행,완료상태를 갖고 추가로 보류,대기상태가 있다. 다음은 프로세스에 대한 용어이다.

PCB와 프로세스 구조

PCB 구조

프로세스 구조

프로세스의 연산

다음은 프로세스의 연산이다.

fork()와 exac()으로 프로세스의 계층 구조를 만들 수 있다. 유닉스에서 커널이 처음 메모리에 올라와 부팅되면 root 프로세스 아래에 page daemon, swapper, init 프로세스를 만든다. 그중에 init 프로세스는 나머지 전체 프로세스의 출발점이다. init의 자식 프로세스들은 트리 형태로 구성되며 init의 자식은 기본적으로 loginshell이 있다. login은 사용자가 컴퓨터에 접속했을 때 인증하는 프로세스이다. login이 통과되면 exac()을 호출해 shell로 전환한다. 이는 운영체제에 명령을 내리고 결과를 받을 수 있는 프로세스이다. shell은 fork(), exac()으로 응용 프로그램을 자식 프로세스로 만들어 실행한다.

프로세스 계층 구조의 장점으로 여러 작업을 동시에 처리가능하고, 부모-자식 관계로 자원의 회수가 용이하다는 점이 있다.

하지만 자식 프로세스가 종료되기 전에 부모 프로세스가 먼저 종료되었을 때 자식 프로세스는 고아 프로세스가 되고, 부모 프로세스가 종료된 자식 프로세스의 자원을 정리하지 않았을 때 자식 프로세스는 좀비 프로세스가 된다. c언어에서 main() 함수의 끝에 return 0 또는 exit(0)을 쓰는 이유도 부모 프로세스에게 작업이 끝났음을 알리기 위함이다. 위에 문자을 안썼다고 무조건 좀비 프로세스가 되는 것은 아니지만 자원을 정리하거나, 자식 프로세스와 동기화할 수 있다.

스레드

스레드란 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행단위이다. 운영체제 입장에서 작업단위는 프로세스, CPU입장에서는 스레드.

프로세스와 스레드의 차이는 프로세스는 실행 순서가 중요하지 않지만, 스레드는 프로세스에 정의된 순서대로 실행되어야 한다.

멀티태스크와 멀티스레드차이 : 멀티태스크는 여러 프로세스, 멀티 스레드는 프로세스안에 여러 스레드

멀티스레드 탄생 배경 기존 멀티 태스킹의 fork(), exac()으로 프로세스를 만드는 것은 불필요한 작업이 많고 메모리 낭비가 심했음. 따라서 한 프로세스 안에서 코드 영역과 데이터 영역은 공유하고, 스택 영역에 여러개의 스레드를 만드는 멀티 스레드방식을 사용. 스레드는 가벼운 프로세스, 스레드가 하나인 프로세스는 무거운 프로세스. 멀티스레드의 예로 자바의 스레드 라이브러리를 사용하여 멀티스레드를 만들 수 있음.

멀티스레드 장점

단점

스레드 종류

멀티스레드 모델

멀티 프로세싱

멀티 프로세서 시스템 : 프로세서를 여러개 사용하는 시스템. 프로세서마다 레지스터와 캐시를 가지며 모든 프로세서가 시스템 버스를 통해 메인 메모리를 공유. 장점은 많은 작업을 동시에 실행시킬 수 있음

멀티코어 시스템 : 기존 시스템을 유지한 채 멀티 프로세싱을 할 수 있게 하는 시스템. 하나의 칩에 CPU의 코어를 여러 개 만들어 여러 작업을 동시 처리.

명령어 병렬 처리 : 파이프라인 기법으로 하나의 CPU에서 스레드의 명령어 패치, 명령어 해석, 실행, 쓰기 과정을 동시에 진행하는것

CPU 멀티 스레드 : 여러 개의 스레드를 동시에 처리

현대의 CPU는 하나의 칩에 멀티코어와 명령어 병렬 처리 기능을 동시에 구현

CPU 관련 통용 법칙

동적 할당 영역과 시스템 호출

CPU Scheduling

스케줄링 종류

프로세스 우선순위

우선순위 높음 우선순위 낮음 이유
커널 일반 운영체제의 핵심 기능이기 때문
전면 후면 GUI가 빨라야 사용자 편의성이 향상되기 때문
입출력 집중 CPU 집중 입출력 집중은 CPU 사용 시간이 짧기 때문

프로세스의 중요도는 프로세스 제어 블록에 표시되는데 이 우선순위는 준비상태의 다중 큐로 처리된다. 우선순위의 개수 만큼 큐가 있으며, 해당하는 우선순위의 큐에 프로세스가 들어간다. 프로세스가 우선순위를 배정하는 방식은 고정 우선순위 방식과 변동 우선순위 방식으로 나뉜다. 이 방식은 작업 중간에 프로세스의 우선순위를 고정할지 변동할지를 말하는 것이다. 변동 우선순위 방식은 효율은 좋지만 구현하기 어렵다. 예를들어 우선순위가 낮지만 중요한 자원을 사용중일때 우선순위를 높이면 CPU를 더 자주 할당받아 작업을 빨리 끝낼 수 있다.

대기 상태에서도 다중 큐를 사용한다. 대기 상태는 입출력을 기다리는 프로세스들이 모여있는 곳으로, 입출력 장치의 개수만큼 큐가 존재한다. 여기서 입출력 장치에는 HDD, CD-ROM, LAN 등이 있다. 준비 큐와 대기 큐의 차이점은 준비 큐는 한번에 하나의 프로세스를 꺼내어 CPU에 할당하고, 대기 큐는 여러개의 PCB를 꺼내 준비상태로 옯긴다는 것이다.

스케줄링 알고리즘 종류

스케줄링 알고리즘의 평가기준은 다음과 같다.

CPU 사용률과 처리량은 계산하기 어려우므로 보통 나머지 3개의 평가 방식을 사용한다. 평균 대기시간은 모든 모든 프로세스 대기 시간을 합한뒤 프로세스 수로 나눈 값이다. 평균 대기 시간은 알고리즘의 절대적인 성능을 보여주지는 않는다.

FCFC(First Come First Served) 스케줄링

이란 우선순위 없이 준비 큐에 도착한 순서대로 CPU를 할당하는 비선점형 방식이다. 이 방식은 프로세스의 처리 기간이 길면 다른 프로세스들은 기다린다는 단점이 있다. 이처럼 컨베이어 벨트에 작업물이 한줄로 늘어서 앞의 작업이 오래 걸려 뒤의 작업 지연되는 것 같다하여 이를 콘보이 효과라고 한다.

SJF(Short Job Rirst) 스케줄링

준비 큐에 있는 프로세스 중에서 실행시간이 가장 짧은 방식부터 CPU에 할당하는 비선점형 방식으로 최단 작업 우선 스케줄링 이라고도 한다. 이 방식은 콘보이 효과를 완화하여 보통 FCFC보다 평균 대기시간이 짧다. 하지만 운영체제가 프로세스의 종료 시간을 정확하게 예측하기 어렵다는 점, 공평성에 위배되어 아사현상, 무한 봉쇄 현상을 일으킬 수 있다는 점이다. 후자에 대한 해결책으로 aging(나이먹기)가 있다. 이는 프로세스가 양보하는 상한선을 정하는 것이다. 이 스케줄링 방식은 위와 같은 문제로 잘 사용하지 않는다.

HRN(Highest Response Ratio Next) 스케줄링

SJF의 아사현상을 에이징으로 해결하는 비선점형 알고리즘으로 최고 응답률 우선 스케줄링 이라고도 한다. 이 방식은 서비스를 받기 위해 기다린 시간과 CPU 사용시간을 고려하여 스케줄링하는 방식이다. 프로세스의 우선순위를 정하는 기준은 (대기시간+CPU사용시간)/CPU사용시간이다. 하지만 여전히 공평성이 위배되어 많이 사용되지 않는다.

RR(Round Robin) 스케줄링

프로세스에게 할당된 타임 슬라이스가 끝나면 준비 큐로 이동시키는 선점형 방식이다. 이 방식은 우선순위를 적용하지 않는 가장 단순한 스케줄링 방식이다. 이 방식은 FCFS의 평균 대기 시간보다 작거나 같은데, 만약 같으면 FCFS보다 비효율적이다. 왜냐하면 선점형 방식은 문맥 교환 시간이 추가되기 때문이다.

SRT(Shortest Remaining Time) 스케줄링

SJF와 RR을 혼합한 선점형 방식으로 최소 잔류 시간 우선 스케줄링이라고도 한다. 타임 슬라이스가 있으며, 우선순위는 남은 작업 시간이 가장 적은 프로세스 순으로 선택한다. 이 방식은 평균 대기 시간이 위에 방식들보다 작지만, SJF에는 없는 문맥교환시간이 추가되고, 종료시간은 예측하기 어려우며, 아사 현상이 발생한다는 단점이 있어 잘 사용되지 않는다. 다시말해 SJF와 RR의 단점을 모두 가지고 있다는 것이다.

우선순위 스케줄링

어떤 기준으로 우선순위를 정하느냐에 따라 다양하게 구현이 가능하다. 이 방식은 프로세스의 순서를 무시하고 우선순위가 높은 프로세스에 먼저 CPU를 할당하므로 공평성을 위배하고 아사현상을 일으킨다는 공통적인 문제가 있다. 또한 우선순위를 매번 바꾸어야 하므로 오버헤드가 발생해 시스템의 효율성이 떨어진다.

다단계 큐 스케줄링(MLQ, Multi-Level Queue)

우선순위에 따라 준비 큐를 여러개 사용하여 운영체제는 프로세스에 우선순위를 매겨 해당 우선순위 큐에 삽입하는 방식이다. 우선순위는 프로세스가 큐에 삽입되는 것으로 우선순위가 고정되어, 상단 큐에 모든 작업이 끝나야 다음 우선순위 큐의 작업이 시작된다. 이 방식은 선점형 방식으로

다단계 피드백 큐 스케줄링(MLQ, Multi-Level Feedback Queue)

MLQ의 문제를 보완한 방식으로 CPU를 사용한 후에는 우선순위를 낮추어 아사현상을 해결한다.(그러나 커널 프로세스가 일반 프로세스 큐에 삽입되지는 않는다) 또한 우선순위가 낮으면 타임 슬라이스를 크게하여 우선순위가 낮은 프로세스에게 실행기뢰를 확대한다. 하지만

인터럽트 처리

동기적 인터럽트란 프로세스가 실행 중인 명령어로 인해 발생하는 인터럽트로 사용자 인터럽트라고도 한다. 예를들어 프로그램 상의 문제로 다른 사용자의메모리에 접근하거나

비동기적 인터럽트란 실행중인 명령어와 무관하게 발생하는 인터럽트이다.

이 인터럽트의 처리과정은 단순하다.

  1. 인터럽트가 발생하면 실행중인 프로세스는 일시 정지 상태가 되며 재시작을 위해 현재 프로세스 관련 정보를 임시로 저장한다.
  2. 인터럽트 컨트롤러가 실행되어 인터럽트 처리 순서를 결정한다.

프로세스 동기화

프로세스 간 통신

프로세스 혹은 스레드는 독립적으로 실행된다. 스레드는 하나의 프로세스 내에서 자원을 공유하는 실행단위이고, IPC(Inter Process Communication)은 운영체제에 의해 프로세스 간에 데이터를 주고 받는 프로세스 간 통신이다. IPC에는 다음과 같은 종류가 았다.

프로세스 간 통신을 분류

통신 구현방식에 따른 분류

프로세스간 통신의 종류

공유 자원과 임계구역

공유자원(shared resource)이란 여러 프로세스가 공동으로 이용하는 변수,메모리,파일 등 이다. 경쟁조건(race condition)이란 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황이다. 경쟁 조건이 발생하면 공유자원 접근 순서에 따라 결과가 달라질 수 있다. 임계구역(critical section)이란 공유자원 접근 순서에 따라 실행결과가 달라지는 프로그램 영역이다. 만약 프로세스가 읽기만 한다면 공유자원이라해도 임계구역이 아니다. 만약 공유자원을 임계구역으로 지정하면 임계구역에서 프로세스의 작업을 마쳐야지 다른 프로세스가 작업을 할 수 있기 때문에 문제가 발생하지 않는다.

임계구역과 관련된 대표적인 문제를 생산자-소비자 문제라고 한다. 생산자와 소비자 프로세스는 서로 독립적으로 작동하며, 버퍼에 생산자는 물건을 넣고, 소비자는 물건을 가져간다. 이때 버퍼에 담긴 물건의 개수를 저장하는 전역 변수 sum이 있다. 생산자가 물건을 담았고 sum을 바꾸기 전에 소비자가 물건을 가져가고 sum을 수정하면 문제가 발생한다.

임계구역 문제를 위해 3가지 해결책이 있다.

임계구역 문제 해결 방법

임계구역 문제를 해결하기 위해 기본적으로 ‘잠금’을 사용할 수 있다. 잠금을 공유변수로 두고 작업을 시작하기전 잠금을 true로 하고 작업이 끝나면 잠금을 false로 한다. 다른 프로세스가 접근을 하면 잠금이 false가 될떄까지 while문이 무한정 돌아간다. 이 방법의 단점은 while문 직후에 문맥교환이 일어나면 잠금이 풀리고, 다른 프로세스는 잠금이 풀리기를 기다리면서 바쁜대기를 해야한다는 것이다.

이 한정대기 문제를 해결하기 위해 잠금 공유변수를 2개를 사용하고 while문 이전에 상대방에게 잠금을 거는 방식이 있다. 하지만 이 방식도 문제가 있는데 상대방에게 잠금을 걸고 문맥교환이 일어나면 무한 대기를 한다는 것이다. 이러한 상황을 교착상태라고 한다.

피터슨 알고리즘은 turn이라는 공유번수를 사용한다. 이 방식은 상대에게 잠금을 걸고 turn의 값을 변경한다. 만약 문맥교환이 일어나도 while문 조건에 turn이 and로 걸려있기 때문에

피터슨 알고리즘과 데커 알고리즘은 임계구역 해결의 세가지 조건을 모두 만족하지만 복잡하다.

void process1(){
    lock1=true;
    while(lock2==2){
        lock1=false;
        while(tuen==2);
        lock1=true;
    }
}

세마포어 알고리즘은 위에 알고리즘보다 간단하고 사용하기 쉽다. 하지만 사용자의 실수로 아래와 같이

Semaphore(n);//n은 공유 자원 개수
P();//잠금을 수행
//(임계구역)
V();//잠금 해제와 동기화(대기중인 프로세슷에게 wake_up()신호를 보냄)

파일, 파이프, 소켓 프로그래밍

순차파일은 데이터가 한줄로 저장되는 형태이다. 파일은 open(), read(), write(), close() 연산을 사용하는데 open을 통해 파일 기술자 fd를 얻고 fd를 통해 파일을 읽고 쓰고 닫는다. 이 파일을 이용해 통신을 할 수 있다. fork()를 하기전에 open()을 하여

파이프를 이용한 통신은

교착상태(deadlock)

교착상태(deadlock)란 다른 작업이 끝나기만을 기다리며 작업을 더이상 진행하지 못하는 상태

아사현상과 deadlock의 차이는 아사현상은 알고리즘의 문제로 발생하는 반면, deadlock은 자연스럽게 발생하는 현상이다.

교착상태 방생 원인은 다음과 같다.

자원할당 그래프는 프로세스가 사용중인 자원, 기다리는 자원을 방향성 있는 그래프로 표현한 것이다. 프로세스는 원으로, 자원은 사각형으로, 자원을 사용중인 경우 자원에서 프로세스로 화살표를, 자원을 기다리른 경우 프로세스에서 자원으로 화살표(점선)로 그린다.

여러 프로세스가 동시에 사용하는 자원을 다중자원이라하며, 한 자원에서 여러 프로세스에 화살표로 가리킨다.

교착상태는 식사하는 철학자 문제로 설명할 수 있다. 4개의 철학자(프로세스)가 둥근 식탁에 앉아 있고, 그위에 4개의 포크(자원)이 있다. 이때 모든 철학자가 동시에 자신의 왼쪽 포크를 잡고, 오른쪽 포크를 잡아야 식사를 할 수 있다. 포크는 4개 밖에 없기 때문에 각 철학자는 왼쪽 포크를 잡고 오른쪽 포크를 잡지 못해 굶어 죽는다

교착상태가 발생하는 필요조건은 다음과 같다. 4가지를 모두 만족해야 교착상태가 발생한다.

[교착상태 해결]

교착상태를 해결하는 방법은 4가지가 있다.

물리 메모리 관리

메모리 관리 개요

컴파일 : 소스코드 >(컴파일러)> 목적코드 >(링커)> 실행

메인 메모리 = 물리 메모리

메모리는 메모리 관리자가 관리

메모리가 꽉찼는데 프로세스가 생성되야 할 경우 메모리에 있는 프로세스를 swap영역으로 보내고(보류상태) 메모리에 적재. fetch(가져오기) : 실행할 프로세스와 데이터를 메모리로 가져오는 작업 placement(배치) : 가져온 프로세스와 데이터를 메모리에 어떤 위치에 놓을지 결정하는 작업 replacement(재배치) : 메모리가 꽉찼으면 메모리에 프로세스를 스왑영역에 옮김

메모리 주소

물리 주소 논리 주소

메모리 오버레이

프로그램이 남은 메모리 공간보다 클때 프로그램을 모듈로 나누어 메모리에 적재 나머지 부분은 swap영역에 적재

swap 영역 : 메모리가 모자라서 프로세스를 저장하는 하드웨어에 영역. 하드웨어에 있지만 메모리 관리자가 관리하고, 실제 메모리 크기+swap 영역을 메모리의 크기로 인식. swap in(스왑영역으로 들어옴), swap out( 스왑영역에서 메모리로)

멀티 프로그래밍 환경에서 메모리 할당 방법

가변 분할 방식(segmentation 메모리 관리 기법)

프로세스 크기에 따라 메모리 나누는 것. 메모리 영역이 각각 다름. 연속 메모리 할당-프로세스를 하나의 연속된 주소로. 외부단편화 - 프로세스가 완료되면 빈공간이 생기는데(단편화)
외부단편화를 메모리 배치 방식(선처리)이나 조각 모음(후처리)으로 해결 메모리 관리 복잡 / 외부단편화가 발생하면 프로세스들을 모두 옮겨 빈공간을 채워야함

메모리 배치 방식

조각모음 : 메모리 중간에 빈 공간이 생기면 프로세스를 붙여서 연속적으로 만드는 작업 / 조각모음 중간에 프로세스 동작 못함,

고정 분할 방식(paging 메모리 관리 기번)

프로세스를 고정된 크기(page)로 나누어 메모리에 적재. 현대 메모리 관리 기법 프로세스가 일정 크기보다 작다면 빈공간 생김 비연속 메모리 할당 메모리 관리 수월, 쓸모없는 빈공간으로 메모리 낭비 내부단편화 : 조각 모음에 빈공간이 남는것(고정 크기보다 나누어진 프로세스 크기가 작을때) 메모리 관리가 편함 /

프로세스 배치

버디 시스템

가변 분할 방식과 고정 분할 방식의 중간 개념. 둘다 같이 사용 가변 분할 방식의 단점(외부단편화)을 완화 프로세스를 고정된 크기로 나누어 배치하는게 아니라 메모리 구역을 절반으로 계속 잘라 프로세스가 배치될 수 있는 가장 작은 메모리 영역에 배치

비슷한 크기의 덩어리가 모여있어 서로 통합하기 쉬움(외부단편화 완화) 하지만 매번 프로세스 크기만큼 메모리를 나누고, 작은 조각을 통합하여야 되기 때문에

? 버디시스템에서 메모리 오버레이 사용불가?

현재에는 고정 분할 방식이 더 쓰임

분할 컴파일

가상 메모리 기초

가상 메모리 개요

프로그래머가 응용프로그램을 개발하는데 동작환경의 메모리 크기를 신경쓰지 않고 개발가능 가상 주소 - 0번지 부터 시작하는 연속된 메모리공간(논리 주소는 물리메모리 주소 공간에 비례한다는 차이점)

프로세스가 바라보는 메모리 영역 - 메모리 관리자가 보는 메모리 영역 -

동적주소변환(DAT) : 가상 주소 -> 물리 주소 변환하는 작업

매핑 테이블 : 가상 주소와 물리 주소()를 일대일 매핑한 테이블 페이지 매핑 테이블 / 페이지 테이블 : 페이징 기번 사용 세그멘테이션 매핑 테이블 / 세그멘테이션 테이블 : 세그멘테이션 기법 사용

지역성 : 기억장치에 접근하는 패턴이 메모리의 특정 영역에 집중된다는 성질 공간의 지역성 : 현재 위치에서 가까운 위치의 데이터 접근 가능성 높음 시간의 지역성 : 가장 최근 접근한 데이터가 사용률 높음 순차적 지역성 : 작업이 순서대로 진행됨

지역성을 캐시와 페이지 교체 알고리즘에 응용

페이징 기법

고정 분할 방식으로 가상 메모리 관리 기법 가상 주소에 분할된 각 영역을 페이지라하고 번호를 매긺 물리 주소에서 분할된 각 영역을 프레임이라하고 번호를 매긺 페이지 프레임 크기 같음

DAT(동적주소변환)과정 - VA=< P,D> -> 페이지 테이블 -> PA=< F,D>

VA =< P,D> 에서 P는 페이지 번호, D는 페이지 내부 위치(0<=D<페이지 크기) F는 프레임 번호

프로세스 마다 페이지 테이블을 가짐. 페이지 테이블 크기를 적정하게 유지하는게 페이지 테이블 관리의 핵심

PCB 경계 레지스터 한계 레지스터에 가상 주소를 가지는가?

페이징 관리 기법

각 프로세스의 페이지 테이블은 페이지 테이블 기준 레지스터에 보관(운영체제 영역)

프로세스를 복사하면(fork)

가상주소 물리주소로 변환은 MMU관리 페이지 테이블 접근 > 사용사 물리주소접근

하지만 물리주소를 두번 접근 하는것은 비효율적 > 변환 색인 버퍼TLB(캐시와 비슷, CPU에 테이블을 가져옴)로 해결 TLB 히트, TLB 미스

역페이지 테이블 프레임을 페이지로 프로세스 수와 상관없이 테이블이 하나만 존재, 테이블 크기가 작은 것이 장점 <프레임번호, 프로세스 아이디, 페이지 번호> 주소 변환시 프로세스가 물리 메모리에 있는지 확인 없으면 스왑영역에서

다단계 페이지 테이블

운영체제 비트수가 크면 주소 공간이 기하급수적으로 커짐 > 이걸해결 페이지 테이블을 여러 무끙ㅁ으로

2단계 페이지 테이블 VA =< P1,P2,D> (디렉토리 테이블 위치정보, 묶음에서 위치정보, D는 그대로)

세그멘테이션 기법

세그멘테이션 테이블 물리 메모리 시작주소나나냄, size대신 limit가 쓰임 장점은 페이지테이블이 작고 단순,but 외부단편화 관리 복잡

세그멘테이션 테이블 (limit, address) (스왑영역이면 address가 I(invalid))

VA=< S, D> S: 세그멘테이션 번호 D: 시작주소에서 거리

리미트보다 디가 크면 트랩, 의도치않은 오류는 ㄴ

캐시 매핑

캐시 직접 매핑

메모리는 N개의 페이지, 캐시는 M개의 페이지(N>M)

캐시 연관 매핑

메모리가 캐시의 어느 위친든 올라감

캐시 집합 연관 매핑

다중메모리

요구 페이징

사용자가 요구 > 페이지를 메모리로(현대 방삭) 장점은 메모리 절약 효율적관리 미리가져오기(요구 페이징과 반대)

페이지 부재 - 페이지에 없음

페이지 교체 - 페이지 부재가 발생하면 스왑에 페이지를 메모리로 올리고 페이지 테이블 갱신

페이지 교체 알고리즘 - 어떤 페이지를 스왑으로 보낼것인가

대상 페이지(victim page) - 스왑에 올라가는(스왑아웃) 페이지

페이지 교체 알고리즘

대상 페이지 결정

사용할 가능성이 적은 페이지 선택

간단한 알고리즘 - 무작위, FIFO 이론적 알고리즘 - 최적(앞으로 사용할 페이지 분석 / 이상적이지만 구현 불가능) 최적 근접 알고리즘 - LRU(시간적으로 멀리 떨어진), LFU(사용빈도가 적은), NUR(최근 사용한 적 없는), FIFO변형

LUR과 LFR은 성능은 좋지만 추가 오버헤드가 있음 NUR은 페이지당 2비트(참조 비트, 변경 비트)만 사용 참조비트 페이지에 접근하면 1, 변경비트 페이지 변경되면 1, 둘다 11이면 00으로 초기화

성능 평가 기준 - 같은 메모리 접근 패턴을 사용하여 페이지 부재 횟수, 페이지 성공 횟수 측정

스레싱과 프레임 할당

스레싱 : 하드디스크 입출력이 많아져 작업이 멈춘것 같은 상태 스레싱 발생 지점 : CUP작업시간 < 페이지 교체 시간 물리 메모리 크기 늘리면 스싱 발생 지점 늦쳐짐

프로세스당 프레임 조금 할당 > 페이지 부재 빈번 > 스레싱 발생 프로세스당 프레임 많이 할당 > 메모리 낭비

따라서 프레임을 할당하는 방식을 정적할당과 동적할당으로 나뉨 동등 할당 - 프로세스에게 할당하는 프레임 수를 같게 - 프로세스 크면 스레싱, 작으면 메모리 낭비 비례 할당 - 프로세스 크기에 비례해서 할당할 프레임 개수를 결정 but 실행중 변경 불가 작업집합 모델 - 페이지 부재 빈도 - 페이지 부재 횟수 기록 상한선 넘으면 페이지 할당 하한선 아래면 페이지 회수

전역 교체 지역 교체

입출력 시스템 & 저장장치

입출력 시스템

주변장치

병목현상 방지를 위해 주변장치와 연결된 여러개의 버스를 묶어 사용

초기 - 버스 하나, 폴링방식 현재 - 메인버스, 입출력버스 두개의 버스로 분리, 두 버스 사이에는 입출력 제어기 현재2 - 입출력버스를 고속 -와 저속 -로 분리, 두 버스 사이에는 채널 선택기 그래픽 카드는 메인버스에 바로 연결(그래픽 버스)

직접 메모리 접근(DMA) : 입출력 제어기가 CPU 허락받지 않고 메모리 접근할 수 있는 권한 DMA 제어기가 관리 과거에는 메모리와 분리된 입출력메모리를 사용 현재에는 메모리 맵드 IO

인터럽트 각 장치는 IRQ 고유번호를 가짐 외부 인터럽트 : 입출력장치 전원이상 등 하드웨어 이상 내부 인터럽트 : 프로세스에서 발생하는 신호

인터럽트 벡터 : 인터럽트 발생여부(0 or 1), 인터럽트 핸들러 배열로 모아놓은것

이중버퍼 : 단방향 버퍼 두개로 양방향 데이터 이동 속도 빠름

저장장치

하드디스크

SSD

CD

하드디스크 vs CD

하드 데이터 전송시간

디스크 스케줄링

트랙 이동을 최소화하여 탐색 시간을 줄이는 것이 목적

알고리즘 성능 테스트할 트랙번호 - 15 8 17 11 3 23 19 14 20

트랙은 0~24, 총 25개

FCFS : 요청 들어온 순서ㄷ로 서비스

SSTF : 현재 헤드가 있는 위치에서 가장 가까운 트랙ㅂ터 서비스

블록 SSTF : 몇개의 트랙을 블럭으로 묶어 큐로 넣음, 블록안에서 SSTF방식, 블록 다끝나면 다음 블록

SCAN 디스크 : 계속 한방향으로 이동하여 트랙읽음, 끝이면 방향 바꿔서

C-SCAN 디스크 : SCAN에서 다른 방향으로 이동할때는 서비스 하지 않음

LOOK 디스크 스케줄링

STLF 디스크 : 헤드를 곶어

RAID

자동으로 백업, 장애발생하면 복구

레이드 뒤에 넘버링은 기능, 여러 넘버링의 RAID를 합쳐서 사용

+하드웨어

메인보드 포트

파일 시스템

파일 시스템 기능

파일 테이블

파일 이름 형식

파일 연결 프로그램-데이터 파일을 실행시키는 프로그램

파일 작업

파일 헤더

파티션

포맷

조각 모음

순차 파일 구조

인덱스 파일구조

직접 팡리 구조