Notice
Recent Posts
Recent Comments
05-21 07:17
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Byeol Lo

1.4 Operating-System Operations 본문

OS/OS Design

1.4 Operating-System Operations

알 수 없는 사용자 2024. 4. 3. 22:38

이제 컴퓨터가 어떻게 구동이 되는지 보자.

 처음에 컴퓨터가 실행하기 위해 초기 프로그램이 필요하고, 이는 전원 켤 때, 재부팅을 할 때 필요하다. 이런 부트스트랩 프로그램은 간단하며 일반적으로 하드웨어 내의 펌웨어에 저장된다. CPU 레지스터부터 장치 컨트롤러, 메모리 내용까지 시스템의 모든 측면을 초기화하며, 운영체제를 로드하고 해당 시스템을 실행하는 방법을 알아야 한다.

 그 후에 이 커널이 제공이 되고 실행되면 시스템과 사용자에게 서비스를 제공하게 된다. 일부 서비스는 커널 외부에서 제공되며, 부팅 시 메모리에 로드되어 데몬으로 실행되며, 전체 시스템이 실행되는 동안 활성화된다. 리눅스에서는 첫번째 시스템 프로그램systemd이고, 또 다른 많은 데몬들이 다른 서비스들을 위해 실행이 된다. 이 단계가 완료가 되면 시스템은 완전히 부팅되고, 시스템은 어떤 이벤트가 발생할 때까지 기다린다.

 실행할 프로세스가 없고 서비스할 I/O 장치도 없고, 응답할 사용자 또한 없다면 운영 체제는 조용히 대기하면서 어떤 일이 일어날 때까지 기다리게 된다. 이벤트는 거의 항상 인터럽트의 발생에 의해 신호를 받는다. 인터럽트의 다른 형태는 트랩(Exception)인데, 이는 소프트웨어 생성 인터럽트로, 오류(ex. divide 0, fault memory access) 또는 사용자 프로그램에서 운영 체제 서비스를 수행하도록 요청하는 특정 요청에 의해 발생된다. 이 요청은 시스템 호출이라고 하는 특수 작업을 실행함으로써 이루어진다.

  • 컴퓨터의 초기 부팅을 위한 프로그램이 필요.
  • 초기 프로그램은 부트스트랩 과 비슷한 부팅 전용 프로그램.
  • 초기 프로그램은 보통 하드웨어 내의 펌웨어에 저장.
  • 초기 프로그램은 CPU, 장치 컨트롤러, 메모리 등의 장치들을 초기화 및 운영체제를 로드.
  • 모든 장치가 로드된 후 커널이 제공.
  • 리눅스에서 데몬이란 백그라운드에서 실행되는 서비스나 프로세스를 가리킴.
  • 리눅스의 첫번째 시스템 데몬은 systemd임.
  • systemd 는 일반적으로 /etc/init.d, /etc/systemd/system/에 저장되어 있음.
  • 인터럽트가 발생할 때까지 운영체제는 대기 상태임.

 

1.4.1 Multiprogramming and Multitasking

 운영체제에서 가장 중요한 측면 중 하나는 여러 프로그램을 수행할 수 있는 능력인데, 이렇게 되면 CPU의 이용률을 높이고, 사용자를 만족시키기 위해 프로그램을 구성하여 CPU가 실행할 프로그램을 보유하게 된다. 이때 시스템에서 실행중인 프로그램을 프로세스라고 한다.

 운영체제는 여러 프로세스를 동시에 메모리에 유지할 때, 이들 중 하나를 선택하여 실행을 시작한다. 이 과정에서 프로세스들 간에 경쟁이 발생하는데, CPU를 할당받아 실행하는 프로세스와 동시에 다른 프로세스는 이 프로세스가 완료될 때까지 기다려야 할 수 있다. 다중 프로그래밍 시스템에서 CPU는 간단히 다른 프로세스로 전환하여 실행을 계속한다. 이와 같은 과정을 반복하여 다양한 프로세스가 실행된다. 결국 첫 번째 프로세스가 기다리는 작업을 마치고 CPU를 다시 얻는다. 적어도 하나의 프로세스가 실행 중이어야만 CPU가 IDLE(유휴) 상태에 빠지지 않는다.

  • 실행할 프로세스는 CPU를 점유할 수 있다.
  • 이때 프로세스는 작업을 끝마치고 CPU의 접근 권한을 반환한다.
  • 보통은 한 프로세스가 끝날때까지 다른 프로세스는 CPU를 점유할 수 없다.
  • 멀티프로그래밍 시스템에서는 CPU는 다른 프로세스로 전환을 하고 작업을 할 수 있다.

 

 multi taskingmulti programming의 논리적 확장이다. 이 다중 태스킹 시스템에서 CPU는 프로세스를 전환하여 여러 프로세스를 실행하지만, 이러한 전환은 빈번하게 발생하여 사용자에게 빠른 응답 시간을 제공해야만 한다. 프로세스가 실행되면 일반적으로 완료되거나 I/O를 수행 할 때까지 짧은 시간 동안 실행된다. I/O는 대화형, 즉 출력이 사용자의 디스플레이로, 입력은 사용자의 키보드나 마우스 또는 터치스크린 등으로 이루어진다.

 대화형 I/O는 평범한 속도로 실행되므로 완료에는 오랜 시간이 걸릴 수 있다. 입력은 사용자의 타이핑 속도에 제한될 수 있기 때문이다. CPU가 유휴상태에 있지 않도록 운영체제는 빠르게 CPU를 다른 프로세스로 전환한다. 동시에 메모리에 여러 프로세스를 가지고 있는 것은 메모리 관리의 어떤 형태를 요구한다. 여러 프로세스가 동시에 실행 준비가 되어 있으면, 시스템은 다음에 실행할 프로세스를 선택해야 하고, 이 결정은 CPU 스케줄링이라고 한다. 마지막으로 여러 프로세스를 동시에 실행하는 것은 프로세스 스케줄링, 디스크 저장, 메모리 관리를 포함한 운영체제의 모든 단계에서 서로에게 영향을 미치는 능력을 제한해야 한다.

 

 multiprogramming, multitasking 시스템에서는 합리적인 응답 시간을 보장해야 하는데, 이를 위한 방법으로는 virtual memory가 있다. 이는 메모리에 없는 프로세스의 실행을 허용한다. 이러한 방법의 주요 장점은 사용자가 실제 물리 메모리 보다 큰 프로그램을 실행할 수 있다. 또한 이는 주 메모리를 사용자가 볼 때 크고 일관된 저장 배열로 추상화하여 논리적 메모리를 물리적 메모리와 분리한다. 이러한 배열은 프로그래머들이 메모리 저장에 대해 걱정할 필요 없이 자유롭게 작업할 수 있게 한다.

 그리고 multiprogramming, multitasking은 파일 시스템을 제공해야 한다. 이는 보조 저장 장치에 상주하므로 저장 관리를 제공해야 한다. 또한 시스템은 부적절한 사용으로부터 자원을 보호해야 한다. 명령을 실행하기 위해서는 프로세스 동기화와 통신 메커니즘을 제공해야 하며, 서로 대기하여 영원히 기다리지 않도록 보장해야 한다.

 

1.4.2 Dual-Mode and Multi-Mode Operation

 운영체제와 그 사용자는 컴퓨터 시스템의 하드웨어와 소프트웨어 리소스를 공유하기 때문에 적절하게 설계된 운영체제는 잘못된 혹은 악의적인 프로그램으로 인해 다른 프로그램이나 운영체제 자체에 해가 되지 않도록 보장해야한다. 시스템의 올바른 실행을 보장하기 위해 운영 체제 코드와 사용자 정의 코드의 실행을 구별할 수 있어야 한다. 즉, 권한을 설정해야 한다는 것이다. 대부분의 컴퓨터 시스템에서 취하는 방법은 여러 실행 모드 간의 차이를 구별할 수 있도록 하드웨어 지원을 제공하는 것이다.

 최소한 두 가지 별도의 운영 modes가 필요한데, 사용자 모드커널 모드(감독자 모드, 시스템 모드, 권한 모드라고도 불림)가 있다. 현재 모드를 나타내는 비트인 모드 비트가 컴퓨터의 하드웨어에 추가된다. kernel mode(0), User mode(1)로 구분되고, 모드 비트를 이용하여 운영체제가 직접 수행하는 작업(커널 모드 권한에서 실행되는 작업)과 사용자 프로그램이 수행하는 작업(사용자 모드 권한에서 실행되는 작업)을 구분할 수 있다. 여기서 컴퓨터 시스템이 사용자 애플리케이션을 대신해서 실행 중일 때는 사용자 모드에 있지만 사용자 애플리케이션이 운영체제에 서비스를 요청하면 시스템은 이를 수행하기 위해 사용자 모드에서 커널 모드로 전환해야 한다.

 

 시스템 부팅 시, 하드웨어는 커널 모드에서 시작된다. 그런 다음 운영 체제가 로드되고 사용자 응용 프로그램을 사용자 모드에서 시작한다. Exception 또는 Interrupt가 발생할 때마다 하드웨어는 사용자 모드에서 커널 모드로 전환된다(즉, 모드 비트의 상태를 0으로 변경한다). 따라서 운영 체제가 컴퓨터를 제어할 때마다 커널 모드에 있다. 그리고 시스템은 사용자 프로그램에 제어를 전달하기 전에 항상 사용자 모드로 전환한다(모드 비트를 1로 설정).

 이중 모드 작동은 운영 체제를 익명 혹은 잘못된 사용자로부터 보호하는 수단을 제공한다. 이 보호 기법은 앞서 봤다 시피 모드가 두 개 인 것처럼 악의적인 명령으로 인해 손상을 일으킬 수 있는 몇 가지 머신 명령에 대해 "privileged instructions"의 높은 권한으로 지정하는 것이다. 그렇게 된다면 하드웨어는 특권 명령이 커널 모드에서만 실행되도록 허용되게 되고, 사용자 모드에서 특권 명령을 실행하려고 시도하면, 하드웨어가 명령을 실행하지 않고 불법으로 처리하여 운영 체제로 Exception을 발생하게 된다. 대표적인 Privileged Instruction은 커널 모드로 전환하는 명령이다.

 Modes라는 개념은 두 가지 이상의 모드로 확장 되어질 수 있다. 예를 들어, 인텔 프로세서는 4개의 별도 Protection Rings을 갖고 있으며, Ring 0Kernel Mode이고 Ring 3User Mode이다. (Ring 1과 Ring 2는 다양한 운영 체제 서비스에 사용될 수 있지만, 실제로는 거의 사용되지 않는다.) ARMv8 시스템에서는 7개의 모드를 갖고 있다. 가상화를 지원하는 CPU에는 VMM(Virtual Machine Manager)이 시스템을 제어하는 ​​시기를 나타내는 별도의 모드가 있는 경우가 많다. 이 모드에서는 VMM은 사용자 프로세스보다 더 많은 권한을 갖지만, 커널보다는 적은 권한을 갖는다. 이러한 권한 수준이 필요한 이유는 가상 머신을 생성하고 관리하기 위해 CPU 상태를 변경해야 하기 때문이다.

 이제 컴퓨터 시스템에서 명령어 실행의 life cycle을 이해해보자. 초기 제어권은 운영 체제에 있으며, 여기서 명령어는 커널 모드에서 실행될 것이다(당연한 소리다). 제어가 사용자 응용 프로그램에게 주어지면 모드가 사용자 모드로 설정되고, 제어는 인터럽트, 트랩 또는 시스템 호출을 통해 운영 체제로 다시 전환된다. 대부분의 현대 운영 체제인 Microsoft Windows, Unix 및 Linux 등은 이 이중 모드 기능을 활용하여 운영 체제에 대한 보호를 더 강화한다.

  • 공통적인 실행모드로는 두 가지가 있는데, 커널 모드 그리고 유저 모드이다.
  • 처음 부팅에는 커널 모드로 시작된다.
  • 사용자 응용프로그램은 사용자 모드로 시작된다.
  • 응용프로그램에서 exception, interrupt가 발생할 때마다 커널 모드로 바뀐다.

 

 이제 사용자 모드에서 커널모드의 전환을 유도하는 시스템 호출을 볼 것이다. System Call(시스템 호출)은 기본 프로세서에서 제공되는 기능에 따라 여러 가지 방법으로 호출된다. 모든 형태에서 프로세스가 운영 체제에게 작업을 요청하는 방법이다. 시스템 호출은 일반적으로 인터럽트 벡터의 특정 인덱스에 위치한 trap 형태를 띈다. 이 trap은 일반적인 trap 명령으로 실행될 수 있지만, 일부 시스템에서는 시스템 호출을 호출하기 위한 별도의 syscall 명령이 있다. 이제 시스템 호출이 실행되었을때 그 과정을 보자.

 시스템 호출이 실행( 보통 하드웨어에서 소프트웨어 인터럽트로 처리됨 )
→ 제어권이 커널 모드 에서 실행되는 인터럽트 핸들러에게 넘어감.
→ 인터럽트 핸들러는 파라미터가 적합한지 확인하고, 어떤 시스템 호출이 일어났는지 파악한다.
→ 인터럽트 핸들러가 인터럽트 벡터를 통하여 적합한 인터럽트 서비스 루틴에게 제어권을 반환한다.
→ 인터럽트 서비스 루틴은 적합한 작업을 실행한 후에 제어권을 다음 명령에게 반환하게 된다.

 사용자 측면에서 이 시스템 호출을 더 보자. 하드웨어 보호가 마련되면, 이 모드를 위반하는 오류를 감지하게 되며, 이러한 오류는 일반적으로 운영 체제에서 처리된다. 사용자 프로그램이 일부 방법으로 실패하는 경우, 하드웨어는 운영 체제로 trap을 보내게 된다. Trap은 인터럽트가 하는 것처럼 인터럽트 벡터를 통해 운영 체제로 제어를 전달하고, 프로그램 오류가 발생할 때 운영 체제는 프로그램을 비정상적으로 종료한다. 이 상황은 사용자 요청에 의한 비정상적인 종료와 동일한 코드에 의해 처리되지만, 오류 메시지가 표시되고, 프로그램의 메모리 덤프가 생성될 수 있다. 메모리 덤프는 주로 디버깅이나 문제 해결을 위해 사용되며, 사용자나 프로그래머가 확인한 후 수정하여 프로그램을 다시 시작할 수 있다.

 

1.4.3 Timer

  운영체제는 CPU를 사용할 때, 효과적으로 제어해야한다. 그 방법 중에 하나로는 타이머를 사용하는 것인데, 사용자 프로그램이 무한 루프에 갇히거나, 시스템 서비스를 호출하지 않고 운영체제로 제어를 반환하지 않는 상황들을 초래할 수 있기 때문에 이를 방지하기 위해서다. 타이머는 지정된 시간 이후에 컴퓨터를 인터럽트 신호를 보내도록 할 수 있고, 이 기간은 고정될 수도, 가변적일 수도 있다. 가변 타이머는 일반적으로 고정된 속도의 클럭카운터로 구현되고, 운영체제가 카운터를 설정한다. 사용자 모드에서 커널모드로의 제어를 넘기기 전에 운영체제는 타이머 설정을 확인하고, 설정된 그 시간에 타이머 인터럽트가 발생하면 제어가 운영체제(커널 모드)로 전환되며, 이러한 인터럽트를 운영체제가 처리할 수 있다. 그래서 타이머가 인터럽트를 보낸다면, 제어는 자동으로 운영체제로 전달되며, 운영체제는 이 인터럽트를 치명적인 오류로 처리할 수도 있고(시스템의 기능이나 안정에 중대한 영향을 끼치는 실행할 수도 있기에 운영체제는 타이머 인터럽트를 치명적인 오류로 인식할 수도 있다는 것), 프로그램에 더 많은 시간을 부여할 수도 있다(실행되는 시간을 연장함). 따라서 타이머의 내용을 수정하는 것은 특권이 필요로 한다는 것이다.

'OS > OS Design' 카테고리의 다른 글

1.6 Security and Protection  (0) 2024.04.06
1.5 Resource Management  (0) 2024.04.04
1.3 Computer-System Architecture  (0) 2024.04.01
1.2 Computer-System Organization  (0) 2024.04.01
1.1 What Operating System Do  (0) 2024.03.05
Comments