운영체제

운영체제 개요

Seonyoung Jeong 2021. 8. 16. 15:56

OS의 역사

✍🏻 1950년대 초반 ~ 중반

  • 매우 원시적이었음. 1bit 단위로 입력. 모든 프로그램은 기계어로 입력!

🔨 1960년대 초반

  • 펀치카드 등장, 펀치카드는 1980년대까지 우리나라 대학에서 사용함.

🗒️ 일괄 처리(Batch)

  • 시작한 job이 끝나야 다음 job 수행 가능
  • Punch card 제출 → 메모리에 적재 → 수행
  • 결과를 받기까지 아무것도 할 수 없음.
  • 사람이 job scheduling 해야함.
  • 기계적인 I/O와 전기 장치인 CPU 사이의 속도 차 때문에 CPU는 빈번히 idle 상태가 되었음.

⚙️ Automatic Job Sequencing

  • 사람의 관여 없이 여러 개의 프로그램을 순차적으로 실행 가능
  • 스케줄링을 담당하는 소프트웨어가 있고, 이 소프트웨어가 프로그램을 실행하기 때문에 이전 작업이 종료되면 바로 다음 작업 수행이 가능. (batch보다 성능 더 좋음)
  • 그러나 I/O에 의한 CPU idle 상태 전환 문제는 해결하지 못했음.

🖨️ 초기 해결책 - Spooling

  • 프린터 spooling
  • 인쇄할 문서를 디스크나 메모리의 버퍼에 로드하고 자신의 처리 속도에 맞게 인쇄할 데이터를 가져옴.
  • I/O와 computation 동시에 진행 가능
  • 프린터 인쇄하는 동안 컴퓨터는 다른 연산 가능

🌐 다른 해결책 - Multiprogramming!

  • 2개 이상의 작업을 동시에 진행 가능하다.
  • 메모리의 Capacity가 커져서 여러 개의 작업을 메모리에 동시에 유지시키는 것이 가능해짐.
  • 현재 실행중인 작업이 I/O에 들어가면 다음 작업을 순차적으로 실행함.
  • 스케줄링이 도입되었음.
  • CPU가 늘 최소 하나의 작업을 하게 됨. 이 작업은 job scheduling에 따라 선택됨.
  • CPU가 idle 상태로 전환되는 것이 최소화되어 CPU 활용도가 증가했음.
  • 그러나 사용자는 여전히 실행중인 작업에 관여할 수 없음.
  • Ex) for loop와 scanf
  • CPU를 쓰는 job이 있음.
  • 근데 job1이 I/O를 할 때 마냥 기다리면 시간이 아까우니 job2한테 CPU를 할당
  • 위의 과정을 반복
  • 다시 job1한테 돌아가는 것은 job2의 I/O 작업이 나올때까지 기다려야함. 만약 job2가 I/O 작업이 없다면 돌아가지 못함....
  • 만약 job3도 있다면 job1으로 돌아갈지 job3을 시작할지는 OS policy에 따름. ⇒ 공평성을 유지할 필요 발생

Timesharing

  • CPU의 실행시간을 타임 슬라이스로 나누어 실행하고, 이 타임 슬라이스 동안 CPU를 점유한 후, 그 시간이 끝난 후 CPU를 양보함.
  • 여러 개의 작업이 이와 같은 CPU Switching을 통해서 동시에 실행됨.
  • 이렇게 되면 프로그램의 state를 저장해 놓아야하고, 이 state를 사용하여 CPU를 다시 받아 수행함.
  • Response time은 1초 미만이여야 함.

🧮 Multitasking

  • 하나의 job을 동시에 실행할 수 있는 태스크로 나눔. ex) 리눅스 프로세스는 fork() 시스템 콜을 통해 여러 개의 자식 프로세스를 생성, 이 프로세스 내에는 여러 쓰레드가 동작할 수 있음.
  • 복잡한 메모리 관리 시스템이 필요함.
  • 동시에 여러 개의 프로그램이 메모리에 상주하기 때문에
  • Concurrent execution 제공을 위해 정교한 CPU Scheduling이 필요함.
  • 필요에 따라 job들간의 orderly execution이 필요함. ex) 동기화, deadlock,,,,