1 컴퓨터 시스템과 하드웨어

1.1 컴퓨터 시스템의 범위

  • 응용소프트웨어
  • 운영체제
  • 컴퓨터 하드웨어

1.2 컴퓨터 하드웨어

컴퓨터 하드웨어

CPU(Central Processing Unit)

메모리(Memory)

캐시 메모리(Cache Memory)

CPU와 메모리 사이의 처리 속도 차이로 인한 CPU의 대기시간을 줄이기 위해 사용 즉 CPU의 프로그램 실행 속도를 높이기 위해서

Device

Bus

컴퓨터 하드웨어들이 서로 데이터를 주고받기 위해 디지털 신호가 지나가는 여러 가닥의 선을 다발로 묶어 부르는 용어 지나다니는 정보에 따라 3가지 종류로 나뉨

  • 주소 버스(address bus)
  • 데이터 버스(data bus)
  • 제어 버스(control bus)

System bus & I/O bus

시스템 버스는 빠르게 작동하는 하드웨어들 사이에 신호를 전송(CPU, 메모리 등) 입출력 버스는 상대적으로 느린 입출력 장치들로부터 데이터를 전송

입출력 제어 장치 및 시스템 제어 회로(I/O Controllers & control circuits)

입출력 장치들을 제어하기 위한 여러 하드웨어 회로들을 포함 입출력 장치와 메모리 혹은 CPU 사이에 데이터가 전달되도록 중계 DMAC(Direct Memory Access Controller)나 인터럽트 제어장치(INTC, Interrupt Controller)등 포함

1.3 CPU와 메모리 관계

32비트 CPU가 액세스할 수 있는 메모리의 최대 범위

1.4 CPU 기계 명령

CPU가 해석하고 실행할 수 있는 기계 명령 CPU에 따라 명령 개수와 형태가 다름

1.5 CPU의 일생

CPU의 레지스터들

  • PC(Program Counter) - 다음에 실행할 기계 명령의 주소를 저장, IP(Instruction Pointer)로도 불림
  • IR(Instruction Register) - 실행하기 위해 메모리에서 읽어 온 명령이 저장
  • SP(Stack Pointer) - 스택 영역의 꼭대기 메모리 주소를 저장
  • 데이터 레지스터들(data registers) - 연산에 사용될 데이터들을 저장
  • 상태 레지스터(status register) - CPU의 상태 정보나 인터럽트 금지 등 제어정보를 가짐
  • 기타 레지스터들 - 페이지 테이블이 저장된 메모리 주소를 가리키는 레지스터 등 운영체제의 실행을 돕는 정보를 가진 레지스터들

CPU의 명령 사이클

CPU가 한 명령을 실행하는 과정을 명령 사이클(Insturction cycle)이라고 부른다. CPU의 명령 사이클

1.6 스택(Stack)은 어디에 있는가?

프로그램의 지역 변수 등을 저장하도록 할당된 메모리 영역을 부르는 말 각 프로그램에게 자신만의 스택 공간이 할당되면 CPU의 SP 레지스터에 스택 영역 꼭대기 주소가 저장 함수가 호출될 때 사용되는 공간으로 다음 내용들이 저장

  • 함수의 지역변수들
  • 매개변수 값들
  • 함수를 마치고 돌아갈 주소
  • 함수 코드가 의도적으로 스택에 저장한 값

1.7 컨텍스트(Context)

운영체제에서 컨텍스트란 어떤 프로그램이 실행중인 일체의 상황을 말한다. 현재 실행중인 프로그램의 컨켁스트를 현재 CPU에 들어 있는 레지스터의 값들로 축소하여 정의 가능 메모리는 그대로 있기 때문에 내용을 복사할 필요가 없음 컨텍스트 스위칭(context switching) 컨텍스트 스위칭

프로세스 제어 블록(PCB) : 운영체제만 접근할 수 있는 메모리 영역

1.8 멀티 코어 CPU

코어(core) : 레지스터들과 제어장치, 산술논리연산장치, 그리고 외부 버스와 연결되는 인터페이스 장치를 독립적으로 갖추고 하나의 프로그램을 실행할 수 있는 완벽한 프로세서 멀티 코어 CPU(multi core CPU) : 여러개의 코어를 가지고 동시에 여러개의 프로그램을 실행할 수 있는 CPU

2 컴퓨터 시스템과 운영체제

운영체제는 부팅 후부터 메모리에 상주하면서 하드웨어를 완전히 장악한 채 제어하며, 사용자와 응용프로그램에게 서비스를 제공하는 실체가 있는 코드이다.

2.1 컴퓨터 시스템의 계층 구조

컴퓨터 시스템의 계층 구조 계층 간의 독립성(independency)을 확보하기 위함

운영체제와 응용프로그램 사이의 관계

응용프로그램이 직접 하드웨어를 다루지 못하도록 차단 운영체제가 제공하는 **시스템 호출(system call)**만을 이용하여 하드웨어에 접근

운영체제와 사용자의 관계

사용자에 대한 운영체제의 역할

  • 쉽게 사용하게 함
  • 새로운 하드웨어를 설치/변경 도움
  • 편리한 UI 제공
  • 여러 도구 응용프로그램 제공
  • 사용자 계정 관리
  • 컴퓨터 사용 시간을 계산하여 과금

운영체제와 하드웨어의 관계

운영체제는 사용자/응용프로그램과 하드웨어 사이의 매개체이다. 장치에 대한 입출력은 전적으로 운영체제만이 할 수 있는 기능

2.2 운영체제의 전체 기능

  • 프로세스와 스레드 관리(process and thread management)

    프로그램이 메모리에 적재되어 실행될 때 **프로세스(process)**라고 부름 프로세스는 한 개 이상의 **스레드(thread)**로 구성 운영체제에 의해 스케줄되고 다루어지는 실행 단위는 스레드 여러 프로세스/스레드를 동시에 실행시키기 위해 여러 기능을 가지며 동시에 자원을 사용하려고 할 때 충돌하지 않도록 이들을 동기화(synchronization) 시키는 기능도 포함

  • 메모리 관리(memory management)

    메모리 할당/반환/보호 등 메모리 관리 기능 가상 메모리 기술 포함

  • 파일 관리(file management) 혹은 파일 시스템 관리

    파일 관리 기능, 이를 위한 저장 장치에 파일을 저장하기 위한 정책 등이 포함

  • 장치 관리(device management)

    입출력/저장 장치 등을 제어

  • 사용자 인터페이스(user interface)

    사용자 친화적인 인터페이스를 제공하여 사용자가 컴퓨터를 쉽게 사용하고 원하는 응용프로그램을 쉽게 실행시킬 수 있도록 돕는 기능 CLI, GUI 방식 등의 인터페이스 제공

  • 네트워킹(networking)

    네트워크 인지, 연결, 닫기, 데이터 송수신 등의 기능 제공

  • 보호 및 보안(protection & security)

    외부 공격이나 무단 침입으로부터 안전하게 유지되도록 보호하며 외부로 유출되지 않도록 하는 기능

2.3 운영체제와 커널

운영체제는 도구/GUI 소프트웨어, 커널(kernel), 디바이스 드라이버(device driver)들로 구성되는 소프트웨어이다. 운영체제의 핵심 부분을 커널이라고 함

커널

부팅 후부터 메모리에 상주하며 아래 기능을 수행

  • 프로세스와 스레드 관리
  • 메모리 관리
  • 파일 및 파일 시스템 관리
  • 디바이스 드라이버를 호출하여 장치 입출력 커널 코드는 함수의 형태로 존재 응용프로그램에서 커널에 있는 함수를 활용하기 위해 system call 제공

디바이스 드라이버

장치를 직접 제어하는 소프트웨어

2.4 운영체제 커널 인터페이스 : 시스템 호출과 인터럽트

하드웨어와 응용프로그램 사이의 중계 역할을 위해 다음 2가지 인터페이스를 가짐

  • 시스템 호출(system call) - 커널과 응용프로그램 사이의 인터페이스
  • 인터럽트(interrupt) - 커널과 하드웨어 장치 사이의 인터페이스

시스템 호출

응용프로그램에서 커널 코드를 실행하는 기법

  • 표준 라이브러리(standard library)

    운영체제 커널의 기능과 일차적으로 무관한 작업을 위해 제공

  • 시스템 호출 라이브러리(system call library)

    ‘시스템 호출’을 일으키는 기계명령을 실행하며, CPU가 커널 코드와 데이터가 적재된 메모리 영역을 액세스 하는 권한을 가지도록 하고, 커널에 작성된 함수를 실행시킨다.

인터럽트

하드웨어 장치들이 CPU에게 하드웨어 신호(인터럽트 신호)를 물리적으로 발생시켜, 입출력 완료나 타이머 완료 등을 CPU에게 알리는 방법이다. CPU가 인터럽트 신호를 받음 하던 일을 멈추고 인터럽트의 요청을 처리하는 코드 실행 이 코드를 인터럽트 서비스 루틴(Interrupt Service Routine, ISR) 이라고 부르며, 커널 코드나 디바이스 드라이버 내에 작성됨 운영체제는 인터럽트라는 방법을 통해 장치와 관련된 모든 이벤트를 처리

3 커널과 시스템 호출

3.1 응용프로그램의 자원 접근 문제

다중사용자/다중프로세스가 실행되는 상황에서, 응용프로그램이 컴퓨터 하드웨어에 직접 접근할 수 있도록 허락한다면 심각한 문제가 발생할 수 있음 메모리 영역을 사용자 공간커널 공간으로 나누고 시스템의 실행 모드를 사용자 모드커널 모드로 나누며 응용프로그램은 사용자 모드에서 실행, 커널 코드는 커널 모드에서만 실행되도록 함

3.2 사용자 공간과 커널 공간

  • 사용자 공간 : 응용프로그램이 적재되고 변수가 만들어지고 동적 할강 받는 공간으로 활용
  • 커널 공간 : 커널 코드와 커널 데이터, 그리고 커널 함수들이 실행될 때 필요한 스택 공간, 디바이스 드라이버 등이 탑재되는 공간

사용자 공간과 커널 공간으로 나누는 이유

응용프로그램으로 부터 커널 코드와 데이터를 지키기 위해서

사용자 공간 크기의 의미

응용프로그램의 크기가 사용자 공간 크기를 넘을 수 없다

사용자 공간과 커널 공간은 가상 주소 공간이다.

가상 주소 공간의 물리 메모리 매핑 모든 응용프로그램은 운영체제가 제공해주는 가상 주소 공간을 통해 자신만의 사용자 공간을 가진다

3.3 CPU의 사용자 모드와 커널 모드

사용자 모드커널 모드
CPU의 메모리 액세스 범위사용자 공간에 국한. 커널 공간 액세스 불가커널 공간을 포함한 모든 메모리 공간
CPU의 하드웨어 액세스 여부불가모든 하드웨어 가능
CPU가 처리 가능한 명령특권 명령(privileged instruction) 을 제외한 모든 CPU 명령특권 명령을 포함한 모든 CPU 명령
오류 발생 시 처리사용자 프로그램만 실행 종료. 시스템이 종료되지 않으므로 안전시스템에 심각한 오류가 발생한 것으로 시스템 종료

특권 명령 : 입출력 장치나 타이머, 인터럽트 처리, 시스템 중단 등 특별한 목적으로 설계된 CPU 기계 명령

사용자 모드에서 커널 모드로 전환

  • 시스템 호출

    응용프로그램에서 시스템 호출을 하면 CPU가 커널 모드로 바뀐 후 커널 함수 실행, 이후 사용자 프로그램으로 돌아 갈 때 시스템 호출을 종료하는 CPU 기계 명령에 의해 사용자 모드로 바뀜

  • 인터럽트

    디바이스가 CPU에게 인터럽트를 거는 경우 CPU는 자동으로 커널 모드로 전환 후 ISR로 점프하여 실행 루틴이 끝나면 CPU는 다시 사용자 모드로 돌아간다 커널모드로 바뀌는 이유? 인터럽트 서비스 루틴이 커널 공간에 있기 때문

특권 명령

  • I/O 명령
    컴퓨터 본체 내 하드웨어들을 제어하거나 입출력 장치나 저장장치를 제어하고 읽기 쓰기에 사용되는 CPU 기계 명령
    
  • Halt 명령

    CPU를 idle 상태로 만드는 명령

  • 인터럽트 플래그 켜고 끄기

    인터럽트가 발생할 때 처리할 지 아니면 무시할 지를 나타내는 비트를 인터럽트 플래그 라고 부름

  • 타이머 설정
  • 컨텍스트 스위칭

다양한 이슈들

  • 사용자 모드와 커널 모드는 CPU에 의해 구현됨
  • 사용자/커널 모드로 나누어 작동시키는 이유는 커널 고드와 데이터에 대한 보안과 보호를 위해서

3.4 커널의 실체

커널은 부팅 시에 커널 공간에 적재되는 함수들과 데이터들의 집합

컴파일된 바이너리 형태

커널 코드는 함수들의 집합이다.

커널은 프로세스가 아니다

커널은 실행 중이 아니다

시스템 호출 또는 인터럽트가 발생하여 커널 코드가 실행 되는 것

커널은 스택이나 힙을 가지지 않는다

3.5 응용프로그램 빌딩

라이브러리(library) : 미리 함수들을 작성하여 컴파일하고 바이너리 형태로 만든 파일

  • 표준 라이브러리

    동일한 프로그래밍 언어에 대해서는 운영체제나 컴퓨터 하드웨어에 상관없이 이름과 사용법이 같음

  • 시스템 호출 라이브러리

    운영체제 커널과 밀접한 관계가 있기 때문에 함수들의 이름이 운영체제마다 다름

시스템 호출 라이브러리에 들어 있는 함수들을 시스템 호출 함수나 커널 API 라고 부른다

사용자 코드와 라이브러리 코드의 링킹

사용자가 작성한 함수와 라이브러리 함수들은 링크 과정을 거쳐 하나의 실행 파일 내에 결합되어 저장

함수 호출(function call)로 라이브러리 활용

같은 주소 공간 내에서 한 함수가 다른 함수의 코드를 실행하는 과정 함수 호출 과정에서는 커널 모드로 바뀌는 일 없이 사용자 모드에서 실행

시스템 호출(system call)로 커널 코드 호출

CPU 모드를 커널 모드로 바꾸고 커널 공간 내에 미리 정해진 주소에 있는 시스템 호출 핸들러(system call handler) 코드를 실행하는 과정

응용프로그램이 라이브러리와 커널 코드를 활용하는 과정

응용프로그램에서 라이브러리 호출과 커널 코드 호출 사례

3.6 시스템 호출

사용자 공간의 코드에서 커널 공간의 코드를 호출하는 과정 커널 콜(kernel call)이라고도 부른다

3.7 시스템 호출 과정 사례

read() 함수에 의해 시스템 호출이 일어나서 커널 코드가 실행되는 과정

함수 호출시스템 호출
메모리 영역사용자 영역의 코드에서 사용자 영역의 함수 호출사용자 영역의 코드에서 커널 함수 호출
CPU 실행 모드사용자 모드사용자 모드에서 커널 모드로 전환
비용함수 호출에 따른 비용커널 모드로 전환하는 등 함수 호출에 비해 큰 비용

3.8 시스템 호출의 종류

3.9 시스템 호출에 따른 비용

시스템 호출은 함수 호출에 비해 많은 시간 비용을 초래한다.

fopen()과 open()이 미리 실행되어 파일이 열려 있다고 가정한다. fread()와 read()의 동작 과정

4 운영체제와 인터럽트

장치들이 어떤 상황이 발생하였음을 CPU에게 알리는 하드웨어적 방법이다.

4.1 초인종과 인터럽트

4.2 컴퓨터에서 인터럽트 활용

  • 마우스 조작, 키보드 입력 등 입력 장치 사용
  • 네트워크로부터 데이터 도착
  • 하드 디스크의 쓰기 종료
  • 시스템 클럭으로부터 일정한 시간 간격으로 알림
  • 컴퓨터의 리셋 버튼 누르기
  • USB 메모리 부착 혹은 해제

4.3 인터럽트 발생 및 처리 과정

CPU와 인터럽트 제어기

여러 입출력 장치로부터 인터럽트를 받기위해, CPU와 입출력 장치 사이에 APIC(Advanced Programmable Interrupt Controller) 라는 하드웨어가 사용되며 인터럽트 제어기라고 한다. 인터럽트의 발생 및 처리 과정

인터럽트 벡터 테이블

인터럽트 요청과 각 요청에 해당하는 ISR의 시작 주소를 매핑하는 테이블이다. 커널 영역에 저장되고 커널 코드에 의해서만 수정된다.

어떤 CPU 코어가 인터럽트를 처리할까?

보통은 I/O APIC가 모든 Local APIC에게 균등하게 분배하여 전달 일부 운영체제에서는 특정 코어에 특정 인터럽트를 할당하여 처리 효율성을 높이기도 한다. 이것을 **인터럽트 친화성(Interrupt Affinity)**이라고 한다.

인터럽트 처리 과정

  1. 인터럽트 발생
  2. 인터럽트 인식
  3. CPU 커널 모드 변경
  4. 인터럽트 벡터 테이블 참조, 컨텍스트 스위칭
  5. ISR 실행
  6. ISR 종료 시 컨텍스트 스위칭, CPU 사용자 모드로 변경
  7. 인터럽트 처리 완료

4.4 인터럽트 서비스 루틴과 운영체제

인터럽트 서비스 루틴의 위치

ISR은 인터럽트 핸들러라고 부르기도 한다. 디바이스 드라이버나 커널 코드에 들어있다. 임베디드 컴퓨터의 경우 ROM에 들어 있기도 하다.

디바이스 드라이버와 인터럽트 서비스 루틴

장치를 제어하여 장치로부터 입출력을 수행하는 프로그램 최근 들어 주요 OS 들은 사용자 모드에서 사용자 공간에서 실행되는 디바이스 드라이버들을 만들 수 있도록 하고 있다. 커널과 디바이스 드라이버

4.5 인터럽트는 다중프로그래밍의 키

인터럽트는 다중 프로그래밍 시스템에서 필수적인 역할을 하는 중요한 개념입니다.

  1. 시스템 자원 효율 활용
  • 여러 프로그램이 동시에 CPU, 메모리, 입출력 장치 등을 효율적으로 사용
  • 한 프로그램이 자원을 사용하지 않을 때 다른 프로그램이 사용하여 처리 속도 향상
  1. 시스템 응답성 향상
  • 중요한 작업 처리하는 인터럽트 우선 처리하여 응답 속도 개선
  • 키보드 입력, 디스크 I/O 완료 인터럽트 신속 처리로 지연 최소화
  1. 시스템 안정성 유지
  • 예상치 못한 오류 발생 시 안전하게 재시작 또는 데이터 손실 방지
  • 오류로 인해 충돌된 프로그램 종료, 다른 프로그램 정상 실행 보장
  1. 실시간 시스템 구현
  • 특정 시간 내에 정해진 작업 수행하는 시스템에서 중요
  • 우선순위에 따라 중요 작업 빠르게 처리하여 요구 사항 충족
  1. 다양한 장치 지원
  • 키보드, 마우스, 프린터, 디스크 드라이브 등 다양한 장치 이벤트 효율 처리
  • 사용자 편의성 향상

결론

인터럽트 없이는 다중 프로그래밍 시스템의 효율적인 구현과 안정적인 작동 불가능 다중 프로그래밍의 핵심 요소이다.

Ref.

황기태, “명품 운영체제”, (주)생튼출판사(2021)