본문 바로가기

CS/운영체제

[운영체제] 개요

운영체제(Operating System)

 과거 컴퓨터가 천공카드로 동작하던 시절에는 컴퓨터를 전문적으로 관리하며 들어온 일거리(job)을 우선 순위에 따라 배치(Scheduling)하고, 컴퓨터를 동작시키던 "오퍼레이터" 라는 직업이 존재했다. 당시 컴퓨터는 오퍼레이터가 스케줄링한 순서에 따라 프로그램을 "순차적으로" 진행했으며, 동시에 2개 이상의 프로그램을 올리는 것은 불가능했다.

 시간이 지나 오퍼레이터가 수행하던 job-scheduling 작업은 오퍼레이팅 시스템, 즉 우리가 아는 OS에 의해 대체되었고, 현재까지 우리는 컴퓨터를 사용할 때 사람 대신 OS을 사용하고 있다. 

 이러한 OS는 컴퓨터 혹은 하드웨어 등을 운영하기 위한 체계 또는 시스템(프로그램) 으로, 오퍼레이터가 그랬듯이 유저 및 컴퓨터 사이에서 발생하는 액션을 처리하는 역할을 수행한다.

운영체제의 목표

운영체제의 주된 목표는 다음과 같다.

  • 사용자(User) 의 프로그램을 잘 실행되도록, 문제가 있다면 쉽게 해결될 수 있도록 지원하는 역할을 수행한다.
  • 컴퓨터 시스템 및 환경을 사용하기 쉽게 만든다. ( ex : GUI 등 )
  • 컴퓨터 하드웨어의 성능을 효율적으로 이끌어낼 수 있도록 시스템적인 도움을 준다.

컴퓨터의 4가지 요소(Components)

  • 하드웨어(Hardware)
    : CPU, 메모리, I/O 디바이스 등 
  • 운영체제(OS)
    : 다양한 어플리케이션 및 유저 사이에서 조율 및 하드웨어 작동 등의 기능 수행
  • 어플리케이션(Application programs)
    : 유저가 정의한 문제(problem) 을 해결하기 위한 방법을 정의한 것으로, 시스템의 리소스를 사용한다.
  • 사용자(User)
    : 사용자는 실제 사용하는 사람일 수도 있지만, 머신이나 컴퓨터가 될 수도 있다.

 컴퓨터의 각 컴포넌트들은 일종의 레이어처럼 존재한다. 최근 하드웨어들은 OS가 제공하는 "시스템 콜" 이라는 형태로 접근할 수 있으며,  어플리케이션들은 OS에서 제공하는 시스템 콜을 이용하여 하드웨어 관련 작업을 수행하거나, 정의된 문제를 해결한다. 유저는 이러한 어플리케이션들을 이용하여 자신이 생각하는 문제를 해결한다. 

 경우에 따라 Application 및 OS을 퉁쳐서 Program(이름은 다양하다) 으로 두기도 하는데, 이 경우에도 역시 유저가 하드웨어에 접근하기 위해서는 프로그램에서 제공하는 시스템 콜 등을 이용하도록 제약되어 있다.

 

컴퓨터 시스템 구성 

 한대의 컴퓨터를 구성하기 위해서는 다양한 하드웨어 기기들이 필요하다. 예를 들어 우리가 컴퓨터 한 대를 만들기 위해서는 CPU, 메모리, GPU, 보조기억장치(SDD 등), USB 기기, 모니터 등등을 구매하게 된다. 현대 컴퓨터 구성에서 이러한 하드웨어 기기들은 직접 통신하는 대신 버스(bus) 라는 통로를 이용한다. 이를 통해 다양한 기기들이 메모리 자원을 공유하여 사용할 수 있게 되며, 하드웨어 역시 계속 추가될 수 있다.

 위와 같은 구조 및 CPU와 타 기기 사이의 속도 비대칭에 의해 CPU는 다른 디바이스로부터 곧바로 데이터를 읽지 못한다. 단적으로 CPU는 보조기억장치의 내용조차도 직접 접근할 수 없으며, 대신 메모리 상에 특정 데이터를 올린 후, 메모리에 저장된 데이터를 읽어들이는 방식으로 동작한다.

 각각의 디바이스 컨트롤러(USB, HDMI 등)들은 특정 타입의 디바이스를 위한 인터페이스 역할을 수행하며, 최근에는 각 컨트롤러 ( 키보드, 마우스 등 ) 에 로컬 버퍼를 이용하여 동작 속도를 높인다. 각 디바이스는 디바이스 드라이버 를 통해 OS와 연결되고, 관리되게 된다.

 I/O 작업시 CPU 및 I/O 디바이스들은 cocurrently(동시간대에 동작) 하게 동작하며, I/O을 시작하거나 끝내는 경우 interrupt 을 통해 CPU에게 해당 사실을 전달한다.

인터럽트(interrupt)

 현재 진행중인 작업을 중단하고, 새로 들어온 작업을 진행하라는 일종의 신호로, 인터럽트 벡터에 의해 관리된다. 각 인터럽트가 발생하게 되면 현재 진행중인 작업에 대한 정보 ( 진행중인 작업의 주소, 여러가지 플래그, PC 등 ) 을 저장한 후, 인터럽트로 들어온 작업의 정보를 로드한다. 이후 해당 작업에게 CPU를 넘기고 idle 상태가 된다.

 I/O 작업 뿐만 아니라 trap, exception 등도 인터럽트에 포함되며, 우리가 사용하는 OS는 인터럽트 기반으로 동작한다. 인터럽트에 의해 수행되는 작업들은 우선순위(priority)을 가지기도 하며, OS의 동작 방식에 따라 Time-Sharing 을 통해 Concurrently하게 수행될 수도 있다.

 인터럽트를 수행할 때에도 I/O 디바이스 및 CPU는 Concurrently하게 동작한다. CPU는 I/O 기기로부터 Input 혹은 Output 작업이 필요할 때 잠깐 인터럽트에 의해 할당된 작업을 수행하고, 나머지 시간은 원래 하던 작업을 계속한다.

구체적으로는 대략 다음 과정을 거친다

  1. CPU는 계속 동작한다. 이때 각 instruction 사이마다 인터럽트가 들어왔는지 체크한다.
  2. 다양한 기기를 통해 인터럽트가 CPU에게 전달된다.
  3. 인터럽트를 받은 CPU는 현재 작업중인 job 관련 정보를 저장(save)하고, 인터럽트 핸들러에 컨트롤 권한을 준다.
  4. 인터럽트 핸들러가 들어온 작업을 수행한다. 작업이 끝나면, 컨트롤 권한을 CPU에게 다시 되돌려준다.
  5. CPU는 작업중이었던 정보를 가져와(load), 다시 하던 일을 재개한다.

인터럽트 2가지 방식

  1. 동기적 인터럽트: I/O 시간동안 CPU는 idle 상태로 머무른다. Wait 상태동안 CPU는 어떤 일도 수행하지 않으므로 그만큼의 CPU 자원이 낭비된다. 한번에 하나의 I/O만을 처리할 수 없으므로, 동시 입력은 불가능하다.
  2. 비동기적 인터럽트: I/O 가 종료될때까지 CPU가 단순히 대기하는 대신, 다른 프로그램 혹은 기존 프로그램의 다른 작업을 수행한다. 
    1. System call : OS에게 I/O 작업이 끝날 때까지 유저가 대기할 수 있게 요청한다.
    2. Device-status table : I/O 디바이스의 타입, 주소, 상태 등을 담은 테이블. OS 에 의해 디바이스의 상태 결정, 인터럽트를 포함한 테이블 엔트리 수정 등에 사용된다.

저장소 구조

  1. 메인 메모리 : CPU가 직접 접근할 수 있는 저장소 미디어. 보통 DRAM, RAM 형태를 띈다.
    1. Random Access : 원하는 정보의 위치를 한번에 접근할 수 있다.
    2. Volatile : 대개 휘발성을 띄어 컴퓨터 종료시 정보가 전부 사라진다.
  2. Secondary storage(HDD 등 보조기억장치) : 저장 능력을 가진 미디어로, 메인 메모리를 확장하는 큰 저장 공간을 가지고 있다.

저장소의 계층(Hierarchy)

저장소의 계층은 다음 3가지 기준에 따라 구성될 수 있다.

  • 속도(Speed) : 저장소에 접근하는 속도
  • 가격(Cost) : 저장소의 가격
  • 휘발성(Volatibility) : 전원을 끌때 정보의 증발 여부

 캐싱 : 자주 사용되는 정보를 속도가 빠른 저장소 시스템에 저장하는 것. ex) 메인 메모리가 SDD에서 자주 사용하는 부분을 캐싱 작업을 통해 캐시에 저장, 이를 사용한다.

 디바이스 드라이버 : 커널과 컨트롤러 사이의 인터페이스를 제공해줌으로써 I/O 디바이스 컨트롤러를 관리한다.

Direct Memory Access Structure

 통상적으로 I/O 작업을 할떄는 보통 CPU가 중간에 수행해야 하는 작업이 존재한다. 만약 I/O 디바이스의 속도가 메모리의 속도에 근접하면 CPU의 개입 없이도 충분히 디바이스로부터 메모리로 직접 정보를 전달할 수 있게 된다. DMA 방식은 기기 및 RAM이 CPU을 거치지 않고 직접 정보를 전달하므로, 그만큼 CPU의 효율이 증가하는 장점이 있다. 기존 CPU의 작업은 DMA Controller 이 수행하며, 이로 인해 자주 발생하는 인터럽트를 줄일 수 있다.

 


Multiprogramming (Batch System)

 기존 컴퓨터에는 한번에 하나의 프로그램밖에 올리지 않았다. 그러나 컴퓨터의 성능 증대에 따라 I/O 시간 등 남는 시간에 CPU를 idle 상태로 두는 것이 큰 손해로 다가왔는데, 이를 해결하기 위해 컴퓨터에 한번에 1개 이상의 프로그램을 적재하는 방식을 고려하게 되었고, 이것이 Multiprogramming 방식이다.

 멀티 프로그래밍 기법을 이용하면 CPU가 job scheduling을 통해 현재 수행할 작업을 결정하는데, 특히 I/O같이 CPU가 대기하는 시간에는 다른 job에게 CPU의 사용권을 넘겨 CPU 자원이 낭비되지 않도록 한다.

Multitasking (Timesharing)

 컴퓨터 성능의 비약적 상승 및 GUI의 등장에 따라 한 순간에 하나의 프로그램만을 돌리는 것 조차 아쉽게 느껴졌다. 예를 들어 우리가 상대방의 카카오톡을 대기하는 동안 어떠한 동작도 수행하지 못한다고 생각해보자. 이러한 경험은 컴퓨터 사용에 매우 부정적으로 다가올 것이며, 이러한 시간을 최대한 활용할 방법을 강구하게 될 것이다. Multitasking 방식은 이러한 요구사항에 부응하는 하나의 기법이다.

 Multitasking은 Multiprogramming 이 논리적으로 확장한 것으로, 한번에 여러개의 프로그램을 적재할 뿐만 아니라, 이러한 프로그램들이 마치 동시에 동작하는 것 "처럼" 보이도록 빠르게 각 job들을 번갈아가며 수행하는 기법으로, 이를 통해 사용자는 해당 환경이 인터렉티브하다고 느끼게 된다.

 이러한 환경에서는 반응 시간(Response time) 이 매우 빨라야 하고, 각각의 프로세스(혹은 job) 들이 CPU에 의해 스케줄링 되어야 한다. 이러한 동작에 메모리가 부족한 경우, 프로그램이 필요할 때 HDD 상에 저장해두었던 데이터와 메모리 상의 데이터를 교체하는 방식으로 동작하는 Swapping 혹은 Virtual Memory가 필요할 수도 있다.

멀티태스킹 환경에서 고려해야 하는 것 : Cache Coherence ( 캐시 일관성 ) 

https://en.wikipedia.org/wiki/Cache_coherence

 멀티태스킹에서는 "현재" 값이 정확히 무엇인지에 대해 주의를 기울여야 한다. 멀티 프로세서를 사용하게 되면 각 코어마다 하나씩 캐시 및 레지스터가 존재하게 된다. CPU는 메모리에 저장되어 있는 값을 읽어들여 캐시 및 레지스터를 이용하여 연산을 수행하는데, 문제는 각각의 프로세서가 동일한 캐시 값을 가지지 않을 수 있다는 것이다.

 예를 들어 프로세서 0 이 연산을 통해 변수 A에 대한 값을 0 에서 1로 변경하고, 이를 컴퓨터 저장소에 반영했다고 생각해보자. 이때, 다른 프로세서들에게 변수 A가 변경되었다는 사실을 알리지 않는다면, 다른 프로세서들은 여전히 이전 값인 0을 기반으로 연산을 진행하게 되므로, 예상한 결과가 제대로 도출되지 않을 것이다. 따라서 멀티 프로세서 기반의 멀티 태스킹 환경에서는 특히 cache coherence, 즉 캐시의 일관성을 유지하여 특정 프로세서의 캐시가 변경됨에 따라 다른 프로세서의 캐시들도 "즉시" 변경될 수 있는 상태를 구축해야 한다.

https://en.wikipedia.org/wiki/Cache_coherence#/media/File:Cache_Coherency_Generic.png

 

Dual Mode

 사용자의 환경 및 커널의 환경을 구분하여, 이 둘을 함께 실행하는 방식. 특정 시스템이 유저에 의한 것인지, 시스템에 의한 것인지를 알기 위해 Mode bit가 필요하며, 사용자는 저수준의 기능을 사용하기 위해 시스템 콜을 통해 커널모드로 진입, 커널의 기능을 사용할 수 있다.


​프로세스

 실행되고 있는 프로그램으로, 시스템의 작업 단위로 사용되기도 한다. 프로그램은 보조기억장치 등에 저장되어 있는 데이터로 passive entity임에 비해, 프로세스는 active entity이고 CPU, 메모리 등 다른 컴퓨터 자원도 필요로 한다.

  • 싱글 스레드 프로세스 : 하나의 program counter 소유
  • 멀티 스레드 프로세스 : 스레드 당 하나의 pc 소유.

OS는 프로세스에 대해 아래 작업을 수행해야 한다.

  • 유저/시스템에 대한 프로세스 생성 및 제거
  • 프로세스 중지 및 재개
  • 프로세스 동기화(여러 프로세스간의 타이밍 조정) 를 위한 매커니즘 수행
  • 프로세스간 커뮤니케이션(IPC, RPC 등) 수행
  • 데드락 핸들링 : 2개 이상의 작업이 서로의 작업이 끝나기만을 기다려, 결과적으로 어떤 것도 완결되지 못하는 상황. 이러한 상황을 해결(예방 및 회피 등) 하는 역할을 수행

Protection , Security

  • Protection(보호) : OS에 의해 특정 유저 혹은 프로세스가 리소스에 접근할 수 있는 권한을 관리하는 것.
    • 유저 식별 : 이름, 그룹 등에 의해 특정 유저의 권한 등을 식별
  • Security(보안) : 컴퓨터 내 · 외부로부터 발생하는 시스템에 대한 공격을 방어하는 것.

가상화(Virtualization)

  • Emulation(에뮬레이션) : 타겟 프로그램에서 사용하는 운영체제나 하드웨어 구조를 소프트웨어적으로 모방하여, 그 위에서 프로그램을 구동하는 방식. 
    • 하드웨어/소프트웨어적인 부분을 전부 소프트웨어로 "모방"하는 방식이므로, 속도가 보통 느리다. 예를 들어 우리가 구식 닌텐도에서 돌아가는 게임을 에뮬레이터를 이용하여 실행하는 것은 윈도우 환경 위에 구식 닌텐도 환경을 소프트웨어적으로 모방하여 나타내야 하므로, 소프트웨어적으로 상당한 오버헤드가 발생한다. 즉, 하드웨어에서 처리해야 할 사항까지도 모두 소프트웨어가 처리하는 것이므로 상당히 속도가 느려진다.
    • 타겟 프로그램이 현재 환경에서 네이티브하게 컴파일 되지 않는다면, 해당 기능을 현재 환경에 맞게 interpretation 하는 과정이 필요하다.
    • 2개의 OS을 돌린다는 개념이 아니라, 현재 OS에서 다른 OS을 모방한 "프로그램"을 돌린다는 개념이다.
  • Virtualization(가상화) : OS 상에 다른 OS을 위한 virtual machine manager을 올린 후, 해당 환경에서 다른 OS를 native하게 실행하는 방식.
    • 다른 OS 환경을 host OS 환경에 맞게 변환하는 것이 아니라, VMM 상에 다른 OS를 올려두어 서로 별개의 OS을 운영하는 방식으로, 마이크로소프트 사의 WSL 등이 이에 속한다.
    • 별개의 OS을 VMM상에 띄웠으므로, 해당 환경에서 동작하는 프로그램을 host OS에 맞게 번역하는 과정이 전혀 필요하지 않다.
    • 특정 코드를 다양한 환경에서 검증할 때, 컴퓨터 한대에 다양한 OS 환경을 띄워 수행할 수 있다는 장점이 있다.

Computer System Architecture

  • 대부분의 컴퓨터는 하나의 CPU(프로세서) 를 이용.
  • 경우에 따라 CPU를 다수 사용하는 경우도 존재.
    • throughput을 향상시킬 수 있음.
    • 규모의 경제(규모 증가에 따라 성능 향상이 따라옴)
    • 하나가 망가지더라도 다른 CPU가 동작하므로, 고장에 대한 위험성이 감소함.
  • 멀티 프로세싱의 2가지 방식
    • Asymmetric Multiprocessing : 성능이 서로 다른 CPU를 이용하는 경우. 보통 특수 목적이 있는 경우 사용.
    • Symmetric Multiprocessing : 성능이 같은 CPU을 사용


N- 코어 디자인

https://en.wikipedia.org/wiki/Multi-core_processor

 프로세서의 수를 늘리는 대신, 하나의 프로세서 안에서 동작하는 코어의 수를 증가시키는 방식. 대부분의 프로그램들은 멀티 프로세스보다는 멀티 스레드 방식이 효율적이므로,  이를 위해 하나의 CPU 내에 여러개의 코어를 두는 방식을 채택함. 최근 생산되는 대부분의 컴퓨터는 멀티코어 방식의 프로세서를 이용.

클러스터링

 멀티프로세서 시스템에서 여러개의 CPU를 연결하여 이용한 것 처럼, 클러스터링은 여러대의 컴퓨터를 마치 하나의 컴퓨터인 것 처럼 네트워크를 통해 연결하여 사용하는 방식임. 물리적 장치를 네트워크를 통해 하나로 묶는 것.

 멀티 프로세서 시스템에서 캐시 값의 통일이 중요했듯이, 모든 컴퓨터 사이에서 변수 값의 일관성이 중요함. 보통 컴퓨터는 CPU처럼 연산을 수행하는 역할을 하고, 실제 데이터는 하나의 storage-area 에 저장되는 구조를 가지나, 자세한 구현 및 구조는 해당 클러스터의 개발자들만이 알 수 있음.


컴퓨팅 환경

  • Client-Server : 서비스를 제공하는 서버 및 해당 서비스를 이용하는 클라이언트들이 네트워크를 통해 묶임.
    • Computer-Server System : 클라이언트의 리퀘스트에 대한 인터페이스를 제공
    • File-Server System : 저장된 파일 혹은 저장소에 대한 인터페이스를 클라이언트에게 제공
  • Peer-to-Peer : 동등한 호스트이 서로 연결되는 분산 시스템으로, Client-Server 방식처럼 서비스의 제공자 및 사용자가 명확하게 나뉘는 대신 각각의 호스트가 두가지 역할을 모두 수행할 수 있는 환경. 따라서 파일 등을 제공하는 서버에 해당하는 컴퓨터가 따로 존재하지 않음 (경우에 따라 가벼운 서버 역할을 수행할 수도 있음.)
    • 각각의 노드들은 Peer으로 간주됨.
    • 노드들은 P2P 네트워크에 가입 ( ex : 토렌트 )
    • 노드들은 서로 다른 Peer 들에게 서비스를 request 하고(client), 다른 Peer의 request에 respond 함(server).
  • 클라우드 컴퓨팅 : 네트워크를 통해 컴퓨팅, 스토리지, 서비스 등을 전달하는 방식.
    • 보통 환경 구성에 있어 가상화를 이용. 
    • 클라우드의 종류
      • public cloud : 돈 내고 사용하는 클라우드 ex ) aws
      • private cloud : 회사가 소유한 클라우드로, 회사 내에서만 사용.
      • hybrid cloud : 두가지 성격을 모두 지닌 클라우드
    • 서비스 방식
      • Software as a Service(SaaS) : 인터넷을 통해 서비스를 제공. ex) 웹을 통해 엑셀 프로그램 사용 가능.
        • 소프트웨어 설치, 관리, 환경 설정 등에 시간을 들일 필요가 없음.
      • Platform as a Service(PaaS) : 인터넷을 통해 미리 준비된, 사용가능한 프로그래밍 스택을 제공하고, 사용자는 해당 환경을 통해 자신의 프로그램을 배포 가능. ex) Elastic Beanstalk
        • 개발은 내 컴퓨터에서 하되, 클라우드에서 제공하는 플랫폼을 통해 내 프로그램을 배포하는 것.
        • 각종 설정, 소프트웨어의 유지 및 관리 등이 현저히 감소함.
      • Infrastructure as a Service(IaaS) : 특정 인프라 자체를 클라우드를 통해 제공받는 것. PaaS 방식에서 각종 추가 기능 ( 미들 웨어, DBMS, 개발 툴, 비즈니스 분석 툴 등 ) 을 더한 것이라고 구분할 수 있음.
  • Real-time embeded system : 제한된 시간 내에 특정 동작의 실행이 보장되는, 제한된 환경에서 사용되는 시스템.
    • ex ) 미사일 발사 시스템, 재난과 관련된(1초라도 늦으면 매우 위험한) 시스템 들

 

 

'CS > 운영체제' 카테고리의 다른 글

[운영체제] CPU 스케줄링  (0) 2022.04.11
[운영체제] 스레드 & Concurrency  (0) 2022.04.06
[운영체제] 프로세스  (0) 2022.04.03
[운영체제] 운영체제  (0) 2022.03.17
[운영체제] OS 서비스/프로그램  (0) 2022.03.15