취업,면접 대비

면접 대비 운영체제 공부 ( abraham 1장)

studying develop 2019. 12. 6. 16:09

1. 컴퓨터 시스템의 구성

지금 까지 책을 쭉 본적도 없고 1장을 너무 개무시 한거 같다. 면접때 받은 질문이 1장에 있네 ㅋㅋㅋ

1.1.3 운영 체제의 정의

컴퓨터 시스템에서 자원을 제어하고 할당하는 수행하는 소프트웨어

보다 일반적인 정의의 운영체제는 컴퓨터에서 항상 수행되는 프로그램으로 커널이라 부른다.
프로 그램은 3개로 나뉘는듯

커널:
핀토스 하면서 어느 파일이 커널인지 구분을 못하겠던데... thread.c 이런거 그냥 다 커널인건가 커널을 호출한다는 말이 이해가 안된다 ㅠ

시스템 프로그램: 운영체제와 연관되어 있으며 커널의 일부분은 아니라함..?
응용 프로그램: 시스템 운영과 상관없는 모든 프로그램.

미들웨어?.. 데이터베이스,멀티미디어,그래픽스등을 제공한다함...

1.2.1 컴퓨터 시스템 연산

컴퓨터 시스템에서 연산의 과정을 요약해 보겠다.

  1. 컴퓨터 구동시 ROM의 펌웨어(부트스트랩 프로그램)가 모든 컴퓨터 하드웨어를 포함한 시스템의 모든 면을 초기화한다.
  2. 부트스트랩 프로그램이 운영체제의 커널을 찾아 메모리에 적재 한다.커널이 적재되고 수행된다.

이 상황에서 시스템과 사용자에게 서비스 제공이 가능하다. 커널이 아닌 시스템 프로그램도 서비스를 제공한다
시스템 프로그램은 부트 시에 메모리에 적재되어 커널이 수행되는 동안 시스템 프로세스,시스템 디먼이 된다
unix에서는 첫 시스템 프로세스가 init 이라함 init이 다른 demon을 실행함
이 단계에서는 시스템이 event를 기다린다.

  1. 소프트웨어 또는 하드웨어에서 인터럽트가 발생한다.

하드웨어의 경우 시스템 버스로 CPU에 신호를 보내 인터럽트를 발생시킨다
소프트웨어는 시스템 호출이라는 연산을 실행하여 인터럽트를 발생시킨다.

아래에 인터럽트 과정을 설명해 보겠다.

  1. CPU가 인터럽트 되면 CPU는 하던 일을 중단하고, 고정된 위치로 이동한다.
  2. 인터럽트 서비스 루틴이 실행된다.
  3. 완료시 CPU는 이전 연산을 재개한다.

좀 더 자세히 인터럽트 메커니즘을 설명해보겠다...

  1. 인터럽트 발생시 인터럽트 정보를 조사하는 일반적인 루틴을 호출한다.

? 인터럽트 정보를 조사하는 루틴은 뭐지..이게 그 인터럽트 벡터 테이블을 보고 인터럽트 서비스 루틴을 실행하는 건가?

  1. 이어서 인터럽트 정보를 조사하는 루틴은 고유의 인터럽트 핸들러를 호출한다.

  2. 빠르게 인터럽트를 처리하기 위해 인터럽트 루틴에 대한 포인터들의 테이블을 이용할 수 있다. 이 경우 중간 루틴을 둘 필요 없이, 테이블을 통하여 간접적으로 인터럽트 루틴이 호출 될 수 있다.

테이블을 통해 인터럽트 루틴을 호출 할 수 있다, 포인터들의 테이블은 하위 메모리에 저장된다

인터럽트 핸들러 대신에 인터럽트 테이블을 사용하는 건가?

  1. 인터럽트가 요청시 인터럽트를 유발한 장치를 위한 인터럽트 서비스 루틴의 주소를 제공하기 위해, 이 주소의 배열인 인터럽트 벡터가 인터럽트 요청과 함께 주어진 고유의 유일한 장치 번호로 색인된다.

인터럽트 벡터는 배열인건다..? 고유의 유일한 장치 번호?

인터럽트 루틴으로 검색해 보았다.
인터럽트

용어적으로 두가지 햇갈린거 같다.

  • 인터럽트 서비스 루틴 : 인터럽트시 수행되는 인터럽트 내용이다, 즉 인터럽트의 할일. 위키 피디아에 의하면! 인터럽트 핸들러(영어: interrupt handler) 또는 인터럽트 서비스 루틴(영어: interrupt Service Routine, ISR)은 인터럽트 접수에 의해 발생되는 인터럽트에 대응하여 특정 기능을 처리하는 기계어 코드 루틴이다. 즉 인터럽트 서비스 루틴 == 인터럽트 핸들러.

  • 인터럽트 벡터 : 실행될 인터럽트 서비스 루틴의 메모리 시작 주소.

  • 설명 안했는데 인터럽트 호출시 현재 프로그램 상태를 저장하는 과정이 있다...*

아래는 핀토스에서 인터럽트가 호출되는 과정이 있다.굳굳
핀토스
[인터럽트 위키 설명] (https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B)
세부적으로 들어가면 하드웨어적인 방법이랑 소프트웨어적인 방법에 차이가 큰거 같은데 잘 모르겠다

1.2.3 입출력 구조 (I/O structure)

  • 디바이스 드라이버, 장치 제어기에 대한 역할을 몰랐었어서 정리한다.

범용 컴퓨터 시스템은 공통 버스에 의해 연결된 여러 개의 장치 제어기와 CPU들로 구성되어 있다. 각 장치 제어기는 특정 장치를 담당하고 여러개의 장치가 붙을 수 도 있다.

장치 제어기는 약간의 로컬 버퍼 저장 장치와 특수 목적용 레지스터 집합을 유지한다. 장치 제어기는 자신이 제어하는 주변 장치와 자신의 로컬 버퍼 저장 장치 사이의 데이터 전송을 담당한다. 이때 운영체제는 각 장치 제어기 마다 디바이스 드라이버를 갖고 있다. * 디바이스 드라이버는 장치 제어기의 동작을 이해하고 운영체제의 다른 부분들에게 장치에 대한 일관된 인터페이스를 제공한다.

입출력 연산 과정.

  1. 입출력 연산을 시작을 위해 디바이스 드라이버는 장치 제어기의 적절한 레지스터에 필요한 값을 적재한다.
  2. 장치 제어기는 레지스터의 값을 보고 취할 동작을 조사한다.
  3. 제어기는 장치로부터 자신의 로컬 버퍼로 데이터 전송을 시작한다.
  4. 데이터의 전송이 완료시 장치 제어기는 자신이 연산을 완료했음을 인터럽트를 이용하여 디바이스 드라이버에게 통보한다.
  5. 디바이스 드라이버는 제어를 운영체제에게 반환한다.??이때 데이터 또는 데이터 포인터, 상태 정보를 같이 반환한다....?

이렇게 복잡하게 안하고 DMA(direct memory access)를 통해서 CPU 개입 없이 메모리부터 자신의 버퍼 장치로 또는 버퍼로부터 메모리로 데이터 블록 전체를 전송할 수 있다함....?

1.4 운영체제의 구조

*다중 프로그래밍 (multiprogramming에 대한 개념을 보려고 정리한다.)

다중 프로그래밍은 CPU가 수행할 작업(코드와 데이터!!)를 항상 하나 가지도록 작업을 구성함으로써 CPU 이용률을 증가시킨다.
운영체제는 한 번에 여러 작업을 메모리에 적재한다. 이들은 디스크의 작업풀에 유지되면서 주 메모리의 할당을 기다린다.

메모리 내의 작업 집합은 작업 풀 내의 작업들의 부분 집합이다. 운영체제는 메모리에 있는 작업 중에서 하나를 선택해 실행을 시작한다.

이때 실행중인 작업이 입출력을 실행으로 입출력 종료를 기다려야 되는 상황에서 멀티 프로그래밍은 CPU를 쉬지 않고 다른 작업을 수행한다. 하지만 non-multiprogramming의 경우 쉬었을 것이다.

  • 멀티태스킹 (multi-tasking)
    시분할, 멀티태스킹은 멀티 프로그래밍의 논리적 확장이다. 멀티 타스킹은 CPU가 다수의 작업들을 교대로 수행하지만, 매우 빈번하게 교대가 일어나므로 프로그램이 실행되는 동안에 사용자들은 각자 자기의 프로그램과 상호 작용할 수 있다.

  • CPU 스케쥴링과 멀티 프로그래밍
    각 사용자는 메모리에 하나의 독립된 프로그램을 갖는다. 메모리에 적재되어 있고, 실행되고 있는 프로그램을 process라고 한다.

멀티 타스킹과 멀티 프로그래밍 운영체제에서는 여러 작업이 메모리에 동시에 유지되어야 한다. 만약 몇몇 작업이 메모리로 옮겨올 준비가 되었고, 그들 전부를 메모리에 보관할만한 공간이 불충분하다면, 시스템은 그들 중 몇 개를 선택해야 한다.

Job scheduler에 의해 수행된다 운영체제가 작업 풀에서 하나의 작업을 선택하면, 실행을 위해 그 작업을 메모리에 적재한다.
이때의 메모리 관리는 ch8,9에서..??머지 ㅠ 뭔지 모르겠음 바본가봄
CPU 스케줄링은 여러개의 작업이 동시에 실행 준비가 되어 있으면, 시스템은 그들 중 하나를 선택해야 한다.

시분할 시스템에서 운영체제는 적절한 응답 시간을 보장해야 한다. 이는 스와핑(swapping)에 의해서 달성된다. 합리적인 응답시간을 보장하는 더 일반적인 방법은 가상 메모리이다. 논리 메모리를 물리 메모리로 부터 분리 시킨다.
내가 생각한 스와핑 가상메모리는 그냥 디스크를 더 효율적으로 사용하려고 있는 기법인 줄 알았는데 응답 시간을 보장한다니...

1.5 운영체제 연산

** 현대의 운영체제는 interrupt driven이다 **
실행할 프로세스가 없고, 서비스할 입출력 장치도 없고, 응답해 주어야 할 사용자도 없다면, 운영체제는 무언가가 일어나기를 기다리며 조용히 앉아 있을 것이다. 사건은 거의 항상 인터럽트나 트랩을 발생시켜 신호를 보낸다.

이렇게 중요해서 면접때 나한테 물어본거 같다. 운영체제 수업때는 그냥 이런게 있다 정도로 배운거 같은데 뒷부분 내용을 중요하게 배우고, 오히려 임베디드때 배워서 일반적이지 않은 기법이라고 착각했다 내가...

운영체제와 사용자는 컴퓨터 시스템의 하드웨어와 소프트웨어 자원을 공유하기 때문에 사용자 프로그램의 오류가 현재 수행중인 프로그램에만 문제를 일으키도록 보장해야 한다. 그래서 밑에 1.5.1절 처럼 작동해야 한다!

1.5.1 이중 연산 모드

운영체제의 적절한 동작을 보장하기 위해, 운영체제 코드의 실행과 사용자 정의 코드의 실행을 구분할 수 있어야 한다. 그러기 위해 많은 운영체제가 실행 모드를 구분할 수 있도록 하드웨어 지원을 제공한다.

두 개의 독립된 연산 모드 user mode, kernel mode를 필요로 한다. mode bit를 통해 커널모드(0), 사용자 모드(1)을 나타낸다.

시스템 부트시 커널 모드로 시작하고, 하드웨어는 priviledged instruction을 지정함으로써 kernel mode에서만 실행 가능한 명령들을 지정한다.

사용자 모드에서 커널 모드로는 인터럽트, 트랩(?) , 시스템 호출을 통하여 넘어간다.
위티피디아 트랩
인터럽트 트랩 차이

위 블로그를 보면 좋을듯, 근데 트랩에 대한 설명이 다 좀 다른거 같다. 정확히는 모르겠는데 synchronous한 interrupt라 생각된다

  • 인터럽트: 하드웨어적, 비동기적(예상 불가)
  • 트랩: 소프트웨어적, 동기적(예상 가능 특정 위치, 무엇에 대한 결과로)
  • 시스템 호출: 시스템 호출은 유저 프로그램이 자신을 대신하여 운영체제가 수행하도록 지정되어 인ㅆ는 작업들을 운영체제에게 요청할 수 있는 방법을 제공한다.

1.8 저장 장치 관리