운영체제 - ch.01

Jajuna_99·2023년 4월 20일
0

운영체제

목록 보기
2/10

운영체제 - 1장 서론

운영체제 : 컴퓨터 하드웨어를 관리하는 소프트웨어, 응용 프로그램을 위한 기반을 제공하며 컴퓨터 사용자와 컴퓨터 하드웨어 사이에서 중재자 역할을 수행

운영체제의 역할을 탐구하기 위해서는 먼저 컴퓨터 하드웨어의 구성과 구조 (CPU, 메모리 및 입출력 장치, 저장 장치)를 이해하는 것이 중요하다. 운영체제는 이러한 자원들을 프로그램에 할당하는 것이다.

운영체제가 할 일

컴퓨터 시스템은 대개 네 가지 구성요소인 하드웨어, 운영체제, 응용 프로그램 및 사용자로 구분할 수 있다.

  • 하드웨어 : CPU, I/O 장치로 구성되어 기본 계산용 자원을 제공한다.

  • 응용 프로그램 : 워드 프로세서, 스프레드시트, 컴파일러, 웹 브자우저 등 사용자의 계산 문제를 해결하기 위해 이들 자원이 어떻게 사용될지 정의한다.

  • 운영체제 : 다양한 사용자를 위해 다양한 응용 프로그램 간의 하드웨어 사용을 제어하고 조정한다.

  • 사용자 : 사람, 기계, 다른 컴퓨터 등 컴퓨터를 제어하는 개체

사용자 관점

사용자가 독점하도록 설계 되어있는 운영체제는 대부분 사용의 용이성을 위해 설계 되고 성능에 약간 신경을 쓰고 다양한 하드웨어와 소프트웨어 자원이 어떻게 공유되는냐의 자원의 이용에는 신경을 쓰지 않는다.

메인프레임이나 미니컴퓨터 같은 공유 컴퓨터(shared computer)는 모든 사용자를 만족시켜야 한다.

워크스테이션 같은 전용 시스템들은 전용 자원이 있지만 서버에서 공유 자원을 자주 끌어다 사용한다.

모바일 장치의 터치스크린 Siri와 같은 음성 인식 인터페이스, 가전 제품이나 자동차 내의 내장형 컴퓨터 등은 사용자의 개입 없이 작동하도록 설계되어 있다.

시스템 관점

컴퓨터 관점에서 운영체제는 하드웨어와 가장 밀접하게 연관된 프로그램이다. 따라서 우리는 운영체제를 자원 할당자로 볼 수 있다.

컴퓨터 시스템은 문제를 해결하기 위해 요구되는 여러가지 자원들 (CPU 시간, 메모리 공간, 저장장치 공간, 입출력 장치 등)을 가진다.

운영체제는 이들 자원의 관리자로서 동작한다. 즉, 운영체제는 제어 프로그램이다.

제어 프로그램은 컴퓨터의 부적절한 사용 방지, 사용자 프로그램의 수행을 제어한다. 운영체제는 특히 입출력 장치의 제어와 작동에 깊이 관여한다.

운영체제의 정의

운영체제는 무수히 많은 디자인과 용도 때문에 보편적으로 인용되는 정의는 없다.

컴퓨팅은 처음 암호 깨기와 탄도 계산과 같은 군사용 밑 인구조사 계산과 같은 정부 업무등의 공정 목적 시스템으로 전용되었다.

이들 초기의 컴퓨터들이 범용의 다기능 대형컴퓨터로 발전하였으며 그즈음 운영체제가 탄생하였다.

1960년대에 무어의 법칙이 직접회로의 트랜지스터 수가 18개월마다 배가할 것이라고 예측했으며 이 법칙은 지켜져 왔다.

운영체제는 유용한 컴퓨팅 시스템을 만드는 문제를 해결할 수 있는 합리적인 방법을 제공하기 때문에 제공한다.

운영체제에는 커널(컴퓨터에서 항상 실행되는 프로그램)과 함께 두 가지 다른 유형의 프로그램이 있다. 시스템 프로그램응용 프로그램이다.

  • 시스템 프로그램 : 운영체제와 관련되어 있지만 반드시 커널의 일부일 필요는 없는 프로그램

  • 응용 프로그램 : 시스템 작동과 관련되지 않은 모든 프로그램

운영체제에는 항상 실행 중인 커널, 응용 프로그램 개발(DB, multimedia, graphics)을 쉽게 하고 기능을 제공하는 미들웨어 프레임워크 및 시스템 실행 중에 시스템을 관리하는 데 도움이 되는 시스템 프로그램(운영체제는 맞지만 커널은 아닌)이 포함된다.

응용 프로그램은 운영체제와 관련이 없는 프로그램을 말한다.

컴퓨터 시스템의 구성

버스 : 하나 이상의 CPU와 구성요소와 공유 메모리 사이의 액세스를 제공하는 통로

각 장치 컨트롤러는 특정 유형의 장치(디스크 드라이브, 오디오 장치, 그래픽 디스플레이)를 담당한다.

장치 컨트롤러는 일부 로컬 버처 저장소와 특수 목적 레지스터 집합을 유지 관리한다. 그리고 제어하는 주변 장치와 로컬 버퍼 저장소 간에 데이터를 이동한다.

일반적으로 운영체제에는 각 장치 컨트롤러마다 장치 드라이버가 있다.

장치 드라이버 : 장치 컨트롤러의 작동을 잘 알고 있고 나머지 운영체제에 장치에 대한 일관된 인터페이스를 제공

CPU와 장치 컨트롤러는 병렬로 실행되어 메모리 사이클을 놓고 경쟁한다. 공유 메모리를 질서 있게 액세스하기 위해 메모리 컨트롤러는 메모리에 대한 액세스를 동기화한다.

인터럽트

입출력 장치와 CPU는 병렬로 실행될 수 있다.

각 장치 컨트롤러는 특정 기기 유형을 맡고, 로컬 버퍼를 갖는다. 그리고 각 장치 컨트롤러 유형은 운영체제 장치 드라이버(device driver)로 관리한다.

입출력 작업을 시작하기 위해 장치 드라이버 장치 컨트롤러의 적절한 레지스터에 값을 적재한다.

그런 다음 장치 컨트롤러는 이러한 레지스터의 내용을 검사하여 수행할 작업을 결정한다.

컨트롤러는 장치에서 로컬 버퍼로 데이터 전송을 시작한다. 데이터 전송이 완료되면 장치 컨트롤러는 장치 드라이버에게 작업이 완료되었음을 알린다.

그런 다음 장치 드라이버는 읽기 요청이면 데이터 또는 데이터에 대한 포인터를 반환하며 운영체제의 다른 부분에 제어를 넘긴다.

다른 작업의 경우 장치 드라이버는 "쓰기 완료" 또는 "장치 사용 중"과 같은 상태 정보를 반환한다. 컨트롤러는 장치 드라이버에게 작업을 인터럽트를 통해 알린다.

개요

하드웨어는 어느 순간이든 시스템 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킬 수 있다.

(컴퓨터 시스템에는 많은 버스가 있지만 시스템 버슨ㄴ 주요 구성요소 사이의 주요 통신 경로이다.)

인터럽트는 다른 많은 목적으로도 사용되며 운영체제와 하드웨어의 상호 작용 방식의 핵심 부분이다.

CPU가 인터럽트 되면, CPU는 하던 일 중단하고 즉시 고정된 위치로 실행을 옮긴다.

이러한 고정된 위치는 일반적으로 인터럽트롤 위한 서비스 루틴이 위치한 시작 주소를 가지고 있다.

그리고 인터럽트 서비스 루틴이 실행된다. 인터럽트 서비스 루틴의 실행이 완료되면, CPU는 인터럽트 되었던 연산을 재개한다. 이러한 연산의 시간 일정(time line)이 있다.

각 컴퓨터 설계는 자신의 인터럽트 메커니즘을 가지고 있으며, 몇 가지 기능은 공통적이다.

인터럽트는 적절한 서비스 루틴으로 제어를 전달한다. 이러한 전달을 관리하는 직선적인 방법은 적절한 정보를 조사하는 일반적인 루틴을 호출하는 방법이다. 이 루틴은 인터럽트 고유의 핸들러를 호출하는 방법이다.

그러나, 인터럽트는 매우 빈번하게 발생되어 빠르게 처리되어야 한다. 필요한 속도를 제공하기 위해 인터럽트 루틴에 대한 포인터들의 테이블을 대신 이용할 수 있따. 이 경우 중간 루틴을 둘 필요 없이, 테이블을 통하여 간접적으로 인터럽트 루틴이 호출될 수 있다.

일반적으로 포인터들의 테이블은 하위 메모리에 저장된다. (첫 100개 정도의 위치) 이들 위치에는 여러 장치에 대한 인터럽트 서비스 루틴의 주소가 들어 있다.

인터럽트가 요청되면, 인터럽트를 유발한 장치를 위한 인터럽트 서비스 루틴의 주소를 제공하기 위해 이 주소의 배열, 즉 인터럽트 벡터가 인터럽트 요청과 함께 주어진 고유의 유일한 장치 번호로 색인된다. 서로 다른 운영체제가 이러한 방법으로 인터럽트를 처리한다.

인터럽트 구조는 또한 인터럽트된 모든 정보를 저장해야 인터럽트를 처리한 후 이 정보를 복원할 수 있다. 만약 인터럽트 루틴이 처리기의 상태를 변경할 필요가 있다면, 인터럽트 루틴이 처리기의 상태를 변경할 필요가 있다면, 인터럽트 루티은 반드시 명시적으로 현재의 상태를 저장하여야 하며, 복귀하기 전에 상태를 복원해야 한다.

인터럽트를 서비스한 후, 저장되어 있던 복귀 주소를 프로그램 카운터에 적재하고, 인터럽트에 의해 중단되었던 연산이 인터럽트가 발생되지 않았던 것처럼 다시 시작한다.

trap이나 exception소프트웨어가 생성한 인터럽트로 오류나 사용자 요청으로 생성된다.

운영체제는 interrupt driven이다.

CPU가 모든 명령어를 처리한 것을 감지하기 위해, CPU 하드웨어에는 interrupt-request line이라는 선이 있다.

연산

운영체제에는 CPU의 상태를 보존하기 위해 레지스터프로그램 카운터를 저장한다.

장치 컨트롤러가 인터럽트 요청 라인에 신호를 선언하여 인터럽트를 발생(raise)시키고 CPU는 인터럽트를 포착(catch)하여 인터럽트 핸들러로 디스패치(dispatch)하고 핸들러는 장치를 서비스하여 인터럽트를 지운다(clear).

인터럽트에는 2가지 종류가 있다. polled interrupt는 인터럽트가 있는지 없는지만 알려주고 vectored interrupt는 발생한 주소까지 알려줘서 CPU가 바로 서비스할 수 있게 하는 것이다.

대부분의 CPU에는 2개의 인터럽트 요청 라인이 있다.

  • nonmaskable interrupt : 복구 불가능한 오류 (메모리 오류 같은)
  • maskable interrupt : 장치 컨트롤러가 서비스를 요청하기 위해 사용되고, 더 중요한 명령 시퀸스를 실행하기 전에 CPU에 의해 꺼질 수 있다.

interrupt chain : 인터럽트 벡터 안의 각 원소가 인터럽트 핸들러 리스트의 헤드를 가리킨다. (인터럽트 핸들러가 모든 인터럽트 소스를 검색할 필요를 줄이기 위한 해결 방안)

interrupt priority level : CPU가 모든 인터럽트를 순차적으로 마스킹하는 것이 아니라 높은 우선순위부터 낮은 우선순위 순으로 인터럽트를 처리하는 것이다. 높은 우선순위 인터럽트는 선점(preempt)할 수 있다.

저장장치 구조

메인 메모리 : 크기가 큰 저장장치 중에 CPU가 직접 접근할 수 있는 유일한 저장 장치

  • 대부분의 범용 컴퓨터는 프로그램 대부분을 메인 메모리(random access memory)라는 재기록 가능한 메모리에서 가져온다. 보통 휘발성이 있고 DRAM의 기술로 구현된다.

보조저장장치 : 메인 메모리의 확장으로 사용되고 비휘발성 성질을 가진다.

부트스트랩 프로그램 : 컴퓨터 전원을 켤 때 가장 먼저 실행되는 프로그램으로 운영체제를 적재한다.

펌웨어 : 쓰기 작업이 자주 발생하지 않고 비휘발성인 저장장치

하드 디스크 드라이브(HDD) : 철이나 유리판으로 magnetic recording material로 덮혀있다.

  • 디스크 표면은 논리적인 단위로 트랙(track)으로 나뉜다. 그리고 섹터로 다시 분류된다.
  • 디스크 컨트롤러는 컴퓨터와 장치의 논리적 상호작용을 결정한다.

비휘발성 메모리(NVM) : HDD보다 빠르고 비휘발성인 메모리, 여러가지 기술이 있고 용량, 성능 증가와 가격 하락으로 점점 대중적으로 사용된다.

저장장치는 계층적 구조를 띈다.

장치 드라이버 : 각 장치 드라이버가 입출력 장치를 관리할 수 있게 해주는 장치, 컨트롤러와 커널의 사이의 획일화된 인터페이스를 제공한다.

입출력 구조

인터럽트 구동 I/O의 형태는 소량의 데이터를 이동하는 데는 좋지만, NVS I/OO와 같은 대량 데이터 이동에 사용될 때 높은 오버헤드를 유발할 수 있다. 이를 위해 직접 메모리 엑세스(DMA)가 사용된다.

장치에 대한 버처 및 포인터, 입출력 카운트를 세팅한 후 장치 제어기는 CPU의 개입 없이 메모리로부터 자신의 버퍼 장치로 또는 버퍼로부터 메모리로 데이터 블록 전체를 전송한다.

속도가 느린 장치처럼 한 바이트마다 인터럽트가 발생하는 것이 아니라 블록 전송이 완료될 때마다 인터럽트가 발생한다.

장치 컨트롤러가 전송 작업을 수행하고 있는 동안 CPU는 다른 작업을 수행할 수 있다.

컴퓨터 시스템 구조

다중 처리 시스템

대부분의 시스템이 단일 목적 시스템이었지만, Multiprocessors 시스템의 중요성이 커지고 있다. parallel systems, tightly-douple systems라고도 불린다.

장점으로는 increased throughput, econemy of scale, increased reliability 등이 있다.

두 가지 유형으로는

  • Asymmetric Multiprocessing : 각 프로세서가 특정한 작업에 할당되는 구조
  • Symmetric Multiprocessing(SMP) : 각 프로세서가 모든 작업에 할당되는 구조

단일 칩에 상주하는 다중 코어 시스템 역시 다중 처리기에 포함된다.

칩 내 통신이 칩 간 통신보다 빠르고 효율적이고 전력 사용도 덜 함으로 여러 분야에서 중요한 기술이다.

NUMA(non-uniform memory access) : 각 CPU에 작고 빠른 로컬 버스를 통해 액세스 되는 자체 로컬 메모리를 제공하는 방식. 모든 CPU가 공유 시스템 연결로 연결되어 모든 CPU가 하나의 물리적 주소 공간을 공유한다.

클러스터형 시스템

멀티프로세서와 같이 여러 CPU를 가지는 시스템이지만, 둘 이상의 시스템 혹은 노들들을 연결해 구성한다는 점에서 다르다.

보통 storage-area network(SAN)을 통해 저장장치를 공유한다.

distributed lock manager(DLM)으로 공유 저장장치에 conflict를 회피한다.

클러스터링은 두 가지로 분류할 수 있다.

Asymmetric clustering : 다른 컴퓨터들이 실행하는 동한 한 컴퓨터가 긴급 대기(hot-standby) 상태 유지

Symmetric clustering : 둘 이상의 호스트들이 응용 프로그램을 실행하고 서로를 모니터링한다.

운영체제의 작동

부트스트랩 : 시스템을 작동시키는 간단한 코드로, 커널을 로드한다.

시스템 데몬(system daemons) : 커널 밖에서 제공되는 서비스들

커널 또한 interrupt driven이고 HW와 SW중 하나에서 발생한다.

HW는 장치 중 하나에서 인터럽트가 발생되고 SW는(exception, trap) SW자체 에러, 운영체제 서비스 요청(시스템 콜), 다른 프로세스 문제(무한 순환, 프로세스끼리 서로 수정, 운영체제 수정 등)가 있다.

멀티 프로그래밍과 다중 태스킹

멀티 프로그래밍(batch system) : 효율이 중요한 시스템이다. (병원진료)

  • 한 명의 사용자가 CPU와 입출력 장치를 항상 모두 점유할 수 없다.
  • 멀티 프로그래밍은 (code and data)들을 관리해서 CPU가 항상 한 개의 잡만 수행하게 한다.
  • 시스템의 모든 잡들은 저장장치에 항상 기억되어 있다.
  • 잡 스케줄링을 통해 항상 한 개 잡이 선택되고 실행된다.
  • 시스템이 대기 상태로 들어간다면, 운영체제는 다른 잡으로 스위치한다.

다중 태스킹(timesharing): 다중 프로그래밍의 논리적 확장으로, 다중 태스킹 시스템에서 CPU는 여러 프로세스를 전환하며 프로세스를 실행하지만 전환이 자주 발생하여 사용자에게 빠른 응답 시간을 제공하게 된다.

  • 응답시간은 1초보다도 빨라야한다.
  • 각 사요자들은 적어도 메모리에서 적어도 한 개의 실행중인 프로그램이 있다. (process)
  • 여러 프로세스가 동시에 실행할 준비가 되면 시스템은 다음에 실행할 프로세스를 선택해야 한다. (CPU 스케줄링)
  • 프로세스가 메모리 크기에 맞지 않는다면 스와핑이 프로세스들을 옮기면서 수행한다.
  • 가상 메모리 : 일부만 메모리에 적재된 프로세스의 실행을 허용하는 기법이다. (물리 메모리보다 큰 프로세스 실행 가능)

이중-모드와 다중모드 운용

Dual-mode 운용은 운영체제가 다른 시스템 요소로부터 자신이 직접 보호할 수 있게 한다.

즉, 적어도 사용자 모드, 커널 모드(특권 모드, 수퍼바이저 모드, 시스템 모드)가 필요하다.

  • 시스템이 사용자 코드를 실행하는지 커널 코드를 실행하는 구별할 수 있다.
  • 몇 명령어들은 특권 형태로 디자인되어 있는데 커널 모드에서만 실행이 가능하다.
  • 시스템 콜은 커널 모드로 바꾸고 call resets를 사용자에게 반환한다.

CPU들은 점점 다중 모드 운용을 지원하는 추세이다. (VMM 모드의 게스트 VMs가 그러하다)

타이머

타이머 : 무한 루프, process hogging에 빠지지 않도록 방지해준다. 일정 시간이 지나면 컴퓨터를 인터럽트 해주는 set이다.

  • 물리적인 시계에 의해 줄어드는 카운터를 갖고 있다. 카운터가 0이 되면 인터럽트를 생성한다.
  • 운영체제가 카운터를 세팅한다.
  • 프로세스를 스케줄링 하기 전에 세팅하여 컨트롤을 회복하거나, 할당 시간이 지난 프로그램을 정지시킨다.

자원 관리

프로세스 관리

프로세스는 실행중인 프로그램이다. 시스템안의 작업 실행 단위이다. 프로그램은 수동적 개체이고 프로스세스는 능동적 개체이다.

프로세스는 작업을 위해서는 자원(CPU, memory, I/O files, initialization data)을 필요로 하고, 작업을 끝내기 위해서는 재사용할 자원을 필요로 한다.

싱글 스레드 프로세스는 다음 명령어 수행 장소를 알려주는 한 개의 프로그램 카운터를 갖고 있다. 프로세스는 명령어가 완료될 때까지 순차적으로, 하나씩 수행한다.

다중 스레드 프로세스는 각 스레드마다 한 개의 프로그램 카운터를 갖는다. 보통 많은 프로세스와 여러 사용자, 여러 운영체제가 한 개 이상의 CPU에서 실행되는 시스템이다.

운영체제는 프로세스 관리를 연결하는 활동들에 대한 다음 책임이 있다.

  • 사용자와 시스템 프로세스 둘 다 생성과 삭제
  • 프로세스의 지연과 재개
  • 프로세스 동기화 메커니즘 제공
  • 프로세스 통신 메커니즘 제공
  • 교착 상태 핸들링 메커니즘 제공

메모리 관리

프로그램을 실행시키기 위한 명령어들은 전부(혹은 부분적으로) 메모리에 있다.

프로그램에서 필요한 모든 모든 데이터들도 메모리에 있다.

CPU utilization 최적화와 컴퓨터 반응을 사용자에게 준다. 메모리 관리는 무엇이 메모리에 있을지, 언제 있을지 결정하는 것이다.

운영체제의 메모리 관리 담당 업무

  • 메모리의 어느 부부이 현재 사용되고 있으며 어느 프로세스에 의해 사용되고 있는지를 추적해야 한다.
  • 필요에 따라 메모리 공간을 할당하고 회수해야 한다.
  • 어떤 프로세스들은 메모리에 적재하고 제거할 것인가를 결정해야 한다.

이후 수정 예정

파일 시스템 관리

대용량 저장장치 관리

캐시 관리

보안과 보호

가상화

분산 시스템

커널 자료구조

계산 환경

profile
Learning bunch, mostly computer and language

0개의 댓글