2022.02.06

서론


운영체제(OS, Operating System)는 컴퓨터 하드웨어를 관리하는 프로그램이다. 한마디로 운영체제는 응용프로그램을 위한 기반을 마련하고, 사용자와 프로그램 사이의 중재자이다.


Window, Linux, Unix등등 여러 운영체제가 있다. 이러한 운영체제는 사용자에게 편리하도록, 혹은 효율성에 등에 따라서 설계되고 구현된다.



1.1 운영체제가 할일 (What Operating Systems Do)


컴퓨터 시스템은 하드웨어, 운영체제, 사용자, 응용프로그램으로 구분할 수 있다. 또한, 컴퓨터 시스템은 하드웨어, 소프트 웨어로 구분할 수 있다. 운영체제는 컴퓨터 시스템이 작동할 때 자원을 적절하게 사용할 수 있는 방법을 제공한다.


하드웨어는 중앙처리장치, 메모리, 입출력 장치로 구성되어 있고, 응용프로그램은 우리가 사용하는 워드, 컴파일러 등이다.

사용자는 각자 동일한 컴퓨터를 다른 터미널에서 접근하는 경우, 또는 워크스테이션과 서버로 나뉘는 경우가 있다. 동일 컴퓨터를 나눠서 쓰는 경우 사용자들에게 자원을 배분하는 것도 운영체제가 관리한다.



운영체제의 정의

1960년 무어의 법칙은 컴퓨터 집적회로의 트랜지스터 수가 18개월마다 배가할 것이라고 예측했고, 이 법칙은 지켜져 왔다. 트랜지스터는 크기가 작아지면서 컴퓨터의 성능이 좋아졌고, 용도가 다양해졌다. 그리고 운영체제도 다양하게 등장했다.


운영체제는 컴퓨터를 더 효율적으로 쓰는데 목적이 있다. 순수 하드웨어 만으로 사용자가 사용하는 프로그램 등 다양한 목적에 충족하지 않는다. 왜냐하면, 프로그램들은 입출력 장치의 제어와 같은 공통적인 연산을 필요로 하기 때문에 여러 프로그램을 충돌없이 효율적으로 수행하기 위해서는 이를 관리하는 소프트웨어가 필요하기 때문이다. 자원을 제어하고 할당하는 기능을 하나의 소프트웨어로 통합한 것이 운영체제이다.


운영체제는 컴퓨터에서 항상 실행되는 하나의 프로그램으로 일반적으로 커널이라고 불린다.(커널과 함께 다른 두 유형이 있다.)

시스템 프로그램은 운영체제와 연관되어있지만, 반드시 커널에 포함될 필요가 없는 프로그램이고, 시스템 작동과 관련없는 것은 응용 프로그램이다.



1.2 컴퓨터 시스템의 구성


컴퓨터가 구동되기 위해서는 실행시킬 초기 프로그램을 가지고 있어야 한다. 이 초기 프로그램 (부트스트랩 프로그램)은 매우 단순하다. 전형적인 읽기 전용 메모리(ROM 또는 EEPROM)에 저장되고 펌웨어라고 알려져 있다. 부트스트랩은 CPU 레지스터 부터 메모리 등을 초기화하고, 운영체제를 적재하는 방법을 알고 있어야 한다.


부트스트랩이 운영체제를 찾아서 메모리에 적재하고 나면 커널이 실행된다. 만약 커널보다 먼저 다른 프로그램이 실행되는 경우, 이 프로그램은 부트 시 메모리에 적제되어 커널이 실행되는 동안 계속 실행되는 시스템 프로세스 혹은 시스템 데몬이 된다. UNIX에서는 첫 시스템 프로세스인 init 등과 같은 다른 데몬이 시작한다.


시스템이 완전히 부트되면 시스템은 사건이 발생하기 기다린다. 사건의 발생 여부는 하드웨어나 소프트웨어로부터 발생한 인터럽트로 알게된다. 하드웨어는 언제든 시스템 버스를 통해서 시스템 호출(System Call) 이라 부르는 연산으로 인터럽트를 발생할 수 있다.



인터럽트

인터럽트 발생 시, CPU는 하던 일을 멈추고 해당 인터럽트에 기록된 특정 루틴의 시작 주소로 가서 실행한다. 이 루틴을 완료하면, 원래 했던 연산으로 돌아간다. 인터럽트는 사실 컴퓨터 구조에서 가장 중요하다. 컴퓨터 설계에 따라 고유한 인터럽트 기법이 있고, 적절한 서비스 루틴으로 제어정보를 전달한다.


인터럽트가 정보전달을 처리하는 간단한 방법은 총괄 루틴을 이용해 인터럽트에 관한 정보를 조사하는 방법이다. 또한, 인터럽트는 빠르게 처리되어야 하기 때문에 인터럽트 고유의 핸들러 정보를 테이블 형식으로 제공한다. 이 경우에 중간 루틴 없이 바로 테이블에서 바로 호출이 가능하다. 일반적으로 이 테이블, 즉 포인터 테이블은 하위 메모리에 저장되고, 이 위치에 인터럽트 서비스 루틴의 주소가 저장된다. 인터럽트가 요청되면 이 주소의 배열, 즉, 인터럽트 벡터가 인터럽트 요청과 함께 서비스 루틴의 주소를 얻을 수 있다.


저장장치 구조

CPU는 명령어를 무조건 메모리에서만 가져올 수 있다. 그렇기 때문에 프로그램이 반드시 메모리에 있어야 한다. 범용 컴퓨터는 대부분의 프로그램을 메인메모리라 불리는 재기록 가능한 메모리에서 가져온다. 명령을 메모리에서 가져와 수행하기까지 각 저장장치마다 그 과정은 조금씩 다르다. 크게 휘발성 저장장치(ROM)와 비휘발성 저장장치(RAM)로 나뉜다. 레지스터, 메인 메모리, 이동 디스크 등 각 메모리 마다 장단점이 있기 때문에 컴퓨터 설계 과정에서 이를 유의해서 설계해야 한다. (TLB 테이블 참조의 고속화)


입출력 구조

저장장치는 여러 입출력 장치 중 하나이다. 시스템의 신뢰성과 성능에 입출력 장치가 많은 부분을 관여하기 때문에 운영체제는 주로 이 입출력을 관리하는데 많은 노력을 기울인다. 그 중 하나가 DMA이다.


입출력 연산을 시작하기 위해 디바이스 드라이버는 장치 제어기의 적절한 레지스터에 필요한 값을 적재한다. 장체 제어기는 이어서 할 동작을 조사하고, 이를 수행하면 자신이 연산을 완료했다는 것을 디바이스 드라이버에게 통보한다. 그러면 드라이버는 제어권을 운영체제에게 반환하고 데이터를 전송한다.


이러한 인터럽트 방식은 적은 양의 데이터를 전송하는 데에는 문제가 없지만, 많은 양의 데이터를 전송해야할 때 문제가 생긴다. 그렇기 때문에, 직접 메모리 접근 DMA(Direct memory Access) 가 사용된다. DMA는 장치의 필수적인 정보를(버퍼, 포인터, 카운터 등을) 세팅하고, 장치제어기를 이용해 메모리에 접근 시 CPU의 개입 없이 직접 메모리에 접근한다. 그렇게 되면, 바이트마다 전송되는 것이 아닌 블록마다 전송되기 때문에 기존에 오래걸리는 대용량 작업 등에서도 CPU는 쉬는 시간이 남게 된다. 그동안 CPU는 다른 일을 할 수 있게 되기 때문에 효율적으로 CPU를 활용할 수 있게 된다.



1.3 컴퓨터 시스템 구조


단일 처리기 시스템(Single-Processor Systems)

하나의 CPU 처리기를 가진 시스템으로 주로 키보드 또는 그래픽 제어기와 같은 특정 장치 처리기의 형태로 제공되거나 대형 컴퓨터에서와 같이 시스템의 구성요소들 간의 데이터를 빠르게 전송할 수 있는 입출력 처리기와 같은 범용 처리기에 가까운 형태로 제공될 수 있다.


다중 처리기 시스템(Multiprocessor Systems)

병렬 시스템 또는 멀티코어 시스템라고 부르기도 하는 다중 처리기 시스템은 매우 밀접한 통신을 하는 둘 이상의 처리기들을 가지고, 시스템 버스, 클록, 메모리와 주변 장치를 공유한다. 주로 서버에서 많이 사용하던 시스템이지만, 점차적으로 컴퓨터, 태블릿, 휴대용 건자 기기 등에서도 사용하게 되었다. 이 시스템은 3가지의 장점을 가진다.


  1. 처리량 증가 (처리량이 증가한다. 그러나 N배가 아니고, 공유 자원 경쟁 등에 따른 오버헤드가 있다.)
  2. 규모의 경제 (주변장치, 메모리, 전원을 공유하기 때문에 N개의 단일 처리기 보다 N개 cpu를 가진 다중처리기가 경제적이다.)
  3. 신뢰성 증가 (처리기 중 하나가 고장나도 다른 처리기로 활용가능)


이 다중 처리기는 코어들의 구조가 대칭적인지 비 대칭적인지를 판단하기도 하고, 메모리에 균등하게 혹은 비 균등하게 접근할 수 있는지 여부에 따라 구분하기도 한다.(UMA vs NUMA)


클러스터형 시스템

여러 cpu를 가진 시스템의 또 다른 유형은 클러스터형 시스템이다. 기존 다중 처리기 시스템과는 달리 각 처리기가 단일처리기 또는 멀티코어 시스템일 수 있다. 즉, 단일 혹은 다중 처리기로 전환이 가능한 시스템으로 정의하기가 어렵다. 또한, 비대칭형 클러스터링, 대칭형 클러스터링 등 변환이 자유롭기때문에 문제 발생 시 유연한 대처가 가능하다.


클러스터는 다수의 컴퓨터 시스템을 네트워크로 연결하여 구성하기 때문에 고성능 컴퓨팅 환경을 제공하는 데 사용될 수 있다. 저장장치를 공유하고 근거리 통신망, 고속의 상호 연결망으로 연결된다. 클러스터링은 비대칭형, 대칭형 클러스터 등 원하는 구조로 구성할 수 있다.



1.4 운영체제의 구조


운영체제는 다양하지만, 그중에 공통점들이 많이 있다. 이번에는 이 공통점을 살펴보고 설명하기로 한다.


운영체제의 가장 중요한 하나는 다중 프로그램을 할 수 있다. 다중 프로그래밍은 한 명의 사용자도 종종 여러 프로그램을 동시에 실행시킨다. 일반적으로 작업들은 작업 풀에 유지된다. 왜냐하면 메모리 내에 동시에 저장할 수 있는 작업의 수는 통상 작업 풀에 둘 수 있는 작업 풀보다 적기 때문이다.


메모리에 존재하는 작업은 대부분 작업풀에 있는 작업이다. 운영체제는 메모리에 있는 작업 중 하나를 선택해 실행 하고, 해당 작업이 완료될 때 까지 기다리게 된다. 다중 프로그래밍을 사용하지 않는 경우, CPU는 입출력 등을 기다리는 동안 CPU가 쉬게 되지만, 다중 프로그래밍을 사용하는 경우 다른 작업으로 전환해 쉬지않고 실행하게 된다.


이러한 다중 프로그래밍 시스템은 여러 가지 시스템 자원을 효율적으로 이용할 수 있는 환경을 제공하지만 컴퓨터 시스템과 사용자 상호 작용은 제공하지 않는다. 시분할 시스템은 이 다중 프로그램의 확장이라고 할 수 있다. 교대가 빈번하게 일어나지만, 각자 자기 프로그램이 실행되는 동안 상호작용할 수 있다. 물론 대화식 컴퓨터 시스템을 필요로하고, 응답시간이 짧은게 특징이다. 시분할 시스템은 많은 사용자가 컴퓨터를 공유할 수 있게 하는 동시에 각 사용자가 자신이 컴퓨터 전체를 사용하는 것처럼 느끼게 한다.


시분할 운영체제는 각 사용자에게 서비스하기 위해서 CPU 스케줄링과 다중 프로그래밍을 사용한다. 각 사용자는 메모리에 최소한 하나의 독립된 프로그램을 가지고 있다. 메모리에 적재되어 있는 프로그램을 프로세스라고 한다. 프로세스는 아주 짧은 시간동안 실행된다. 특정 사용자의 프로세스 수행 중 만약 입출력 등을 기다려야하는 상황에서는 다른 사용자 프로세스로 신속하게 전환한다.


만약 전환 가능한 프로세스가 많은 경우 그중 몇개를 선택해야 한다. 이걸 결정하는 것이 작업 스케줄링이고, 선택된 작업은 메모리에 적재되고 수행된다. 메모리는 한정적이기 때문에 선택된 작업중 어떤걸 적재 시킬지 메모리 관리가 필요하고, 적재 후 수행 시에도 어떤 프로세스를 먼저 수행할지도 결정해야한다. 어떤 것을 먼저할지 결정하는 것을 CPU 스케줄링이라고 하며, 운영체제는 전반적인 메모리 관리, 스케줄링 등을 담당해서 관리한다.


→ 쓰레싱 : 워킹셋이 실제 메모리에 다 올라가지 못하면 쓰레싱이 발생. 해결하기 위해 다중 프로세싱을 내려서 메모리 크기를 늘려야한다.



Categories:

Updated:

Leave a comment