1. 운영체제 하드웨어 프로텍션
0) 이중 모드 동작
시스템 자원을 공유하는 것은 운영체제가 부정확한 프로그램이 다른 프로그램을 올바르지 않게 실행시키지 못하도록 보장할 필요가 있다.
모드 비트는 컴퓨터 하드웨어에 현재의 모드를 지정한다 : 모니터(0) 또는 유저(1). 인터럽트 또는 폴트가 발생했을 때, 하드웨어는 모니터 모드로 변환한다. 특권을 가진 명령어들은 오로지 모니터모드에서만 사용될 수 있다.
이 후에 나오는 3개의 보호 방법은 운영체제를 위한 하드웨어의 3대 프로텍션에 대한 설명이다.
1) I/O Protection
모든 I/O 명령어는 특권을 가진 명령어이다. 유저프로그램은 결고 모니터 모드에 있는 컴퓨터의 제어권한을 얻을 수 없도록 보장해야 한다. (유저 프로그램은 실행의 한 부분으로서 인터럽트 벡터 내에 새로운 주소를 저장한다.)
2) Memory Protection
적어도 인터럽트 벡터 및 인터럽트 서비스 루틴에 대한 메모리 보호를 제공해야한다. 메모리 보호를 위해 프로그램이 접근할 유효한 주소의 범위를 결정하는 2개의 레지스터를 추가한다.
Base register : 가장 작은 합법적인 물리 메모리 주소를 고정한다.
Limit register : 보호되는 것으로 정의된 범위 밖의 메모리 크기를 방지한다.
하드웨어 보호를 위해 모니터 모드에서 실행할 때 운영체제 시스템은 모니터와 사용자의 메모리에 대해 둘 다 제한된 접근을 가진다. base와 limit 레지스터에 대한 load 명령어는 특권을 가진 명령어이다
3) CPU Protection
1. 타이머 - 운영체제의 컨트롤 유지를 보장하기 위해 특정 주기 후에 컴퓨터에게 인터럽트를 발생시킨다.
2. 타이머는 매 클락마다 감소된다.
3. 타이머가 0에 도달했을 때 인터럽트가 발생한다.
타이머는 일반적으로 시분한을 구현하고 현재의 시간을 계산하기 위해 사용된다.
Load-timer는 특권을 가진 명령어이다.
설명 |
하드웨어 레벨 프로텍션은 다음의 메카니즘을 통해 이루어진다. 0) 듀얼 모드 오퍼레이션 : 이것은 모든 보호의 근간이다. 모든 프로세스 오퍼레이션은 유저 모드 또는 커널 모드에서 수행된다. 유저 모드는 유저를 대신하여 실행이 처리되는 것이고 커널/모니터 모드는 실행이 운영체제 시스템을 대신하여 처리되는 것이다. 그러므로 기본적으로 모든 권한이 필요한 오퍼레이션은 커널 모드에서 수행된다. OS는 반드시 유저 모드의 어플리케이션 프로그램이 커널 모드에 있는 컴퓨터의 제어를 얻지 못하도록 보장해야 한다. 1) I/O 프로텍션 : 모든 인풋/아우풋 오퍼레이션은 권한이 필요한 명령어이고 따라서 커널 모드 내에서 처리된다. OS는 반드시 유저 모드의 어플리케이션 프로그램이 커널 모드에 있는 컴퓨터의 컨트롤을 얻지 못하도록 보장해야 한다. 2) 메모리 프로텍션 : 유저모드는 그들이 허락된 곳의 메모리 위치에 대한 접근만 허락해야한다. 이것은 2개의 레지스터를 가짐으로서 해결될 수 있다. - 베이스 레지스터 : 허가된 메모리 위치에서 물리 주소의 시작 위치가 저장된다. - 리미트 레지스터 : 범위의 크기가 저장된다. 그래서 CPU가 메모리 위치에 대한 액세스를 요청할 때마다 그 접근할 주소가 베이스 레지스터와 베이스 레지스터+ 리미트 레지스터 사이에 있는지 확인하여 제공한다. 커널 모드에서 OS는 커널과 유저의 메모리를 포함한 모든 메모리 위치에 대한 접근이 허락된다. 베이스, 리미트 레지스터를 로딩하는 것은 권한이 필요한 명령어이고 따라서 커널모드에서 처리된다. 3) CPU 프로텍션 : 이것은 타이머를 통해서 해결될 수 있다. 이것은 매 클락 틱마다 감소된다. 타이머가 0에 도달한다면 인터럽트가 발생되고 현재의 프로세스 실행은 CPU에 의해 중지된다. 이것은 시분할에 의해 구현되고 현재 시간을 연산하기 위해 사용된다. 이 타이머를 로딩하는 것은 권한이 필요한 명령어이므로 따라서 커널 모드에서 처리된다. |
2. 컴퓨터 시스템 동작
컴퓨터 시스템은 CPU와 메모리가 버스로 연결되어 있고 이 버스에 독립적인 I/O가 연결되어 있는 방식으로 구성되어 있다.
1) MMU, 메모리 컨트롤러, DMA 와의 차이점
MMU는 이전부터 가상 메모리와 캐시를 다루는데 책임을 진다. 메모리 컨트롤러는 외부 메모리와의 통신에 관계된 물리 신호를 다룬다. 일반적으로 MMU는 프로세스 코어와 매우 근접하게 위치해있다. 반면 메모리 컨트롤러는 내부 버스 주변에 위치한다.
주변 장치들은 CPU와 통신을 위해 I/O 인터페이스를 가지고 있게 되는데 작업을 수행하기 위해 CPU에게 메모리를 할당/ 쓰기/ 읽기등을 요청한다. CPU는 메모리 컨트롤러를 통해서 외부의 Memory를 Access하고 Read/ Write할 수 있다.
메모리를 컨트롤 하는 유닛 : MMU는 메모리에 접근하는 것을 관리하는 하드웨어로서 프로세서에서 사용하는 가상주소를 물리주소로 변환하는 어드레스 변환 기능과 메모리 보호기능을 가진다. CPU가 생성하는 주소를 논리주소라하고 메모리가 취급하는 주소를 물리주소라한다. 실행시간 바인딩 시 논리주소(가상주소)를 사용한다. 프로그램 실행 중에는 이와 같은 가상주소를 물리주소로 바꾸어줘야 하는데 이 변환 작업(맵핑)은 하드웨어 장치인 MMU(메모리 관리기)에 의해 실행된다. 이 때 재배치 레지스터를 이용해를 이용해 물리 주소를 얻는다.
메모리와 디스크 입출력과 같은 대량의 데이터를 전송하는 경우 DMA 장치가 CPU의 개입없이 메모리로부터 자신의 버퍼 장치로 또는 버퍼로부터 메모리로 데이터 블록 전체를 전송한다. 한 바이트마다 인터럽트가 발생하는 것이 아니라 블록 전송이 완료될 때마다 인터럽트가 발생한다. 데이터 전송이 완료되면 CPU에게 인터럽트를 보내어 완료됨을 알린다.
설명 |
출처 : https://kldp.org/node/83480 CPU에서는 MMU가 있다면 MMU에서 메모리 주소를 변환하고 해당 메모리에 접근합니다. 이 과정에서 Memory Controller는 해당 메모리 주소에 연결된 장치와의 접근을 제어한다. (SDRAM이라면 SDRAM에 맞는 하드웨어 시그널을 발생시키고 NAND나 CPLD 같은 장치라면 그에 맞게 시그널을 발생시키는 역할입니다) DMA는 메모리를 고속 전송하기 위한 방식이며 이것을 통제하는 레지스터에 DMA 동작을 지정하고 개시하면 메모리 영역간의 전송이 이루어지는 것입니다. Memory Controller부터의 과정은 전부 물리적인 주소를 사용하며 MMU는 가상 메모리 주소에서 물리 주소의 변환을 담당합니다. [[MMU] -> Memory Controller] -> NAND/CPLD/SDRAM ... DMA Controller는 CPU에 내장된 경우도 있고 외부에 따로 나와 있는 경우도 있습니다. 단순히 레지스터 제어의 측면에서 본다면 CPU에 연결된 주변장치 정도로 생각하셔도 됩니다. (Memory Controller도 유사합니다) MMU가 없을 경우에는 CPU에서 발생시킨 주소는 무조건 CPU의 물리적 Address Pin에 1:1로 대응됩니다. MMU가 있을 경우에는 명령어에서 발생시킨 주소가 항상 물리적 주소와 일치하지는 않습니다. 가상의 주소를 만들 수 있고 이것을 실제 물리 주소와 매핑시키는 장치가 MMU입니다. |
2) CPU와 IO가 통신하는 방식
입출력장치는 CPU, 주기억장치와 시스템 버스를 통해 서로 접속된다. 그러나 이들 입출력장치들은 고속으로 동작하는 CPU나 주기억장치에 비해서는 동작 속도가 아주 느리기 때문에 시스템 버스에 직접 접속된 형태로 CPU가 이들의 입출력 동작을 직접 제어하는 것은 비효율적이다. 따라서 주변장치들은 입출력 인터페이스(I/O Interface)를 거쳐서 시스템 버스에 연결된다. 여기서 시스템 버스란 CPU, 주기억장치, 주변장치 제어기 등을 서로 연결해 주는 전기적 연결선들을 말한다.
I/O 장치들은 대체로 컨트롤러와 장치 자체라는 두 부분으로 구분된다. 컨트롤러는 칩 또는 칩의 집합으로 장치를 물리적으로 조정한다. 이는 장치로부터 데이터를 읽으라는 명령과 같은 운영체제의 명령을 받아 수행한다. 컨트롤러는 운영체제게 보다 간단한 인터페이스를 제공하도록 프로그램된 작은 임베디드 컴퓨터를 가지고 있다.
각 컨트롤러 종류가 다르기 때문에 각각을 제어하기 위한 소프트웨어가 별도로 필요하다. 컨트롤러와 이야기하는 소프트웨어를 장치 드라이버라고 부른다.
3) CPU의 I/O 상태 확인 방법
폴링방식 : 드라이버는 I/O를 시작하고 그 작업이 완료되었는지 확인하기 위해 장치를 계속 폴링하는 순환 루프를 돈다 . 이는 장치가 완료도었는지 풀링하기 위해 CPU를 잡고 있어야 한다는 단점이 있다.
인터럽트 방식 : 드라이버 장치를 시작해놓고 일이 마무리되면 인터럽트를 걸어달라고 설정하는 방법이다. 운영체제는 호출자를 기다리게 하고 할 수 있는 다른 일을 찾아 처리한다. 컨트롤러가 모든 전달이 완료되었다고 판단하면 완료를 알리는 인터럽트를 발생시킨다.
특수한 하드웨어 활용 : CPU의 계속적인 개입 없이 메모리와 특정 컨트롤러 간의 비트들의 흐름을 제어할 수 있는 DMA칩을 사용한다. CPU는 얼마나 많은 바이트를 이동시킬지, 관련 장치와 메모리의 주소, 그리고 방향을 DMA 칩에 설정해 놓고 나간다. DMA 칩이 작업을 완료하면 인터럽트를 발생시키게 되며 이후의 작업은 앞어 설명하 내용과 동일하다.
3. 메모리 구성 (Memory Hierarchy)
아래로 갈 수록 접근 시간은 길어지고 저장 수용공간은 증가한다. 또한 메인메모리 까지는 휘발성이나 그 아래는 비휘발성이다.
(speed : 아래로갈수록느려짐, cost : 아래로 갈 수록 저장공간당 가격은 싸짐, volatility : 메인메모리 이후로 비휘발성)
1) 레지스터
2) 캐쉬
3) 메인메모리
4) SSD(solid-state-disk)
5) 하드디스크
6) optical disk
7) 마그네틱 테잎
4. CPU 캐쉬(cache)
캐시(Cache)란 프로그램이 수행될 때 나타나는 지역성(locality)을 이용하여 메모리나 디스크에서 사용 되었던 내용을 특별히 빠르게 접근할 수 있는 곳에 보관하고 관리함으로써 이 내용을 다시 필요로 할 때 보다 빠르게 참조하도록 하는 제어장치를 뜻한다.
프로그램의 실행 패턴이 참조되었던 근처의 메모리를 다시 참조한다는 지역성의 특성을 이용해서 마이크로프로세서 내에 CPU의 클록 사이클만큼 빠르게 접근할 수 있는 온칩 캐시 메모리를 두게 되었다.
CPU가 참조하고자 하는 메모리가 캐시에 존재하고 있을 경우를 캐시 히트(Cache Hit)라 하며, 이때는 캐시의 데이터를 즉시 CPU에 돌려줌으로써 빠른 정보 를제공하게된다. 이와 반대로 캐시에 요청한 데이터가 없을 경우를 캐시 미스(Cache Miss)라하며, 이때는 메인 메모리로부터 일정한 블록 사이즈의 데이터를 가져와서 캐시에 저장한 후 그 데이터에서 특정 워드크기의데이터만을 CPU에 전달하게된다
마이크로 프로세서 <----워드사이즈----> 캐시 <----블록사이즈----> 메인메모리
블록의 사이즈는 캐시의 성능을 좌우하는 데 매우 큰 영향을 미치게 되는데, 그 이유는 실제 프로그램의 실행 시 참조된 메모리에 대한 공간적 지역성과 시간적 지역성을 가지고 있기 때문이다. 여기서 참조의 공간적 지역성(spatial locality of reference)이란 대부분의 실제 프로그램이 참조되어진 주소와 인접한 주소의 내용이 다시 참조된다는 특성을 이야기하며, 시간적 지역성(temporal locality of reference)이란 한 번 참조된 주소의 내용은 곧 다음에 다시 참조된다는 특성을 이야기하는 것이다. 이러한 지역성의 특성은 블록의 사이즈가 클수록 캐시의 히트율이 올라갈 수 있다는 사실을 보여주는 특성이도 하지만 블록의 크기가 커지면 이에 따른 전송 시의 부담과 캐시 데이터 교체 작업이 자주 일어날 수 있다는 부담이 증가하기 때문에 쉽게 그 수치를 늘릴 수는 없는 것이다.
캐시에서의 교체 알고리즘은 주로 LRU(Least Recently Used) 방식을 많이 사용하며 이 방식의 구현을 위하여 각각의 라인에 추가적인 비트를 두고 각 라인에 대한 데이터 참조 시 그 발생 하는시점을 기록함으로써 이 방식을 실현하고있다.
프로세서에서 메모리에 대한 읽기 요청 시에는 캐시로부터 그 데이터가 있는지를 확인하고, 데이터가 캐시에 존재하고 있다면 그 내용을 돌려주면 되었다. 하지만 프로세서에서 메모리에 대한 쓰기 작업을 요청할 경우에는 어떻게 수행해야 할까? 우선 캐시에 저장되어 있는 내용을 변 경해야 할 것이며, 변경된 내용을 언젠가는 메인 메모리에 저장해 주어야 할 것이다. 이때 언제 메인 메모리의 내용을 변경할 것인지를 결정하기 위하여 아래와 같은 두 가지 정책이 주로 사용 되어진다.
1) Write Through 정책 :
프로세서에서 메모리에 쓰기 요청을 할 때마다 캐시의 내용과 메인 메모리의 내용을 같이 바꾸는 방식으로 이 방식은 구조가 단순하다는 장점을 가지고 있지만 데이터에 대한 쓰기 요청을 할 때마다 항상 메인 메모리에 접근해야 하므로 캐시에 의한 접근 시간의 개선이 없어지게 되며, 따라서 쓰기 시의 접근시간은 주 메모리의 접근시간과 같게 되는 단점을 가지게 된다. 하지만 실제의 프로그램에서 메모리 참조 시 쓰기에 대한 작업은 통계적으로 10~15%에 불과하 며 따라서 그 구조가 단순하고, 메모리와 캐시의 데이터를 동일하게 유지하는 데 별도의 신경을 쓰지않아도 되므로 많이 사용되어지는방식이다.
2) Write Back 정책 :
이 방식은 CPU에서 메모리에 대한 쓰기 작업 요청 시 캐시에서만 쓰기 작업과 그 변경 사실을 확인할 수 있는 표시를 하여 놓은 후 캐시로부터 해당 블록의 내용이 제거될 때 그 블록을 메인 메모리에 복사함으로써 메인메모리와 캐시의내용을 동일하게 유지하는 방식이다. 이 방식은 동일한 블록 내에 여러 번 쓰기를 실행하는 경우 캐시에만 여러 번 쓰기를 하고 메인 메모리에는한 번만 쓰게 되므로 이 경우에 매우 효율적으로 동작하게 될 것이다.
3) Cache Coherency :
데이터가 분실되거나 겹쳐 쓰이지 않도록 캐시를 관리하는 것. 데이터가 캐시 내에서는 갱신되었으나 주기억장치 또는 디스크로 아직 전달되지 않았을 때 데이터가 파손되거나 오염될 가능성이 크다. 캐시 일관성은 캐시의 내용과 그에 대응하는 주기억 장치 또는 디스크의 내용이 항상 일치하도록 캐시를 관리하는 알고리듬을 잘 설계함으로써 확보된다. 캐시 일관성은 복수의 처리 장치가 주기억 장치나 디스크를 공유하는 대칭적 다중 처리(SMP)에서 특히 더 중요하다.
5. Process와 Program 의 차이
1) 프로그램 : 명령어 리스트를 내용을 가진 디스크에 저장된 파일(실행파일이라 불림)과 같은 수동적인 존재.
2) 프로세스 : 다음에 실행할 명령어를 지정하는 프로그램 카운터 및 관련된 자원의 집합을 가진 능동적인 존재. 실행 파일이 메모리에 적재될 때 프로그램은 프로세스가 됨
6. Process의 상태 변화 및 천이 조건
프로세스가 가질 수 있는 상태는 다음 3가지와 같다.
1) running(실행) : 이 순간 실제로 CPU를 사용하고 있음
2) ready(준비) : 실행 가능하지만 다른 프로세스가 실행할 수 있도록 일시적으로 정지
3) blocked(대기) : 외부 이벤트가 발생할 때 까지 실행할 수 없음
4) new(새로운) : 프로세스가 생성중임
5) terminated(종료) : 프로세스가 실행을 종료함
네 가지 상태 전이의 가능하다.
상태전이 1 (입출력 요청, 자식프로세스를 기다릴 때) : 어떤 프로세스가 수행을 지속적으로 수행할 수 없음을 운영체제가 발견한 경우이다. 몇몇 시스템의 경우 스스로 대기 상태가 되기 위해 프로세스는 pause와 같은 시스템 호출을 부를 수 있다. UNIX와 같은 다른 시스템에서 프로세스가 파이프나 특별한 파일(예, 터미널)로부터 읽으려고 하는데 입력이 주어지지 않은 경우 프로세스는 자동적으로 대기 상태가 된다.
상태전이 2 (인터럽트 발생 시) : 프로세스 자신은 이러한 상태 전이에 대해 모르는 상태에서 운영체제의 일부분인 프로세스의 스케줄러에 의해 야기된다. 스케줄러가 현재 수행중인 프로세스가 충분히 오랫동안 수행되었으며 이제 다른 프로세스에게 CPU 시간을 할당해야한다고 결정했을 때 발생한다.
상태전이 3 (스케줄러에 의해) : 상태전이 2와 같이 프로세스 스케줄러에의해 야기된다. 다만 다른 모든 프로세스가 공평하게 자신의 몫을 받았으며 이제 다시 처음 프로세스가 CPU를 할당 받아야 한다고 스케줄러가 결정했을 때 발생한다. 전체 시스템의 효율성과 개별적인 프로세스들의 공평성 간에 존재하는 상충되는 요구 사이에서 균형을 이루기 위해 다양한 알고리즘이 고안되었다.
상태전이 4 (입출력 종료 시) : 프로세스가 기다리던 (입력이 주어지는 것과 같은) 외부 이벤트가 발생했을 때 생긴다. 만약 그 순간 수행중인 다른 프로세스가 없다면 다시 상태전이 3이 발생하고 해당 프로세스는 실행을 시작한다. 수행중인 다른 프로세스가 존재하면 이 프로세스는 자신의 순번이 되어서 CPU가 이용 가능해질 때까지 준비 상태에서 기다려야할 것이다.
7. 시스템 성능 측정 기준
1) CPU 이용율(utilization) : 종종 배치 시스템의 측정에 사용된다. 시간당 엔진이 몇 번 회전하는지를 기준으로 자동차를 측정하는 것과 유사하다.
2) 처리량(thoughput) : 단위 시간 당 완료된 프로세스의 개수
3) 총 처리 시간(turnaround time) : 프로세스 제출시간과 완료시간의 간격을 총 처리 시간이라 한다. 총 처리시간은 메모리에 적재되기 위해 기다리며 소비한 시간, 준비완료 큐에서 대기한 시간, CPU에서 실행하는 시간, 그리고 입출력 시간을 합한 값이다. 배치 작업이 제출된 순간부터 끝날때까지 걸린 통계적인 평균 시간.
4) 응답시간(response time) : 대화식 시스템에서 총 처리 시간은 최선의 기준이 아닐 수 있다. 명령을 입력한 후 결과를 받게 되는데 걸린 시간이다.
8. Schedule 방법
1) FCFS : 선입 선처리 스케줄링 :
이 알고리즘에서 프로세스들은 요청 순서대로 CPU를 할당받는다. 기본적으로 준비상태의 프로세스를 위해 단일 큐가 존재한다. 첫 번째 작업이 들어오면 원하는 만큼 실행된다. 이 작업은 아무리 오래 수행되어도 방해 받지 않는다. 다른 작업이 도착하면 이들은 큐의 끝부분에 놓인다. 실행중인 프로세스가 대기 상태가 되면 큐의 첫번째 프로세스에 이어 실행 된다. 구현방법이 매우 쉬우나 앞에 스케줄링이 매우 길 경우 뒤에 있는 스케줄링이 실행이 안되는 단점이 존재한다.
2) RR : 라운드로빈방식 :
각 프로세스에게는 시간 할당량이라 불리는 시간 주기가 할당되며 한 번에 이 시간 동안 만큼만 실행된다. 프로세스가 할당 시간 동안 실행하면 CPU는 선점되어 다른 프로세스에게 주어진다. 프로세스가 할당 시간에 끝나기 전에 대기하거나 종료되면 CPU는 다른 프로세스로 전환한다. 여러 프로세스가 공평하게 CPU를 할당받을 수 있으나 자주 context switch가 일어나 CPU의 시간이 관리 작업으로 사라진다.따라서 적절한 교환시간이 설정되어야 한다.
9. Context switch
Context Switching은 문맥교환으로 번역되며, 하나의 Task에서 다른 Task로 전환을 하는 경우 필요한 과정을 의미한다. 운영체제는 시분할을 통해 CPU가 다수의 작업들을 교대로 실행할 수 있게 한다. 인터럽트는 운영체제가 CPU를 현재 작업으로부터 빼았아 커널 루틴을 실행할 수 있게 한다. 이러한 연산은 범용 시스템에서 자주 발생한다. 인터럽트가 발생하면 시스템은 인터럽트 처리가 끝난 후에 상태를 복구할 수 있도록 현재 실행 중인 프로세스의 현재 상태를 저장할 필요가 있다. 이는 결국 프로세스를 중단했다가 재개하는 작업이다. 상태는 PCB에 표현되고 CPU 레지스터의 값, 프로세스 상태, 메모리 관리 정보등을 포함한다. CPU를 다른 프로세스로 교환 하려면 현재 프로세스의 상태를 저장하고 다른 프로세스의 저장된 상태를 복구하는 작업이 필요하다. 이 작업을 Context switch라고 한다.
10. Process Synchronization을 위한 3가지 조건
1) 상호배제(mutual exclusion) : 프로세스가 자신의 임계 영역에서 실행된다면, 다른 프로세스들은 그들 자신의 임계 영역에서 실행될 수 없다.
- 오로지 하나의 프로세스만 임계 구역에 들어갈 수 있다.
- 두개의 프로세스가 동시에 자기의 임계구역 내에 존재하는 경우는 없어야 한다.
2) 진행 or 진전(progress) : 자기의 임계 영역에서 실행 중인 프로세스가 없고 자신의 임계 영역으로 진입하려고 하는 프로세스들이 있다면 , 나머지 영역에서 실행 중이지 않은 프로세스들만 임계 영역으로 진입할 프로세스를 결정하는데 참여할 수 있으며, 이선택은 무기한 연기될 수 없다.
- 비 임계구역에 있는 프로세스 때문에 다른 프로세스가 임계구역에 못들어가면 안된다.
- 임계구역 외부에서 실행하고 있는 프로세스는 다른 프로세스 들을 블록시켜서는 안된다.
3) 한정된 대기 : 프로세스가 자기의 임계 영역에 진입하려는 요청을 한 후부터 그 요청이 허용될 때까지 다른 프로세스들이 자신의 임계 영역에 진입하도록 허용되는 횟수는 한계 또는 제한이 있어야 한다.
- 임계영역을 누구나 들어갈 수 있도록 기회가 주어져야 한다.
- 임계구역에 진입하기 위해 무한히 기다리는 프로세스는 없어야 한다.
11. OS의 역할
운영체제는 오랫동안 두 가지 주요 목적을 달성하기 위해 발전해왔다. 바로 사용자가 프로그램을 개발하고 사용하는데 좀 더 편리한 환경을 제공하는 것(편리성)과 계산 시스템 성능의 향상(효율성)이다. 운영체제는 시스템 운영 요소를 적절하게 사용할 수 있도록 제어하며(조정자), 프로그램 실행 환경과 필요한 자원(프로세스, 메모리, 파일, 장치)을 제공하고 관리해주며(자원 할당자 또는 관리자), 다양한 입출력장치와 사용자 프로그램을 제어한다.
(a) 사용자 관점 (User View) : 컴퓨터 시스템을 편리하게 사용할 수 있게 해주는 프로그램.
실행되려 하는 프로그램의 일련의 작업(메모리 할당, 버퍼 할당, 이벤트 처리 등)들을 사용자에게 맡기지 않고 사용자가 하기 어려운 일들을 운영체제에서 대신 처리해주는 것을 말한다.
(b) 시스템 관점 (User View) : 컴퓨터 시스템을 편리하게 사용할 수 있게 해주는 프로그램.
컴퓨터 시스템의 자원에는 CPU, 메모리, 디스크, 프린터, 키보드 등과 같은 하드웨어.파일, 서비스 루틴과 같은 소프트웨어가 있다. 운영체제는 하나의 프로그램을 실행 하기 위해서 필요한 메모리를 확보해야 하며, 또한 내부 혹은 외부에서 발생한 이벤트들(키입력 등)을 위해 임의의 버퍼를 마련하고 적절한 순서로 그 이벤트들을 처리해 주는 것이다. 그리고 현재 실행되고 있는 프로세스마다 CPU의 수행시간을 알맞게 분배해야 한다.
12. 버퍼링과 스풀링의 차이
1) 버퍼링 :
버퍼링(Buffering)은 운영체제의 기능 중 하나다. 일반적으로 상주 모니터 혹은 장치 드라이버는 각 입출력장치를 위해 시스템 입출력버퍼를 가지는데, 이는 입출력 장치의 느린 속도를 보완하기 위해 이용된다. 버퍼링은 프로세서와 입출력장치를 항상 분주하게, 즉 유휴시간이 없도록 프로세서의 연산 과정과 함께 어떤작업의 입출력을 동시에 수행하는 아주 간단한 방법이다.
2) 스풀링 :
디스크 시스템에서는 헤드가 디스크의 한 영역에서 다른 영역으로 빠르게 이동하기 때문에 추가 기록이 가능하다. 예를 들어, 디스크는 카드 판독기가 사용하는 영역에서 다음카드를 읽기 위해 프로세서에 필요한 다른 영역으로 빠르게 이동할 수 있다. 이러한 디스크의 특성을 이용하여 스풀링(Spooling) 기법이 개발되었다. 스풀링은 ‘Simultaneous Peripheral Operation On-Line’이라는 의미로 디스크를 매우 큰 버퍼처럼 사용하는 것이다. 즉, 입력장치에서 미리 읽어들여 출력장치가 받을 수 있을 때까지 출력파일 을저장한다.
스풀링은 카드 판독 작업, 출력 작업, 카드 펀치 작업 등을 오프라인으로 수행하는 과정으로 버퍼링이 컴퓨터의 하드웨어의 일부, 즉 버퍼를 사용한다면 스풀링은 별개의 오프라인장치를 사용한다는 차이가 있다.
13. 용어 정리
(a) Batch process :
일괄 처리(batch processing)란 컴퓨터 프로그램 흐름에 따라 순차적으로 자료를 처리하는 방식이다. 초기의 일괄처리 방식은 사용자와 상호작용하는 것이 불가능했지만, 운영 체제가 발전함에 따라 프로그램 입출력를 통해 상호작용하는 것이 가능해졌다. 일괄 처리는 1950년대 전자 컴퓨팅 초기 시절 이후 메인프레임 컴퓨터와 함께하고 있다.
(b) interactive system :
컴퓨터 시스템 상에서 임의의 작업을 처리할 때 이용자와 컴퓨터 사이의 실시간 대화를 기반으로 하는 시스템으로 시스템의 이러한 운영방식은 일괄 처리 시스템과 대조된다. 대화식 시스템의 장점은 이용자가 프로그램 실행이 초기 단계로부터 수신된 완료되지 않은 부분 결과에 근거하여 입력과 제어 지시를 선택할 수 있다는 것이다. 대화식 사용자 환경에서는 한 프로세스가 CPU를 독점하여 다른 사용자의 서비스를 방해하는 것을 막기 위해 서 선점이 필수적이다. 비록 프로세스가 고의적으로 영원히 수행하지는 않겠지만 프로그램 버그 때문에 이한 프로세스가 무기한 다른 사용자의 수행을 불가능하게 할 지 모른다. 선점은 이러한 행위를 막기 위해 필요하다. 서버는 다수의 사용자를 서비스하고 이들은 또한 신속함을 원하기 때문에 여기에 속한다.
(c) multi-task system:
멀티태스킹(영어: multitasking) 또는 다중작업(이하 멀티태스킹)은 다수의 작업(혹은 프로세스, 이하 태스크)이 중앙 처리 장치(이하 CPU)와 같은 공용자원을 나누어 사용하는 것을 말한다. 엄밀히 말해 한 개의 CPU를 가진 개인용 컴퓨터가 특정 순간에 수행할 수 있는 태스크의 개수는 하나뿐이다. 따라서 멀티태스킹은 스케줄링이라는 방식을 사용하여 컴퓨터 사용자에게 병렬 연산이 이루어지는 것과 같은 환경을 제공한다. 스케줄링 방식은 CPU 사용시간을 일정한 기준에 따라 나누어 각 태스크가 사용할 수 있도록 분배한다. 분배받은 시간동안 태스크가 CPU를 사용할 때 다른 태스크들은 자신의 차례가 오기를 기다린다. 분배받은 시간이 종료되어 태스크가 사용하던 CPU를 다른 태스크가 사용할 수 있도록 재배정하는 것을 문맥교환이라 하는데 스케줄링에서 이 문맥교환이 충분히 자주 발생하게 되면 컴퓨터 사용자는 병렬 연산이 이루어진 것처럼 느끼게 된다. 멀티태스킹은 다수의 CPU를 내장한 컴퓨터(즉, 멀티프로세서)에서도 유효한데, 멀티태스킹을 사용하게 되면 탑재한 CPU의 숫자보다 많은 수의 태스크를 동시에 수행할 수 있게 된다. 일반적으로 운영 체제는 아래 나열된 스케줄링 방식중 하나를 채택해서 사용한다.
멀티프로그래밍 시스템에서는 현재 실행되고 있는 태스크는 다른 외부 이벤트를 기다려야 하는 상황이 되거나, 컴퓨터의 스케줄러가 강제로 실행 중인 태스크를 중단시킬 때까지 계속 진행된다. 멀티 프로그램 시스템은 CPU 사용률을 극대화할 수 있도록 설계되었다.
시분할 시스템에서는 현재 실행되고 있는 태스크가 스스로 혹은 하드웨어 인터럽트 따위의 외부적인 이유로 중앙 처리 장치의 점유를 포기해야 한다. 시분할 시스템은 다수의 프로그램이 거의 동시에 수행될 수 있도록 해준다. "시간을 분할한다"라는 표현은 단말에 위치한 사용자가 함께 공유할 수 있는 IBM사의 TSO, CP/CMS와 같은 컴퓨터를 가리키기 위해 쓰였다.
실시간 시스템에서는 외부 이벤트가 발생하였을 때 몇 개의 대기 중인 태스크들이 CPU를 점유할 수 있도록 보장해 준다. 실시간 시스템은 시간 내에 처리하여야 하는 산업 로봇과 같은 기계적인 장치를 제어하기 위해 사용된다.
(d) multi core processor :
멀티코어 프로세서는 보다 강력한 성능과 소비 전력 절감, 그리고 여러 개의 작업을 보다 효율적으로 한 번에 처리하기 위해 두 개 이상의 프로세서가 붙어있는 집적회로를 가리킨다. 듀얼코어는 한 컴퓨터 내에 두 개 이상의 독립된 프로세서가 설치된 경우와 종종 비교되곤 하는데, 듀얼코어의 경우 두 개의 프로세서가 실제로는 하나의 소켓을 통해 꽂혀지기 때문에 연결이 더 빠르다. 이론적으로는 듀얼코어 프로세서가 싱글코어 프로세서보다 두 배나 더 강력해야 하지만, 실제로는 듀얼코어 프로세서가 싱글코어 프로세서보다 약 1.5배 정도 더 강력하기 때문에, 약 50% 정도의 성능 향상만을 기대할 수 있는 것으로 알려지고 있다.
(e) multi processing system :
시스템은 프로세서(처리기)를 많이 사용해 신뢰성, 가용성, 컴퓨터능력 등을 증가시킬 수 있다. 하드웨어 비용이 저렴해짐에 따라 단위 시간당 처리량을 늘리기 위해 마이크로프로세서 여러 개를 연결해 다중 프로세서를 만드는 것도 많이 보편화되었다. 이 방법으로 고가의 초고속 프로세서를 사용하지 않고도 대형 컴퓨터에 근접하는 능력을 얻을 수 있다. 이렇게 다중처리는 막대한 비용을 들이지 않고도 단일프로세서 컴퓨터 시스템의 계산능력을 증대 시킬 수 있는 길을 제공해준다. 다중 처리를 위해 운영체제를 구성하는 기본 방법에는 비대칭(주/종)적 구성과 대칭적 구성이있다
(e) distributed system :
시스템 마다 운영체제와 메모리를 가지고 독립적으로 운영되며 필요할 때 통신하는 시스템을 일반적으로 분산 처리 시스템(Distributed Processing System)이라고 한다. 최근의 컴퓨터시스템은 여러 개의 물리적 프로세서에 연산을 분산하는 경향이 있다. 이유는 자원 공유, 연산속도향상, 신뢰성과통신때문이다. 분산 시스템을 구성하는 방법은 기본적으로 두 가지다. 첫째, 강결합(단단히 결합된) 시스템으로프로세서(처리기)가 기억 장치와 클록(Clock)을 공유하며, 공유된 기억장치를 통해 통신한다. 둘째, 약결합(느슨하게 결합된) 시스템으로 둘 이상의 독립된 컴퓨터시스템을 통신선으로 연결한다.
(f) Cloud services :
클라우드 컴퓨팅의 정의는 개인이 가진 단말기를 통해서는 주로 입/출력 작업만 이루어지고, 정보분석 및 처리, 저장, 관리, 유통 등의 작업은 클라우드라고 불리는 제3의 공간에서 이루어지는 컴퓨팅 시스템 형태라고 할 수 있다.
14. 생산자 소비자 문제
1) 바쁜 대기를 이용한 생산자 소비자 문제 해결 코드
생산자 |
while (true) { /* produce an item in next produced */ while (counter == BUFFER_SIZE) ; /* do nothing */ buffer[in] = next_produced; in = (in + 1) % BUFFER_SIZE; counter++; } |
소비자 |
while (true) { while (counter == 0); /* do nothing */ next_consumed = buffer[out]; out = (out + 1) % BUFFER_SIZE; counter--; /* consume the item in next consumed */ } |
2) 세마포어를 이용한 생산자 소비자 문제 해결 코드
참고 : http://moaimoai.tistory.com/115
세마포어를 이용한 원자적 연산 구현 |
typedef struct{ int value; struct process *list; } semaphore; wait(semaphore *S) { S->value--; if (S->value < 0) { //add this process to S->list; block(); //적절한 대기 큐에 오퍼레이션을 호출 한 프로세스를 배치함. } } signal(semaphore *S) { S->value++; if (S->value <= 0) { //remove a process P from S->list; wakeup(P); //대기 큐 내에 프로세스들 중 하나를 제거하고 그것을 준비 큐에 배치함. } } semaphore empty = MAX; //현재 생산 가능한 물건 개수 (0이 되면 생산 못함) semaphore full = 0; // 현재 소비가능한 물건 개수 (0이 되면 소비 못함) semaphore mutex = 0; |
생산자 |
do { item = produce_item(); //물건 생산 wait(empty); //최대 생산량이 넘으면 잠듦 wait(mutex); insert_item(item); //물건을 버퍼에 넣음 signal(mutex); signal(full); //물건 생산 후 소비자를 깨움 } while (true); |
소비자 |
do { wait(full); //물건이 없으면 잠듦 wait(mutex); item = remove_item(); signal(mutex); signal(empty); //물건 소비 후 생산자를 깨움 consume_item(item); // 물건 소비 } while (true); |
카운팅 세마포어 : 이 값은 제한되지 않은 도메인을 넘는 범위로 할 수 있다.
바이너리 세마포어 : 이 값은 오로지 0 또는 1만 가능하다. (뮤텍스와 동일)
15. Deadlock 발생 요건 4가지, prevention 문제점
교착상태가 발생하려면 각 네가지의 필요조건이 반드시 성립해야한다. 이들 조건 중에서 하나가 성립하지 않도록 보장함으로써 교착상태의 발생을 예방할 수 있다.
1) 상호 배제
각 자원은 현재 정확하게 하나의 프로세스에게 할당되어 있거나 가용한 상태이다.
설명) 최소한 하나의 자원이 비공유 모드로 점유되어야 한다. 비공유 모드에서는 한 번에 하나의 프로세스만이 그 자원을 사용할 수 있다. 다른 프로세스가 그 자원을 요청하면 요청 프로세스는 자원이 방출될 때까지 반드시 지연되어야 한다.
해결책 및 그에 대한 문제점) 여러 프로세스에게 하나의 자원을 공유한다. 이럴 경우 공유 가능한 자원을 위해 대기할 필요가 없다. 하지만 이는 근본적으로 공유가 불가능하기 때문에 상호 배제 조건을 인정하지 않음으로써 교착상태를 예방하는 것은 불가능하다.
2) 점유하며 대기(Hold and Wait)
이전에 승인되어 현재 자원들을 보유하는 프로세스가 새로운 자원들을 요청한다.
설명) 프로세스는 최소한 하나의 자원을 점유한 채, 현재 다른 프로세스에 의해 점유된 자원을 추가로 얻기 위해 반드기 대기해야 한다.
해결책 및 그에 대한 문제점) 교착상태 회피 : 프로세스가 자원을 전혀 갖고 있지 않을 때만 자원을 요청할 수 있도록 한다. 또한 프로세스가 실행되기 전에 반드시 자신의 모든 자원을 요청하여 할당받게 한다. 이 방법은 많은 자원들이 할당된후 오래동안 사용되지 않기 때문에 자원의 이용율이 낮을 수 있고 기아 상태가 발생할 수 있다. 여러 개의 인기 자원들을 여러 개 필요하는 프로세스는 자신의 필요로 하는 자원 중에서 최소한 하나가 항상 다른 프로세스에게 할당되어 있기 때문에 무한정 대기할 수 있다.
3) 비선점(No Preemption)
이전에 승인된 자원들은 프로세스로부터 강제로 빼앗을 수 없다. 그들은 명확하게 그것을 보유한 프로세스에 의하여 반환되어야 한다.
설명) 자원들을 선점할 수 없어야 한다. 즉 자원이 강제적으로 방출될 수 없고, 점유하고 있는 프로세스가 태스크를 종료한 후 그 프로세스에 의해 자발적으로 방출될 수 있다.
해결책 및 그에 대한 문제점) 교착상태 회복 : 자원을 가지고 있거나 대기하고 있는 프로세스를 중지시키고 자원을 선점한다. 이 방법은 희생자 선택 시 주로 비용 요인에 근거한 시스템에서는 동일한 프로세스가 항상 희생자로 선택될 수 있다. 그 결과 이 프로세스는 기아상태로 남게 된다. 일반적으로 선점 당하는 최대 횟수를 정하는 방법이 있다.
4) 순환대기
둘 혹은 더 많은 프로세스들의 순환이나 체인이 있어야 한다. 각 프로세스는 체인의 다른 구성원들에 의해 소유되어있는 자원들을 기다린다.
설명) 대기하고 있는 프로세스의 집합(P0, P1, P2)에서 프로세스들이 P0->P1 , P1->P2, P2->P0 과 같이 체인 형태로 점유한 자원을 대기한다.
해결책 및 그에 대한 문제점) 교착상태 탐지 : 자원 할당 그래프를 이용해 미리 예방이 가능하나 프로세스가 많아질 수록 오버헤드는 굉장히 커진다. 교착상태가 탐지될 경우 더이상 자원할당은 불가능해진다. 이 때 무한정 대기하여 기아상태가 발생할 수 있다.
- 출처 :그림으로배우는운영체제(한빛미디어), 공룡 책8판(조유근 저), 운영체제론(노삼혁 교수님 저), 위키피디아
'운영체제' 카테고리의 다른 글
운영체제 정리 및 요약 #2 (0) | 2015.08.24 |
---|