[운영체제] 운영체제는 무슨 일을 할까? (컴퓨터 구조와 관련지어)

컴퓨터 시스템 구조


1. 컴퓨터 시스템의 흐름

etc-image-0

  • 부팅을 하면 운영체제가 메모리에 상주하면서 실행 → CPU는 매순간 메모리에 있는 기계어를 실행시킴
  • 프로그램 실행시키면 해당 프로그램이 메모리에 올라가서 프로세스가 됨
  • CPU가 운영체제에 의해서 실행될 경우에는 필요한 기계어만 사용함, but 운영체제가 사용자 프로그램에게 CPU를 넘겨줄 때에는 안정성을 보장할 수 없음 → 이때는 mode bit을 통해서 안정성 해결
  • 또한, 사용자가 프로그램을 계속 사용하는 것을 막기 위해 부가적인 하드웨어를 둠
    • 일정 시간이 흐르면 자연스럽게 CPU에게 인터럽트를 걸어서 운영체제에게 CPU 권한을 넘김
    • timer를 통해서 CPU의 사용 시간을 조절함
    • 역할 : CPU를 특정 프로그램이 독점하는 것으로부터 보호함
  • Interrupt : CPU가 매 순간 체크를 하면서, CPU 할당시간나 특정 시간이 지나면 프로그램 카운터가 운영체제의 위치로 가게 함 → 운영체제 코드가 실행되면 mode bit가 0으로 바뀜

 

2. Mode bit

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

사용자 모드 (1) : 사용자 프로그램 수행 → 사용자 프로그램에게 CPU를 넘길 때의 상태
모니터 모드 (0) : OS 코드 수행 → 운영체제가 CPU 권한을 가짐
  • 사용자 프로그램에게 CPU를 넘기기 전에 1로 세팅함
  • 위험한 상황 발생 시 하드웨어가 운영체제에게 CPU 권한을 넘기기 위해 0으로 바꿈

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

  • 모든 I/O는 특권 명령

 

3. 인터럽트 (Interrupt)

  • 인터럽트가 들어오기 전까지 프로그램은 계속 실행됨
  • 인터럽트가 들어오면, 당한 시점의 레지스터와 program counter를 저장한 후 CPU의 제어를 인터럽트 처리 루틴에 넘김
  • CPU가 매 순간 체크를 하면서, 인터럽트가 들어오면 프로그램 카운터가 운영체제의 위치로 가게 함 → 운영체제 코드가 실행되면 mode bit가 0으로 바뀜
  • Interrupt의 넓은 의미
    • 하드웨어 인터럽트(Interrupt) : 하드웨어가 발생시킨 인터럽트
    • 소프트웨어 인터럽트(Trap)  → 개별 프로그램이 운영체제에 CPU를 넘기기 위해 소프트웨어가 발생시키는 경우
      • Exception - 프로그램이 오류를 범한 경우
      • System call - 프로그램이 커널 함수를 호출하는 경우
  • 인터럽트 관련 용어
    • 인터럽트 벡터 : 해당 인터럽트의 처리 루틴 주소를 가지고 있음
    • 인터럽트 처리 루틴 : 해당 인터럽트를 처리하는 커널 함수

 

4. 시스템콜 (System Call)

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

⬇️ 시스템콜 동작 과정

etc-image-1

  1. 운영체제는 CPU를 가져와 디스크에게 파일을 요청해달라고 device controller에게 부탁함 → 부탁을 하는 기계어가 device driver(CPU가 실행하는 코드임)
  2. 그 동안에 CPU는 다른 프로그램에게 넘어가서 본인들의 기계어를 실행하게 하고 프로그램을 동작시킴
  3. 디스크에서 요청된 파일이 다 준비됨 → 컨트롤러(버퍼)에 준비되었다는 뜻
  4. 해당 프로그램이 스스로 CPU에게 인터럽트를 걸어서 알려줌 → 프로그램이 자신의 기계어를 통해서 스스로 인터럽트 라인을 세팅함
  5. CPU가 다음 기계어를 실행하기 전에 인터럽트가 들어왔으므로 운영체제에게 CPU 권한을 넘김
  6. 운영체제는 자신의 기계어를 통해서 읽어온 파일을 메모리에 카피해주고 프로그램은 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밖에 없었음 → 하지만, 인터럽트가 자주 걸리는 것을 막기 위해 메모리에 직접 접근할 수 있는 장치를 만듦, 이게 DMA
  • 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용함
  • 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장치에도 메인 메모리의 주소를 연장해서 놓고 고유의 기계어를 쓰는 것이 아니라 메모리 접근 기계어를 통해서 접근함