운영체제

시스템 소프트웨어의 일종

애플리케이션 소프트웨어 - 시스템 소프트웨어 (운영체제 > 커널) - 하드웨어

운영체제가 필요한 이유 : 예전엔 하드웨어를 목적에 따라 처음부터 끝까지 설계했으나, 범용적으로 하드웨어를 통제하기 위해 소프트웨어를 만들기 시작

운영체제 정의

운영체제(operating system)는 너무 복잡해서 단순한 일반적 정의를 내리기 어렵다.

  • 컴퓨터 하드웨어와 사용자(프로그램 또는 사람)간의 인터페이스
  • 다른 프로그램들의 실행을 용이하게 해 주는 프로그램
  • 시스템 내부에 있는 각 구성요소의 활동을 감독하는 괸리자
    • 하드웨어와 소프트웨어가 능률적으로 사용하도록 감시
    • 자원들의 충돌이 발생했을 때 해결하기 위해 중재

운영 체제의 두 가지 주된 디자인 목표는 다음과 같다.

  1. 효율적인 하드웨어 사용
  2. 용이한 자원들의 사용

운영체제의 발전

일괄처리 시스템 (batch operating system)

1950년대에 설계되었다. 그 당시 컴퓨터는 펀치 카드로 입력을 했다. 이 시대의 운영 체제는 매우 간단했다. 운영 체제는 단지 모든 자원들이 하나의 작업에서 다음 작업으로 옮겨지는 것만을 보장했다.

  • 작업(Job) : 실행되는 각 프로그램

다중프로그래밍 (multi programming)

컴퓨터 시스템 자원을 효율적으로 사용하기 위해서 다중프로그래밍(multiprogramming)이 소개되었다. 메모리에 여러 개의 작업들을 가지고 있고 자원이 이용가능한 상태일 때 그 자원을 필요로 하는 작업에 할당 하는 것이다. 예를 들어 하나의 프로그램이 입출력 장치를 사용하고 있을 때, CPU는 자유로운 상태고 또 다른 프로그램에 사용될 수 있다.

시분할 시스템 (time sharing system)

다중프로그래밍은 시분할(time-sharing)의 개념을 낳았다. 시스템 자원들은 서로 다른 작업들에 분담될 수 있다. 각각의 작업은 자원을 사용하는 시간에 할당될 수 있다.

다중프로그래밍과 시분할은 컴퓨터 시스템 능률을 크게 향상시켰다. 그러다 보니 복잡한 운영체제가 필요했다. 운영체제는 이제 스케쥴링(scheduling)이 필요했다. 자원들을 서로 다른 프로그램에 할당하고 프로그램이 언제 자원을 사용하는지 결정한다.

  • 프로세스(process) : 메모리 안에서 자원을 기다리고 있는 프로그램

개인처리 시스템

개인용 컴퓨터가 소개되었을 때, 이러한 형태의 운영체제가 필요했다. 이 기간 동안 단일 사용자 운영체제(single-user operating system)이 소개됐다.

병렬처리 시스템

더 빠른 속도와 능률의 요구는 병렬처리 시스템(parallel system)의 설계를 이끌었다. 같은 기계안에 다중의 CPU. 각각의 CPU는 하나의 프로그램 또는 프로그램의 일부분을 사용할 수 있다. 이것은 많은 작업들을 순차적이 아닌 병렬로 수행됨을 의미한다.

분산처리 시스템 (distributed system)

네트워킹(networking)과 인터네트워킹(internetworking)은 운영체제의 새로운 범위를 창조한다. 이전에는 하나의 컴퓨터에서 수행되었던 작업이 이제는 수천마일 떨어져 있는 컴퓨터들 간에 분할될 수 있다.

운영체제 구성 요소

오늘날의 운영체제는 매우 복잡하다. 현대의 운영체제는 적어도 네 가지 임무를 가진다. 기억 장치 관리자(memory manager), 프로세스 관리자(process manager), 장치 관리자(device manager), 파일 관리자(file manager). 어떠한 관리자에도 속해 있지 않은 부서가 있는 것처럼 운영체제 역시 일반적으로 사용자 인터페이스(user interface) 또는 셸(shell)이 라고 불리는 구성요를 가지고 있다. 사용자 인터페이스는 운영체제의 외부와 통신하는 책임을 가지고 있다.

기억장치 관리자

단일 프로그래밍(monoprogramming)

단일 프로그래밍에서 대부분의 메모리 수용능력은 한 개의 프로그램에 제한된다. 이 구성은 실행을 위해서 전체 프로그램이 메모리 안에 있다. 프로그램의 동작이 끝나면 다른 프로그램이 메모리 안에 대체된다. 여기서 기억장치 관리자의 작업은 수월하다.

하지만 메모리 크기가 프로그램보다 작으면 프로그램은 실행될 수 없다. 또한, 하나의 프로그램이 실행되고 있을 때, 다른 프로그램은 실행될 수 없다. 프로그램이 실행되고 있는 동안 가끔 입출력장치를 통해 데이터를 주고 받아야 한다. 입출력 장치는 CPU와 비교해 매우 느리다. 때문에 메모리와 CPU의 비효율적인 사용이다.

다중 프로그래밍(multiprogramming)

다중 프로그래밍에서는 하나 이상의 프로그램이 동시에 메모리 안에 있고프로그램들은 병행해서 실행된다. CPU는 프로그램들을 교환한다.

1960년대 이후로 다중프로그래밍은 몇 단계 향상을 거듭해 왔다.

  • Multi Programming
    • Non swapping : 실행되는 동안에 프로그램이 메모리 안에 남아 있음을 의미
      • Partitioning
      • Paging
    • Swapping : 실행되는 동안에 프로그램이 한번 또는 여러번에 걸쳐 메모리에서 디스크로 교체될 수 있음을 의미
      • Demand Paging
      • Demand Segmentation
가변 분할 (Partitionig)

메모리는 가변 길이의 조각으로 나누어진다. 각각의 조각(section) 또는 파티션(partition)은 하나의 프로그램을 가진다. CPU는 프로그램들을 교환한다.

하나의 프로그램으로 시작한다. CPU는 입출력 연산을 만나거나 프로그램의 소멸시간 때가지 몇 개의 명령들을 실행한다. CPU는 마지막으로 실행되 명령의 메모리 위치를 저장하고 다음 프로그램으로 옮긴다. 두 번째 프로그램에서도 같은 절차를 반복한다. 물론 CPU에 접근하는 우선순위가 있을 수 있다.

분할은 CPU 능롤을 향상시킨다. 그러나 몇 가지 쟁점을 가지고 있다.

  • 분할의 크기는 기억 장치 관리자에 의해 미리 결정된다. 분할 크기들이 작으면, 일부 프로그램은 메모리에 옮겨질 수 없다. 분할 크기가 크면, 메모리에 일부 구멍(사용되지 않는 공간)이 생길 것이다.
  • 분할이 컴퓨터 시작시 완벽하게 이루어져도, 프로그램이 새로운 것으로 대체된 후에는 일부 구멍이 생길지도 모른다.
  • 메모리에 사용되지 않는 공간이 많을 때, 기억 장치 관리자는 구멍을 제거하여 분할 공간을 꽉 채우고 새로운 분할 공간을 생성한다. 하지만 이것은 시스템의 또 다른 오버헤드를 발생 시킨다.
페이징 (Paging)

페이징은 분할의 능률을 향상시킨다. 페이징에서 메모리는 프레임(frame)이라 불리는 동일한 크기의 섹션(section)으로 나누어진다. 프로그램은 페이지(page)라고 불리는 동일한 크기의 섹션으로 나누어진다. 일반적으로 페이지와 프레임의 크기는 같으며, 저장 장치에서 정보를 검색하는 시스템에 사용되는 블록의 크기와 같다.

페이지는 프레임 안으로 옮겨진다. 만약 프로그램이 세 개의 페이지를 가지고 있다면, 메모리에서 세 개의 프레임을 차지한다. 이와 같은 기술에서 프로그램은 메모리에 연속적으로 위치할 필요가 없다.

페이징은 어느 정도까지는 능률을 향상시키지만, 전체 프로그램은 여전히 실행되기 전에 메모리 안에 있어야 한다. 이것은 비어 있는 프레임이 네 개 밖에 없다면 여섯 개의 프레임이 필요한 프로그램은 메모리 안으로 옮겨질 수 없다.

요구 페이징 (Demand Paging)

페이징은 프로그램이 연속적인 메모리 위치에 있는 것을 요구하지는 않지만, 전체 프로그램은 실행중에 메모리 안에 있어야 한다. 요구 페이징에서 프로그램은 페이지들로 나누어지지만 페이지들은 메모리 안으로 하나씩 옮겨 질 수 있고, 실행될 수 있으며 다른 페이지로 대체될 수 있다. 다시 말해서 메모리는 동시에 다중 프로그램들로 부터 하나의 페이지를 보유할 수 있다.

요구 분절 (Demand Segmentation)

논리적 관점의 분할이다.

  • segment : 사용자 관점에서 본 가변 크기를 가진 함수나 배열 (프로그램은 segment 집합임)
  • segmentation : 사용자 관점의 메모리 할당기법

페이징에서 프로그램은 프로그래머가 생각했던 방법이 아닌 동일한 크기의 페이지로 나누어진다. 요구 분절은 동일한 크기의 조각 대신 프로그램의 분절(segmentation)과 일치하게 나눠진다.

가상메모리

요구 페이징과 요구 분절은 프로그램이 실행되고 있을 때 프로그램의 일부분은 주 기억 장치에 있고 일부분은 디스크에 있음을 의미한다. 가상메모리는 오늘날 거의 모든 운영체제에서 사용하고 있다.

- vmware처럼 가상메모리 옵션을 물어보는 프로그램이 있다. 메모리가 넉넉하다면 가상메모리 옵션을 끄는게 좋다.
- 반대 개념으로 '램 디스크'가 있다. 램이 광할해 하드디스크 처럼 사용하는 것이다.
- Random Access : 주소 값만 알면 찾을 수 있다는 의미이다. 예전에는 순차적으로 접근했기 때문에 이런 개념이 없어 랜덤이라는 단어를 사용하게 됐다.

프로세스 관리자

프로그램, 작업, 프로세스

프로그램

프로그래머에 의해 작성되고 디스크에 저장되어 있는 능동적이지 않은 명령어들 집합이다. 프로그램은 작업이 될 수도 있고 안될 수도 있다. 예를 들어 word.exe는 프로그래머가 만들어논 01010101들의 명령어 집합이다.

작업

프로그램은 실행을 위해 선택된 순간부터 그것의 동작이 끝날 때 까지 작업(job)이 되었다가 다시 프로그램이 된다. 모든 작업은 프로그램이지만 모든 프로그램은 작업이 아님을 명심하자.

프로세스

프로세스는 이미 실행중에 있는 프로그램이다. 시작했지만 아직 끝나지 않은 프로그램이다. 다시 말해서 프로세스는 메모리 안에 있는 작업이다. 프로세스는 그 순간 실행되고 있거나 CPU 시간을 기다리고 있다. 모든 프로세스는 작업이지만 모든 작업은 프로세스가 아니다.

상태도

프로그램, 작업, 프로세스의 다른 상태를 보여주는 것이 상태도(state diagram)이다.

프로그램은 운영체제에 의해 선택되어 예약 상태(hold state)가 될 때 작업이 된다. 작업은 메모리 안으로 옮겨질 때까지 이 상태로 남아 있는다. 프로그램 전부 또는 부분적으로 옮겨질 수 있는 메모리 공간이 생길 때 작업은 준비 상태(ready state)로 이동한다. 이제 이것은 프로세스가 된다. 프로세스는 CPU가 실행할 수 있을 때까지 준비 상태로 메모리에 남아있는다. CPU가 실행할 수 있을 때에는 준비 상태에서 실행 상태(runnig state)로 이동한다. 실행 상태에서는 다음 세 가지 중에 하나가 발생 할 수 있다.

  • 프로세스는 입출력이 필요 > 대기 상태(waiting state)로 이동, 입출력 대기
  • 프로세스는 할당된 시간 슬롯을 고갈 > 준비 상태(ready state)
  • 프로세스는 종료 > 프로세스 종료상태(terminated state)로 이동, 더 이상 프로세스가 아님

프로세스는 종료상태로 가기전에 여러번 실행/대기/준비 상태 사이를 이동할 수 있다. 만약 시스템이 가상 메모리를 사용하고 주 기억 장치 안과 밖의 프로그램을 맞바꾼다면 상태도는 훨씬 복잡해진다.

스케줄러

한 상태에서 다른 상태로 작업을 이동시키거나 처리하기 위해서, 프로세스 관리자(process manager)는 두 개의 스케줄러를 사용한다. 작업스케줄러와 프로세스 스케줄러다.

작업 스케줄러 (job scheduler)

예약 상태(hold)에서 준비(ready) 상태로 or 실행(runnig) 상태에서 종료(terminated)상태로 작업을 이동시킨다. 다시 말해 작업 스케줄러는 작업으로부터 프로세스를 만들고 종결시키는 역할을 한다.

프로세스 스케줄러 (process scheduler)

프로세스를 한 상태에서 다른 상태로 이동시킨다.

  • FCFS : 준비 상태에 도착한 순서에 따라 차례로 CPU 할당
    • 맨 처음 들어온 것이 크면 다음 것은 한없이 기다려야함
  • SJF : 실행시간이 가장 짧은 프로세스에게 먼저 CPU 할당
    • 평균 대기 시간이 가장 적은 알고리즘
    • 실행시간이 긴 프로세스는 밀려 무한 연기상태 발생
  • Round Robin Scheduling
    • 시분할 시스템을 위해 고안된 방식
    • FCFS 기법변형
    • 각 프로세스는 할당 시간 양 동안만 실행
    • 완료되지 않으면 다음 프로세스에게 CPU를 넘겨주고 준비상태 큐의 가장 뒤로 배치
    • 할당된 시간이 클수록 FCFS와 비슷
    • 할당시간이 작을 수록 문맥교환(자리배치)과 오버헤드가 자주 발생
    • 핵심은 하나의 프로세스 처리 시간을 효율적으로 하는 것이다.
    • 프로세스 우선순위 문제가 생길 수 있다.
  • Priority Based Scheduling
    • 프로세스마다 우선순위 부여​
    • 우선순위가 동일한 경우 FCFS 기법으로 할당
    • 가장 낮은 순위를 부여 받은 프로세스의 무한 연기 발생가능
  • Multi Queue Scheduling
    • 프로세스를 특정 그룹으로 분류할 수 있을 경우 그룹에 따라 각기 다른 준비단계 사용
    • 준비상태 큐 마다 다른 스케쥴링 기법 사용가능
    • 다른 준비상태 큐로 이동 불가
    • 하위단계 준비 큐에 있는 프로세스를 실행하는 도중이라도 상위 단계 준비상태 큐에 프로세스가 들어오면 상위 단계 프로세스에게 CPU를 할당
다른 스케줄러

몇몇의 운영체제는 효과적인 프로세스로 전환시키기 위해 다른 형태의 스케줄러를 사용한다.

대기

상태도는 하나의 작업이나 프로세스가 어느 상태에서 다른 상태로 이동하는 것을 보여준다. 실제로 컴퓨터 자원에는 서로 경쟁하는 많은 작업들과 프로세스들이 있다. 다수의 프로세스들과 작업들을 다루기 위해서 프로세스 관리자는 큐(queue, 대기목록)를 사용한다. 프로세스 관리자는 작업이나 프로세스 자체 대신에 큐에 작업/프로세스 제어블록을 저장한다.

프로세스 관리자는 큐로부터 다음에 할 작업이나 프로세스를 선택하는데 다른 방법들을 사용할 수 있다. 선입선출(FIFO), 최단 경로 우선, 최상위 우선 등이 있다.

프로세스 동기화

프로세스 관리 뒤에 있는 전체적인 개념은 다른 프로세스를 다른 자원에 동기화시키는 것이다.자원이 하나보다 더 많은 사용자(이 경우 프로세스)에 의해 사용될 때, 두 가지 상황이 일어날 수 있다. 교착상태와 기아 상태이다.

교착상태 (deadlock)

교착상태는 운영체제가 프로세스에 자원 제한을 두지 않을 때 발생한다.

운영체제가 필요한 자원이 준비되어 있고 프로세스가 자원을 필요한 만큼 잡고 있을 수 있는지 처음부터 점검하지 않고 프로세스가 시작된다면 교착상태가 발생한다. 교착상태를 막기 위해 시스템 내에 몇 가지 준비가 있어야 한다. 한 가지 해결 방법은 자원이 자유로워질 때까지 프로세스가 실행되지 못하게 하는 것이다. 두 번째 해결 방법은 프로세스가 자원을 보유하고 있는 시간에 제한을 두는 것이다.

교착상태가 일어나는 데는 네 가지의 필수조건이 있다.

  • 상호간의 배제 : 단 하나의 프로세스가 하나의 자원을 보유
  • 자원 보유 : 프로세스가 다른 자원을 이용할 수 있을 때까지 그 자원을 이용할 수 없어도 보유
  • 우선 점유권 없음 : 운영체제가 임시적으로 자원을 재분배 할 수 없음
  • 순환적 대기 : 모든 프로세스들과 자원들은 고리 형태로 연결

이 조건들 중 한개라도 없어진다면 교착상태는 절대 일어날 수 없다.

기아 (starvation)

기아는 교착상태의 반대이다. 운영체제가 프로세스에 너무 많은 자원제한을 둘 경우 발생할 수 있다. 예를 들어 프로세스가 질행되기 전에 모든 필요한 자원들을 일일이 열거하는 운영체제가 있다고 가정하자. 프로세스 A는 file1, file2가 필요하다. 하지만 file1은 B가 사용중이며, file2는 C가 사용중이다. 프로세스 B가 종료되어 file1을 놓어준다. 하지만 file2는 아직 사용 불가능하기 때문에 프로세스 A는 실행될 수 없다.

장치 관리자

장치관리자(device manager)나 입출력 관리자는 입출력 장치 접근에 대한 책임이 있다. 컴퓨터 시스템에서 입출력 장치들의 수와 속도에는 제한이 있다. 왜냐하면 한 프로세스가 입출력장치를 이용할 때 다른 프로세스들이 그 시간에 입출력장치를 이용할 수 없기 때문이다. 장치관리자는 입출력 장치들의 효과적인 사용에 대한 책임이 있다.

  • 장치 관리자는 항상 모든 입출력 장치를 감독한다.
  • 장치가 한 프로세스에 의해 사용되는 것을 마치고 큐에 있는 다음 프로세스에 의해 사용되는 때를 알고 있다.
  • 장치 관리자는 입출력 장치에 대한 한개 또는 그 이상의 큐를 유지시킨다.
- 드라이버 : 새로운 하드웨어가 표준과 달리 독자적인 기능이 있을 경우, 커널이 제대로 동작하지 않을 수 있으므로 드라이버를 제공
- 펌웨어 : 전기신호만 들어오면 프로그램 실행 (예: 마더보드)

파일 관리자

응용프로그램 ← (파일 입/출력 요청) → 운영체제 ← (파일 입/출력 처리) → 보조기억 장치

운영 체제는 파일에 접근하는 것을 제어하기 위해 파일 관리자(file manager)를 사용한다.

  • 파일에 접근하는 것을 제어
  • 파일 생성, 삭제, 수정을 감독
  • 파일의 이름을 제어 (확장자를 바꾼다고 파일안의 내용이 바뀌는 것이 아니다.)
  • 파일의 저장을 감독 : 어떻게 저장하고, 어디에 저장하는지, …
  • 파일 보관과 백업에 관한 책임
디스크에 인덱스 테이블을 만들어 관리한다.
	- 물리 디스크 : 디스크가 두 개일 경우
	- 논리 디스크 : 한 개의 디스크를 c:와 d:로 분리하는 경우
디스크 포맷 시, 인덱스 테이블만 제거한다. 그래서 복구프로그램을 이용해 복구가 가능하다. 때문에 망치로 부셔야 복구가 불가능하다.

SSD
	- 조각모음을 하지 말라는 이유 : 어차피 Random Access라 할 필요가 없다. 해도되지만 SSD는 읽고 쓰는 횟수가 제한되어 있으므로 하지 않는게 좋다.
	- 가상 메모리로 사용하지 말라는 이유 : 주기억장치는 읽고 쓰는 횟수가 많기 때문이다.

사용자 인터페이스

각각의 운영체제는 그것들이 쉬는 동안 사용자(프로세스)들로부터 요청을 받아들이고 그것을 해석하는 프로그램인 사용자 인터페이스(user interface)를 가진다.

운영체제의 종류

Unix - BSD - Mac OS X
Linux - android, ubuntu, centOS, fedora
Windows - Window NT
  • 리눅스는 유닉스에서 파생됐기 때문에 리눅스와 유닉스를 합쳐 유닉스 계열이라고 부른다.
  • 윈도우는 범용성에 초점을 두고 설계했다. 범용성이 중심이라는 말은 어디 하나에 최적화 하기도 어렵다는 뜻이다. 그렇기 때문에 가장 불안정한 운영체제이다.
  • 유닉스는 가장 안정한 운영체제이다. 그래서 은행같이 안정성이 중요한 시스템은 유닉스를 사용한다.
  • 블루스크린(윈도우계열), 커널패닉(유닉스계열) : 운영체제(커널)가 하드웨어나 소프트웨어를 더이상 통제하지 못 하는 상황이 되면 “에라 모르겠다”하고 꺼져버리는 것
    • 덤프 : 메모리 전원이 꺼지면 데이터가 사라지므로 꺼지기 전에 메모리에 있는 0101011을 통째로 보조기억장치(하드디스크)에 저장해두는것
    • 4G 메모리를 사용하는 컴퓨터라면 메모리 전체의 데이터(0101010)를 덤프로 남기기 때문에, 덤프도 4G가 남는다. 그래서 덤프가 많이 쌓이면 하드디스크 용량을 차지하게 된다.
  • 최대절전 모드는 임시파일을 만든다. 임시파일은 메모리의 내용을 하드에 저장해뒀다가 복구해주는 것이다.

커널

운영체제는 하드웨어와 애플리케이션의 교두부 역활을 한다. 운영체제안에는 커널(kerner)이 존재한다. 커널은 하드웨어를 통제/제어하는 역할을 한다.

  • 운영체제의 핵심
  • 운영체제의 정체성 (커널에 따라 운영체제가 결정 됨)
  • 보안, 자원관리, 추상화(예: 하드디스크의 path를 추상화해서 보여줌)

운영체제 껍데기는 가상시스템, UI, 유틸리티를 제공한다. 토발즈가 발명한 건 리눅스 커널이다. 거기에 껍데기를 씌어서 운영체제로 나오는것이 우분투, 레드햇, … 등이 있다.

컴퓨터 동작 체험

별(*)은 운영체제가 개입하는곳

사용자: 명령을 입력장치를 통해 전달
↓
(*)입력장치: 응용프로그램에게 사용자 입력 전달
↓
(*)응용프로그램: 주기억장치에 명령복사
↓
주기억장치: CPU명령복사
↓
CPU: 명령 수행후 주기억장치로 결과 복사
↓
(*)응용프로그램: 결과값을 보조기억장치에 저장
↓
(*)응용프로그램: 결과 값을 출력장치로 전달
↓
출력 장치: 사용자에게 결과 안내

데이터베이스

자료구조 vs 데이터베이스

  • 자료구조 : 주기억장치에서 이루어질 내용
  • 데이터베이스 : 대부분 보조기억장치에서 이루어질 내용

데이터베이스 모델

  • 관계형 : 주로 사용하며 RDB라고 부른다.
    • 장점 : 속도가 빠름
    • 단점 : 설계 확장/수정이 까다로움
  • 키-값형
  • 객체형
  • 문서형
  • 컬럼형

데이터베이스 마이그레이션 : 데이터 베이스 설계 구조를 바꾸는 것

관계형 데이터 베이스

  • 정규화 : 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스
  • SQL : 데이터를 관리하기 위한 구조화된 질의문을 작성하기 위한 언어

DBMS

DB Management System : DB에 접근할 수 있는 기능을 제공하는 소프트웨어 (mysql, postgresql, sqlite, mariadb, …)