타자치는 문돌이 2024. 4. 18. 02:49

Introduction에서는 컴퓨터가 어떤 식으로 작동하는지 OS의 관점에서 살펴볼 것이다.
모든 1단원이 그렇듯 다양하고 중구난방인 정보가 나열된다.


컴퓨터 시스템의 구조

컴퓨터는

  • CPU
  • 메모리(RAM/ROM)
  • 각종 장치들 (SSD나 하드디스크 같은 저장장치와 모니터, 키보드, 마우스 같은 입출력장치)
    로 구성된다.

CPU와 메모리와 장치들은 버스라는 통로를 통해 서로 데이터와 신호를 주고받는다.

각 장치는 자신의 Device Controller를 통해 제어되고, Device Controller는 데이터를 주고받기 위한 Local Buffer를 가지고 있으며, Device Controller를 통해 CPU, 메모리와 소통한다.


컴퓨터 시스템의 작동

입출력 장치와 CPU는 동시에 실행된다.
CPU는 메모리의 데이터를 Local Buffer에 보내고, Local Buffer의 데이터를 메모리로 가져온다.
우리가 마우스나 모니터를 사용해 입출력이 일어나면, 장치는 Local Buffer에 데이터를 보낸다. 데이터를 받은 Device Controller는 입출력을 처리하고 CPU에 자기는 일을 다 했으니 해당 입출력을 처리해달라는 Interrupt를 보낸다.

Interrupt

CPU는 열심히 (프로그램 실행 같은) 일을 하다가 Interrupt가 일어나면 잠시 하던 일을 중단하고 Interrupt를 처리해 준다.
Interrupt가 일어나면

  1. CPU는 Interrupt Vector Table이라는 표를 뒤져 일어난 Interrupt에 해당하는 Interrupt Service Routine (Interrupt를 처리하는 명령어 모음집)을 찾는다.
  2. 다른 Interrupt가 중첩되어 발생하지 않도록 Interrupt를 막은 다음,
  3. 실행하고 있던 프로그램의 주소와 CPU의 상태를 저장해 다시 돌아올 위치를 기억하고,
  4. Interrupt를 처리한다.
  5. 그 후 저장해둔 주소와 CPU 정보를 불러온 뒤,
  6. Interrupt 금지를 풀고
  7. 프로그램을 마저 실행한다.

 

Interrupt는 입출력 장치만 일으키는 것이 아니라 컴퓨터의 다양한 곳에서 일으킨다.

  • 프로그램 (에러나 사용자 요청으로 프로그램이 일으킨 Interrupt를 Trap이라고 한다.)
    • 0으로 나누는 연산이 있을 때
    • 계산값이 데이터가 표현할 수 있는 범위를 넘어갈 때
    • 실행되어서는 안 되는 명령어가 실행되었을 때
    • 사용자 메모리가 아닌 곳에 접근할 때
    • System Call이나 Monitor Call 같은 사용자 요청
  • 타이머
  • 입출력
  • 하드웨어 오류

저장 장치

컴퓨터에는 크게 두 종류의 저장 장치가 있는데, 하나는 흔히 RAM, 메모리라고 하는 메인 메모리와 하드 디스크, SSD와 같은 보조 기억장치가 있다.

하드 디스크나 SSD는 비휘발성 메모리로, 전원이 꺼져도 데이터가 남아 파일을 저장하는 보조 기억 장치로 사용한다.

RAM은 휘발성 메모리로, 전원이 꺼지면 데이터가 모두 사라진다.
RAM은 보조 기억장치에서 데이터를 불러온다. 불러온 데이터 중 필요한 데이터를 레지스터로 보내고, CPU는 레지스터의 값으로 연산을 처리한다.

RAM과 레지스터 사이에 캐시를 두어 효율성을 높일 수 있다.
레지스터가 자주 필요로 하는(최근에 사용한) 데이터를 캐시에 임시 저장해두어 데이터가 다시 필요할 때 RAM이 아니라 캐시에서 값을 찾아 더 빠르게 접근할 수 있게 한다.

Multitasking이나 Multiprocessor 환경에서는 메모리나 캐시를 특히 신경 써야 한다. 한 곳에서 값이 바뀌었는데 다른 프로세스나 프로세서가 기존의 값을 사용하는 불일치가 일어나면 안 된다.


입출력 장치

OS의 많은 부분은 입출력 장치의 처리를 위한 코드이다.
Interrupt 부분에서 보았듯이, 입출력의 처리도 상당한 단계를 거치기 때문에 주고받는 데이터가 크다면 Overhead가 크다.
빠른 속도로 입출력 장치의 연산을 처리하고 싶은데 입출력 장치가 I/O Request를 보내고 CPU가 Interrupt 되고 RAM에서 데이터를 가져와서 입출력 장치에 데이터를 보내면 많이 느리다.
그래서 등장한 방법이 입출력 장치와 메모리가 직접 데이터를 주고받는 형식인 Direct Memory Access Structure이다.


운영체제의 작동

Multiprogramming

원래의 컴퓨터는 하나의 프로그램이 끝나야 다음 프로그램을 실행할 수 있었다.
프로그램이 실행되다가 입출력 장치의 응답을 기다려야 한다면 CPU는 입출력 장치가 응답할 때까지 아무것도 안 하고 기다려야 한다. 이런 대기 시간도 알뜰하게 사용하기 위해 Multiprogramming이 등장한다.
Multiprogramming에서는 CPU가 항상 반드시 하나의 프로세스를 실행시켜야 한다.
Job Scheduling을 통해 실행할 프로세스를 조율해 CPU가 쉬는 시간 없이 일하도록 한다.


Multitasking

CPU는 한 번에 하나의 프로세스만 처리할 수 있다. 그러나 우리는 유튜브를 보면서 게임도 해야 한다.
CPU는 이런 Multitasking을 구현하기 위해 매우 빠르게 실행하는 프로세스를 바꾼다. 너무 빨리 바꿔 여러 프로세스가 동시에 실행되는 것처럼 느낄 정도로 바꿔 착시를 일으킨다.


운영체제의 컴퓨터 보호를 위한 장치

Dual-Mode Operation

OS는 시스템을 보호하기 위해 User Mode와 Kernel Mode라는 두 가지 모드를 가지고 있다.
시스템에 영향을 끼칠 수 있는 중요한 명령어는 반드시 Kernel Mode로만 실행되고, 그런 명령어가 필요할 때는 모드를 전환한 다음 명령어를 실행한다.

I/O & Memory Protection

I/O

모든 입출력 관련 명령은 Privileged Instruction으로 실행된다.

Memory

메모리를 보호하기 위해 OS는 한 프로그램이 쓸 수 있는 메모리의 범위를 정해둔다.
프로그램은 할당받은 Base Register부터 Limit Register까지만 접근할 수 있다.

Timer

while(1)문이 탈출 조건이 없으면 프로그램이 영원히 실행될 것이다. 이렇게 무한 루프가 실행되는 경우나, System Call을 부르는데 실패한 경우, 영원히 대기 상황에 있는 경우를 막기 위한 타이머가 존재한다.
타이머는 매 Clock Tick마다 줄어들고 0이 되면 Interrupt를 발생시킨다.


System Call

위에서 OS는 보안을 위해 System과 관련된 명령어를 실행할 때는 Kernel Mode로 전환해 실행한다고 했다. 이 명령의 수행은 System Call을 통해 이루어진다.
주로 C나 C++로 작성한 함수로 되어 있고 이 함수를 호출하면 Kernel Mode가 필요한 작업을 실행해 준다.

System Call에는 번호가 할당되어 있고, System Call이 호출되면 표에서 번호에 해당하는 명령이 Kernel Mode로 실행된 뒤, 다시 User Mode에서 다음 명령을 이어간다. 이를 통해 사용자가 직접 Kernel Mode에서 작업하는 것을 막는다.
System Call로 실행되는 명령은 주로

  • 프로세스 제어 (실행, 종료. 대기, 메모리 할당, 해제 등)
  • 파일 제어 (파일 생성, 삭제, 읽기, 쓰기 등)
  • 장치 제어
  • 정보 제어 (시간, 날짜, 파일, 장치 속성 등)
  • 통신
    과 같은 명령이다.

System Boot

부팅은 Kernel을 로드하면서 컴퓨터를 시작하는 것을 말한다.
컴퓨터의 전원 버튼이 눌리면, ROM에 저장된 Bootstrap Loader라는 프로그램이 실행된다.
단순한 OS는

  1. Bootstrap Loader가 디스크에서 Boot Program을 불러오고
  2. Boot Program이 Kernel을 로드한다.
    윈도우 같은 큰 OS는
  3. Bootstrap Loader가 진단을 실행한 뒤, 디스크의 정해진 위치에서 Boot Block이라는 block을 읽어 코드를 실행한다.
  4. Boot Block 안의 코드는 OS 전체를 로드하거나, 남은 Bootstrap 프로그램을 읽는다.

Virtual Machine

Virtual Machine은 컴퓨터 안에 가상의 컴퓨터 환경을 구성해 동작시키는 방식이다.

이렇게 구현된 가상 컴퓨터끼리는 서로 영향을 주지 않고, 자원을 공유하지 않는다. 독립된 환경을 만들 수 있어 다양한 연구와 개발에 사용할 수 있다.

 

OS - 0. Index