[OS] OS와 컴퓨터의 역사

2024. 3. 24. 16:31CS/Operating System

OS란?

하드웨어와 소프트웨어 사이에 Architecture가 존재한다. 애플리케이션 계층에 있는 어떤 애플리케이션이던 실행시키려면 하드웨어가 어떻게 동작할지 관리해야 하는데, 이를 Architecture 시스템 소프트웨어가 도와준다. 그리고 그 위에 OS가 존재한다. OS가 어느 위치에 존재하는지 잘 알아야 한다.


애플리케이션 view에서 OS

  • 프로그램을 위한 실행할 수 있는 환경 제공을 제공한다.
  • abstract view를 제공한다.
    • 프로세서를 스레드로 제공한다.
    • 메모리를 Address spaces라는 가상의 메모리를 제공한다.
    • 디렉터리, 파일들처럼 밑에서 동작하는 디테일은 모르는 채로 사용할 수 있도록 추상화된 시각을 제공한다.
    • I/O 장치, 네트워크를 파일로 다룰 수 있게 해 준다.

시스템 view에서 OS

  • CPU, Memory, I/O devices, Queues 등등의 컴퓨터 시스템의 다양한 자원들을 관리한다.
  • CPU를 어떻게 공유할지, 메모리를 어떻게 나눠주고 보호할지, 어떻게 공평하고 효율적으로 나눌지를 관리하는 게 OS이다.

Event-driven software

OS는 event-driven software이다. 웹 서버처럼 시작하면 대기하고, 이벤트가 일어나면 처리해 주고 다시 대기하는 소프트웨어인 것이다. OS는 하드웨어 바로 위에서 하드웨어를 관리하고 어떻게 동작하는지 정한다. OS가 어디서 동작하는지 잘 알아둬야 한다.

 

또 OS는 Application을 비롯한 Software 계층 아래에서 소프트웨어의 요청을 받는다. CPU, Mem, I/O Devices를 통한 하드웨어 계층 위에서 하드웨어의 요청, 응답도 처리한다.


 

컴퓨터의 역사

1세대 컴퓨터는 단순한 계산기로 OS도 없고 소프트웨어라는 게 존재하지 않았다.

 

2세대 트랜지스터가 등장하면서 Batch system을 사용했다. 한 번에 하나의 작업밖에 못하고 카드 리더기, tape 드라이브 같은 걸로 입력을 받아서 결과를 line printer로 출력하는 방식이다.

 

운영체제가 있긴 있었는데 프로그램을 받아서 연산을 수행하고 출력하는 역할만 했다. 카드 리더와 프린터 같은 I/O 때문에 굉장히 느렸다. 프로그램을 읽어 들이는 오랜 시간 동안 CPU는 할 일이 없었다. 그리고 CPU는 매우 짧은 시간만 동작하고 다시 I/O가 굉장히 오래 걸렸다. 즉, I/O 장치에서 발생한 bottleneck 때문에 CPU가 잘 작동하지 않았다.

 

3세대에는 IC칩이 나오면서 트랜지스터를 하나의 칩에 여러 개를 박아 넣었다. 하드 디스크와 On-line terminals가 등장했다. 여러 개의 프로그램을 돌리기 시작한 것도 이때부터이다.

 

Multiprogrammed systems가 가능해지면서 CPU의 활용도는 높아졌지만 운영체제 또한 복잡해졌다. 4개의 작업을 동시에 돌리는 중이라면 그 순서, 메모리 관리, CPU 스케줄링, 서로를 보호해 주는 문제들이 발생했다.

 

더 발전하면서 Time-sharing system이 만들어지고 응답 시간이 굉장히 좋아졌다. 그러면서 점점 OS가 복잡해졌다.

 

4세대는 현재 세대로 더 작아지고 빨라지고, 저장소는 더 커지고 빨라졌다. 그러다 보니 운영체제는 GUI(그래픽 UI), Multimedia(유튜브, 음악 등), Internet, network도 지원해야 한다.

 

OS는 처음 CTSS로 시작하였다. Compatible Time Sharing System의 약자이다. 그다음은 OS/360이 나왔다. 여기까지는 간단하지만 그다음에 나온 MULTICS, Unix부터 의미가 있다. MULTICS에서 사용한 개념의 대부분이 Unix에서 사용되고 Unix는 현재 사용하는 운영체제의 조상 격이다.


Multics - Multiplexed Information and Computing Service

  • 일부 하드웨어에서 동작하는 운영체제를 만들기 시작했다.
  • Multics는 당시 잘나갔던 회사, 대학이 모여 만든 대규모 프로젝트였다. 지금 사용하는 대부분의 운영체제 개념, 기능들이 이때부터 시작하였다.
  • Hierarchical file system 
    • C드라이브 밑에 users 밑에… 이런 것처럼 hierarchical 구조를 이때 만들었다.
    • 파일의 접근 권한에 대한 accesss control, 파일에 대한 링크 개념인 바로가기 Symbolic links, Storage quotas 개념들이 등장했다.
  • segmentation과 paging을 포함한 virtual memory에 대한 관리가 많이 개발되었다.
  • shell
    •  shell에서 프로그램을 실행시킬 수 있고 파일을 찾는 등 운영체제에 명령을 내릴 수 있다.
  • Dynamic linking 
    • Dynamic linking은 프로그램에 printf 같은 함수를 부르면 라이브러리에서 printf를 불러온다. a.exe에 printf를 사용했을 때 컴파일 타임에 printf 기계어 코드가 포함된다면 static linking이다.
    • dynamic linking은 a.exe에 printf 기계어 코드가 포함되지 않는다. 대신 표시해 두고 필요할 때 찾아가서 사용한다. dynamic linking은 a.exe의 용량이 작아지고 다른 b.exe, c.exe에서도 메모리에 printf를 한 번만 올려둬도 사용이 가능하다는 장점이 있다.
  • high level lanuage
    •  기존에는 어셈블리어로 개발을 하였다.
    • high level 언어가 나오면서 OS에서 사용하였다.
  • 공유되는 메모리를 관리하기 시작했다.
  • logical disk를 physical volumes에 매핑시킬 수 있다.
  • Multics Relational Data Store
    • 최초의 관계형 DB이다.
    • SQL과 매우 유사한 쿼리 언어가 존재했다.
  • Spreadsheets
    • 엑셀처럼 동작하고 Multics 플랫폼에서 개발되었다.
  • 또 여러 언어와 컴파일러를 지원하였다.

Unix

Multics 개발원 중 한 명이 나와서 Unix를 만들었다. Unix의 몇 가지 특징을 보자.

  • Hierarchical file systems
  • process control
  • shells
  • signals
  • C언어로 작성되었다. 어셈블리어로 작성되었다면 CPU를 비롯한 하드웨어에서 바뀌면 실행할 수 없다는 단점이 있다.
    • 사용자들이 쉽게 수정할 수 있었고 자기만의 운영체제로 바꿔서 사용할 수 있었다.

Multics vs Unix

Multics

  • Top-down appraoch를 취했다.
  • 위에서부터 설계해서 내려오면서 작업을 하다보니 하드웨어가 너무 비싸지고 복잡했다.

Unix

  • Bottonm-Up 방식으로 접근했다. 
  • 필요한 부분만 개발하는 방식이다.
  • 사용이 간단하고 쉬워졌다.
  • 현대 OS의 뿌리가 되었다.