Post Lists

2019년 1월 30일 수요일

OS Chapter1 : Introduction


* OS 정의
  • OS는 컴퓨터 사용자와 컴퓨터 하드웨어 사이의 중간자 역할. 컴퓨터의 하드웨어 관리.
  • OS설계 이전에 OS의 목적이 정의되어야하는데, 여러 알고리즘과 전략에 대한 선택의 근거가 된다.
  • 컴퓨터 시스템 : 하드웨어, 운영체제, 응용 프로그램, 사용자
* 컴퓨터 시스템 구성
  • 컴퓨터 시작 -> bootstrap program (Read-Only Memory, Electrically Erasable Programmable Read-Only Memory, firmware).
  • bootstrap program이 운영체제 kernel을 찾고, 그것을 메모리에 load.
  • 모든 게 boot되면, 운영체제는 event발생을 기다리고, 이벤트 발생은 interrupt로 신호됨.
  • 하드웨어는 언제든지 system bus로 CPU에 신호를 보내서 interrupt 촉발
  • 소프트웨어는 system call (monitor call)이라고 불리는 특별한 연산을 실행하여 interrupt 촉발
  • CPU가 interrupted되면, 하던 일을 중단하고, 고정된 위치로 실행을 옮기는데, 고정된 위치는 해당 interrupt에 대한 서비스 루틴이 위치한 시작 주소를 포함하고 있음.
  • Word는 컴퓨터가 연산을 실행하는 연산 크기임.
  • 많은 오래된 설계들은 고정 위치에 interrupt address를 저장하지만, 좀 더 최근 아키텍쳐들은 system stack에 return address를 저장한다.
  • 메모리는 CPU의 내부 레지스터에 byte or word 단위로 움직이게하는 load 명령어와 레지스터의 내용을 메모리로 옮기는 store 명령어를 가진다.
  • 폰 노이만 아키텍쳐는 처음에 메모리에서 명령어를 가져오고, 그 명령어를 명령어 레지스터에 저장하고, 그 명령어가 해독되어 operands가 메모리로부터 가져와지게 하고 어떤 내부 레지스터에 저장되게 할지도 모른다. operands에 대해 명령어가 실행된 후에 그 결과는 메모리에 다시 저장될지도 모른다.
  • 일반 목적의 컴퓨터 시스템은 CPU와 common bus를 통해 연결된 많은 디바이스 컨트롤러로 구성된다.
  • 헌 device controller는 어떤 local buffer storage와 special-purpose registers의 한 집합을 유지한다. 그것은 그것이 통제하는 주변 장치와 그것의 local buffer storage 사이의 데이터를 움직이게하는 데 책임이 있다.
  • 일반적으로 운영체제는 각 device controller에 대한 device driver를 가진다. 이 device driver는 device controller를 이해하고, 운영체제의 나머지에게 디바이스에 대한 균일한 인터페이스를 제공한다.
  • 디바이스 드라이버는 디바이스 컨트롤러 내의 적절한 레지스터를 불러온다. 디바이스 컨트롤러는 무슨 행동을 취할지 결정하기 위해 이러한 레지스터의 내용들을 검사한다. 그 device controller는 그 디바이스에서 그것의 local buffer로 데이터 전이를 시작한다. 그 데이터 전이가 완료됐다면, 디바이스 드라이버에게 그것의 연산이 끝났다고 interrupt로 알린다. 그 디바이스 드라이버는 그러고나서 운영체제에게 control을 반환한다.
  • 위의 interrupt-drive I/O 형태는 작은 데이터를 옮기기에 괜챃지만, disk I/O 같은 bulk data movemnet에 대해서는 높은 오버헤드를 만들어낼 수 있고, 이것을 해결하기 위해 Direct Memory Access(DMA)가 사용된다. I/O device에 대한 버퍼, 포인터, 카운터가 설정된 후에, 그 디바이스 컨트롤러는 데이터의 전체블럭을 자신의 버퍼 스토리지에서 메모리로, CPU 개입없이 움직인다. 오직 block 당 한 번의 인터럽트가 생성되는데, 디바이스 드라이버에게 그 연산이 완료되었다고 말하려고 한다. low-speed devices에 대해 생성된 바이트당 인터럽트와 다르다. 
  • 고급 시스템은 버스 아키텍쳐보다는 switch를 사용한다. 이러한 시스템에서 수 많은 컴포넌트들은 다른 컴포넌트들에게 공유된 버스에서 몇 사이클동안 경쟁하는 대신 concurrently(병행하게) 이야기 할 수 있다.
* 컴퓨터 시스템 아키텍쳐
  • 거의 모든 single-processor systems는 user processes의 명령어를 포함하여 일반 목적의 명령어 집합을 실행할 수 있는 하나의 main CPU가 있다. 또 다른 목적은 특별한 목적의 프로세서로서, device-specific processors의 형태로 온다. 디바이스에 특정한 프로세서는 제한된 명령어 집합을 수행하고, 사용자 프로세스를 실행하지 않는다.
  • Multiprocessor systems(또는 parallel/multicore systems)은 가까운 커뮤니케이션에서 두 개 이상의 프로세서를 가지고, 컴퓨터버스와 가끔씩 clock, memory, 주변장치를 공유한다. 
  • 멀티프로세서 시스템은 세 가지 장점을 가지는데, 증가된 처리량, 규모의 경제, 증가된 신뢰성이다.
  • 생존한 하드웨어의 수준에 비례하여 서비스를 계속해서 제공하는 능력을 graceful degradation이라고 부르고, 그것을 넘어서는 시스템은 fault tolerant라고 불려진다.
  • multiple-processor system은 두 가지 유형이 있는데, 첫 번째는 asymmetric multiprocessing이다. 이것은 각 프로세서가 특별한 일을 할당 받는다. 보스 프로세서는 시스템을 통제하고, 다른 프로세서는 명령어를 위해 보스를 바라보거나 미리 정의된 일을 갖는다. 보스 프로세서는 워커 프로세서에게 일을 스케쥴링하고 할당한다.
  • 가장 흔한 시스템은 symmetric multiprocessing(SMP)를 사용하고, 각 프로세서는 운영체제 내에서 모든 일들을 수행한다. SMP는 모든 프로세서가 동료라는 것을 의미한다. 각 프로세서는 그것 자신만의 레지스터 집합을 가지고, private(or local) cache를 가진다. 그러나 모든 프로세서는 physical memory를 공유한다.
  • 그러나 데이터가 적절한 프로세서에 도달하도록 I/O를 세심히 컨트롤 해야하고, CPU가 분리되어있기에, 어떤 것을 쉬거나 어떤 것은 과부하되어 있을지도 모른다. 이러한 비효율성은 프로세서가 어떤 자료구조를 공유한다면 피해질 수 있다. 이러한 형태의 시스템은 메모리 같은 프로세스와 자원들이 다양한 프로세서에서 동적으로 공유되도록 하고, 프로세서간의 분산을 낮출 수 있다. 윈도우즈, 맥, 리눅스를 포함한 모든 현대의 운영체제들은 SMP에 대한 지원을 제공한다.
  • 멀티프로세싱은 메모리 접근 모델을 uniform memory access(UMA)에서 non-uniform memory access(NUMA)로 바꾸게 할 수 있다.
  • CPU 설계에서 최근 트렌드는 많은 computing cores를 단일 칩에 포함하는 것이다. 그러한 멀티프로세서 시스템들은 multicore라고 용어가 지어져있다. 그것은 단일 코어를 가진 여러 개의 칩들보다 더 효율적일 수 있는데, 칩에서의 커뮤니케이션이 칩간의 커뮤니케이션 보다 더 빠르기 때문이다. 게다가, 여러 코어를 가진 한 칩이 여러 싱글 코어 칩보다 더 적은 전력을 사용한다.
  • 멀티코어 시스템들이 멀티프로세서 시스템인 반면에, 모든 멀티프로세서 시스템들이 멀티코어이지 않다는 것을 주목하는 것이 중요하다. 멀티프로세서 시스템에 대해서 다룰 때, 우리는 여기에서 주로 좀 더 현대적인 용어인 multicore를 사용한다.
  • 여러 CPU들을 함께 모은 것이 clustered system인데, 그것들이 두 개 이상의 개별 시스템으로 구성되어있다는 점에서 멀티프로세서 시스템과 다르다. clustered 컴퓨ㅜ터들은 storage를 공유하고, local-area network LAN으로 연결되어 있거나 InfiniBand같은 더 빠른 interconnect로 연결되어있다.
  • Clustering은 asymmetrically or symmetrically하게 구조되어질 수 있다. 비대칭 클러스터링에서 한 기계는 hot-standby mode에 있고, 다른 것은 프로그램을 돌리고 있다. hot-standby host machine은 활동중인 서버만을 감시하다가, 그 서버가 실패한다면, 그 hot-standby host machine이 active server가 된다. symmetric clustering에서 두 개 이상의 호스트들이 프로그램을 돌리고 있고, 서로를 감시한다. 이 구조가 이용가능한 하드웨어를 모두 사용하기 때문에 좀 더 명백히 효율적이다. 클러스터링을 이용하는 프로그램은 parallelization(병렬화)라는 기법을 이용해야 하는데, 한 프로그램을 별개의 컴포넌트들로 나누고, 병렬로 클러스터에 있는 개별 컴퓨터에 작동하게 하는 것이다. 일반적으로 이러한 프로그램들은 클러스터에 있는 각 컴퓨팅 노드가 그것의 문제 부분을 해결한다면, 모든 노드의 결과들이 최종 답으로 합쳐지도록 설계된다.
  • 일반 OS에 없는, shared storage에 있는 같은 데이터에 많은 호스트들이 접근하게 해주는 Paralle clusters가 있다.


* 운영체제 구조
  • OS의 가장 중요한 측면 중 하나는 multiprogram 능력이다. Multiprogramming은 CPU가 항상 실행할 것을 가지게 하여 일(코드와 데이터)를 구성하여 CPU 효율을 증가시킨다. 아이디어는, 메인 메모리가 모든 일을 수용하기에 너무작아서, 그 일들은 job pool에서 disk에 초기에 유지된다. 이 pool은 메인 메모리의 할당을 기다리는 디스크에 거주중인 모든 프로세스들로 구성된다.
  • Time Sharing(or multitasking)은 multiprogramming의 논리적 확장이다. CPU는 그 기법으로, 그것들 사이에서 스위치하여 여러 일들을 수행하지만, 그 switches는 매우 자주 일어나서 그 사용ㅈ다르이 각 프로그램과 작동하는동안 상호작용할 수 있게 된다.
  • Time-shared 운영체제는 각 사용자에게 time-shared computer의 작은 부분을 제공하기 위해 CPU scheduling과 multiplrogramming을 사용한다.
  • 메모리에 불러와지고 실행되는 한 프로그램을 process라고 부른다.
  • Time sharing은 메모리에 여러 jobs들이 유지되는 것을 요구하는데, 여러 일들이 메모리에 불려와질 준비과 되어있지만, 그것들을 위한 충분한 공간이 없을 때, 그 시스템은 그것들 중에서 골라야 한다. 이러한 결정을 하는 것은 job scheduling 이고, 챕터 6에서 이야기 된다.
  • 메모리에 동시에 여러 프로그램들을 가지는 것은 어떤 메모리 관리 형태를 요구하는데, 챕터 8과 9에서 이야기 된다. 
  • 만약 여러 일들이 동시에 실행될 준비가 되어있따면, 그 시스템은 어떤 일이 처음에 실행되어야 할 지를 결정해야 만하는데, 이 결정을 하는 것이 CPU scheduling이고 챕터 6에서 이야기된다.
  • 여러 일들을 병행하여(concurrently) 실행하는 것은 서로에게 영향을 주는 능력이 프로세스 스케쥴링, 디스크 스토리지, 메모리 관리를 포함한 운영체제의 모든 단계에서 제한되도록 하는 것을 요구한다.
  • Time-sharing system에서, 운영체제는 합리적인 response time을 보장해야만 하는데, 이 목적은 swapping을 통해 가끔씩 이뤄진다. 그것으로 인해, 프로세스들은 메인메모리에서 디스크로 swapped in and out 되어진다.
  • 합리적인 반응 시간을 보장하는 좀 더 흔한 방식은 virtual memory이고, 완전히 메모리에 있지 않은 한 프로세스의 실행을 허용하는 기법이다 (챕터9) 가상메모리 전략의 주된 이점은 실제 물리적 메로리보다 더 큰 프로그램들을 사용자가 작동할 수 있도록 하는 것이다. 게다가, 그것은 메인 메모리를 크고 단일한 array of storage로 추상화시키는데, 그것은 physical memory로부터 사용자 관점의 logical memory를 분리해낸다.
  • Time-sharing은 파일시스템 제공해야만 한다 (챕터 11과 12). 그러므로 disk management가 제공되어야 한다 (챕터 10).
  • 게다가, time-sharing system은 부적절한 사용으로부터 자원들을 보호하는 기제를 제공해야 한다 (챕터 14)
  • 순서대로 실행을 보장하기 위해, 그 시스템은 job synchronization과 communication에 대한 메커니즘을 제공해야 한다 (챕터 5).
  • 그리고 jobs이 서로를 영원히 기다리는 deadlock에 갇히지 않도록 보장해야 한다 (챕터 7).
* 운영체제 연산
  • 현대 운영체제는 interrupt driven이다.
  • Events는 항상 interrupt 또는 trap의 발생으로 신호가 보내진다.
  • Trap(or exception)는 에러 (0으로 나누기, 무효한 메모리 접근 등) 또는 한 OS service가 수행되어야 한다는 사용자 프로그램으로 부터의 특정한 요청에 의해 발생되는 소프트웨어에 의해 생성되는 interrupt이다.
  • OS의 적절한 실행을 보장하기 위해, 우리는 OS code와 user-defined code의 실행 사이를 구분 할 수 있어야 한다. 
  • 적어도 우리는 두 개의 분리된 연산 모드들이 필요하다: user mode and kernel mode (kernel mode는 또한, supervisor mode, system mode, or privileged mode라고 불려진다). mode bit라고 불려지는 한 비트가 그 현재 모드를 나타내기 위해 컴퓨터 하드웨어에 추가된다: kernel(0) or user(1).
  • 컴퓨터 부트 시간에, 하드웨어는 커널 모드에서 시작한다. 그 OS는 그러고나서 불러와지고 user mode에서 user applications를 시작한다.
  • trap or interrupt가 발생할 때 마다, 하드웨어는 user mode에서 kernel mode로 스위치 한다. 따라서, OS가 컴퓨터의 통제를 얻을 때 마다, 그것은 kernel mode에 있다. 그 시스템은 user program에 통제를 넘기기 전에 user mode로 항상 스위치 해야 한다.
  • 연산의 Dual mode는 우리에게 잘못된 사용자로부터 OS를 그리고 서로로부터 잘못된 사용자를 보호하는 수단을 제공한다. 우리는 이 보호를 해를 끼칠지도 모르는 machine 명령어를 privileged instructions으로 지정하여 해낸다. 그 하드웨어는 privileged instructions이 오직 커널 모드에서만 실행되도록 한다. 만약 사용자 모드에서 privileged instruction이 실행되게 만들어진다면, 그 하드웨어는 명령어를 실행하지 않지만, 오히려 그것을 불법으로 간주하고, 그것을 OS에 trap한다.
  • virtualization(가상화)를 지원하는 CPU들은 빈번히 언제 virtual machine manager(VMM)이 시스템의 통제에 있는지를 가리키는 별개의 모드를 가진다.
  • System calls은 사용자 프로그램이 OS에게 사용자 프로그램을 대신해서 OS에 보유된 업무를 수행하라고 요청하는 수단을 제공한다. System call이 실행될 때, 그것은 일반적으로 하드웨어에 의해 software interrupt라고 다뤄진다. System-call service routine은 OS의 한 일부이다. 그 커널은 무슨 system call이 발생했는지를 결정하기 위해 interrupting instruction을 검사한다. 그 Kernel은 그 파라미터가 옳은지 합법적인지를 검증하고, 요청을 실행하고, system call 에 따라 그 명령어에 대한 통제를 반환한다.
  • OS는 CPU에 대한 통제를 보유해야만 한다. 우리는 한 사용자 프로그램이 무한 루프에 빠지거나 시스템 서비스를 호출하는데 실패하고, OS에 결코 control을 반환하지 않도록 할 수 없다. 이 목적을 달성하기 위해, 우리는 timer를 사용한다.
  • timer는 정해진 주기 후에 그 컴퓨터에 interrupt하도록 설정되어질 수 있고, 그 주기는 고정이거나 가변할 수 있다. 가변 타이머는 일반적으로 고정비율 clock과 counter로 구현된다. OS는 counter를 설정한다. clock이 tick할 때 마다, 그 카운터는 감소하고, 0에 도달하면 인터럽트가 발생한다.
* 프로세스 관리 (챕터 3 ~ 5)
  • 실행중인 프로그램이 프로세스이다. job 또는 time-shared program은 프로세스이다.
  • 프로세스는 일을 수행하기 위해 CPU time, memory,files, I/O device 같은 것들을 포함하여 어떤 자원들이 필요하다.
  • signle-threaded process는 다음에 실행할 명령어를 명시하는 한 개의 program counter를가진다.
  • multithreaded process는 여러 개의 program counters를 가지고, 각각은 주어진 thread에 대해 실행할 다음 명령어를가리킨다.
  • 프로세스는 한 시스템에서 work의 단위이다. system은 프로세스들의집합으로 구성되고, 그들 중 어떤 것은 OS 프로세스이고, 나머지는 사용자 프로세스이다. 모든 이러한 프로세스들은 잠재적으로 병렬로 실행될 수 있다 .
  • OS는 프로세스 관리와 관련하여 다음의 활동들에 책임이 있다:
    • CPU에서 프로세스와 쓰레드들을 스케쥴링하기
    • 사용자와 시스템 프로세스 둘 다를 생성하고 제거하기
    • 프로세스를 중지하고 재개하기
    • 프로세스 동기화를 위한 메커니즘 제공
    • 프로세스 커뮤니케이션을 위한 메커니즘 제공
* 메모리 관리 (챕터 8 ~ 9)
  • 메인 메모리에서 각 byte는 자신의 주소를 가진다.
  • 메인 메모리는 CPU와 I/O device들에서 공유되는 빠르게 접근 가능한 데이터 저장소이다.
  • 폰 노이만 아키텍쳐에서, central processor는 메인 메모리에서 instruction-fetch cycle동안 명령어를 읽어오고, data-fetch cycle동안 메인 메모리로부터 데이터를 읽어오고 쓴다.
  • 메모리 관리 전략을 선택할 때, 특히 시스템의 하드웨어 디자인을 고려해야 한다.
  • OS는 메모리 관리와 관련하여 다음의 활동들에 책임이 있다:
    • 메모리의 어떤 부분이 현재 사용되고 있는지와 누가 그것들을 사용하는지를 추적하기
    • 어떤 프로세스 (또는 프로세스의 일부)와 데이터가 메모리로 들어가고 메모리에서 나와야 하는지를 결정하기
    • 필요할 때 메모리 공간을 할당하고 해제하기
* Storage Management (챕터 9 ~ 13)
  • 운영체제는 file이라는 logical storage unit을 정의하기 위해 그것의 storage devices의 물리적 특성으로부터 추상화한다. 운영체제는 physical media로 files들을 매핑하고, storage devices를 통해서 이러한 파일들에 접근한다.
  • 컴퓨터들은 Magnetic disk, optical disk, magnetic tape같은 physical media에 정보를 저장할 수 있다. 각각은 자신의 특징과 물리적 구성을 가진다. 각 medium은 disk drive 또는 tape drive같은 그것 자신의 고유의 특성을 가진 장치에 의해 조종된다. 이러한 특성들은 access speed, capacity, data-transfer rate, access method를 포함한다.
  • OS는 tapes or disks같은 mass-storage media와 그것들을 제어하는 디바이스들을 관리하여 파일의 추상적 개념을 구현한다.
  • OS는 file management와 관련하여 다음의 활동들에 책임이 있다: (챕터 11 ~ 12)
    • 파일을 생성하고 제거하기
    • 파일을 구성하기 위해 폴더 생성하고 제거하기
    • 파일과 폴더를 조작하기 위한 primitives 제공
    • 파일들을 secondary storage에 매핑하기
    • 안정적인(없어지지 않는) storage media에 파일을 백업하기
  • 대부분의 현대 컴퓨터 시스템은 디스크를 프로그램과 데이터를 위한 주요한 on-line storage medium으로서 사용한다. OS의 disk management와 관련하여 다음의 활동들에 책임이 있다: (챕터 10)
    • Free-space management
    • Storage 할당
    • Disk scheduling
  • secondary storage는 빈번히 사용되기 때문에, 그것은 효율적으료 사용되어야 한다. 한 컴퓨터의 전체 속도는 디스크 subsystem과 그 subsystem을 조작하는 알고리즘에 달려있을지도 모른다.
  • Caching은 컴퓨터 시스템의 한 중요한 원리이다. 다른 캐시들은 하드웨어에서 전적으로 구현된다. 예를들어 대부분의 시스템들은 다음에 실행될 거라고 예상되는 명령어를 보유한 명령어 cache를 가지고 있다.
  • Cache management는 중요한 설계 문제이다. cache size와 replacement policy의 세심한 선택은 크게 증가된 성능을 만들 수 있다. (챕터 9)
  • cache에서 CPU와 레지스터에 가는 데이터 전송은 보통 하드웨어 함수이고, OS의 개입이 없다. 대조적으로, disk에서 메모리로 가는 데이터의 전송은 보통 OS에 의해 제어된다.
  • 멀티프로세서 환경에서의 cache 문제는 복잡해진다. A의 복사본이 여러 캐쉬에 존재하고, 그 중 하나가 업데이트 된다면, 다른 것에 있는 A데이터도 업데이트 되도록 해야한다. 이 상황은 cache coherency라고 불려지고, 보통 하드웨어 문제이다 (OS 수준 밑에서 다뤄진다).
  • 분산 환경에서 그 상황은 심지어 더 복잡해진다. 복사본이 한 장소에서 업데이트 될 때, 모든 다른 복사본들이 가능한 빠르게 최신으로 업데이트 되도록 해야한다. (챕터 17)
  • OS의 목적들 중 하나는 사용자로부터 특정한 하드웨어 장치들의 특이성을 숨기는 것이다. 리눅스의 경우 I/O 장치의 특이성을 OS의 bulk로부터 I/O subsystem으로 인해 숨겨진다. 
  • I/O Subsystem은 몇 가지 컴포넌트들로 구성된다:
    • buffering, caching and spooling을 포함하는 memory-management component
    • 일반적인 device-driver interface
    • 특정한 하드웨어 장치에 대한 드라이버
  • 디바이스 드라이버만이 할당된 특정 디바이스의 특이성을 안다. (챕터 13)
* Protection and Security (챕터 14 ~ 15)

  • Protection은 프로세스 또는 사용자의 컴퓨터에 정의된 리소스에 접근을 제어하는 기제이다. 이 메커니즘은 그 제어를 강화하거나 부과되는 제어를 명시할 수단을 제공한다. Protection은 component subsystems 사이의 인터페이스에서 잠복된 에러를 탐지하여 신뢰성을 향상시킬 수 있다. protection-oriented system은 authorized and unauthorized 사용 사이를 구분하는 수단을 제공한다. (챕터 14)
  • 외부와 내부의 공격으로부터 시스템을 보호하는 것이 Security의 일이다. 그러한 공격들은 넓은 범위를 가지고, 바이러스, 웜, denial-of-service attacks(한 시스템의 자원의 모든 것을 사용하고 적법한 사용자를 시스템 밖으로 나가게 하는 것), 신분 절도, 서비스 절도 (한 시스템의 인가받지 않는 사용)을 포함한다. 이러한 일을 방지하는 것은 어떤 시스템에서 OS의 기능으로 고려되지만, 반면에 다른 시스템들은 그것을 정책 또는 부가적인 소프트웨어에 남긴다. (챕터 15)

댓글 없음:

댓글 쓰기