[KOCW 반효경 운영체제] 2. System Structure & Program Execution
Computer Science/Operating System

[KOCW 반효경 운영체제] 2. System Structure & Program Execution

728x90

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net


컴퓨터 시스템 구조

큰 흐름

컴퓨터 시스템의 구조는 컴퓨터 내부 장치인 CPU, 메모리와 컴퓨터 외부 장치(입출력 장치)인 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등으로 구분된다. 컴퓨터는 외부 장치에서 내부 장치로 데이터를 읽어와(input) 각종 연산을 수행한 후, 그 결과를 외부 장치로 내보내는(output) 방식으로 업무를 처리한다.

  • memory : 메모리는 CPU가 직접 접근할 수 있는 내부 기억 장치로서, 특정 프로그램이 CPU에서 실행되려면 해당 부분이 메모리에 올라가 있어야 한다. 운영체제는 컴퓨터가 부팅되었을 때 메모리에 올라가 있는데, 메모리에 상주하고 있는 CPU의 작업 공간을 Main Memeory라고 부른다.
  • device controller : 일종의 작은 CPU, 각 입출력 장치 내부를 관리, 제어
  • local buffer : 메인 CPU에 메모리가 있듯이 device controller도 데이터를 임시로 저장하기 위한 작업 공간이 필요.
  • register : 메모리보다 빠른 작은 기억장치.
  • mode bit : 현재 CPU에서 실행되는 것이 운영체제인지 사용자 프로그램인지 구분해 줌.
  • timer : 특정 프로그램이 CPU를 독점하는 것을 막아줌.
  • Interrupt line : CPU는 하나의 instruction을 수행하면 interrupt line을 체크하고 interrupt 들어온 게 없다면 다음 instruction을 수행한다. 프로그램이 CPU를 오랫동안 가지고 있어 timer가 interrupt를 걸거나, 입출력 장치의 수행이 끝나 device controller가 interrupt를 걸면 CPU는 하던 일을 잠시 멈추고 CPU 제어권이 사용자 프로그램에서 os로 자동으로 넘어간다. 그리고 os는 다른 프로그램에게 CPU를 넘겨준다.

CPU

CPU는 클럭마다 메모리에서 명령(Instruction)을 하나씩 읽어서 실행하는 역할을 한다. IO가 일어나면 CPU가 직접 접근하지 않고 Device Controller에게 시킨다. 이렇게 디바이스 컨트롤러에게 시키는 이유는 CPU에 비해 디바이스 속도가 매우 느리기 때문이다.

  • 접근 범위 : CPU는 메인 메모리와 Local Buffer에 접근이 가능하다.
  • 인터럽트 라인 (Interrupt Line) : CPU가 자신의 작업을 하던 중간에 인터럽트 라인에 신호가 들어오면 하던 일을 멈추고 인터럽트와 관련된 일을 먼저 처리한다.
  • 레지스터 (Register) : CPU 내부에 메모리보다 더 빠르면서 정보를 저장할 수 있는 작은 공간이다. 레지스터 중에 메모리 주소를 가리키는 레지스터인 PC (Program Counter) 레지스터가 있다. CPU는 PC 레지스터가 가리키는 메모리 위치에서 인스트럭션을 읽어서 수행한다.

Mode bit

  • CPU에서 실행되는 것이 운영 체제인지 사용자 프로그램인지 구분해 준다.
  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치 필요
  • Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원
1 사용자 모드 : 사용자 프로그램 수행 → 한정된 instruction만 실행 가능
0 모니터 모드 : OS 코드 수행 → 모든 instruction 수행 가능
  • 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 특권명령으로 규정
  • Interrupt나 Exception 발생 시 하드웨어가 mode bit을 0으로 바꿈
  • 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 세팅

Timer

컴퓨터를 시작하면 처음에 운영 체제가 CPU를 가지고 있다가 사용자 프로그램에게 CPU를 넘겨준다. 하지만 그냥 넘겨주지 않고 Timer에 값을 세팅하고 넘겨주게 된다. 시간이 지나서 Timer의 값이 0이 되면 타이머 인터럽트가 발생하여 다른 프로그램에게 CPU를 넘겨준다.

  • 타이머
    • 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 interrupt를 발생시킴
    • 타이머는 매 클럭 틱 때마다 1씩 감소
    • 타이머 값이 0이 되면 타이머 인터럽트 발생
    • CPU를 특정 프로그램이 독점하는 것으로부터 보호
  • 타이머는 time sharing을 구현하기 위해 널리 이용됨
    • time sharing : CPU의 시간을 쪼개서 다른 프로그램이 함께 사용된다는 CPU를 강조하여 사용되는 언어
  • 타이머는 현재 시간을 계산하기 위해서도 사용

Device Controller

  • I/O device controller
    • 해당 I/O 장치유형을 관리하는 일종의 작은 CPU
    • 제어 정보를 위해 control register, status register를 가짐
    • local buffer를 가짐 (일종의 data register)
  • I/O는 실제 device와 local buffer 사이에서 일어남
  • Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림 (이 경우 device controller가 너무 빈번하게 CPU에 interrupt를 보내는 것을 막기 위해 DMA controller를 중간에 둔다.)
  • device driver(장치구동기) : OS 코드 중 각 장치별 처리루틴 → software
  • device controller(장치제어기) : 각 장치를 통제하는 일종의 작은 CPU → hardware

입출력(I/O)의 수행

  • 모든 입출력 명령은 특권 명령
  • 사용자 프로그램은 어떻게 I/O를 하는가?
    • 시스템콜(system call)
      • 사용자 프로그램은 운영체제에게 I/O 요청
    • trap을 사용하여 인터럽트 벡터의 특정 위치로 이동
    • 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
    • 올바른 I/O 요청인지 확인 후 I/O 수행
    • I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮김
  • 동작
    • mode bit가 1인 상태로 사용자 프로그램이 실행되는 중, I/O를 해야 하는 상황이 오면 바로 OS의 주소로 점프 불가.
    • 프로그램이 직접 인터럽트 라인을 세팅
    • CPU에게 인터럽트 보냄
    • CPU는 다음 인스트럭션을 수행하는 대신 mode bit를 0으로 바꾸고 CPU 제어권을 os에게 넘김.

인터럽트(Interrupt)

💡 CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외 상황이 발생하여 처리가 필요한 경우에 CPU에게 알리는 일종의 이벤트
  • 인터럽트
    • 인터럽트 당한 시점의 레지스터와 program counter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다
  • Interrupt (넓은 의미)
    • Interrupt(하드웨어 인터럽트) : 하드웨어가 발생시킨 인터럽트
    • Trap(소프트웨어 인터럽트)
      • Exception: 프로그램이 오류를 범한 경우
      • System call: 프로그램이 커널 함수를 호출하는 경우
  • 인터럽트 관련 용어
    • 인터럽트 벡터
      • 해당 인터럽트의 처리 루틴 주소를 가지고 있음
      • 어느 인터럽트가 들어왔을 때는 어디 있는 함수를 봐야 하는지를 표시하고 있음
    • 인터럽트 처리 루틴(=Interrupt Service Routine. 인터럽트 핸들러)
      • 인터럽트 벡터에서 실제 처리해야 할 코드.
      • 해당 인터럽트를 처리하는 커널 함수
      • 인터럽트 종류마다 실행해야 하는 처리 코드
      • 실제로 인터럽트를 처리하는 부분
  • 특정 프로그램이 CPU 독점하는 것을 막기 위해서 timer interrupt 사용

  • 요청한 I/O가 다 끝났다는 것을 알려주기 위해서 혹은 입력이 들어왔다는 것을 알려주기 위해서 controller가 interrupt를 걸어서 알려줌

💡 현대의 운영체제는 인터럽트에 의해 구동됨

시스템콜(System Call)

  • 시스템 콜
    • 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것
  • 사용자 프로그램이 함수 호출을 해 interrput line 세팅 → CPU 제어권이 운영체제로 넘어옴 → 사용자 프로그램에서 요청한 수행을 할 수 있게 됨

동기식 입출력과 비동기식 입출력

💡 두 경우 모두 I/O의 완료는 인터럽트로 알려줌
  • 동기식 입출력(synchronous I/O)
    • I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
    • 구현 방법 1
      • I/O가 끝날 때까지 CPU를 낭비시킴
      • 매시점 하나의 I/O만 일어날 수 있음
    • 구현 방법 2
      • I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
      • I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
      • 다른 프로그램에게 CPU를 줌
      • 요청 보낸 I/O가 완료되면 CPU에게 인터럽트를 보내고, CPU는 os에게 제어권을 넘겨줌
  • 비동기식 입출력(asynchronous I/O)
    • I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
    • I/O 요청만 해둔 뒤에 CPU는 바로 다른 I/O 요청과 상관없는 작업들을 함

위 그림은 동기식 입출력과 비동기식 입출력을 비교해 보여 준다.

사용자가 입출력 요청을 하면 동기식 입출력에서는 먼저 운영체제의 커널로 CPU의 제어권이 넘어와서 입출력 처리와 관련된 커널의 코드가 수행된다. 이때 입출력을 호출한 프로세스의 상태를 Blocked 상태로 바꾸어 입출력이 완료될 때까지 CPU를 할당받지 못하도록 한다. 입출력이 완료되면 I/O 컨트롤러가 CPU에게 인터럽트를 발생시켜 입출력이 완료되었음을 알려주고, Blocked 상태인 해당 프로세스에게 CPU를 할당받을 수 있는 권한을 준다. 권한을 준다는 이야기는 CPU를 할당받을 수 있는 줄에 서게 될 수 있다는 뜻이다.

반면 비동기식 입출력에서는 CPU의 제어권이 입출력을 요청한 프로세스에게 곧바로 다시 주어지며, 입출력 연산이 완료되는 것과 무관하게 처리 가능한 작업부터 처리한다.

DMA (Direct Memory Access)

원칙적으로 메모리는 CPU에 의해서만 접근할 수 있는 장치이다. CPU 외의 장치가 메모리의 데이터에 접근하기 위해서는 CPU에게 인터럽트 발생시켜 CPU가 대신 컨트롤러의 로컬 버퍼와 메모리 사이에서 데이터를 옮겨 준다. 하지만, 작업 처리 속도가 매우 빠른 CPU가 인터럽트를 많이 당하면 비효율적이다. 그래서 CPU 이외에 메모리 접근이 가능한 DMA 컨트롤러를 둔다.

  • DMA (Direct Memory Access)
    • 빠른 입출력 장치(인터럽트를 더 빈번하게 걸 수 있음)를 메모리에 가까운 속도로 처리하기 위해 사용
    • CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
    • 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴 → 인터럽트 빈도 줄여 CPU를 효율적으로 이용 가능하게 함.
    • CPU와 DMA가 동시에 메인 메모리에 접근할 수 있다는 문제점이 있어서 누가 메모리에 먼저 접근하게 만들지 Memory Controller가 교통 정리하는 역할을 한다.

 

서로 다른 입출력 명령어

  • I/O를 수행하는 special instruction에 의해 (입출력 장치에만 접근하는 instruction, 메모리에만 접근하는 instruction)
  • Memory Mapped I/O에 의해

  • 왼쪽 그림 : 메모리 접근하는 instruction 따로 있고 I/O에 접근하는 instruction이 따로 있는 모습
  • 오른쪽 그림 : I/O 장치에도 메모리에 접근하는 연장 주소를 붙여 그 연장 주소로 접근 → Memory Mapped I/O

 

저장장치 계층 구조

  • 위로 갈수록 속도가 빠르고 가격이 비싸 용량이 적고 휘발성이다.
  • Primary : CPU에서 직접 접근할 수 있는 저장장치. CPU에서 직접 접근하기 위해서는 byte 단위 매체여야 한다.
  • Secondary : CPU에서 직접 접근하지 못하는 저장장치. 하드 디스크의 단위는 섹터 단위이므로 CPU가 접근하지 못해서 Secondary라고 부른다. 해당 저장소는 전원이 꺼져도 데이터가 보존되는 비휘발성 특징을 갖는다.
  • Caching : 캐시 메모리는 CPU와 메인 메모리의 속도 차이를 완충하기 위해 존재한다. 용량이 적기 때문에 모든 것을 담아 둘 수는 없으나, 빈번히 사용되는 필요한 정보를 선별적으로 저장하여 재사용하는 캐싱 기법을 통해 시스템의 성능을 높일 수 있다.

 

프로그램의 실행

메모리 load

  • 프로그램은 실행파일 형태로 하드디스크에 저장되어 있다. 실행파일을 실행시키면 메모리로 올라가 프로세스가 되어 실행된다.

  • 실행파일은 물리적인 메모리에 바로 올라가는 것이 아니라 가상 메모리(Virtual memory)에 먼저 올라간다.
  • 프로그램을 실행시키면, 0번지부터 시작하는 그 프로그램만의 독자적인 주소 공간이 생긴다. 이런 주소 공간은 각 프로그램마다 stack, data, code 공간으로 나뉜다. code는 프로그램을 실행시킬 기계어 코드를 담고 있고, data는 프로그램이 사용하는 변수, 자료구조를 담고 있고, stack은 함수를 호출하거나 리턴할 때 사용하는 데이터들을 담고 있다.
  • 커널은 컴퓨터를 부팅시키면 항상 상주하고, 프로그램은 프로그램을 실행시키면 메모리에 로드 됐다가 프로그램을 종료하면 메모리에서 사라진다.
  • 프로그램을 실행시켰을 때 주소공간을 모두 물리적인 메모리에 로드시켜 두면 메모리가 낭비되기 때문에 당장 필요한 부분만 메모리에 로드시켜 두고, 그렇지 않은 부분은 디스크의 swap area에 내려놓는다.
  • 가상 메모리 공간은 실제로 연속된 메모리 공간이 아니라 실제로는 쪼개져서 올라가 있다.
  • file system의 하드디스크와 swap area의 하드디스크는 용도가 다르다. file system은 전원이 나가도 내용이 유지가 되어야 하지만, swap area는 전원이 나가면 의미가 없는 데이터다.
  • address translation : 가상 주소 공간의 주소를 물리적인 메모리의 주소로 하드웨어의 지원을 받아서 변환을 해주어야 한다. (운영체제가 할 수 있는 것은 아님)

커널 주소 공간의 내용

  • code
    • CPU, 메모리 등의 효율적으로 자원을 관리하기 위한 부분과 사용자에게 편리한 인터페이스를 제공하기 위한 부분이 주를 이루고 있다.
    • 이 밖에도 커널의 코드는 시스템 콜 및 인터럽트를 처리하기 위한 부분을 포함한다.
  • data
    • 각종 자원을 관리하기 위한 자료 구조가 저장된다.
    • CPU나 메모리와 같은 하드웨어 자원을 관리하기 위한 자료 구조뿐 아니라 프로세스를 관리하기 위한 자료 구조도 커널의 데이터 영역에 유지된다.
    • 커널의 데이터 영역 내에는 각 프로세스의 상태, CPU 사용 정보, 메모리 사용 정보 등을 유지하기 위한 PCB를 두고 있다.
    • PCB(Process Control Block) : 프로세스 하나당 하나씩 만들어지며, 해당 프로세스를 관리한다.
  • stack
    • 운영체제도 함수 구조로 짜여 있기 때문에 함수 호출했을 때 stack을 사용한다.
    • 운영체제 코드는 사용자 프로그램이 필요에 따라 시스템콜을 통해 사용할 수 있다. 따라서 어느 프로세스가 함수를 실행 중인가에 따라서 사용자 프로그램마다 커널 스택을 따로 두고 있다.

사용자 프로그램이 사용하는 함수

  • 함수 (function)
    • 사용자 정의 함수
      • 자신의 프로그램에서 정의한 함수
    • 라이브러리 함수
      • 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
      • 자신의 프로그램의 실행 파일에 포함되어 있다
    • 커널 함수
      • 운영체제 프로그램의 함수
      • 커널 함수의 호출 = 시스템 콜
  • 사용자 정의 함수와 라이브러리 함수는 프로세스 별로 해당 프로세스의 주소 공간에 만들어지고, 커널 함수는 하나의 커널 주소 공간에만 있다.

프로그램의 실행

  • 프로그램이 CPU를 사용하고 있다면 user mode라고 한다.
  • user mode일 때 사용자 정의 함수나 라이브러리 함수를 호출해도 여전히 user mode에서 실행함.
  • 이때 시스템콜을 호출하게 되면 kernel mode로 바뀌어 CPU가 kernel mode에서 동작하고 시스템콜이 끝나면 프로그램으로 CPU 제어권이 넘어간다.

 

참고 - https://steady-coding.tistory.com/511

728x90