되자!백엔드개발자

[OS] 2-2: 컴퓨터 시스템 구조&프로그램 실행(2) 본문

CS/운영체제

[OS] 2-2: 컴퓨터 시스템 구조&프로그램 실행(2)

HyunJng 2023. 6. 22. 06:37

동기식/비동기식 입출력


💡 동기식 입출력(Synchronous I/O)

  • I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어가는 경우이다.
  • ex) 프로그램에서 필요한 데이터를 읽어와서 처리해야 되는 경우 => 동기식처리를 한다.
  • 작동 예시
    사용자 프로그램이 OS에게 System call로 I/O 요청 → 운영체제는 커널을 통해서 Device controller에게 I/O요청→ drive controller에게 I/O를 요청하는 동안 요청한 request process(CPU)는 기다린다.→ 작업이 끝나면 device controller이 CPU에게 interrupt를 건다.

구현방법 1

  • I/O가 끝날 때까지 CPU를 낭비시킴
  • 매 시점 하나의 I/O만 일어날 수 있어 I/O도 낭비
하나의 작업이 끝날때까지 기다렸다가 작업이 끝나면 다음 작업을 시작하는 방법이다.

구현방법 2  (주로 보는 구현 방법)

  • I/O가 끝날 때까지 해당 프로그램에서 CPU를 빼앗음
  • I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
  • 다른 프로그램에게 CPU를 줌
작업중에 오래걸리는 작업은 뒤로 미뤄두고 먼저 끝나는 작업부터 처리하는 방법이다.
여기서 오래 걸리는 작업을 뒤로 미뤄둔다는 의미는 CPU가 아무것도 안하면서 뒤로 미루는게 아니다.
다른 프로세스에게 CPU를 넘겨주고 열심히 일하고 있다. 

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

  • I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 직접 넘어간다.
  • ex) 프로그램에서 필요한 데이터 없이 글을 쓰는 과정 -> 비동기식 처리

둘 다 끝났다는 것을 interrupt를 걸어서 알려준다.
동기식과의 차이점
비동기식은 IO Device가 해당 요청을 진행하는 동안 다시 System call을 요청한 프로세스에게 돌아가서 다른 instruction을 실행하는 것이다. 동기식은 요청했던 프로세스가 CPU를 가지고 있는지 여부는 중요하지 않고 프로세스가 wait상태를 유지하고 있다면 동기식인 것.

DMA(Direct Memory Access)


빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용한다.

앞의 정리에서도 언급되었지만 입출력장치가 local buffer이 꽉 차서 메모리에 올려줘야할 때마다 CPU를 interrupt를 하는 것은 매우 오버헤드이다. DMA는 이런 interrupt를 줄이기 위해  CPU 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송하도록 도와주는 역할이다. 

 

I/O장치 명령어


 

I/O장치에 대한 명령어를 다루는 방식은 2가지 방법이 있다.

  • 좌측 : I/O를 수행하는 special instruction이 메모리에 따로 존재하는 방법
  • 우측: 메모리에 다른 instruction처럼 I/O 에 대한 주소가 있는 방법
    => Memory Mapped I/O
    - access할 때 다른 instruction과 같은 신호를 사용하므로 포트 입출력을 구현할 때 부수적인 복잡성이 사라져서 CPU의 부담이 덜하다. 따라서 더 저렴하고 빠르고 쉬운 CPU를 구현할 수 있게된다.
    - 그러나 주소와 데이터버스를 많이 사용하게되어 메인 메모리에 접근하는 것보다 매핑된 장치에 접근하는 것이 더 느리다.

 

저장장치 계층 구조


위로 갈수록 빠름, 비쌈, 휘발성 존재.

캐싱: 재사용을 목적으로 빠른 storage로 정보를 복사해놓는 것이다.

 

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


프로그램은 실행파일 형태로 FileSystem에 저장되어있다. 프로그램을 실행시키면 memory에 프로세스로 올라가고 CPU가  메모리를 보고 실행한다.

그런데 실행파일이 바로 memory에 올라가는 것이 아니다.

프로그램을 실행시키면 각 프로그램마다 가상 메모리(Address Space)가 생기고 이 것은 3가지 영역으로 나뉜다.

  • code: 작성된 프로그램 함수들의 코드가 CPU에서 실행할 기계어 코드로 변환되어 저장되는 공간
  • data: 자료구조, 전역변수 등 프로그램이 사용하는 데이터를 저장되는 공간
  • stack: 지역변수, 함수 호출과 관련된 정보 즉, return될 때 그 내용을 읽어 되돌아가는 정보들이 저장되는 공간

가상 메모리 중에 당장 필요한 부분만 물리적인 메모리에 올려놓고 그렇지 않은 부분은 Hard Disk의 swap area에 내려놓는다.

swap area로서의 Hard Disk는 메모리 사용을 줄이기 위한 연장 공간이라면 FileSystem으로서의 HardDisk는 비휘발성으로 내용이 유지시키기 위해 사용되는 것이다.

💡 jump에 관하여
사실 jump라고 하는 것은 메모리 상에서 하는 것이 아니라 가상 메모리 상에서 하는 것이다. 만약 가상 메모리 공간이 다른 곳으로 jump를 하고 싶다면 jump라기보단 interrupt를 실행하여 CPU제어권을 넘겨주는 것

 

운영체제 커널 주소 공간 내용

커널도 하나의 프로그램이라 커널 가상 메모리(Kenal address space)가 부여된다.

  • PCB: 프로세스마다 프로그램을 관리하기 위한 자료구조로, 운영체제 커널에 하나씩 만들어짐

 

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


함수의 종류는 3가지가 있다.

  • 사용자 정의 함수: 자신의 프로그램에서 정의한 함수
  • 라이브러리 함수: 자신의 프로그램에서 정의하지 않고 가져다 쓴 함수(실행파일 안에 포함)
  • 커널함수: 운영체제 프로그램 함수 커널함수의 호출 = 시스템 콜