운영체제 Overview 정리

최동혁·2022년 12월 6일
0

운영체제

목록 보기
4/10

  1. CPU가 매 clock cycle마다 메모리에서 기계어를 읽어서 실행
    1. CPU는 1clock당 1 인스트럭션을 처리함.
    2. register에서 Program Counter라고 하는 레지스터가 있는데, 메모리 주소를 가리키는 레지스터이다.
    3. 그것이 가리키고 있는 메모리 위치에서 인스트럭션을 하나 읽어와서 CPU가 그 인스트럭션을 실행하고, Program Counter라고 하는 레지스터는 다음 주소를 가리키게 된다.
      1. 여기서 인스트럭션 하나는 4byte이다.
    4. Program Counter는 다음 인스트럭션의 주소를 가리키기 위해 4가 증가한다.
    5. 특별한 일이 없으면 PC가 가리키는 다음 인스트럭션을 순차적으로 실행한다.
  2. CPU가 특정 사용자 프로그램에 있는것을 실행
    1. 만약 사용자 프로그램에 있는 코드가 I/O 디바이스를 사용하기 위해 system call을 건다면?

      1. system call을 거는 이유는 사용자 프로그램은 I/O로 직접적인 요청을 못함.
      2. 의도적으로 interrupt line을 세팅함.
        1. 인터럽트가 걸리면 하던 일을 중단하고 CPU 제어권을 운영체제에게 넘기기 때문에.
        2. 일반적으로 거는 인터럽트는 하드웨어 인터럽트로써 I/O device가 거는 인터럽트이다.
        3. 이건 의도적으로 세팅을 해서 부르는데 Trap(소프트웨어 인터럽트)라고 한다.
      3. 운영체제만이 I/O 디바이스에게 요청할 수 있음.
      4. 사용자 프로그램이 I/O 요청을 직접적으로 하는 것을 막기 위해 mode bit 존재

      mode bit

      • 1일때는 사용자 모드로, 사용자 프로그램을 수행하며 I/O 접근을 못하게 막음.
      • 0일때는 모니터 모드로 CPU가 운영체제에 넘어가 있을때를 뜻함.
        • 무슨일이든 다 할 수 있다.
    2. system call이나 Exception(예시로 0으로 나누는 것)을 걸면 interrupt line이 자동으로 세팅되고 mode bit가 1에서 0으로 바뀜.

      1. system call과 Exception으로 거는 interrupt를 소프트웨어 인터럽트(trap)라고 함.
    3. CPU가 운영체제에게 넘어가서 trap을 사용하여 인터럽트 벡터의 특정 위치로 이동시킴.

    4. 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동

      1. 인터럽트 벡터는 특정 인터럽트가 발생해서 실행시켜야 하는 함수들의 주소를 정의해 놓은 일종의 테이블
      2. 인터럽트 처리 루틴은 각 인터럽트마다 처리해야 하는 실제 코드(커널 함수)
    5. 올바른 I/O 요청인지 확인 후 I/O 수행

  3. system call로 device controller에게 특정 명령을 지시했으면, CPU는 다른 사용자 프로그램을 실행시킴. 계속해서 메모리랑 일을함.
    1. 여기서 device controller는 일종의 작은 CPU임.
    2. 제어 정보를 위해 control register와 status register를 가짐.
    3. 실제 데이터는 local buffer에 담고, 명령은 제어 레지스터를 통해서 함.
      1. 메인 CPU의 작업공간인 메인 메모리가 있듯이, device controller들도 작은 작업 공간이 필요한데 이것이 local buffer이다.
    4. 그리고 만약 특정 하드웨어가 하나 추가되면 메모리에 해당 device driver를 설치해야함.
  4. 그러다가 I/O 디바이스에서 해당 명령을 다 수행했으면 DMA controller가 처리
    1. 원래 I/O 가 다 수행이 되면 다 수행했다고 interrupt line에 세팅을 해서 CPU에게 알림.
    2. 하지만 너무 많은 하드웨어 interrupt가 발생하면 CPU가 효율을 못냄.
    3. 원래 메모리에는 CPU만 접근할 수 있는데, DMA controller도 접근을 해서 대신 일을 해줌.
    4. I/O 결과들을 메모리에 복사해줌.
    5. 그리고 전부 완료한 후 CPU의 interrupt line에 한번만 세팅해줌.
    6. 여러번 interrupt 당하는 것을 한번으로 처리해서 좀 더 효율적으로 CPU 사용.
    7. 하지만 여기서 DMA와 CPU가 동시에 메모리 영역에 접근하는 경우
      1. memory controller가 중재해줌.
      2. 누가 먼저 접근해서 작업을 수행하게 할 것인지 교통정리를 해주는 것.
  5. 해당 I/O 작업이 끝나더라도 현재 진행되고 있는 작업을 CPU가 일단 진행함.
    1. 만약 이 작업을 완료하거나, 할당된 시간을 다 쓴다면 I/O 작업을 시킨 프로그램에게 CPU가 다시 돌아감.
      1. 여기서 할당된 시간이란?
        1. CPU가 한 프로그램에게 독점되지 않게 timer가 정해놓은 시간.
        2. 만약 한 프로그램에서 무한루프가 도는 경우에 timer가 정해놓은 시간을 넘어가게 되면 타이머 인터럽트를 발생시켜 CPU 제어권을 다른 프로그램에게 넘김.
  6. CPU가 특정 인스트럭션을 실행 종료하고 나서 다음 인스트럭션을 실행하기 전에는 항상 interrupt line을 확인해 interrupt가 들어온게 있는지 체크.
    1. 여기서 인터럽트가 있으면, 지금 하던 작업을 멈추고 PC가 가리키는 다음 인스트럭션을 실행하는 것이 아닌, 누가 쓰고 있던 CPU 제어권이 운영체제에게 넘어간다.
    2. 운영체제는 인터럽트 벡터로 가서 해당 인터럽트의 처리 루틴 주소를 보고 거기로 이동.
    3. 운영체제는 인터럽트 당한 시점의 레지스터와 program counter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.
    4. 그 후, device controller에게 명령을 내리고 CPU는 다음 인스트럭션을 수행.
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글