Advanced Intelligent Computing Architecture
Hand-operated System
1950년대 초반
- 기계적인 스위치를 이용해 1bit 단위로 컴퓨터에 입력되어 실행
1950년대 중반
- 모든 프로그램은 기계어로 쓰여짐
- Plug-Board에 Wiring을 통해 컴퓨터의 기능을 제어
- 프로그래밍 언어 및 운영체제라는 존재가 없음
- 영구적인 저장장치가 없음(매번 프로그램 다시 입력)
1960년대 초반
- 펀치카드 등장
- 프로그래밍한 카드로 컴퓨터 구동(Plug-Board 대체)
Mainframe - 일괄처리(Batch)
Business Machinery로써 쓰이면서 가치가 발생
- 계산을 하는데 주로 사용되기 시작함
- 교량(Bridge → 주식, 산업용 시스템 설계할때 사용) 설계
일괄 처리 - 아주 단순한 OS 개념
- 일단 시작한 job은 끝나야 다음 job이 실행됨
- job(Punch card)이 다 읽히고 결과를 받을때까지 아무것도 못함(유저 개입 불가)
- 사람이 Scheduling 함
CPU는 빈번히 Idle 상태로 전환됨
- 기계적인 I/O 장치와 전기 장치인 CPU 사이에 현격한 속도 차가 존재
- Idle Time(유휴 시간) : 사용할 수 있는 상태임에도 실제적인 작업이 없는 시간
Automatic Job Sequencing - 좀 더 나은 OS
- 사람의 관여 없이, 여러 개의 프로그램을 순차적으로 실행
- 이전 작업이 종료되자마자 다음 작업을 실행하기 때문에, 일괄 처리 Batch보다 성능이 향상됨
- 스케줄링을 담당하는 소프트웨어가 프로그램을 실행
- I/O에 의해 CPU가 Idle 상태로 전환되는 문제는 해결 못함
Spooling - 초기 해결책
Simultaneous Peripheral Operation On-Line
I/O와 Computation을 동시에 진행할 수 있음
- 예) 프린터 Spooling
- 인쇄할 문서를 디스크나 메모리의 버퍼에 로드
- 프린터는 버퍼에서 자신의 처리 속도로 인쇄할 데이터를 가져옴
- 프린터가 인쇄하는 동안 컴퓨터는 다른 작업을 수행할 수 있음
- SSD에서 buffer에 입력 → buffer에 데이터가 있는지 확인 → buffer에서 꺼내서 사용
Spooling을 통해 사용자는 여러 개의 인쇄 작업을 프린터에 순차적으로 요청할 수 있음
- 이전 작업의 종료를 기다리지 않고, 버퍼에 인쇄 작업을 로드하여 자신의 인쇄 작업을 요청함
I/O로 인한 Idle 지속 시간을 줄었지만 Interactive하지 못함
- 한번 시작한 job을 모두 끝내야 다른 job을 실행할 수 있음
- I/O 문제는 해결했으나 CPU 활용도는 낮음
MultiProgramming
2개 이상의 작업을 동시에 실행
- 완전 동시에 X, user는 동시에 실행된다고 느낌(concurrent)
- 운영체제는 여러 개의 작업을 메모리에 동시에 유지 (memory에 process들이 올라와 있음)
- 현재 실행중인 작업이 I/O를 할 경우, 다음 작업을 순차적으로 실행
- 스케줄링 고려사항 - First Come First Served
- 좋지않은 방식일 수 있음 (I/O가 수행되지 않고 연산만 하는 작업이 처음에 들어가면 비효율)

목적
단점
- 사용자는 여전히 실행중인 작업에 대해서는 관여할 수 없다.
- 먼저 온 job이 CPU를 계속 차지하고 있으면 관여 못함
Issues with Multiprogramming
다른 Job이 수행되기 위해서는 현재 수행되는 Job이 I/O를 해야함(Voluntary Yield에 의존)
공평성을 유지할 필요 발생
High Priority로 수행할 필요도 생김
Job Scheduling으로는 해결이 안됨
Timesharing

CPU의 실행 시간을 타임 슬라이스(Time Slice)로 나누어 실행
- Job을 작게 쪼개서 보자 (예 → 10ms)
모든 프로그램은 타임 슬라이스동안 CPU를 점유하고, 그 시간이 끝나면 CPU를 양보한다.(공평성 유지)
여러개의 작업들이 CPU 스위칭을 통해 동시에 실행된다.
CPU 스위칭이 매우 빈번하게 일어난다
Multitasking
여러 개의 테스크(Task)들이 CPU와 같은 자원을 공유하도록 하는 방법
하나의 작업(Job)은 동시에 실행할 수 있는 Task로 나눠질 수 있음
- 유닉스의 프로세스는 fork() 시스템 콜을 이용해서 여러 개의 자식 프로세스 를 생성할 수 있음
- 안드로이드 어플리케이션은 UI 처리 프로세스, 입출력 처리 프로세스, 계산 처리 프로세스 등 다수의 프로세스를 생성할 수 있음
Multitasking은 사용자가 여러 개의 프로그램을 실행할 수 있도록 하며, CPU가 Idle 상태일 때는 Background 작업을 실행 가능하도록 함
Example of DBMS Multitasking
Fork를 이용한 Child Process 생성
- 멀티태스킹 : 여러 프로그램이 동시에 수행 (Concurrent Execution)
- 하나의 태스크가 다른 테스크(Child Process)를 만들 수 있는 기능을 의미한다.
- 자신이 필요한 기능을 Child Process 형태로 만들어서 서로 협력을 통한 작업 수행
Issues with Multitasking System
복잡한 메모리 관리 시스템
- 하나의 Job이 여러 process로 분화되면서 쓰는 메모리 양이 많아지고 관리를 잘 해야한다.
- 동시에 여러 개의 프로그램이 메모리에 상주
- 메모리 관리 및 보호 시스템 필요
적절한 응답 시간을 제공
- Job들은 메모리와 디스크로 Swap In/Out 될 수 있음
Concurrent Execution 제공
필요에 따라서 Job들 간의 Orderly Execution이 필요
출처