[OS] 컴퓨터시스템의 구조

JiKwang Jeong·2022년 5월 11일
0
post-thumbnail


CPU는 매순간 (PC Register) 메모리에 있는 기계어를 읽어와서 실행한다.

Mode bit

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치
  • 1 사용자 모드: 사용자 프로그램 수행
  • 0 모니터 모드: OS 코드 수행
    • 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 '특권명령'으로 규정
    • Interrupt나 Exception 발생 시 하드웨어가 mode bit을 0으로 바꿈
      (디스크 컨트롤러가 요청한 작업을 모두 수행하면 CPU에게 인터럽트를 건다)
    • 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 셋팅

timer

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

인터럽트 (Interrupt)

  • 인터럽트 당한 시점의 레지스터와 program counter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.
  • Interrupt (넓은 의미)
    • Interrupt (하드웨어 인터럽트): 하드웨어가 발생시킨 인터럽트
    • Trap (소프트웨어 인터럽트)
      • Exception: 프로그램이 오류를 범한 경우
      • System call: 프로그램이 커널 함수를 호출하는 경우
  • 인터럽트 관련 용어
    • 인터럽트 벡터
      해당 인터럽트의 처리 루틴 주소를 가지고 있음 (주소에 대한 포인터)
    • 인터럽트 처리 루틴 (=Interrupt Service Routine, 인터럽트 핸들러)
      해당 인터럽트를 처리하는 커널 함수

시스템콜 (System Call)

  • 파일을 읽을 경우 디스크 컨트롤러에게 기계어(특권명령으로 묶여있음)를 통해 부탁을 함.
  • 이로 인해 시스템콜 사용
  • 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것
  • 사용자 프로그램 기계어가 실행되다가 운영체제의 기계어가 실행될 수 있도록 점프가 필요
  • 점프를 위해 사용자 프로그램이 스스로 인터럽트를 건다 (System call)
  • 정리
    • 운영체제한테 프로그램이 시스템콜을 한다.
    • 운영체제는 CPU에게 파일을 읽어달라고 디스크 컨트롤러한테 부탁한다.
    • 해당 파일을 읽어서 버퍼에 들어들이는 작업이 오래 걸리므로 방금 전 프로그램에게 CPU를 넘기는 것이 아니라 그동안 다른 프로그램에게 CPU를 넘김.
    • 디스크 컨트롤러가 요청한 파일을 전부 읽으면 CPU에게 인터럽트를 걸고 CPU 제어권이 운영체제로 넘어가고 자신의 기계어를 통해서 프로그램이 사용할 수 있게 메모리에 카피한다. 그리고 프로그램이 CPU를 얻으면 사용.

운영체제한테 CPU가 넘어가는 경우 3가지

  • 하드웨어 장치의 I/O 인터럽트 -> Interrupt
  • 프로그램 소프트웨어가 직접 인터럽트 라인을 세팅해서 운영체제가 넘어가는 경우 -> Trap
    • System call (I/O 작업) 특권명령
    • Exception / 권한이 없는 코드 실행

사용자 프로그램이 CPU를 가지고 있다가 다른 프로그램 또는 운영체제에 넘어가는 경우 (CPU를 빼앗기는 경우)

  • CPU 독점권을 막으려고 번갈아 쓰는 경우 -> Timer Interrupt
  • 더 이상 CPU를 쓸 의지가 없는 경우 -> 파일이 아직 읽혀져 오지 않아 대기만 하는 경우

DMA controller (Direct Memory Access)

  • 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
  • CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
  • 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴.
    메모리를 접근할 수 있는 장치를 하나 더 둠.

인터럽트가 너무 자주 걸리는 것을 막기위해서 생성.
블록단위의 분량이 찼을 때 DMA가 직접 메모리에 카피하는 작업을 하고 인터럽트를 걸어서 필요로 하는 작업이 끝났다고 알림. -> 인터럽트가 덜 빈번하게 발생하므로 CPU가 효율적으로 동작 가능

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


synchronous: 여럿이 작업할 때 시간을 맞춰 동작을 맞추어서 잘 이루어지는 것 (립싱크)

동기식 입출력 (synchronous I/O)

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

비동기식 입출력 (asynchronous I/O)

  • I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
  • 쓰는 작업은 비동기식으로 쓸 수 있다. 써진 것을 확인할 필요는 없으므로

두 경우 모두 I/O 인터럽트를 통해 알림

프로그램의 실행 (메모리 load)

커널 주소 공간(Kernel Address Space)의 내용

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

  • 사용자 정의 함수
    자신의 프로그램에서 정의한 함수
  • 라이브러리 함수
    자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
    자신의 프로그램의 실행 파일에 포함되어 있다
  • 커널 함수 (Kernel Address Space)
    운영체제 프로그램의 함수
    커널 함수의 호출 = 시스템 콜
    mode bit = 0 ( 운영체제가 CPU를 사용하고 있음 )
profile
기억보다 기록, 난리보다 정리

0개의 댓글