전기창지 CPU와 기계장치인 Input/Output device간 속도 차이(병목 현상)으로 인해

I/O 디바이스가 작업을 하는 동안 task가 Blocked되는 현상이 존재했다.

 

레지스터 -> 캐시 -> 메인 메모리(RAM) -> Disk(SSD, HDD)

우측으로 갈수록 각 메모리 접근 시간이 점점 느려진다.

특히나 캐시 메모리는 메인 메모리와 레지스터 간 속도 차이를 줄이기 위해 존재한다.

 

 

Spooling

주변기기와 컴퓨터 처리 장치 간에 데이터를 전송할때 처리 지연을 단축하기 위해 보조기억 장치를 완충 기억 장치로 사용하는 것

중앙 처리장치와 I/O 디바이스 등 컴퓨터 주변 장치의 독립적으로 작동하게 한다.

보조 기억장치를 하나의 버퍼로 사용한다고 볼 수 있다.

I/O요청이 있으면 디바이스와 연결된 저장장치 공간에 task를 쌓아놓고 cpu는 다른 작업을 할 수 있다.

이는 프로세스 입장에서는 입출력 처리가 발생할 시 이전 작업의 종료를 기다리지 않고 I/O 디바이스 버퍼에 요청을 쌓아놓으면 되는 것이기 때문에, 프로세스당 독립적인 입출력 장치를 할당받는 것으로 이해할 수도 있다.

 

 

Multi Programming

초기 컴퓨터는 하나의 task를 실행하고 완료된 후 다음 task를 실행할 수 있었다 즉 한번에 하나의 작업만 가능했다.

하지만 위에서 말했듯 입출력 기기와 프로세서 간 속도 차이와 각 메모리의 접근 시간 차이가 있기 때문에 병목현상이 자주 발생했다.

사람은 비싼 돈 주고 산 기계가 쉬는 꼴을 못보기 마련이다. 이런 비효율을 해결고자, 컴퓨터를 어떻게든 혹사시키기 위해 프로세서가 입출력 작업을 요청하고 대기시간 동안 다른 일을 처리할 수 있도록 하는 것이 MultiProgramming이다

 

 

그림의 예시로 보면

만약 Job 1이 I/O 처리를 위한 대기 시간으로 들어가면 다음 Job2가 실행되는 것이다.

Job2는 I/O 요청이 없다면 끝까지 처리한다. 이후 또 다음 스케쥴된 Job으로 넘어가는 것이다.

 

근데, 딱봐도 조금 이상해 보이나. 일단 다음 job이 수행되려면 현재 수행되는 job이 I/O를 해야 할것이고, Job1이 I/O요청이 있는 간단한 작업이고 Job2는 I/O작업이 없는 복잡한 작업이라면 Job1은 I/O처리를 끝내고도 계속 다음 스케쥴을 기다려야 한다.

 

 

 

Time sharing

CPU의 실행 시간을 타임 슬라이스 (Time Slice)로 나누어 실행한다.

모든 프로그램이 타임 슬라이스 동안 CPU를 점유하고 그 시간이 끝나면 CPU를 양보한다.

나중에 얘기할 Round Robin 과 형태가 유사하다고 할 수 있다.

여러개의 작업들이 cpu 스위칭을 통해 동시에 실행된다.

그야말로 공산주의 식으로 매우 공평하긴 하지만, 일단 cpu 스위칭, Context Switching 이 빈번하기 때문에 오버헤드가 커질 수 밖에 없고, 많은 작업이 필요한 job과 간단한 job 모두 동일한 작업 시간을 할당받기 때문에 비효율을 야기할 수 있다.

 

Multitasking

여러개의 Task emfdl CPUR와 같은 자원을 공유하도록 하는 방법

대표적으로 한개의 Job에 Unix fork() 시스템콜을 통해 여러개의 프로세스로 실행시키는 것이 있다.

즉 여러 프로그램이 동시에 수행(Concurrent Execution) 된다고 볼 수 있다.

멀티 태스킹 이슈

- 메모리 관리

   - 동시에 여러 프로그램이 메모리에 상주하기 때문에 각 프로세스 간 접근하면 안되는 메모리를 보호하는 시스템이 필요하다.

- cpu scheduling

    - cpu 스케쥴링 Policy가 필요하다

- 동기화

   - 공유 자원에 동시 접근에 대해서 접근 순서를 보장해줄 필요가 있다.

 

  

 

그 외 시스템