CH2. System Structure & Program Execution

유지언·2023년 8월 20일
0

운영체제

목록 보기
1/8

컴퓨터 시스템 구조


  • CPU: Memory에서 instruction(기계어)를 읽어와서 실행하는 것을 반복한다.

  • registers:

  • mode bit: CPU에서 실행되고 있는 것이 사용자 프로그램인지 운영체제인지 구분해주는 장치

  • Interrupt line: CPU가 사용자 프로그램을 사용하다가 I/O device에 접근이 필요한 경우,

  • Timer: CPU의 time sharing을 구현하기 위한 하드웨어로 특정 프로그램이 CPU를 독점하는 것을 막는다. timer에 할당된 시간이 끝나면 timer가 timer interrupt를 걸어서 CPU 제어권이 실행되던 프로그램에서 운영체제로 넘어가게 한다.

  • Memory: CPU의 작업공간.

  • I/O device: 입출력 장치. input device의 예시로는 키보다, output device의 예시로는 프린터와 모니터를 들 수 있다. Disk의 경우 disk에 저장되어있는 데이터를 읽기도 하고, 실행결과를 저장할 수도 있기 때문에 I/O가 모두 가능한 device로 볼 수 있다.

  • device controller: 각 I/O device를 전담하는 작은 CPU 역할을 한다.

  • local buffer: device controller의 작업공간

Mode bit

  • 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치가 필요하다.
  • Mode bit를 통해 하드웨어적으로 두 가지 모드의 operation을 지원한다.
    1 사용자 모드: 사용자 프로그램 수행. 제한된 instruction만 수행 가능
    0 모니터모드(=커널모드, 시스템모드): OS코드 수행. 모든 instruction 수행 가능
    • 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 '특권 명령'으로 규정
    • Interrupt나 Exception 발생 시 하드웨어가 mode bit를 0으로 바꾼다.
    • 사용자 프로그램에게 CPU를 넘기기 전에 mode bit를 1로 세팅한다.

Timer

사용자 프로그램이 무한 루프 등으로 인해 한 번 실행되었을 때 CPU를 계속 사용하게 된다면 다른 프로그램을 실행할 수 없을 것이다. 이를 방지하기 위하여 사용자 프로그램을 실행할 때 timer에 시간을 설정하여 사용자 프로그램이 정해진 시간동안만 CPU를 사용하도록 한다. 시간이 다 되면 timer에서 CPU에 interrupt를 걸어 운영체제에게 CPU 제어권을 넘겨준다.

  • 정해진 시간이 흐른 뒤 운영체제에게 CPU 제우권이 넘어가도록 Interrupt를 발생시킨다.
  • 타이머는 매 클럭 틱 때마다 1씩 감소한다.
  • 타이머 값이 0이 되면 timer interrupt가 발생한다.
  • CPU를 특정 프로그램이 독점하는 것으로부터 보호한다. (Time sharing 구현)

Interrupt

interrupt를 당한 시점의 register와 program counter를 save한 후 CPU의 제어를 interrupt 처리 루틴에 넘긴다.

  • Interrupt(하드웨어 인터럽트): 하드웨어에가 발생시킨 인터럽트
  • Trap(소프트웨어 인터럽트)
    - Exception: 프로그램이 오류를 범한 경우
    - System call: 사용자 프로그램이 운영체제의 서비스를 받기 위하여 커널 함수를 호출하는 경우

[인터럽트 관련 용어]
interrupt의 종류에 따라서 이후 어떤 작업이 필요한지가 달라진다. interrupt의 종류 별로 어떤 동작을 해야하는지에 대한 함수가 '인터럽트 처리 루틴', 이런 인터럽트 처리 루틴의 주소를 정리해놓은 것을 '언터럽트 벡터'라고 한다.

  • 인터럽트 벡터(interrupt vector): 해당 인터럽트 처리 루틴 주소를 가지고 있음
  • 인터럽트 처리 루틴(interrupt service routine, 인터럽트 핸들러): 해당 인터럽트를 처리하는 커널 함수

Device Controller

I/O device controller

  • 해당 I/O device를 관리하는 일종의 작은 CPU
  • 제어 정보(CPU의 지시사항)를 위해 control register, status register를 가진다.
  • local buffer를 가진다. (일종의 data register)

I/O는 device와 local buffer 사이에서 일어난다.
Device Controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알린다.

Device Driver(장치구동기): OS 코드 중 각 장치별 처리 루틴 - software
Device Controller(장치 제어기): 각 장치를 통제하는 일종의 작은 CPU - hardware

DMA(Direct Memory Access)

  • 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위하여 사용한다.
  • CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송한다.
  • 바이트가 아니라 block 단위로 interrupt를 발생시키기 때문에 DMA를 사용하지 않을 때보다 CPU가 interrupt 되는 빈도가 적다.

DMA가 없다면?
메모리에 접근할 수 있는 것은 CPU 밖에 없기 때문에 입출력 장치에서 I/O가 완료될 때마다 device의 buffer storage에 있는 bit 단위의 입력값을 memory로 옮기기 위하여 CPU에 interrupt를 걸어야한다. 이 경우 CPU가 I/O device에 의해 interrupt의 발생 빈도가 높아져 CPU가 효율적으로 운영될 수 없다는 문제점이 발생한다.

따라서 DMA를 통해 I/O device의 buffer storage에 있는 입력값을 memory로 복사한다. memory에 데이터가 block 단위로 쌓이게 되면 CPU에 interrupt를 걸어 CPU가 이를 처리하도록 한다. 이를 통해 CPU가 효율적으로 동작할 수 있도록 돕는다.

입출력(I/O)의 수행

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

사용자 프로그램이 I/O를 수행하는 과정
1. system call: 사용자 프로그램이 운영체제에게 I/O를 요청
2. trap(software interrupt)을 사용하여 interript vector의 특정 위치로 이동
3. 제어권이 interrupt vector가 가리키는 interrupt service routine으로 이동
4. 올바른 I/O 요청인지 확인 후 I/O 수행
5. I/O 완료 시 interrupt(hardware interrupt)를 사용하여 CPU에 알림

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

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

I/O를 요청한 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어간다. 즉 I/O 작업이 완료되기 전까지 CPU 제어권이 사용자 프로그램에게 없는 상태이다.

[구현방법 1]
-I/O가 완료될 때까지 CPU를 다른 프로그램에게 넘겨주지 않기 때문에 CPU를 낭비시킨다.
-요청된 I/O가 완료될 때까지 CPU가 다른 프로그램을 실행하고 있지 않기 때문에 매 시점 하나의 I/O만 발생한다.

[구현방법 2]
-I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗는다.
-I/O 처리를 기다리는 줄에 그 프로그램을 줄 세운다.
-다른 프로그램에게 CPU를 준다.

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

I/O가 시작되면 끝나기를 기다리지 않고 CPU 제어권이 사용자 프로그램에게로 즉시 넘어간다. 즉 I/O가 완료될 때까지 CPU가 쉬도록 두지 않고, 실행되고 있던 사용자 프로그램 내에서 CPU가 I/O와 상관없는 작업을 실행하도록 한다.

두 경우 모두 I/O의 완료는 interrupt로 알려준다.

[정리]

: 동기식 입출력과 비동기식 입출력은 I/O 요청 ~ 완료 시점까지 CPU 제어권이 사용자 프로그램에게 있는지 여부에 따라서 구분한다. CPU 제어권이 사용자 프로그램에게 없으면 '동기식 입출력', 있으면 '비동기식 입출력'이다.

I/O를 수행하는 두 가지 방법

CPU에서 사용하는 instruction에는 memory에 접근하는 것과 I/O 장치에 접근하는 것이 있다.

I/O를 수행하는 special Instruction에 의해 수행되는 경우 (일반적)

I/O Device에는 device address가 부여되고, Memory에는 memory address가 부여하여 각각의 address에 접근하는 instruction을 따로 사용한다.

Memory Mapped I/O에 의해 수행되는 경우

I/O 장치에도 memory address를 부여하여 memory와 I/O 장치 모두 memory address에 접근하는 instruction을 사용한다.

저장장치의 계층 구조


위쪽에 있을수록 속도가 빠르고, 단위 당 가격이 비싸고, 휘발성이다.

  • Primary: CPU가 직접 접근할 수 있고, bit 단위로 접근 가능(executable)
  • Secondary: sector 단위로 접근 가능.

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

  1. 실행파일A 실행
  2. 프로세스A의 Address space를 생성한다. Address space는 실행파일이 종료되면 삭제된다.
  3. Address space에서 프로그램을 실행할 때 당장 필요한 부분은 Physical memory에, 그렇지 않은 부분은 Disk의 Swap area에 놓여진다. 이때 주소 변환을 해주는 하드웨어 장치의 도움을 받아 address translation이 발생한다.

Address space는 code, data, stack으로 구분되며, 프로그램을 실행하는 과정에서 필요한 부분은 pysical memory에, 그렇지 않은 부분은 Swap area에 분리되어 놓여지므로 virtual memory이다.

Disk의 File system은 비휘발성, Swap area는 휘발성

커널 주소 공간의 내용

code: 커널 코드

  • system call, interrupt 처리코드
  • 자원 관리를 위한 코드
  • 편리한 서비스 제공을 위한 코드

data: CPU, memory, disk, PCB(process control block)

stack: 함수를 호출하거나 return할 때 stack을 사용해야하는데, 이때 사용되는 각 process의 커널 stack.

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

함수 (function)

1) 사용자 정의 함수

  • 자신이 프로그램에서 정의한 함수

2) 라이브러리 함수

  • 자신의 프로그램에서 정의하지 않고 가져다 쓰는 함수
  • 자신의 프로그램의 실행 파일에 포함되어있다.

3) 커널함수

  • 운영체제 프로그램의 함수
  • 커널함수의 호출 = system call

1, 2는 Process Address space의 code 부분에 위치하고, 3은 Kernal Address space의 code 부분에 위치한다.

프로그램의 실행

profile
신입 데이터 엔지니어

0개의 댓글