[OS] SystemStructure & Program Execution 1

Doodung·2022년 1월 25일
0

OS - 운영체제

목록 보기
4/15
post-thumbnail

SystemStructure & Program Execution

☑️컴퓨터 시스템의 하드웨어적인 구조

  • CPU + Memory → Computer (Host)
  • I/O device
    • Input : I/O device 데이터가 컴퓨터로 들어가는 것
    • Output → 컴퓨터에서 처리 후 그 결과를 I/O device로 내보내는 것

CPU의 일

cpu는 pc라는 레지스터가 가르키는 메모리주소에 있는 인스트럭션을 읽고 실행하는 것.
다음 인스트럭션을 읽기 전에 인터럽트 라인 체크함. 인터럽트 있으면 하던 작업 멈추고 cpu를 누가 쓰고 있었든 상관 없이 cpu제어권이 운영체제에게 넘어가게 된다.

운영체제는 인터럽트 마다 왜 인터럽트가 걸렸는지 os 안의 커널 함수로 정의되어있다. 인터럽트 벡터 (인터럽트 번호와 주소의 쌍) / 실제 해야하는 일은 인터럽트 처리 루틴

Memory

CPU의 작업 공간.

CPU에서 하는 일을 기계어(instruction)를 실행한다고 이야기 하는데,
CPU는 매 클럭 사이클마다 메모리에서 기계어를 하나씩 읽어서 실행한다.

I/O Device

별개의 디바이스들

CPU와 I/O device는 처리 속도 차이가 굉장히 많이 난다. 디스크만해도 CPU에 비해 백만배 느리다.

  • 키보드, 마우스 → 정보가 컴퓨터로 들어감 : input device
  • 모니터, 프린터 → 처리 결과를 내보냄 : output device
  • 하드디스크 → 보조기억장치로 보통 이야기하지만, I/O device로 볼수 있음.
    데이터를 읽어서 컴퓨터에 보내기도 하고, 데이터를 받아서 파일 저장 장치에 저장하기도 하는 input, output 두 가지의 역할을 수행하는 장치

local buffer

메인 cpu에 메인 메모리가 있듯이 device controller에도 작은 작업 공간이 필요한데, 그것을 local buffer라고 한다.

register

CPU에는 memory보다 더 빠르면서 정보를 저장할 수 있는 작은 공간들이 있는데 그것이 register이다.

mode bit

사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치 필요
mode bit은 지금 이 CPU에서 실행되는 것이 운영체제인지, 아니면 사용자 프로그램인지를 구분해준다.

mode bit을 통해 하드웨어적으로 두가지 모드의 operation을 지원한다.

  • mode bit == 1 (사용자모드) : 사용자 프로그램 수행
  • mode bit == 0 (모니터모드, 커널모드, 시스템모드) : 운영체제가 CPU에서 실행중인 것 - OS코드 수행
    • 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 ‘특권 명령’으로 규정
    • interrupt나 Exception 발생 시 하드웨어가 mode bit을 0으로 바꿈
    • 사용자 프로그램에게 cpu를 넘기기 전에 mode bit을 1로 셋팅

mode bit이 0일때, 운영체제가 CPU를 실행중일때 : 메모리 접근 뿐 아니라 I/O device에 접근하는 것이 가능하다.
mode bit이 1일때는 사용자 프로그램이 cpu를 가지고 있을 때 : 제한된 instruction만 CPU에서 실행할 수 있다. (보안상의 문제)

interrupt line

interrupt line이라는 것이 CPU에 붙어있는데 이것은 왜 있을까?
CPU는 매 클럭마다 memory에서 instruction 하나씩 읽고, 그 다음 instruction 실행하고. 이런 역할만 한다.
정확하게 설명하면, instruction 하나가 실행되고 나면 그 다음번에 실행할 instruction 주소값이 증가하고
그 다음 싸이클에서는 그 다음 instruction을 실행하고. 이런 역할만 한다.

그럼 키보드에서 입력이 들어왔다던지 디스크에서 읽어와야 한다던지 등등을 CPU가 어떻게 아느냐?
그걸 전달하기 위해 interrupt line이 붙어있는 것이다. CPU는 항상 memory하고만 일한다.

timer

운영체제가 사용자프로그램에게 cpu를 넘겨줄 때 타이머에 시간을 할당한다.

  • 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생 시킴
  • 타이머는 매 클럭 틱 때마다 1씩 감소
  • 타이머 값이 0이 되면 타이머 인터럽트 발생 → (운영체제가 그 프로그램으로 부터 cpu를 뺏음)
  • cpu를 특정 프로그램이 독점하는 것으로부터 보호

타이머는 timesharing을 구현하기 위해 널리 이용됨

타이머는 현재 시간을 계산하기 위해서도 사용

device controller

각각의 I/O device들은 그 디바이스들을 전담하는 작은 CPU같은 것들이 붙어있는데 그걸 device controller라 부른다.
디스크에서 헤드가 어떻게 움직이고, 어떤 데이터를 읽을지 내부를 통제하는 것은 device controller가 그런 작업을 하게 된다.

I/O device controller

  • 해당 I/O 장치유형을 관리하는 일종의 작은 CPU
  • 제어 정보를 위해 control register(→CPU가 일을 시킬때 이 제어정보를 통해 무슨일을 해라 라고 지시하기 위함.), status register를 가짐
  • local buffer를 가짐 (일종의 data register) (→ 담은 데이터를 CPU에 넘겨주거나, 사용자 프로그램에 있는 데이터를 담아서 출력할때 등의 데이터를 담는다.)

I/O는 실제 device와 local buffer 사이에서 일어남

Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림

용어 정리
device driver(장치구동기) : OS 코드 중 각 장치별 처리 루틴 → software
device controller(장치제어기) : 각 장치를 토제하는 일종의 작은 CPU → hardware

DMA

메인메모리는 CPU만 접근 가능하다. I/O는 buffer에 데이터를 담고, 버퍼에 쌓이게 되면 CPU가 거기 있는 내용을 읽어서 자신의 작업 영역인 memory에 복사를 하고.
CPU는 memory 접근, local buffer 접근이 가능하다. 작은 CPU(device controller)는 자신의 버퍼에만 접근 가능하다.
그렇게 하다보면 CPU가 인터럽트를 너무 많이 당한다. 그럼 CPU가 효율적이지 않게 동작한다.

그래서 DBA라는 컨트롤러를 하나 더두고 있다.

→ 직접 메모리를 접근할 수 있는 컨트롤러이다. 원래 메모리는 CPU만 접근 가능한데 이를 두게 되면 DMA도 메모리에 접근 할수 있게 한다.
둘이서 특정 영역을 동시에 접근하게 되면 문제가 생길 수 있어서 그런것을 memory controller가 중재하는 역할을 한다.

→ CPU가 방해받는것을 막기 위해서 DMA 컨트롤러가 중간 중간 작업이 들어왔을 때, CPU에게 interrupt를 걸어서 CPU가 일처리 하게 하는게 너무 overhead가 크다.
그래서 그렇게 하지 않고 CPU는 계속 자기 일을 하고 있고, I/O 작업이 끝나면 DMA가 그 디바이스의 local buffer의 내용들을 메모리에 복사해준다.
그 작업이 다 끝났으면 CPU에게 interrupt를 1번만 걸어서 그 내용이 다 메모리에 올라왔다고 알려준다. 그렇게 되면 CPU가 interrupt 되는 숫자가 줄어들어서 더 빨리 처리 할 수있게 되는 것이다.

결국 CPU의 일은 본인이 이번에 실행해야 할 instruction의 메모리 주소를 레지스터 PC(program counter)가 다음번 instrucion 주소를 가지고 있는데, CPU는 그 매번 instruction만 실행하면 된다. 그 instruction 중에서 I/O장치를 접근해야 되는 그런 상황이 되면, device driver를 통해서 읽으라던지 쓰라던지 명령을 하게 된다. device driver가 실제로 디스크에서 헤더가 읽는 코드는 아니다. 그 코드는 disk controller가 그 코드의 지시를 받아서 일을 한다.

CPU는 메모리의 instruction 지시를 받아서 일을 하는 것이고, device driver는 CPU가 실행하는 코드를 담고 있는 것이다.
이것은 직접 일을 할 수 없고 매뉴얼대로 일한다. 매뉴얼엔 memory 몇번지에 일하라고 적혀 있다. CPU의 전체적인 통제는 운영체제가 한다.

입출력(I/O)의 수행

모든 입출력 명령은 특권 명령 → 사용자 프로그램이 직접 I/O를 하지 못하고 OS를 통해서만 I/O 장치로 접근할 수 있다.

그렇다면 사용자 프로그램은 어떻게 I/O를 하는가?

  • 시스템 콜 (system call)
    • 사용자 프로그램은 운영체제에게 I/O 요청 (사용자 프로그램이 운영체제 커널을 호출하는 것.)
  • trap을 사용하여 인터럽트 벡터의 특정 위치로 이동
  • 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동
  • 올바른 I/O 요청인지 확인 후 I/O를 수행
  • I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮김

사용자 프로그램을 실행하다 보면 함수 호출을 해야하는 부분이 있다. 처음에 프로그램이 main 실행 하다가 다른 함수 호출하면 JUMP를 한다.
이렇게 내 프로그램 안에서의 함수 호출은 이 안에서 메모리 주소를 바꾸는 것인데, 프로그램이 실행되다가 I/O를 호출하기 위해서 운영체제 함수 호출하는 그것이 system call이다.
이것은 그냥 메모리 주소를 바꾸면 되는일이 아니고, device controller들이 CPU에 interrupt를 거는 것처럼 내 프로그램을 실행하다가 I/O 해야 하면 직접 OS로 주소점프를 하지 못하고 (MODEBIT==1이기 때문에) 프로그램이 직접 interrupt line을 셋팅하는 그러한 instruction을 실행한다.

CPU는 instruction 하나 실행 후에 interrupt를 체크하는데, 프로그램이 운영체제에게 뭘 요청하기 위한 interrupt이다. 그럼 interrupt가 들어왔기 떄문에 mode bit이 0으로 바뀌고 운영체제로 넘어간다.
OS는 요청이 올바른지 확인한다. 그럼 OS는 CPU를 갖고 있기 때문에 disk controller에게 부탁한다. 그 후 device controller가 일을 끝냈다고 하드웨어 interrupt를 건다.

따라서 interrupt는 하드웨어들이 CPU에게 교신을 하기 위해 걸어줄 수도 있고, 사용자 프로그램이 돌아가다가 내가 직접 처리 못하고 운영체제에게 요청해야하는 상황에서도 interrupt line을 셋팅할수 있다.
이것이 소프트웨어 interrupt이다.

인터럽트 (Interrupt)

인터럽트

  • 인터럽트 당한 시점의 레지스터와 program conter를 save한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.

의미의 확장

  1. Interrupt (하드웨어 인터럽트) : 하드웨어가 발생시킨 인터럽트 (timer, i/o controller) → 보통의 인터럽트

  2. Trap (소프트웨어 인터럽트)

    • Exception : 프로그램이 오류를 범한 경우 → 0으로 나누는 경우
    • system call : 프로그램이 커널 함수를 호출하는 경우

인터럽트 관련 용어

  • 인터럽트 벡터 : 해당 인터럽트의 처리 루틴 주소를 가지고 있음 (각 인터럽트 종류마다 그 인터럽트가 생겼을 때 어디 있는 함수를 실행해야하는지 그 함수의 주소를 정의해놓은 테이블)
  • 인터럽트 처리 루틴 (=Interrupt Service Routine, 인터럽트 핸들러) : 해당 인터럽트를 처리하는 커널 함수 (각각의 인터럽트마다 해야할 실제 코드)

그래서 I/O를 실행하기 위해 두가지 인터럽트가 걸린다.

처음엔 사용자 프로그램에서 I/O를 요청하기 위해 systemcall을 한다 그럼 os가 일을 시키고, (cpu는 다른 프로그램에게 넘어감.) 그 후 일을 끝나면 하드웨어 인터럽트를 통해 끝남을 알려준다.

현대의 운영체제는 인터럽트에 의해 구동됨

운영체제는 cpu를 사용할 일이 없다. 인터럽트가 걸려올 때만 cpu가 운영체제에게 넘어가는 거지 그렇지 않으면 운영체제는 항상 사용자 프로그램이 쓰고 있는 것

profile
반가워요!

0개의 댓글