이 포스팅에서 다루는 내용
운영체제의 역사, 컴퓨터의 역사, 배치시스템, resident monitor (상주모니터), spooling, multiprogramming
들어가며...
지금의 운영체제들이 왜 이러한 모습을 갖추게 되었는지는 운영체제의 역사를 알면 더 쉽게 이해할 수 있다.
끊임없이 문제점을 보완하며 운영체제가 발전해 온 큰 흐름을 짚어본다.
운영체제 발전의 전체적인 흐름뿐만 아니라, 작은 기능 하나하나까지 어떻게 발전하게 되었는지 선배님들의 발자취를 따라오다 보면 기억에도 잘 남는다. 그리고 무엇보다 CS 공부를 하다 보면 비슷한 용어들이 계속 나오기 때문에 그 용어들이 처음에 어떻게 나오게 되었는지 알 수 있어 도움이 많이 될 것 같다.
생각해야 할 것
1. 운영체제의 역사는 세대별로 완전히 구별되는 것은 아니다.
상당 부분 겹치는 부분도 존재하고 시작부터 잘못된 것들도 존재했다. 칼로 나누듯 운영체제의 역사를 구분 지을 수는 없다. 문제점을 보완해 나가며 점점 발전한 부분들과, 아예 새롭게 생겨난 것들 등을 고려해야 한다.
2. 컴퓨터 구조와의 깊은 연관성
컴퓨터 구조의 세대와 운영체제 세대가 완전히 대응하는 것은 아니지만, 둘 사이에는 깊은 연관성이 존재한다. 컴퓨터 구조가 발전함에 따라 운영체제도 그에 맞게 새로운 혹은 추가적인 역할을 맡게 되며 발전했다.
그렇다면 컴퓨터 구조의 발전 과정도 어느정도 알아야 운영체제의 발전도 이해하기 쉽겠다!
- 컴퓨터 구조의 발전 단계에 따라 운영체제의 발전 양상을 살펴보자
0. 최초의 디지털 컴퓨터 - Charles Babbage's "analytical engine"
최초의 디지털 컴퓨터는 영국의 수학자 Charles Babbage가 발명한 "분석하는 엔진"이다.
그러나 제대로 동작하는 장치는 아니었음. 그러니 당연히 운영체제는 존재❌
그렇지만 Babbage는 이 분석하는 엔진에 "소프트웨어"가 필요하다는 사실을 인식했다고 한다! - 운영체제의 필요성은 처음부터 존재했구나
이후 디지털 컴퓨터의 발전을 간단하게 정리하면 다음과 같다
- 1세대 (1945-1955) 진공관
- 2세대 (1955-1965) 트랜지스터와 배치 시스템
- 3세대 (1965-1980) IC와 다중프로그래밍
- 4세대 (1980-현재) 개인용 컴퓨터
1세대 (1945-1955) 진공관
컴퓨터는 단순한 수치해석 계산 용으로만 쓰이던 시대
<발전과정>
John Atanasoff 교수와 그의 대학원생 Clifford Berry 이 제대로 작동하는 최초의 컴퓨터를 개발 - 300개의 진공관
비슷한 시기, 베를린의 Konard Zuse가 Z3 컴퓨터 개발 - 계전기
이후 1944, 영국의 Bletchley Park 그룹에서 Colossus 개발
하버드 대학의 Howard Aiken 이 Mark I
펜실베니아 대학의 William Mauchley, 그의 대학원생 J.Presper Eckert가 ENIAC
이 시기에는 하나의 그룹이 - 기계 설계, 구현, 프로그램, 작동, 관리를 모두 !
프로그래밍 언어 따위는 ❌ 오로지 기계어로..! 어셈블리어 그런 것도 노노
더 심하게는 수천 개의 케이블을 연결해서 구성하는 전기회로를 만들어서 프로그래밍을 하던 시절
그 시절 프로그래머는
기계실에 내려와 그의 배선반을 컴퓨터에 꽂고, 몇 시간 동안 2만 여개의 진공관 중 하나도 꺼지지 않고 잘 실행되길 빌며 기다리는 것
-> 이후에 천공 카드의 등장으로 케이블을 일일이 연결하지 않고 프로그램을 천공 카드에 쓰면 되었다고 한다.
2세대 (1955-1965) 트랜지스터와 배치 시스템
- 트랜지스터의 발명 -> 쓸만한 컴퓨터들의 등장
- 명확한 역할 구분 - desinger / builder / operator / programmer / maintenance
대형 냉방 장치가 있는 컴퓨터실에 위치했던 메인프레임.
작동시키기 위해 많은 관리자가 필요했고 가격도 매우 비쌌다.
프로그램이나 프로그램들의 집합을 job 이라고 하는데, 이 잡을 실행하는 순서는 다음과 같았다.
- FORTRAN이나 어셈블리어로 종이에 프로그램을 작성한다.
- 이걸 토대로 천공 카드를 만든다.
- 입력실로 카드 뭉치를 들고 가 운영자에게 전달
- 운영자는 카드 뭉치 중 하나를 시스템에 입력한다.
- 운영자는 실행 완료 후의 출력물을 출력실에 둔다.
*FORTRAN: 최초의 high-level 프로그래밍언어. 수치계산에 특화되어 있고 여전히 과학분야에서는 잘 쓰이고 있다.
*어셈블리어 : low-level 프로그래밍 언어. 기계어와 고급 언어 사이.
사람이 직접 움직이며 컴퓨터에 입력을 넣고 출력을 받는 과정은 대충만 생각해봐도 굉장히 비효율적이다.
비싼 돈 들여 산 컴퓨터를 낭비하고 있는 것!
그래서 이러한 문제를 해결하기 위한 다양한 방안이 개발되었고, 그중 대표적인 것이 배치 시스템.
Simple Batch system
원래 프로그램을 실행시키기 위해서 운영자가 (카드 뭉치 1개 -> 컴퓨터 시스템에 입력 -> 출력물 전달) 이 과정을 반복해야 했었는데,
배치 시스템은 천공 카드 상의 프로그램들을 읽는 card reder를 추가하여 매번 프로그램별로 입력하는 과정을 일괄적으로 처리할 수 있게 했다.
하나의 잡이 완료되면 자동으로 다음 잡을 실행할 수 있었다.
💭 어떻게 순서대로 프로그램을 실행할 수 있었을까?
항상 상주하는 특별한 프로그램을 통해서; resident monitor
resident monitor는 순서대로 잡들을 읽어 들이고 수행할 수 있게 했다.
최초의 제어를 가지는 모니터는 첫 번째 잡에게 제어를 넘기고 잡은 실행을 완료하면 다시 모니터에게 제어를 넘겼다.
->>> 오늘날 운영체제의 시초!
resident monitor는 다른 프로그램을 실행시키기 위해 항상 필요하기 때문에 늘 메모리상에 존재하고 있었다.("resident" monitor인 이유) 컴퓨터가 부팅된 이후부터 전원을 끌 때까지 OS가 메모리 상에 적재되어 있는 것과 마찬가지.
🔴 이 시스템의 문제점
1. 모니터가 job이 어떻게 되어있는지 알 수 없다.
프로그램이 Fortran으로 작성되었는지 어셈블리어로 작성되었는지 등 잡에 대해 알 수 없었다. 또한 어떤 프로그램이 실행되고 있는지 알 수 없었다.
2. 모니터가 잡들을 구별하거나, 프로그램 별 데이터를 구별하기 어려웠다.
🔵 solution)
모니터에게 프로그램을 실행시키기 위한 정보를 제공하는 카드를 추가하자! -> control card
컨트롤 카드가 존재하는 일반적인 잡의 구조
잡은 어떤 구조로 되어있었는지 빠르게 훑어보기.
$가 붙은 카드가 컨트롤 카드이다. 모니터에게 프로그램에 대한 정보를 주고, 명령을 내리는 역할
- $JOB card : 잡 관련 정보들. 최대 실행 시간, 프로그래머 이름 등
- $FORTRAN card : FORTRAN 컴파일러(시스템 테이프에 존재) 적재를 위한 내용. 운영체제는 이를 보고 컴파일러를 적재
- Fortran program : 컴파일되어야 하는 프로그램.
- $LOAD card : 컴파일한 오브젝트 파일을 적재하도록 한다.
- $RUN card : 뒤에 오는 데이터를 이용해서 적재한 프로그램을 실행시키도록 한다.
- Data for program : 프로그램 실행에 필요한 데이터들
- $END card : 잡의 끝을 나타낸다.
모니터의 구성
- Control card interpreter : 카드를 읽고 명령을 수행
- Loader : 메모리로 프로그램을 적재
- Device drivers : 각 입출력 장치에 따른 특성을 알고 있다
🔴 하지만 여전히 존재하는 문제점
바로 느린 성능!
why?
1️⃣ 입출력과 CPU 중복 불가 (I/O and CPU could not overlap)
하나의 장치에서 카드를 읽고 프로그램 실행, 결과 출력을 다 하기 때문에 속도가 느릴 수밖에 없다.
2️⃣ card reader의 느린 속도
연산 수행 속도에 비해 느린 읽기 속도는 전체 시스템 성능 저하를 일으킨다. 중요한 건 프로그램을 실행하는 것인데 카드 리더가 시간을 다 잡아먹음.
🔵 solution)
입출력을 따로 수행하자! -> Off-line 작동
느린 카드 리더와 결과물 출력하는 장치들을 메인 컴퓨터와 분리시켜 버리자
How?
입출력만 수행하는 작은 장치를 따로 이용하여 프로그램 실행과 입출력 과정을 분리시키고,
잡의 내용과 실행 결과는 자기 테이프를 이용해서 입출력 담당 컴퓨터와 메인 컴퓨터 사이에서 전달한다.
- 여러 job들(카드 뭉치들)을 자기 테이프에 미리 기록
- 자기 테이프를 읽으며 프로그램을 실행
- 하나의 job이 끝나면 자기 테이프 상에 있는 다음 job 을 실행한다.
- 실행 결과는 다른 자기 테이프에 기록
- 결과가 기록된 자기 테이프를 보고 결과물을 출력
분리된 두 가지 종류의 컴퓨터
입출력 담당 : 카드 리더를 통해 여러 개의 job을 읽어 자기 테이프에 쓰거나 테이프를 읽고 실행 결과를 출력
- IBM 1401 : 저렴. 카드를 읽어 들이거나 테이프 복사, 출력물 프린트 등에 적합. 수치 연산 등은 부적합한 컴퓨터. 1, 5번을 수행
프로그램 수행 담당 (메인 컴퓨터): 자기 테이프를 읽고 프로그램을 실행하고 결과를 다른 자기 테이프에 기록
- IBM 7094 : 훨씬 비쌈. 수치 연산 등의 실제 계산을 담당한 메인 컴퓨터. 2, 3, 4번을 수행.
각각 IBM 1401, IBM 7094과 같은 컴퓨터가 사용되었다.
-> 메인 컴퓨터는 더 이상 느린 카드 리더나 프린터기의 속도에 영향을 받지 않게 됐다!
-> 하나의 CPU를 위해 여러 개의 카드 리더, 여러 개의 프린터기가 존재할 수 있게 되었다!
3세대 (1965-1980) IC와 다중프로그래밍
IC (집적회로) 개발 -> IBM System/360 -> 다중프로그래밍의 등장
Spooling 스풀링
;simultaneous peripheral operation on line
일종의 버퍼링! 디스크에 실행할 잡들 혹은 출력해야 하는 내용들을 잠시 저장해 둘 수 있는 기법이다.
-> 입출력을 수행하는 동시에 다른 잡에 대한 연산 (computation)을 수행할 수 있다.
디스크에 다음에 실행할 잡을 미리 저장해 두면 CPU는 실행하던 잡이 끝나면 바로 디스크에서 다음 잡을 읽어와 실행할 수 있다.
-> 원래 하나의 잡이 끝나면 운영자가 자기 테이프를 새로 들고 와 입력을 넣어줘야 했던 과정이 필요 없어졌다.
운영자가 실행 결과가 기록된 자기 테이프를 들고 프린터를 하러 가는 과정도 필요 없어졌다.
운영자 안녕 ~ 👋
이렇게 되면 하나의 잡을 실행 하면서(computation), 운영체제는
- 카드리더에서 디스크(저장장치)로 다음에 실행할 잡을 읽어 들이고 (입력)
- 디스크에 저장된 이전 잡의 실행결과를 프린터로 내보낸다 (출력)
또한 디스크에 여러 개의 잡을 미리 저장해 두게 되면 (job queue)
-> 운영체제는 그중 다음으로 실행할 잡을 골라서 실행할 수 있다.
-> CPU를 최대한 활용할 수 있는 실행 순서를 결정해야 한다 - 운영체제의 주요 업무 중 하나인 스케줄링!
Multuprogramming (다중프로그래밍)
각자의 메모리 영역을 갖는 여러 프로그램이 동시에 메모리에 존재 가능
-> 메모리 상에는 운영체제와 여러 잡이 위치하게 되었다
멀티프로그래밍을 위한 운영체제의 조건
- I/O 루틴을 수행
- 메모리 관리 - 각 잡별로 메모리를 할당해야 함
- CPU 스케줄링 - 여러 잡 중에 실행시킬 것을 선택해야 함
- 장치 할당
시분할 시스템
- 컴퓨터를 여러 사용자가 공유하던 시절, 컴퓨터를 대화식으로 사용하려던 시도에서 탄생
- 시간에 따라 자원을 할당
- CPU 스케줄링과 다중 프로그래밍을 통해서 시분할 시스템 제공
- 대화식 인터페이스를 제공하던 컴퓨터 (interactive computing)에서, 만약 20명의 사용자가 로그인 중이고 17명은 다른 걸 하고 있으면 CPU 서비스를 필요로 하는 3명의 사용자에게 자원(CPU)을 할당
4세대 (1980~ ) Personal Computer System
LSI 회로 (고밀도 집적 회로)의 개발 -> 개인용 컴퓨터 시대 (PC)
- 개인용 컴퓨터 - 한 명에게 할당된 컴퓨터!
- I/O 장치들 - 키보드, 마우스, 모니터, 프린터 등
- 사용자 편의성과 즉각적인 반응성
- 대형 운영체제용 기술들이 적용
이 외에
Parallel System (병렬 시스템)
- 두 개 이상의 CPU를 가지는 멀티프로세서 시스템
- Tightly coupled system
장점
- throughput (처리량)의 증가; 같은 시간 동안 처리하는 작업량 증가
- 경제적
- 신뢰성
Distributed System (분산 시스템)
- 분리되어 있는 여러 프로세서를 이용해 연산하는 시스템
- Loosely coupled system
장점
- 자원 공유
- 연산 속도 증가
- 신뢰성
- 통신하기에 적합
틀린 내용이 있다면 댓글 부탁드립니다 :)
'Computer Science > Operating System' 카테고리의 다른 글
[운영체제] 운영체제의 여러 종류 | Batch, Multi-programming, Time-Sharing, Distributed, Real Time OS 등 (5) | 2023.09.06 |
---|---|
[운영체제] 커널과 디바이스 드라이버란 무엇일까 (1) | 2023.08.28 |
[운영체제] 운영체제의 구성요소 What are the parts of an OS? (0) | 2023.08.27 |
[운영체제] 운영체제란? (2) | 2023.07.08 |
[운영체제] (0) | 2023.07.08 |