[운영체제] Ch2. 시스템 구조와 프로그램 실행

돗개·2020년 11월 24일
1

운영체제

목록 보기
2/7

운영체제를 본격적으로 시작하기에 앞서,

컴퓨터 시스템이 어떻게 동작하고, 프로그램들이 하드웨어 위에서 어떻게 돌아가는지 알아보자.


1. 컴퓨터 시스템 구조

: 쉽게 말해 컴퓨터(CPU, 메모리)가 호스트고, 입출력 장치(하드디스크, 키보드/마우스, 프린터, 모니터 등)와 정보를 주고 받는다. 사이에는 DMA 컨트롤러와 타이머가 있다.

  • CPU - 매순간 메모리에서 기계어(instruction)를 읽어와 실행. 한 instruction이 끝나면, interrupt line 검사.

    입출력 장치에 직접 접근하지 않고, 메모리에만 접근. 입출력 작업을 해야할 시에는 각 장치 제어기에게 시키고 다음 일을 함. (출력 값이 있어야 다음 일을 할 수 있을 때는 다음 프로그램으로 넘어감)

    굉장히 빠른 일꾼으로, 사용자 입장에서는 interactive하게 응답을 받게 된다.

    • register - 메모리보다 더 빠르게 정보를 저장하는 작은 공간.
    • mode bit - 지금 CPU를 사용하고 있는 주체가 OS인지 사용자 프로그램인지를 구분해줌
    • interrupt line - 입출력 관련 interrupt가 발생한 경우, 발생한 interrupt를 확인
  • 메모리 - CPU의 작업 공간.

  • 입출력 장치 - 정보를 입력 받고, 내보내는 장치.

    • 장치 제어기(device controller) - 각 입출력 장치를 전담하는 작은 CPU. 각 장치의 어떤 부분에서 어떤 내용을 읽어올지를 담당. (입출력 장치 속도가 CPU에 비해 매우 느리기 때문에 장치 제어기가 필요)
    • local buffer - 장치 제어기의 작업 공간. (메모리와 같은 역할)
  • 타이머 - 특정 프로그램이 CPU를 독점하지 못하도록 막음. (OS가 작업을 CPU에 넘겨주기 전 timer에 시간을 걸고, 시간이 끝나면 timer interrupt를 발생, OS가 주도권을 다시 가져간다. )

  • DMA controller - CPU의 중재 없이 데이터를 전송하고, 작업이 완료되면 interrupt를 걸어 CPU에게 알려줌.


예시를 들면,

CPU가 작업을 하던 중, 프로그램1이 키보드 입력정보가 필요

-> (interrupt line을 세팅해 system call을 하고 OS가 주도권을 가짐) -> OS가 키보드 장치 제어기에게 해당 작업을 시킴

-> 다음 프로그램2를 CPU가 진행 -> 입력값이 키보드 버퍼에 올라옴 -> 키보드 장치 제어기가 CPU에 interrupt를 걺

-> CPU는 하던일을 멈추고, OS가 주도권을 가져가 입력값을 메모리에 copy

-> 하던 일 프로그램2가 아직 할당시간이 끝나지 않았으므로 계속 진행됨. (프로그램1은 자기 차례를 기다림)


구조별로 더 자세한 설명

-Mode bit

: 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기위한 보호 장치.

Mode bit를 통해 두 가지 모드의 operation을 지원한다.

  • 1 - 사용자 모드 ) 사용자 프로그램을 수행
  • 0 - 커널모드 ) OS코드 수행

interrupt가 발생하거나 예외 발생 시, HW가 mode bit를 0으로 바꿈.

사용자 프로그램에게 CPU를 넘기기 전에 mode bit를 1로 세팅.


-Timer

: CPU를 특정 프로그램이 독점하는 것으로부터 보호.

정해진 시간이 흐른 뒤, OS에게 제어권이 넘어가도록 interrupt를 발생시킨다.

타이머는 매 클릭 tick 마다 1씩 감소 -> 타이머 값이 0이 되면 'timer interrupt' 발생.


-I/O Device Controller(입출력 장치 제어기)

: 해당 I/O 장치 유형을 관리하는 일종의 작은 CPU.

제어 정보를 위해 control register, status register, local buffer를 가짐

I/O는 실제 device와 local buffer 사이에서 일어남 -> I/O가 끝나면 interrupt로 CPU에게 알림


-입출력의 수행

: 모든 입출력 명령은 특권명령이다.

사용자 프로그램이 I/O를 하려면,

​ 1) 시스템콜(System call) 발생 - 사용자 프로그램이 interrupt line을 세팅해 OS에게 I/O를 요청 -> 모드가 1에서 0으로 변경됨

​ (시스템콜 - 사용자 프로그램이 OS서비스를 받기 위해 커널함수를 호출하는 것)

​ 2) trap을 사용해 interrupt vector의 특정 위치로 이동

​ 3) 제어권이 interrupt vector가 가리키는 interrupt 서비스 루틴으로 이동

​ 4) 올바른 I/O 요청인지 확인 후, 수행

​ 5) I/O 완료 시, 제어권을 시스템콜 다음 명령으로 옮김


-인터럽트(interrupt)

: 인터럽트는 포괄적인 의미로, 일반적 의미는 HW가 발생시킨 인터럽트이다.

시스템콜 / 예외적으로 프로그램이 오류를 범한 경우에는 SW가 인터럽트를 발생시키게 되는데, 이를 Trap이라고 한다. ('Trap을 이용해 인터럽트를 건다'고 함.)

+) 인터럽트 벡터 : 인터럽트 번호 - 주소 쌍으로 해당 인터럽트의 처리루틴 주소를 갖고 있음.

인터럽트 처리 루틴(인터럽트 핸들러, Interrupt Service Routine): 해당 인터럽트를 처리하는 커널 함수로 실제 해야할 일이라고 생각하면 됨.


=> 인터럽트 당한 시점의 레지스터와 program counter를 저장한 후, CPU의 제어를 인터럽트 처리 루틴에 넘긴다.

=> 현대 OS는 interrupt 구조에 의해 구동된다. (interrupt 걸릴 때만 OS가 CPU를 가짐)


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

  • 동기식 입출력(Synchronous I/O) - I/O 요청 후, 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감. (다른 일을 수행하지 않고 기다림, 결과를 보고 다음 작업)
  • 비동기식 입출력(Asynchronous I/O) - I/O가 시작 된 후, 작업이 끝나기를 기다리지 않고, 제어가 사용자 프로그램에 즉시 넘어감. (입출력과 무관한 일로 넘어감)

-DMA(Direct Memory Access)

: 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용. CPU를 거치지 않고, 장치 제어기가 장치의 buffer storage 내용을 메모리에 block 단위로 직접 전송.
전송이 완료되면, DMA 모듈은 인터럽트 신호를 CPU로 보낸다. 따라서 CPU는 전송의 시작과 끝만 관여한다.
(byte 단위가 아닌 block 단위로 인터럽트를 발생시킴)
인터럽트 구동 방식보다 효율적이다.


-서로 다른 I/O 명령어

instruction의 두 가지 종류)

  • memory에 접근하는 instruction (ex. load store)

  • I/O장치에 접근하는 instruction (by I/O를 수행하는 special instruction)

이렇게 보통은 memory와 device 주소를 각각 따로 두는 것이 일반적인데,

I/O device에 memory 주소를 매겨서 memory에 접근하는 instruction을 통해 I/O에 접근할 수도 있다. (Memory Mapped I/O)


-저장장치 계층구조

  • Primary storage ) CPU가 직접 접근해서 처리 가능 (Executable, byte 단위), 휘발성 매체

​ CPU - Register - Cache Memory(중간에서 속도 완충: Caching - 빠른 매체로 정보를 복사해서 올림, 재사용이 목적) - Main Memory (D-RAM)

  • Secondary storage ) CPU가 직접 접근해서 처리하지 못함, 비휘발성 매체

​ Magnetic Disk - Optical Disk - Magnetic Tape

=> 상위 단계일수록 속도가 빠른 매체를 사용 (비싸고 용량 적음)



2. 프로그램의 실행

(프로그램이 컴퓨터에서 어떻게 실행되는가?)


보통 프로그램은 파일 시스템(비휘발성 디스크)내에 실행파일 형태로 저장되어 있다. 이 실행파일을 실행시키면 메모리에 올라가 프로세스가 된다. (정확하게는 가상 메모리를 거쳐 물리적 메모리로 올려 실행시킴, 논리적 메모리 주소가 물리적 메모리 주소로 변환됨)


1) 프로그램을 실행하면 그 프로그램의 독자적인 메모리 주소공간(code, data, stack 영역을 가진)이 생김.

  • code - 기계어 코드를 담고 있음
  • data - 변수 / 자료구조를 담고 있음
  • stack - 데이터를 쌓거나 빼가는 용도

2) 당장 필요한 것만 물리적 메모리에 올린다. 그렇지 않은 부분은 디스크의 Swap area(메인 메모리의 연장공간, 전원 나가면 종료)에 내려놓는다.

부팅하면 커널영역은 메모리에 항상 상주해있지만, 사용자 프로그램 주소공간은 프로그램 종료 시 사라진다.


-커널 주소 공간의 내용

  • code (커널 코드)

    • 시스템콜, 인터럽트 처리 코드
    • 자원 관리를 위한 코드
    • 편리한 서비스 제공을 위한 코드
  • data (운영체제가 사용하는 자료구조들)

    • CPU, memory, disk와 같은 HW를 관리하기 위해 각각의 자료구조를 갖고 있음.
    • 프로세스들을 관리하기 위해 각 프로세스마다 자료구조(PCB)를 갖고 있음.
  • stack (함수 호출 시 사용)

    : 사용자 프로그램마다 커널스택을 따로 갖고 있음.


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

  • 사용자 정의 함수

    : 자신의 프로그램에서 정의한 함수 (내가 직접 작성한 함수를 불러와 씀)

  • 라이브러리 함수

    : 자신의 프로그램에서 정의하지 않고 가져다 쓴 함수

=> 사용자 정의 함수와 라이브러리 함수 둘 다 자신의 프로그램 실행파일에 포함되어 있음. (사용자 프로세스의 code영역 내에서 점프하며 실행)

  • 커널 함수

    : 운영체제 프로그램의 함수. 내가 갖고있지 않고, 커널 함수를 호출해(virtual memory 내에서 점프할 수 없으므로, interrupt line을 세팅하고 시스템 콜) 씀.


-프로그램의 실행

(프로그램 A 관점에서)


참고 : KOWC 반효경 교수님운영체제 강의를 듣고 정리, 학습한 내용입니다._

profile
울보 개발자(멍.. 하고 울어요)

0개의 댓글