이중모드, 하드웨어 보호

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
경성대학교 양희재 교수님 수업 영상을 듣고 정리하였습니다.


이중모드(Dual Mode)

한 컴퓨터를 여러 사람이 동시에 사용하는데 한 사람이 고의/실수로 잘못된 명령을 내리면 그 영향이 전체에 미칠 수 있다.

cpu를 다운 시키는 명령어에는 stop, reset, halt가 있는데, 어떤 사용자가 프로그램을 하드디스크에 깔면서 stop이라는 명령을 넣어뒀다고 하자. 이후 프로그램을 실행시키면 해당 프로그램은 메인 메모리로 올라가게 될 것이고 stop명령을 cpu가 들고와 실행한다면 cpu는 정지하게 된다. 정지된 cpu가 다시 동작하는 방법은 컴퓨터를 껏다 키는 방법 뿐이다. 서버컴퓨터일수록 그 시간은 더 오래 걸리고 혼자 사용하는거면 그나마 났지만, 여러명이 하는 컴퓨터일수록 치명적인 상황을 초래할 것이다.

그래서 사용자 프로그램(일반 유저)들은 이런 명령어를 사용하면 안된다. 즉, 오로지 관리자만 내릴 수 있어야한다. 그래서 이중모드를 만들었다.

이중모드란 cpu가 동작하는 모드를 2가지로 두겠다는것을 의미한다.

  • 사용자(user) 모드: 일반 사용자가 사용하는 모드
  • 관리자(supervisor,시스템(system), 모니터(감시자, monitor), 특권(privileged mode) 모드: 컴퓨터에서 관리자는 os

cpu가 메모리에 있는 명령을 읽어와서 실행하는데, os에 있는 명령을 실행할 적에는 cpu가 관리자 모드에서 동작하도록 하고 일반 유저 영역의 메모리를 가져와 실행하면 사용자모드에 있도록 한다.

특권명령(privileged instruction): 관리자 모드에서만 내릴 수 있는 명령인 stop, halt, reset, set_timer, set_HW 등 은 일반 사용자가 아닌 반드시 os(운영체제, 관리자)만이 내릴 수 있도록 한다.

이중모드는 어떤식으로 만드는가?

cpu안에는 레지스터(비트들의 모음. 32bit라고 하면 비트가 32개 들어있음), alu, cu도 있는데, 이 비트들에는 어떤 프로세서(cpu)의 상태를 알려주는 비트를 둘 수 있다.

  • 캐리(carry)
  • negative: 연산의 결과가 음수가 나왔을때
  • zero: 앞의 연산이 0이 나올때
  • overflow: 앞의 연산이 그 연산 결과가 자리 범위를 넘었을때

fleg :깃발, 사건이 일어나면 깃발을 들고 사라지면 내리는 것과 같이 상태를 나타내는 것을 플래그라고 한다 즉, 1이면 발생한것이고 0이면 발생 안한 것!

이중모드에서 갑자기 플래그?

레지스터 안에 있는 1개의 비트를 모니터 비트로 할당해서 이중모드를 나타낸다.(이중모드를 나타내는 비트를 하나 더 추가한다. 그때 비트의 이름이 monitor, system 등이다.)

즉, 1이면 시스템 모드, 0이면 유저 모드!

처음 파워를 키면 부팅을 통해 os가 메인메모리로 올라가고, 올라가는 도중에는 모두 모니터 비트가 다 1(시스템모드)이다. 즉, os가 동작할 적에는 시스템모드에서 동작한다(os가 모든 명령을 다 내릴 수 있다) 그래서 os 부팅이 끝나면 이제 메모리에 사용자 프로그램을 올릴 것이고, cpu는 그 프로그램을 실행하게된다. 이때는 유저모드가 동작한다. 즉, os가 돌적에는 시스템 모드지만 이제 os에서 사용자 프로그램으로 갈 적에는 os의 비트를 0으로 만들어줌으로써 유저 모드가 되도록 한다. 그래서 사용자 프로그램이 동작할 때는 유저모드에서 동작하는 것이다.

os가 새로운 프로그램을 실행하면 그 프로그램가 올라오고 (os가 해당 프로그램을 하드디스크에서 메모리로 올리는 행위) os가 프로그램을 메모리에 올리고나면 cpu에서는 프로그램이 실행되기 직전에 해당 비트를 1에서 0으로 만들어준다. 그래서 사용자프로그램이 사용될때는 사용자모드에서 동작이 된다. 따라서 사용자 프로그램에서는 stop과 같은 특권 명령어는 사용하지 못한다.

만약 내가 사용자프로그램에서 햇던 행위를 하드디스크에 저장하고싶다면?

프로그램 자체가 하드디스크에 저장을 해도되지만 문제가 많다. 이는 곧 유저 프로그램이 하드디스크에 접근이 가능하다는 것인데, 그 의미는 하드디스크의 남의 파일애도 접근이 가능하다는 뜻이다. 즉 서버컴퓨터에는 여러 사용자들의 파일들이 저장되어있을텐데 다른 사람들의 파일에도 접근이 가능하다는 의미로 일반 사용자프로그램이 하드디스크를 직접 접근하는것은 보안에 심각한 문제를 끼친다.

즉, 일반 프로그램이 하드디스크에 접근하는 할 때에는 해당 프로그램이 os에 부탁을 해야한다. 이 부탁은 swi를 이용해서 부탁한다.

swi가 온다면 cpu는 지금 하는 일을 중지하고 os의 isr로 접근하여 하드디스크에 저장할 수 있도록 한다. os로부터 인터럽트를 걸어서 cpu의 모드가 1로 변경되면 이제 os에서는 무슨 명령이든 내릴 수가 있게되고 이때 유저 프로그램에서는 그 어떤 명령들도 내릴 수가 없게된다. 이제 저장을 하고나면 다시 유저영역으로 돌아오고 모니터비트를 다시 0으로 바꿔준다.

대부분의 모든 cpu는 이중모드를 지원한다. (모니터를 나타내는 비트가 따로있음) 그래서 절대 일반유저가 특별한 명령을 내리지 못한다.

만약 내리려면 어떻게 될까?

cpu가 그 명령을 읽어왔는데 모니터비트가 0임을 확인했는데 유저모드에서 stop명령이 왔다면 cpu는 이 명령이 잘못된 명령이라고 생각해서 내부적으로 인터럽트가 발생했다고 생각한다. 그래서 os의 isr(해당 프로그램이 잘못된 명령을 내렸을때 처리하는 루틴)을 통해 그 프로그램을 강제로 종료시킨다. 즉 바로 메모리에서 삭제시켜버린다.

이중모드는 이런면에서 보호와 관련이 있다.(protection)

컴퓨터에서 보호받아야하는 3가지

1. 입출력장치 보호(IO, Input/Output device protection)

일반사용자가 하드웨어를 자기멋대로 사용할 수 있도록 하면 안된다.

  • 서버컴퓨터는 동시에 여러사람이 사용하는데 거기에 프린트가 달려있다고 하자.
  • 한 사용자가 프린트를 사용하고 있는데 다른 사용자가 그 프린트에 대해 리셋 혹은 자기도 찍겠다고 신호를 보낸다면 프린트의 한줄에는 다른 사람꺼도 찍히게 된다.
    • 프린트 혼선, 강제 리셋 발생
  • 혹은 프린트 말고도 서버컴퓨터에는 대용량 하드디스크도 달려있다.
  • 하드디스크에 여러사람들의 파일들이 들어있을텐데 뿐만 아니라, 자신의 중요정보를 하드디스크에 저장했는데 이를 마음대로 누군가 접근해서 보면 안된다.
    • priviliged instruction violation
    • 그러니까 프린트, 하드디스크 등은 아무나 볼 수 없도록 보호를 받아야 한다.

이를 보호하려면, 이 접근 자체를 못하도록 하려면 입출력장치를 제어해야한다. 입출력장치와 관련이 있는 명령어들은 아래와 같다.

-> in(키보드나 마우스 같은 입출력 장치로부터 정보를 받아들이는 것), -> out(출력장치에 명령을 내리는것(출력을 내보내라고), 프린트, 디스크, 스피커, 램 등)

-> 이런 명령어들을 priviliged instruction 함으로써 os만 내릴 수 있도록 해야한다. 즉, 입출력 관련 명령어는 무조건 특권명령어이다.

2. 메모리 보호 (Memory protection)

유저1 프로그램이 돌면서 해당 프로그램이 유저 2,3 메모리 영역을 읽으려고 하거나 혹은 os안의 값을 바꾸려고 한다면 이를 해킹이라고 하고 이는 보호받아야한다.

  • cpu에서 메모리로 address bus(몇번지를 읽겠다는 명령)가 가면 data bus(몇번지에 해당하는 데이터)를 통해 cpu로 오게 된다.
  • 일반 유저프로그램이 os나 다른영역에 가지 않게 하려면 address bus를 잘라버려야 하는데, 이는 자기 영역에도 못들어가게 함으로 해결책이 되지 않는다.

그러면 다른 방법은 address bus에 문지기를 세워두는 것!

어떤 주소를 보낼 적에 그 주소가 해당 영역에 해당되는 주소가 맞다면 문지기가 통과시켜주고 벗어나면 문지기가 거절을 내버림.

문지기(MMU: Memory management unit)는 실제로 레지스터를 둔다. base, limit 이런식으로 base에서 limit 사이에 들어오면 통과, 벗어나면 cpu로 다시 인터럽트 신호가 가도록한다. 인터럽트 신호를 보내주면 cpu는 하던일을 중지하고 os의 isr로 점프하고 해당 isr는 잘못된 번지를 읽으려고 시도하면 그 프로그램을 강제로 종료시킨다.

segment violation : 영역에 대한 침범 > 해당 에러를 발생시키며 강제 종료시킴!

이 mmu의 base, limit 값 설정은 os가 해준다. 이 값을 바꾸는 것은 특권명령으로 해서 올려둬야한다.

3. CPU 보호 (CPU protection)

cpu도 어떤 침범 대상이 된다. 만약 유저 1가 cpu 시간을 독접하게 되어버리면 문제가 될테니까..

따라서 해당 프로그램마다 timer를 둔다. timer는 일정 주기로 cpu에 인터럽트를 걸도록 회로가 설계되어있다. 그러면 해당 시간마다 인터럽트가 걸리면 cpu는 os의 isr로 점프하고 해당 isr에는 해당 cpu가 골고루 돌아가고 있는지를 체크하고, 오랜 시간이 지났는데도 한 유저에게만 묶여있다면 isr이 cpu로 하여금 강제로 해당 프로그램이 아닌 다음 프로그램으로 넘어가도록 조정해준다.

즉, 어느 한 유저프로그램에만 묶여있지않도록 한다. 그래서 timer를 두면 일정시간 지나면 인터럽트 걸리고 해당 isr로 점프하게 되어 해당 루틴이 너무 묶여있는 것 같다면 다음 프로그램으로 넘어가도록 한다.

python iterable과 iterator

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Iterable과 Iterator

파이썬을 공부하면 할수록 용어의 어려움을 계속해서 느끼고있다. 파이썬 뿐만 아니라 일반적인 프로그래밍 언어에는 iterator라는 개념이 있는데, 종종 iterable이라는 개념과 혼동되는 경우가 많았다.

Iterable

  • 반복 가능한 객체
  • iterator로 변환 가능한 객체
  • 대표적인 iterable한 타입: list, dict, set, str, tuple, range…

여기서 iterator로 변환이 가능하다는 말은, 값을 한 개씩 순차적으로 접근이 가능하도록 만들 수 있다는 것을 의미한다. 좀 더 쉽게 설명하면 for문에 넣어 돌리는 것이 가능하다는 것이다.

li = [1,2,3]

print(li)  # [1,2,3]
print(li[1])  # [2]

next(li)  # 'list' object is not an iterator

위 예시에서도 볼 수 있듯 list를 print를 통해 한번에 여러개 값이 반환가능한 것은 발견했지만, next 메소드를 써서 한번에 한개씩 순차적으로 접근하려고 보니 list객체는 iterator가 아니라는 에러를 발생했다.

li = [1,2,3]
li_iter = iter(li)

next(li_iter)  # 1
next(li_iter)  # 2
next(li_iter)  # 3
next(li_iter)  # StopIteration

type(li_iter)  # <class 'list_iterator'

이렇게 iter 메소드를 통해 순차적으로 접근이 가능해진 것을 볼 수 있었다. 그리고 li_iter의 타입을 확인해보니 list_iterator라는 iterator로 변환된 것을 볼 수 있었다. 즉, list는 iterator로 변환이 가능하기에 iterable한 객체인 것이다.

li = [1,2,3]
for item in li:
  print(item)  # 1,2,3

이렇게 for문을 돌려봄으로써도 확인할 수 있듯 for문에 list를 넣어 돌리면 순차적인 접근이 가능하다. 명시적으로 list를 iterator로 바꾸어주지 않았음에도 불구하고 말이다. 이는 for문에서 내부적으로 list를 iterator로 바꾸어 순차접근을 하고 있기 때문이다. 즉, for문을 돌려 순차접근이 가능한 객체는 모두 iterable하다고 볼 수 있다.

Iterator

  • 값을 차례대로 꺼낼 수 있는 객체
  • 파이썬 내장함수 iter()를 통해 iterator 객체를 만든다.
li = [1,2,3]
li_iter = iter(li)

next(li_iter)  # 1
next(li_iter)  # 2
next(li_iter)  # 3
next(li_iter)  # StopIteration

type(li_iter)  # <class 'list_iterator'

Interpreter언어와 Compiler 언어

|

개인적인 연습 내용을 정리한 글입니다.
잘못된 내용이 있다면 편하게 댓글 남겨주세요!


Compiler / Interpreter 차이

  • 두 언어의 가장 큰 차이점은 컴파일 시점이다.
    • 즉, 런타임 전에 컴파일을 하는지 안하는지 그게 가장 큰 차이점이다.

컴파일 언어(Compiled Language)

  • 예: C, C++, JAVA
  • 컴파일 언어는 런타임 이전에 기계어로 변환되는 언어이다.
    • 자바의 경우 런타임 이전에 컴파일을 통해 기계어가 아닌 바이트어로 변경되지만, 컴파일 시점이 존재하여 컴파일 언어라고 한다.
  • 전체 소스코드를 보고 명령어를 수집하고 재구성한다.

인터프리터 언어(Interpreter Language)

  • 런타임 중에 프로그램을 한줄한줄 연속적으로 해석하며 실행하는 언어이다.
  • 파이썬의 경우 런타임 중 컴파일 과정에서 렉서(lexer), 파서(parser)를 거쳐 바이트 코드를 만들어낸다.
    • lexer: 요소를 하나하나 쪼갠다, parser: 구문 분석

두 언어의 특징 및 차이점

  1. 컴파일러는 소스코드 전체를 한번 훑고 컴퓨터 프로세서가 실행할 수 있도록 바로 기계어로 변환한다. 인터프리터는 고레벨 언어를 중간 코드로 변환하고 이를 각 행마다 실행한다. 이 중간 코드는 다른 프로그램에 의해 실행된다.

  2. 일반적으로 컴파일러가 각 행마다 실행하는 특성을 가진 인터프리터보다 실행시간이 빠르다.

  3. 컴파일러는 전체 소스코드를 변환한 뒤 에러를 보고하지만, 인터프리터는 각 행마다 실행하는 도중 에러가 보고되면 이후 작성된 코드는 살펴보지 않는다. 이는 보안적인 관점에서 도움이 된다.

고등운영체제, 인터럽트 기반 운영체제(Operating System Interrupt)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
경성대학교 양희재 교수님 수업 영상을 듣고 정리하였습니다.


고등운영체제

1. 다중 프로세서 시스템(Multiprocessor system)

메모리는 하나인데 cpu가 여러개인 시스템

  • 병합 시스템(Parrallel system): cpu가 여러개, 병렬로 있다.
  • 강결합 시스템(tightly-coupleds system): 강하게 결합, 하나의 메모리에 cpu가 여러개 강하게 결합되어있다.
  • 3가지 장점(performance, cost, reliability)
    • performance: 성능향상. cpu가 여러개 있으면 더 많은 계산이 가능하겠지
    • const: 비용절감. 컴퓨터는 빠를 수록 좋은데 하나의 강한 cpu보다 싸지만 여러개를 cpu를 두는게 더 효율적임
    • reliability: 신뢰도. 하나의 cpu가 고장나더라도 다른애들은 사용가능
  • 다중 프로세서 운영체제(multiprocessor OS): 하나의 메모리에 cpu가 여러개인 것은 multiprocessor OS이다.

2. 분산시스템(Distributed system)

여러개의 컴퓨터를 근거리 통신망(LAN)으로 연결 = cpu도 여러개, 메모리도 여러개로 이루어진 시스템

  • 다중 컴퓨터 시스템(multi-computer system): 여러개의 컴퓨터가 하나의 LAN으로 연결 되어있음
  • 소결합 시스템(loosely-coupled system): 메인 메모리를 공유하지 않음 (하나의 메모리, 하나의 cpu)
  • 분산 운영체제(Distibuted OS): 각각의 컴퓨터에 들어있는 os는 서로 메시지를 주고받으며 하나의 공통의 일을 나누어서 함

다중 프로세서 시스템과 분산시스켐의 장점/목표는 아래와 같다.

  • 성능향상: 강한 컴퓨터(성능이 좋다는건 빨리 계산한다는것)
  • 비용절감
  • 신뢰성(하나가 죽어도 다른일을 할 수 있음)

즉, 구현방식이 다른것이지 하고자하는 시스템을 통해 하고자하는 목표는 동일하다. 그러나 아래는 다르다.

3. 실시간 시스템(Real-time system)

계산이 시간내에 반드시 끝내야하는 시스템, 실시간 시스템이라 한다.

스마트폰에서 컴파일(하이레벨 랭귀지를 기계어로 변환하는것)을 한다고 할때,그 컴파일이 되는 시간은 반드시 몇ms안에 끝나야한다. 즉, 시간에 대한 절대적인 제한을 주는것!

  • 시간제약: Deadline. 시간내에 반드시 끝나야하는 시스템. 그것을 지나가면 실패한 시스템이라 한다.(타이트한 시간제약)
  • 공장 자동화(FA), 군사, 항공, 우주
  • 실시간 운영체제(Real-time OS = RTOS): 3초내에 끝내야한다고 할때, 못 끝날것같으면 나머지 다른애들을 희생시키고(바쁘지 않은 어떤 프로그램) 그 시간을 좀 더 투자함으로써 반드시 시간내에 끝낼 수 있도록 실행

인터럽트 기반 시스템(Interrupt-Based System)

가로채기, 현재 운영체제는 전부다 인터럽트 기반 시스템이다!

컴퓨터의 전원을 키고 boot load를 통해 하드디스크에 설치되이었던 os가 램으로 올라가 상주하게 되면 우리 눈에는 모니터의 바탕화면이 보이고 마우스가 깜빡이는걸 볼 수 있을 것이다. 마우스에 아무런 이동을 주지 않는다면 os는 일단 아무것도 안하고 가만히 있다. 이는 즉, cpu가 아무것도 하고 있지 않음을 의미한다.

그런데 마우스를 움직으면 무슨일이 일어날까?

  • 마우스에서는 전기신호가 발생해서 그 전기신호가 cpu에 보내진다.
    • 마우스가 실질적으로 cpu에 연결되어 있는 것은 아님.
    • 논리적으로 이 마우스가 인터럽트 선을 통해 전기신호를 보낸다.
  • cpu는 메모리 안에 os로 점프를 하게 된다.
    • 인터럽트라고 하는것은 지금 하는일을 중지하고 점프를 하는 것
  • os 안의 어떤일을 하라는 명령을 확인한다.
    • (Interrupt service routine: 인터럽트가 일어나면 이런 서비스를 해주는 코드)

즉, 우리가 바탕화면이 나타나 마우스를 움직이는 그 자체가 인터럽트가 발생한것이고 그 인터럽트 신호가 cpu에 보내지게 되면 cpu는 지금 하던일을 중지하고 os로 넘어가 os안에 들어가있는 마우스 Interrupt service routine으로 점프한다.

어떤 코드가 들어있을까?

마우스가 움직이는대로 모니터의 커서를 옮기는 루틴이 들어있다.

Hardware Interrupt

  • 마우스커서를 hwp로 움직여 더블클릭을 해본다.
  • 더블클릭을 하면 인터럽트에 걸릴것이고 cpu는 os에 들어가 해당하는 코드가 무엇인지를 확인한다.
  • 더블클릭에 해당하는 서비스 루틴을 확인(더블클릭의 x,y좌표에 해당하는 곳이 hwp구나 라는것을 확인)
  • 마우스 인터럽트 서비스 루틴이 하드디스크를 뒤져서 하드디스크 안의 hwp를 뒤져서 확인한뒤 메인메모리로 가지고 온다.
  • 메인메모리에 hwp프로그램이 올라가고 모니터에는 아래 한글 초기화면이 나타나게 된다.

키보드의 경우도 마찬가지다. 키보드의 어떤 키라도 누르면 전기신호가 가서 cpu는 하던일을 멈추고 os안의 키보드의 인터럽트 서비스 루틴으로 점프하게 된다. 즉, os는 하나의 프로그램이고 그 안에는 여러가지 코드가 있는데 그 코드는 인터럽트가 걸려오면 작동을 한다. 이렇게 해당 동작이 멈추게 되면 cpu는 다시 대기하고 있는다.

Software Interrupt > swi

  • hwp 프로그램이 메인메모리로 올라오면 해당 프로그램은 실행이 된다.
  • hwp 실행되다가 하드디스크의 어떤 내용을 읽어오고 싶은 경우,
    • 하드디스크를 읽어오는 루틴(프로그램)은 os안에 들어있음 - hwp가 직접 들고오지않음 (이 또한 ISR임)
  • hwp가 하드디스크의 내용을 읽어오고 싶다면, swi가 os에 점프
  • os안에 있던 코드가 하드디스크에 가서 하드디스크 안에 있던 파일을 읽어와 메인 메모리에 가져온다.
  • 다 읽고나면 다시 원래의 hwp 프로그램으로 돌아온다.

os안에는 많은 코드들이 들어있으며, os 안의 코드는 인터럽트를 통해서 실행이 된다.

Internal Interrupt

  • 컴퓨터 프로그램을 짰는데, 코드내 연산에서 값이 없는 코드가 나오게 되면 그 밑의 코드로는 진행이 안된다.
  • 이런 경우 컴퓨터의 입장에선 cpu에서 프로그램이 실행이 안된다.(저장이 안되니까)
  • cpu는 내부적으로 인터럽트가 발생한것으로 인식
  • os안에는 divide by zero(0으로 나누면 이 코드를 실행하라)라는 코드를 실행한다.
  • 프로그램을 종료시킨다.

운영체제 역사(Operating System History)

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
경성대학교 양희재 교수님 수업 영상을 듣고 정리하였습니다.


컴퓨터의 역사!

1. No operating System

처음 컴퓨터가 만들어진 때는 세계 2차대전 중 1940년대 말 즈음이다. 컴퓨터의 발전과 함꼐 하드웨어의 발전도 이루어졌고, 그에 따라 운영체제의 기술 또한 발전되었다. 제일 처음 발명된 컴퓨터의 크기는 너무 컸기 때문에 책상위에 올려둘 수도 없었고 아예 한 건물안에 컴퓨터 하나가 들어가있는 모습이었다.

그 건물에서 제일 큰 비중을 차지하는 것은 입력장치(카드리더)가 있는데, 이 카드리더에는 여러가지는 OCR에 적힌 내용을 읽어 처리기에 보내고 처리기에서 컴파일러 한 내용을 그대로 프린트(io)에 찍어보낸다.

이때의 컴퓨터는 일반인들은 사용 하지 못했고, 컴퓨터를 작동시키는 오퍼레이터라는 직업이 따로 있었다. 따라서 오퍼레이터(프로그래머)가 종이에 연필로 프로그램을 적어 전산실에 넘기면 전산실에서는 연필로 작성된 코드들을 OCR 카드에 구멍을 뚫어서 그 구멍을 통해 카드리더가 코드를 파악했다. 그럼 이 내용들이 처리기의 메모리에 적재되고 즉, 메모리가 프로세서에 올라가게되면 카드리더에 있던 파일은 삭제되고 이 메모리를 읽기 위한 컴파일러가 카드리더에 올라가 처리기로 옮겨지면서 처리기에는 메모리와 컴파일러가 올라가 있게 된다.

이 컴파일러는 이제 이 메모리를 번역하기 위해 기계어가 나오고 처리기는 기계어를 실행한다. 이때는 모니터가 없으니 그 결과는 프린터에 찍힌다.

그래서 처음의 컴퓨터에는 별도의 운영체제가 존재하지 않던 No operating system이었으며, 기술이 발전과 함께 컴퓨터 스스로 할 수 있는 운영체제가 만들어지기 시작했다.

2. Batch processing System

Batch: 꾸러미, 묶어서 프로세스를 처리를 한다 (일괄처리)

과거에 오퍼레이터가 했던 일련의 동작들을 이제는 메모리에 프로그램들을 넣어 컴파일 > 링크 > 로드하도록 하는, 즉 프로그램들을 메모리에 넣는 것 을 Batch processing system(일괄처리 시스템)이라고 한다.

이 메모리 안에 들어있는 작은 프로그램을 레지던트 모니터(resident monitor)라고 부른다. 메모리에 상주함으로써 일괄적인 일들을 한다고 해서 batch라는 단어를 붙였고 이를 최초의 운영체제로 본다. 그 후에 기술이 발전되어 메인 메모리 외에도 하드디스크(기억용량이 크고 속도도 빠름)도 만들어지고 그리고 이때의 메인메모리는 반도체 메모리가 아닌 진공관 메모리여서 이후 트랜지스터 등등이 생기면서 메모리가 굉장히 커지고, 프로세스 속도도 빨라지게 된다.

즉, 하드웨어 기술이 발전되며 os에도 변화 또한 굉장히 커졌다.

3. Multiprogramming System

os(운영체제)의 변화중에서도 가장 큰 변화인 멀티 프로그래밍(다중 프로그래밍)이다.

옛날에는 컴퓨터가 정말 비쌌고, 미국에도 많아야 5개가 안됐다.(우리나라에는 없었고) 그래서 사람들이 생각해보면 batch processing system도 좋았지만 단점도 존재했다.

  • 컴퓨터를 생각해보면 기본적으로 메모리에는 os와 유저 프로그램이 들어있다.
  • 다양한 유저 프로그램중에는 메모리에 하나만 올라갈 수 있었다.
    • 동시에 여러 프로그램이 메모리에 올라갈 수 없었다.

우리가 프로그램을 통해 어떤 연산을 할때에는 cpu를 사용하는데, 프린트를 통해 화면에 무언가를 입/출력할 때(io)에는 cpu를 사용하지 못한다. 즉 우리는 다양한 프로그램을 사용하고(cpu를 사용하고) 입/출력(io)를 하고싶은데 이를 동시에 진행하기가 어려운 것이다.

즉 시간경과에 따라서 cpu->io->cpu->io 이렇게 도는 것을 볼 수 있다.

더 나아가 batch processing system은 유저 프로그램이 하나 있었는데 처음 프로그램을 실행할때에는 cpu가 동작하지만, io가 실행할때에는 cpu는 io가 끝날때까지는 할일이 없다. 그래서 이때 cpu가 아무일도 안하고 놀게 되는데 이를 idle이라고 한다. (idle은 아무일도 안하고 빙빙 돌고있다는 뜻)

컴퓨터는 굉장히 비싼 자원이고 cpu의 연산속도는 무척 빠르지만 io의 속도는 느리고, 그렇다는 것은 io가 진행될때에는 cpu가 계속 놀고있게 되니 이를 해결할 방법을 마련한 것이 Multiprogramming system(다중 프로그래밍)이다.

메모리에 여러개의 프로그램을 돌리자!

cpu가 idle하지 않고 다른 프로그램(다른 유저 프로그램)으로 내려가게 된다.

그래서 원래 진행하고 있던 프로그램에서 io를 진행하고 있다고 하더라도 cpu는 계속해서 다른 프로그램으로 옮겨감으로써 일을 계속 하게될 수 있게된다. cpu는 되게 비싼 자원이기 때문에 이런식을 통해 메모리의 작업/프로그램을 수행하도록 한다. 어느 순간에도 cpu가 idle하지 않도록!

이 방식을 통해 idle 타임을 대폭 줄이고 cpu의 사용률이 올려버린다. 즉, 메인 메모리에 여러개의 프로그램을 올리는 것을 다중 프로그래밍 시스템이라고 한다.(프로그램이 여러개)

멀티 프로세싱 시스템을 채택하게 되면서 이제 우리는 단순하게 메모리에 프로그램을 여러개 올리는것만으로 끝나는게 아니라, 여러개의 생각해봐야 할 이슈가 생겼다.

  • CPU scheduling: 메인 메모리에 프로그램이 여러개 있으면 어떤 순서대로 cpu를 사용할 것인가?
    • 성능을 향상 시켜야 하니까, 성능이 더 좋은 방식으로!
  • 메모리 관리: 이제는 메모리의 유저프로그램들이 많아졌으니까, 유저 프로그램들을 각각 어디에 배치하는것이 좋을까?
    • 프로그램이 종료된다면 이 새로운 프로그램을 넣으려고 하면 비어있는 곳? 아니면 그 다음?
  • 보호: 다른 프로그램 영역까지 침범할 수 있으니 이를 막아햐 하잖아.

4. Time Sharing System

더 나아가, 60년대 후반 70년대로 오면서 모니터, 키보드가 생겨나게 되면서 컴퓨터와 사용자간의 interactive가 가능해졌다.

옛날에는 컴퓨터 한대의 값이 너무 비싸서 한사람이 쓰지 못하고, 하나의 컴퓨터에 단말기(terminal)를 연결해 각각의 컴퓨터와 키보드가 연결해 사용했다. 근데 이때의 컴퓨터 모양은 지금과 비슷해보이지만 조금 다르게 생겼다. 지금은 본체가 있어서 그 본체에 cpu와 메모리가 있지만 과거에는 그냥 단순히 모니터와 키보드로만 이루어진 입출력 장치에 불과했다.

그래서 옛날에는 하나의 컴퓨터에 수많은 단말기를 달아서 사용했다.

컴퓨터를 여러명이 사용하려다 보니, 처음 유저프로그램1을 실행을 하면 이 사이 유저2,3은 아무것도 실행하지 못한다.(cpu가 하나이기 때문에..) 하나의 컴퓨터를 여러명이 동시에 사용하려면 위에서 이야기했던 multiprocessor system을 사용하기는 힘들다.

이를 해결하기 위해서는 프로그램이 3개라고 한다면 1분에 1/100초 마다 cpu가 스위칭을 해줘야한다.

즉, io를 만날때마다 스위칭해주는게 아니라 아주 짧은 시간동안 계속해서 움직이게 한다. 그러면 유저가 3명이고 1/100초마다 스위칭이 된다면 한 사람마다 1초에 총 33번의 cpu가 할당되는 기회를 얻는다. 이렇게 되면 cpu는 워낙 빠르니까 유저는 혼자 컴퓨터를 사용하는 것처럼 느껴지게 된다.

이를 TSS(Time Sharing System)시공유 시스템이라고 한다. 일정 시간이 지나면 강제절환(Switching)하고 대화형 시스템이 가능해진다.(명령내리고 응답받고..)

  • 사용자가 여러명인데 다른 사용자에게 메시지를 보낼 수도 있음 (ex.카카오톡..)
  • 하나의 컴퓨터를 여러명이 쓰다보니까 서로 데이터를 주고받는것이 가능해짐
  • 프로세스간 통신이 가능해짐
  • 유저 1,2,3이 거의 동시에 실행되다 보니까 누가 앞서도 뒤서야하는지 알아봐야함(동기의 개념이 대두됨)
동기란?
싱크로나이즈 > 여러명이 짝을 이뤄 움직이는것
즉, 프로그램이 여러개 동시에 있다보니 누가 순서를 앞서도 뒤서야하는지를 해결해야하고, 이를 동기라고 한다.

늘어나는 유저상황에서 적은 메모리로는 어떻게 이를 유지할 수 있을까?

  • 새로운 기술이 나타남: 하드디스크가 보편화됨
    • 하드디스크의 일부를 메인 메모리인양 사용
    • 사실은 메인메모리가 아닌데, 하드디스크가 메인메모리처럼 보이게 함
    • 그래서 cpu가 보기에는 메인메모리가 크게 보이는것 > 가상메모리처럼..

운영체제는 성능향상을 시킨다고 했는데 바로 위에 저런 기능들을 통해서 성능향상을 시킬 수 있게 된것이다.

그래서 결론적으로 지금 우리가 사용하는 대부분의 운영체제는 TSS이다! 그 이후로는 os의 특별한 발전은 없었는데, 왜냐하면 거의 완성이 되었기 때문이다.

단일 cpu를 사용한 가장 최신의 운영체제가 되었고 unix, linux도 마찬가지고 mac, 윈도우 모든 TSS를 사용하고 있다.

os 기술의 천이

가장 강력한 컴퓨터는 무엇인가?

  • supercomputer: 가장 최강의 컴퓨터, 메모리용량도 크고 cpu도 빠르고 보조기억장치도 엄청나다.
  • mainframe: 한 컴퓨터에 수백대의 단말기를 달아 사용(수백명의 사람들이 동시에 사용하는 것)
  • minicomputer: 단말기가 수십대
  • micro: 작으면 한명정도..

이건 옛날 구별이고 이제는

  • supercomputer
  • server
  • work station
  • PC
  • handheld: 손에 들고다니는 컴퓨터 / 노트북, 태플릿, 스마트폰..
  • embedded: 어디에 파묻혀있다. 즉, 내장되어져있다.
    • 컴퓨터가 어디에 포함되어있다. 자동차안의 컴퓨터(엔진제어..), 전기밥솥 안의 cpu, 냉장고, 세탁기..
    • 우리 눈에는 안보이지만, 세탁기도 지능화되어야하니까 컴퓨터가 들어잇다.

이 모든 컴퓨터에는 모두 운영체제가 들어가 있다. 운영체제가 없으면 우리가 그것을 사용할 수가 없다. 그래서 아무리 간단해 보이는 컴퓨터라고 하더라도 모두 운영체제가 들어있다.