운영체제 전체적인 구조

최동혁·2022년 12월 6일
0

운영체제

목록 보기
3/10

컴퓨터 시스템 구조

I/O device에서 데이터가 컴퓨터 안쪽으로 들어가는 것을 input

컴퓨터 안에서 처리하고 내보내는 결과가 output

그래서 I/O device

간략하게 말하자면 컴퓨터는 CPU 와 memory로 구성되어 있다.

좀더 자세히 본다면?

  • 메모리는 CPU의 작업 공간이다.
  • CPU는 매 clock cycle마다 메모리에서 기계어를 읽어서 실행함
  • 각각의 I/O device에는 그 device를 전담하는 작은 CPU 같은 것들이 붙어있다.
    • device controller
    • disk의 내부를 통제하는 것은 CPU가 아닌 disk controller이다.
  • 메인 CPU의 작업공간인 메인 메모리가 있듯이, device controller들도 작은 작업 공간이 필요하다.
    • local buffer
  • CPU는 평생 하는 일이 메모리에서 인스트럭션 하나 읽어서 실행하고 다음꺼 실행함.
  • CPU안에는 메모리보다 더 빠르면서 정보를 저장할 수 있는 작은 공간이 있다.
    • register
  • CPU에서 실행되는 것이 운영체제인지, 사용자 프로그램인지 구분해 주는 것
    • mode bit
  • CPU가 계속 메모리와 작업을 하다가 I/O 작업을 해야 되면, I/O device에 일을 시키고 계속 메모리랑 일을 함.
    • 시킨일에 대한 결과를 intterupt line을 통해 받음.
  • 만약 무한 루프가 도는 것을 만들어서 메모리에 있는데, 이게 한번 CPU한테 넘어가면?
    • CPU가 이 작업 때문에 다른 작업을 못하는 것을 막기 위해
    • timer라는 하드웨어 존재
      • 특정 프로그램이 CPU 독점하는 것을 막음.
      • 처음 컴퓨터를 켜면 운영체제가 CPU를 가지고 있음.
      • 여러 프로그램이 실행되면 CPU를 넘겨줌.
      • 그냥 넘겨주는 것이 아닌 timer에 어떤 값을 세팅하고 넘겨준다.
      • 그러면 한 프로그램이 CPU를 timer에 세팅된 시간만큼 쓰고 다시 넘겨주게 된다.
      • 세팅된 시간이 다 되면 timer가 CPU에게 인터럽트를 거는 방식으로 알려줌.
  • 하나의 인스트럭션이 끝나면 interrupt line을 체크함.
  • 그 후, interrupt 들어온 것 없으면 다음 인스트럭션 실행!
  • timer가 interrupt를 걸어왔으면, CPU는 하던일을 잠시 멈추고, CPU의 제어권이 사용자에서 운영체제로 자동으로 넘어감.
  • 다음 인스트럭션으로 넘어가면서 제어권이 그냥 넘어가는 것이 아닌, timer를 세팅하고 넘겨줌.
  • 시간 만료되면 또 timer interrupt 들어오고 위의 작업 반복.
  • 굳이 timer가 interrupt를 걸지 않아도, 인스트럭션이 종료 시간이 다 되면 알아서 반납함.
  • I/O device를 사용해야 하는 코드에 도달하면, CPU의 제어권을 가지고 있던 프로그램이 운영체제로 제어권을 넘기게 됨.
  • 왜냐면 사용자 프로그램은 직접적으로 I/O device에 접근할 수 없다.
    • 운영체제를 통해서만 할 수 있음.
  • 그러면 운영체제가 I/O controller에게 해당 작업을 시킴.
    • 해당 작업이 오래 걸리기 때문에 CPU는 이 작업을 시킨 프로그램으로 다시 돌아가는 것이 아닌, 다른 프로그램으로 CPU를 넘겨줌.
    • I/O device 작업
      • 요청한 작업이 끝나서 결과물이 local buffer에 들어왔다면?
      • device controller가 CPU에게 interrupt를 건다.
      • 어떤 프로그램이 CPU에서 실행되고 있었지만, interrupt가 들어오면 기본적으로 제어권이 운영체제로 다시 넘어감.
      • 그렇다면 아까 작업을 시킨 프로그램의 메모리 공간에 결과 값을 카피해주고, 방금까지 CPU를 쓰던 프로그램에 일단 다시 돌려줌.
      • 그 친구가 할당된 시간을 다 쓰거나, 작업을 완료했으면 I/O 작업을 시킨 프로그램에게 CPU가 다시 돌아간다!

Mode bit

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치 필요
  • Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원 1 : 사용자 모드
    • 사용자 프로그램 수행

    • 제한된 인스트럭션만 실행할 수 있다.

    • 그렇다면, CPU가 I/O에 접근을 한다던지, 다른 프로그램의 메모리 공간, 운영체제의 메모리 위치에 접근을 하는 시도가 있을 때, mode bit이 1인 것을 보고 인스트럭션 실행이 안되게 하드웨어적 구현을 해놓은 것

      0 : 모니터 모드

    • OS 코드 수행

    • 무슨 일이든 다 할 수 있게끔 정의되어 있다.

    • 메모리 접근 뿐만 아니라 I/O device 접근까지

      • 운영체제가 CPU를 가지고 있기 때문에
    • interrupt가 들어오면 CPU가 운영체제에게 넘어가서 mode bit이 자동으로 0으로 바뀜.

    • 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 ”특권명령”으로 규정

    • Interrupt나 Exception 발생시 하드웨어가 mode bit을 0으로 바꿈

    • 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 셋팅

Timer

  • 타이머

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

  • 타이머는 현재 시간을 계산하기 위해서도 사용

Device Controller

  • I/O device controller
    • 해당 I/O 장치 유형을 관리하는 일종의 작은 CPU
    • 제어 정보를 위해 control register, status register를 가짐
      • 실제 데이터는 local buffer에 담고, 명령은 제어 레지스터를 통해서 한다는 뜻.
    • local buffer를 가짐 (일종의 data register)
  • I/O는 실제 device와 local buffer 사이에서 일어남
  • Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림

device driver (장치 구동기)

: OS 코드 중 각 장치별 처리 루틴 → software

  • 특정 하드웨어 하나를 붙이게 되면 메모리에 드라이버를 설치해야 함.

device controller (장치 제어기)

: 각 장치를 통제하는 일종의 작은 CPU → hardware

CPU는 사실 메모리 접근도 할 수 있고, local buffer에도 접근할 수 있다.

작은 CPU인 device controller들은 자신의 local buffer만 접근할 수 있다.

그렇다 보니 CPU가 interrupt를 너무 많이 당하게 된다.

이걸 방지하기 위해 DMA controller를 놨음.

DMA (Direct Memory Access) controller

  • 메모리에 직접 접근할 수 있는 컨트롤러
  • 원래는 메모리에 접근할 수 있는 장치는 CPU뿐이였다.
  • 그런데 DMA를 두면 접근을 DMA controller와 CPU 둘이서 할 수 있다.
  • 그러다 보니 특정 메모리 영역을 둘이 동시에 접근하는 경우가 생김.
    • 그런걸 중재하는 역할을 하는 것이 memory controller이다.
    • 누가 먼저 접근해서 작업을 수행하게 할 것인지 교통 정리를 해주는 역할
  • 그렇다면 왜 달아 놓은 것일까??
    • I/O device가 너무 많이 interrupt를 거니깐 cpu가 방해를 너무 많이 받는다.
    • CPU가 자기 일을 하다가 interrupt 받아서 하던 일을 멈추고 결과물을 메모리에 복사해주는 그런 일이 너무 많기 때문에, CPU는 하던 일을 마저 하고, DMA가 그것들을 받아서 메모리에 복사해준다.
    • 그리고 그 작업들을 DMA가 전부 완료시키면 CPU에 interrupt를 한번만 걸어서 전부 완료했다고 보고.
    • 그렇게 되면 CPU가 interrupt 당하는 빈도수가 줄어들어 좀 더 효율적으로 쓸 수 있다.

입출력(I/O)의 수행

  • 모든 입출력 명령은 특권 명령
  • 사용자 프로그램은 어떻게 I/O를 하는가?
    • 시스템콜(system call)
      • 사용자 프로그램은 운영체제에게 I/O 요청
      • 사용자 프로그램이 운영체제에게 부탁하는걸 시스템 콜이라고 함.
    • trap을 사용하여 인터럽트 벡터의 특정 위치로 이동
    • 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
    • 올바른 I/O 요청인지 확인 후 I/O 수행
    • I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮김

예를 들어

  • c언어로 하나의 프로그램을 짬
    • main 함수
    • a 함수
    • 등등
  • CPU는 메인 함수에 해당하는 인스트럭션을 실행
  • CPU에서 인스트럭션을 순차적으로 실행하다가 특정 함수 호출이 일어나면 점프를 함.

즉, 내 프로그램에서 함수 호출을 하는 것은 메모리 안에 내 프로그램 안에서 메모리 주소를 바꾸는 것.

하지만, 내 프로그램을 실행하다가 I/O 요청을 하기 위해 시스템 콜을 하는 것은 단순히 메모리 주소를 바꾸는 것이 아니다. 좀 더 복잡함.

메모리 주소 안에서 한 블럭에 해당하는 내 프로그램 내에서만 점프가 가능한데, 만약 시스템 콜을 해서 운영체제로 점프를 하려면 안된다.

왜냐면 mode bit이 1이여서 사용자 프로그램 내에서만 이동이 가능하기 때문.

그렇게 되면 사용자 프로그램이 직접 interrupt line을 세팅하는 인스트럭션을 실행함.

인스트럭션 하나를 실행하고 나면 인터럽트 들어온게 있는지 체크를 함.

그런데 아까처럼 timer나 i/o controller가 인터럽트를 거는것이 아닌, 프로그램이 운영체제에게 직접적으로 요청하기 위해 소프트웨어적으로 인터럽트를 검.

그렇게 되면 CPU는 다음 인스트럭션을 실행하는 것이 아닌, 인터럽트가 들어왔기 때문에 mode bit이 0으로 바뀌고 CPU 제어권이 운영체제에게 넘어감.

그래서 만약 함수에서 디스크에서 무언가를 읽어오기 위해 시스템 콜을 했다?

그러면 운영체제가 CPU를 가지고 있기 때문에 디스크 컨트롤러에게 읽어오라고 부탁을 함.

결론

인터럽트를 거는 4가지 방법

  1. 하드웨어 일꾼들이 CPU에게 정보 교신을 위해 인터럽트 걸기
  2. 메모리에 있는 사용자 프로그램이 돌아가다가 내가 처리 못하고 운영체제에게 대신 해달라고 요청을 해야 되는 그런 상황에서도 interrupt line을 세팅해서 운영체제에게 CPU가 넘어감.
  3. 타이머가 사용자 프로그램이 실행시간이 끝나면 인터럽트를 검
  4. DMA가 하드웨어에서 걸어온 모든 인터럽트를 전부 수행했을 때 CPU에게 다했다고 보고하기 위해 인터럽트를 검.

인터럽트 (Interrupt)

  • 인터럽트
    • 인터럽트 당한 시점의 레지스터와 program counter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.
  • Interrupt (넓은 의미)
    • Interrupt (하드웨어 인터럽트) : 하드웨어가 발생시킨 인터럽트
      • 일반적인 인터럽트
    • Trap (소프트웨어 인터럽트)
  • 인터럽트 관련 용어
    • 인터럽트 벡터
      • 해당 인터럽트의 처리 루틴 주소를 가지고 있음
      • 1번 인터럽트가 들어왔을때 어떤 함수로 가고 2번 인터럽트가 들어왔을때 어떤 함수로 가는지 표시를 해줘야 하는데, 그런 표시를 인터럽트 벡터에 해주고 있다.
      • 함수의 주소들을 정의해놓은 일종의 테이블.
    • 인터럽트 처리 루틴 (=Interrupt Service Routine, 인터럽트 핸들러)
      • 해당 인터럽트를 처리하는 커널 함수
      • 각 인터럽트마다 처리해야 하는 실제 코드

결론

  1. 메모리에 있는 사용자 프로그램이 I/O를 요청하기 위해 system call을 함.
    1. I/O를 요청할 때 발생하는 인터럽트는 소프트웨어 인터럽트(Trap)
  2. 운영체제에게 CPU가 넘어간 후, OS가 device controller에게 일을 시킴.
  3. 그러는 동시에 CPU는 다른 프로그램에게 넘어가서 다른 일을 함.
  4. 시킨일을 다 끝내면 일을 다 끝냈다고 CPU에게 알려줌
    1. 하드웨어 인터럽트임.
    2. I/O controller가 인터럽트를 걸어서 CPU에게 알려줌.
  5. 또 CPU를 특정 프로그램이 독점하는 것을 막기 위해 timer 인터럽트 사용

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

I/O를 하기 위해 필요한 인터럽트는 하드웨어 인터럽트냐, 소프트웨어 인터럽트냐??

  • I/O 요청을 할 때에는 소프트웨어 인터럽트를 통해 요청을 함.
  • I/O가 다 끝났으면 하드웨어 인터럽트를 통해 알려줌.
  • 두가지 다 필요!
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글