[운영체제] 컴퓨터 시스템의 구조와 시스템 콜, Interrupt

컴퓨터 시스템 구조


컴퓨터 시스템 구조

etc-image-0

  1. 부팅을 하면 운영체제가 메모리에 상주하면서 실행 → CPU는 매순간 메모리에 있는 기계어를 실행시킴
  2. 프로그램 실행시키면 해당 프로그램이 메모리에 올라가서 프로세스가 됨
  3. CPU가 운영체제에 의해서 실행될 경우에는 필요한 기계어만 사용하지만 운영체제가 사용자 프로그램에게 CPU를 넘겨줄 때에는 안정성을 보장할 수 없음 → mode bit을 통해서 해결함

 

  • Program Register Counter : 다음 번에 실행할 기계어의 메모리 주소를 가지고 있음 → CPU는 카운터가 가리키고 있는 메모리 위치에서 기계어를 가져옴

 

  • 사용자가 프로그램을 계속 사용하는 것을 막기 위해 부가적인 하드웨어를 두는데 이를 timer 하드웨어라고 함
    • 일정 시간이 흐르면 자연스럽게 CPU에게 인터럽트를 걸기 때문에 운영체제에게로 CPU 권한이 넘어옴
    • CPU를 특정 프로그램이 독점하는 것으로부터 보호함
    • timer를 통해서 CPU의 사용 시간을 조절함

 

Mode bit

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치가 필요한데 운영체제는 mode bit 통해 하드웨어적으로 두 가지 모드의 operation을 지원함
1 (사용자 모드) : 사용자 프로그램 수행 → 사용자 프로그램에게 CPU를 넘길 때
0 (모니터 모드) : OS 코드 수행 → 운영체제가 CPU 권한을 가짐
  • 위험한 상황 발생 시 하드웨어가 0으로 바꿈
  • 사용자 프로그램에게 CPU를 넘기기 전에 1로 세팅함

⇒ 기계어를 실행하기 전에 위험한 기계어인데 0이 아닌 경우라면, 자동적으로 CPU가 운영체제로 넘어가게 함

  • 모든 I/O는 특권 명령

 

인터럽트 (Interrupt)

  • 인터럽트가 들어오기 전까지 프로그램을 계속 실행함
  • 인터럽트 당한 시점의 레지스터와 program counter를 save한 후 CPU의 제어를 인터럽트 처리 루틴에 넘김
  • CPU가 매 순간 체크를 하면서, 인터럽트가 들어오면 프로그램 카운터가 운영체제의 위치로 가게 함 → 운영체제 코드가 실행되면 mode bit가 0으로 바뀜

 

  • Interrupt의 넓은 의미
    • 하드웨어 인터럽트(Interrupt) : 하드웨어가 발생시킨 인터럽트
    • 소프트웨어 인터럽트(Trap) : 개별 프로그램이 운영체제에 CPU를 넘기기 위해 소프트웨어가 발생시키는 경우
      • Exception - 프로그램이 오류를 범한 경우
      • System call - 프로그램이 커널 함수를 호출하는 경우

 

  • 인터럽트 관련 용어
    • 인터럽트 벡터 : 해당 인터럽트의 처리 루틴 주소를 가지고 있음
    • 인터럽트 처리 루틴 : 해당 인터럽트를 처리하는 커널 함수

 

시스템콜 (System Call)

  • CPU가 프로그램을 실행하는 도중에 디스크에 파일을 요청하기 위해 사용되는 I/O 장치들특권 명령으로 묶여있음(본인의 코드로는 실행을 못시킴) → 그래서 I/O에 특정 명령을 할 때는 운영체제에게 요청하는데 이를 시스템콜이라고 함
  • 즉, 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것 → 사용자 프로그램이 뭘 하고 싶은데 자신의 권한으로는 할 수 없을 때 사용

etc-image-1

  1. 운영체제는 CPU를 가져와 disk에서 파일을 요청해달라고 device controller에게 부탁 → 부탁을 하는 기계어가 device driver(CPU가 실행하는 코드임)
  2. 그 동안에 다른 프로그램에게 CPU를 넘겨서 다른 프로그램이 기계어를 실행하게 함
  3. 디스크에서 요청된 파일이 다 준비됨 → 컨트롤러(버퍼)에 준비된 상태임
  4. 현재 CPU를 사용하고 있는 프로그램에게 인터럽트가 걸림 → 현재 실행 중인 프로그램이 자신의 기계어를 통해서 스스로 인터럽트 라인을 세팅함
  5. CPU가 다음 기계어를 실행하기 전에 인터럽트가 들어왔으니까 운영체제에게 CPU 권한을 넘김
  6. 운영체제는 자신의 기계어를 통해서 읽어온 파일을 메모리에 카피해주고 I/O 요청을 한 해당 프로그램은 CPU를 얻으면 본인의 기계어를 실행가능하게 함

→ 가상 메모리의 주소공간을 가로질러서 다른 영역의 프로그램을 바뀌게 하는 것이기 때문에, Interrupt line을 세팅해서 운영체제에게 CPU 제약 권한을 넘어가게 함

 

💡운영체제한테 CPU가 넘어가는 경우
  • Interrupt line을 세팅하는 상황
    • 하드웨어 장치들(DIisk)이 Interrupt를 거는 상황 → 프로그램이 일을 하고 있었는데 일을 하는 것과 별개로 CPU, 운영체제를 통해서 정보를 전달할 일이 있을 때
    • 프로그램 소프트웨어가 직접 세팅하는 상황 → 시스템콜

 

💡CPU가 다른 프로그램에게 넘어가는 경우
  • time interrupt
  • 더이상 CPU를 사용할 일이 없을 때 → 오래걸리는 I/O작업을 할 경우

 

→ 현대의 운영체제는 아무 일도 안하다가 인터럽트가 들어올 때만 일을 하므로, 인터럽트에 의해 구동됨

 

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


1. 동기식 입출력

  • I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
  • I/O 에서 일어나는 작업과 CPU에서 일어나는 작업이 싱크가 맞아야 됨 → 시간에 맞게 서로 조율을 잘해서 넘어가는 것
  • 구현 방법 1
    • I/O가 끝날 때까지 CPU를 낭비시킴
    • 매시점 하나의 I/O만 일어날 수 있음
  • 구현 방법 2
    • I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
    • I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
    • 다른 프로그램에게 CPU를 줌

 

2. 비동기식 입출력

  • I/O 요청 후 결과와는 무관하게 CPU를 해당 프로그램에게 줘서 일을 하게 하는 것
  • ex) 파일에 내용 쓰는 작업 요청 → 다 썼다는 응답만 받으면 써지든 안써지든 다음 CPU를 실행할 수 있음

→ 두 경우 모두 I/O의 완료는 인터럽트로 알려줌

 

DMA(Direct Memory Access)


etc-image-2

  • 여기서 메모리에 접근할 수 있는 장치는 CPU밖에 없음 → 인터럽트가 자주 걸리는 것을 막기 위해 메모리에 직접 접근할 수 있는 장치를 만듦
  • 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
  • CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리게 block 단위로 직접 전송
  • 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴

etc-image-3

 

서로 다른 입출력 기계어


etc-image-4

⬇️ I/O를 기계어를 통해서 수행하는 방법

  • I/O를 수행하는 special instruction에 의해 수행할 경우
    • I/O를 전담하는 기계어를 둠
    • I/O를 수행하는 기계어와 메모리에 접근하는 기계어가 따로 있음
  • Memory Mapped I/O에 의해 수행할 경우
    • I/O장치에도 메인 메모리의 주소를 연장해서 놓고 고유의 기계어를 쓰는 것이 아니라 메모리 접근 기계어를 통해서 접근함