#title 서론 [[TableOfContents]] 이곳의 문서들은 [http://www.databaser.net/moniwiki/wiki.php/BookLog#s-7 운영체제론]을 정리한 것이다. ==== 운영체제의 2가지 중요한 기능 ==== * 확장된 머신으로서의 운영체제 * 자원 관리자로서의 운영체제 '확장된 머신으로서의 운영체제'란 시스템 호출[* System Call]이라는 특수한 명령을 사용하여 다양한 서비스를 제공하는 프로그램을 말하며, '자원 관리자로서의 운영체제'는 복잡한 시스템의 모든 자원을 효율적으로 관리하는 것을 말한다. 자원을 관리하는 방법은 다음과 같은 2가지 방법이 있다. (시간과 공간상에서 자원을 다중화(공유)하는 것) * 시간 다중화: 하나의 자원을 시간으로 쪼개어 여러 프로그램을 동작시킴. * 공간 다중화: 하나의 자원을 여러 프로그램들이 일부를 나누어 갖는 방법(ex: Mian Memory는 여러 프로그램이 쪼개어 쓴다.) ==== 멀티 프로그래밍이란? ==== 트랜지스터로 제작된 2세대 컴퓨터들은 현재의 작업이 테이프나 다른 입출력이 완료되기를 기다리고 있을 때 CPU도 단순히 입출력이 끝날 때가지 대기하고 있었다. 복잡한 과학 계산의 CPU 바운드 작업이므로 입출력이 빈번하지 않아서 CPU 대기시간은 그다지 문제가 되지 않았다. 그러나 업무용 데이터 처리에서는 전체 시간의 80%정도가 입출력 대기이므로 CPU 대기시간을 줄이기 위한 대책이 필요했다. 이런 배경으로 출현한 방법이 '''멀티프로그래밍''' 기법이다. 3세대 컴퓨터는 다음과 같이 메모리를 나누어 여러 프로그램을 메모리에 로드하여 대기시간 동안 다른 프로그램이 동작하도록 하였다. 아래는 메모리를 나누고 3개의 작업이 있는 것을 나타낸다. ||작업1|| ||작업2|| ||작업3|| ||운영체제|| 많은 작업이 메모리에 로드되면 CPU는 거의 쉬지 않고 100%의 사용률을 보일 것이다. 이 때 필요한 것은 여러 작업이 동시에 안전하게 메모리에 있게 하고, 각 작업이 서로 간섭하지 않게 하는 특별한 하드웨어다. 360을 비롯한 여러 3세대 컴퓨터들은 이러한 하드웨어를 갖추고 있었다. ==== 스풀링(Spooling[* Simultaneous Peripheral Operation On Line]) ==== 작업이 컴퓨터실에 도착하면 즉시 카드에서 디스크로 읽어들일 수 있는 능력을 갖는 것은 3세대 운영체제의 또 다른 특징이다. 따라서 현재 실행중인 작업이 끝나면 운영체제는 디스크에서 새로운 자업 하나를 메모리의 빈 자리에 로드하여 실행할 수 있었다. 이 기법을 스풀링이라고 하며, 출력시에도 적용되었다. ==== 프로세서 ==== * 컴퓨터의 두뇌. * CPU는 메모리에서 명령을 가져와 실행 * 기본 사이클 1. 메모리에서 명령을 가져온다. 1. 디코딩(명령어의 타입과 피연산자를 결정하기 위함) 1. 실행 * CPU는 자신이 수행할 명령어들을 가지고 있다. 팬티엄은 스팍(SPARC) 프로그램을 수행할 수 없고, 그 반대도 마찬가지다) * CPU는 다수의 레지스터를 가진다. 이유는 메모리에서 명령어나 데이터를 가져와야 하는데, 명령어 수행시간보다 가져오는데 시간이 더 걸리기 때문에 모든 CPU는 핵심 변수와 임시 결과를 내부에 유지하기 위하여 몇 개의 레지스터를 가진다. * 레지스터 * 범용 레지스터: 변수와 임시 결과를 유지하기 위해 사용 * 프로그램 카운터(program counter): 다음에 가져올 명령어의 메모리 주소를 갖는다. 명령을 가져오면 프로그램 카운터에는 자동적으로 그 다음 명령의 메모리 주소가 들어간다. * 스택 포인터(stack pointer): 메모리의 현재 스택의 최상위를 가리킨다. 스택은 각 프로시저에 대하여 한 프레임씩 할당된다. 프로시저의 스택 프레임에는 레지스터에 유지되지 않는 입력 파라미터, 지역 변수, 임시 변수등이 들어간다. * PSW(program status word): 비교 명령에 의해 세트되는 조건 코드 비트, CPU 우선순위, 모드(사용자 or 커널), 그리고 다양한 제어 비트들이 들어간다. 사용자 프로그램은 PSW 전체를 읽을 수 있지만 일부 필드만을 기록할 수 있다. PSW 시스템 호출이나 I/O에서 중요한 역할을 한다. * CPU 성능 개선 방법 * 파이프라인(pipeline) * 슈퍼스칼라(superscalar): 여러 개의 실행단위(정수 연산, 부동소수점 연산, 불리언 연산 등) attachment:서론/cpu_perf.jpg * 모드(사용자 모드, 커널 모드는 보통 PSW의 한 비트를 제어) * 사용자 모드 * 커널 모드 * TRAP명령: 사용자 모드에서 커널 모드로 전환 * 운영체제의 서비스를 제공받으려면, 커널로 트랩하여 운영체제를 기동하는 시스템 호출(system call)을 사용자 프로그램이 호출해야 한다. * 0으로 나누기, 부동소수점 오버플로우와 같은 예외조건은 하드웨어적으로 일어난다. 즉, 사용자 모드에서 실행되던 프로그램 커널모드로 트랩된다. 이는 운영체제가 제어한다. ==== Context Switch ==== * 프로그램이 컴파일되고 링크될 때, 컴파일러와 링커는 프로그램이 실행될 때에 로드되는 실제 메모리 주소를 알지 못함. 그러므로 프로그램은 메모리주소 "0"에서 시작(즉, 가상주소) * 가상주소(virtual address): 프로그램에 의해 생성된 주소 * 물리주소(physical address): 실제로 메모리에 매핑되어 메모리에서 사용하는 주소 * MMU(Memory Management Unit): 가상주소와 물리주소의 검사와 매핑 * 실제로 CPU칩에 올라가든가 가까이 배치 * 논리적으로는 CPU와 메모리 사이에 위치 * MMU는 OS가 관리함 * Context Switch * 한 프로그램에서 다른 프로그램으로 스위칭될 때 MMU 레지스터도 바뀌게 됨 * 아래의 그림에서는 2개의 Base Register와 2개의 Limit Register만 바뀌면 문제가 되지 않지만, 실제의 MMU에서는 더 많은 레지스터들이 다시 로드되어야 한다. 즉, 로드되는 동안의 시간이 필요하다. attachment:서론/context_switch.jpg ==== I/O 방법 ==== * 바쁜 대기(busy waiting) * 프로그램이 해당 드라이버에 대한 프로시저 호출로 전환해주는 시스템 호출을 기동시킨다. * 드라이버는 I/O를 시작하고 계속 장치를 폴링한다. 일반적으로 장치가 아직도 사용중인가를 나타내는 비트를 가짐.(폴링(Polling): 여러 장치에 대하여 순차적으로 송신 요구의 유무를 문의하여, 요구가 있을 경우 그 단말장치에 송신하도록 명령을 내림.) * I/O가 완료되면 필요한 데이터를 주고 리턴. 이때 운영체제는 제어권을 처음 호출한 자에게 돌려준다. * 인터럽트(interrupt) * 드라이버는 장치 레지스터에 무엇을 하라고 기록할지를 제어기에 알려준다. 그리고 장치를 시작시킨다. 제어기가 일련의 바이트에 대한 액세스(읽기, 쓰기)가 끝날 때 인터럽트 제어기 칩에 신호를 보낸다. * 인터럽트 제어기가 인터럽트를 받을 준비가 되어 있으면(우선순위가 높은 인터럽트가 있어 바쁠 수 있다.), 정보를 전하기 위하여 CPU칩의 해당 핀을 동작시킨다. * 인터럽트 제어기는 버스상의 장치번호를 알려 CPU가 읽어서 그 장치가 바로 전에 일을 끝냈음을 안다. (동시에 수행되는 여러 장치가 있을 수 있다) * DMA(Direct Memory Access): CPU는 전송할 양이 얼마인지, 장치와 메모리 주소, 방향(읽기, 쓰기) 등에 대한 DMA칩 세팅한 후 실행. DMA가 발생하면, 인터럽트 발생