운영체제_운영체제의 목적 및 기능

미뇽·2024년 3월 28일
0

운영체제(강의)

목록 보기
3/43
post-thumbnail

운영체제의 목적과 기능

운영체제는 응용 프로그램의 수행을 제어하고 응용 프로그램과 컴퓨터 하드웨어 사이의 인터페이스 역할을 하는 프로그램이다. 목적으로는 세 가지가 있다.
1. 편리성: 컴퓨터의 보다 편리한 사용
2. 효율성: 컴퓨터 시스템 자원의 효율적 사용
3. 발전성: 효과적인 개발 및 시험 가능, 서비스를 방해하지 않고 새로운 시스템 기능을 도입할 수 있도록 구축

사용자/컴퓨터 인터페이스로서의 운영체제

운영체제는 프로그래머와 응용 프로그램이 그와 같은 기능과 서비스에 쉽게 접근하고 편리하게 사용할 수 있게 해주는 중개자로서의 역할을 한다. 운영체제가 제공하는 서비스는
1. 프로그램 개발: 프로그램 작성을 위한 문서 편집기, 디버거 등의 기능 및 서비스 제공.
2. 프로그램 실행: 하나의 프로그램 실행에선 운영체제에서 여러 단계를 거친다.
명령어와 데이터가 주기억장치에 적재되고, 입출력 장치와 파일들이 초기화되어야 하며, 필요시 다른 자원들도 준비되어야 한다. 이러한 자원을 사용자 대신 스케줄링하는 의무 수행.
3. 입출력 장치 접근: 각 입출력 장치에 대해 세부 사항들을 감추어 프로그래머가 단순 읽기/쓰기 관점에서 입출력 장치를 사용할 수 있도록 일관된 인터페이스 제공
4. 파일 접근 제어: 디스크, 테이프 드라이브와 같은 입출력장치 뿐만 아니라 저장매체 상에서의 파일 형식에 대한 정보도 반영한다. 또한 여러명의 동시 사용자를 지원하는 시스템의 경우에 운영체제는 파일에 대한 접근을 제어하기 위해 보호 기법 제공.
5. 시스템 접근: 공공(Public) 시스템의 경우 시스템 전체 및 특정 시스템 자원에 대한 접근을 제어하여 불법 사용자 접근 방지 및 자원 경쟁(같은 자원에 동시에 접근) 문제 해결
6. 에러 발견 및 응답: 메모리 에러나 장치 결함, 오동작과 같은 에러 발생에 대해 영향을 최소화시키면서도 에러 조건을 제거할 수 있도록 응답. 프로그램 종료, 연산 재시도, 에러 보고 등
7. 어카운팅(accounting): 여러 자원에 대한 사용 통계 수집 및 성능 척도(응답시간 등) 모니터링 -> 보완 필요성 예상 및 시스템 튜닝에 유용
8. Instruction Set Architecture(ISA): 컴퓨터가 따르고 있는 기계 명령어 집합 규정 정의. CPU마다 기계 명령어가 다를 수도 있기 때문에 이에 대해 규정을 정의하여 ISA에 의해 정의된 명령어를 사용하여 동작하도록 만듦.
9. 응용 실행파일 인터페이스(Application binary interface, ABI): 프로그램 간/서로 다른 컴파일러가 생산하는 실행파일 간 바이너리 호환성을 지원하기 위한 표준. 사용자 ISA에 의해 접근 가능한 하드웨어 자원이나 서비스 또는 운영체제로 전달되는 시스템 콜 인터페이스 규정
10. 응용 프로그래밍 인터페이스(Application Programming interface, API) : 프로그램들이 사용자 ISA를 통해 시스템에 있는 하드웨어 자원과 서비스에 접근할 수 있도록 해주는 수단. 표준화된 API를 통해 운영체제에서 재컴파일만으로 다른 운영체제에서도 쉽게 이식 가능.

자원 관리자로서의 운영체제

운영체제는 컴퓨터의 이동, 저장, 처리와 이 기능들을 제어하는데 필요한 자원들의 관리를 책임진다.
위 사진에서 운영체제는 주기억장치의 일부분을 차지하며 커널(운영체제 내부 코드) 및 OS 부분들이 항상 켜져있으며 처리기와 번갈아가며 제어를 가진다. 처리기가 유용한 작업을 수행할 수 있도록 제어를 양도한 뒤 다음 응용의 수행을 준비하는데 충분한 시간 동안 제어를 돌려 받고 이동안 운영체제는 다른 시스템 자원의 사용을 지시하며 다른 프로그램이 수행될 시점을 결정한다.
주기억장치의 나머지 부분에는 프로그램과 데이터가 적재된다.

운영체제 발전의 용이성

운영체제는 계속해서 발전해나갈 가능성이 있다.
1. 하드웨어 업그레이드 및 새로운 형태의 하드웨어: 하드웨어의 업그레이드와 함께 운영체제 또한 이를 위한 지원 확대
2. 새로운 서비스: 사용자 또는 시스템 관리자의 요구에 따라 새로운 서비스 제공을 위한 운영체제 확장.
3. 버그 수정: 결함이 발생하면 이에 대해서 수정

운영체제의 발전

순차처리

  • 1940말 ~ 1950 중반까지 사용되었던 방식.
    해당 시스템에는 큰 문제점이 두 가지 있었다.
  • 스케줄링(scheduling) : 기계에 소프트웨어를 설치하기 위해선 기계 사용시간을 예약하기 위해 등록 용지(sign-up sheet)을 이용했는데 30분 단위라 시간이 남아도 해당 시간동안 다른 사용자가 들어올 수 없어 처리 시간이 낭비되는 문제 발생
  • 준비시간(setup time) : 작업(Job)이라 불리는 단일 프로그램 수행에서 컴파일러와 소스 코드를 주기억장치에 적재하고 컴파일된 프로그램을 저장 장치에 저장한 다음, 바이너리 실행 파일과 공용 함수들을 함께 적재하여 링크했어야 하는데, 각 단계마다 테이프의 장착 여부, 카드 덱의 여부가 달랐기 때문에 여기서 에러가 발생하면 처음부터 다시해야됐다. 수행 준비에 미친 시간이 걸리는 셈

단순 일괄처리 시스템(Simple Batch System)

  • 1950년대 중반 IBM 704에 탐재된 버전
  • 모니터가 사용되기 시작됨
    - 단계별로 컴퓨터에게 직접 명령을 내리지 않고, 작업을 카드나 테이프에 담아 컴퓨터 오퍼레이터에게 제출하고, 오퍼레이터는 작업들을 순서대로 한데 모아 모니터가 처리할 수 있도록 작업 묶음(batch)을 입력장치에 넣어 제어가 모니터로 넘어감 -> 자동으로 프로그램 실행 완료 후 모니터가 다음 프로그램 적재
  • 동작 과정 이해
    - 모니터 관점
    - 항상 수행 가능한 상태로 주기억장치에 적재되어 일련의 사건(event)를 제어. 상주 모니터(resident monitor) 로 불림.
    - 나머지 부분은 유틸리티와 공용 함수로 구성되어 모니터의 서브루틴 관리.
    - 각 작업을 프로그램 영역에 읽어 들이면 제어가 작업으로 넘어가 작업 완료 후 다시 모니터로 돌아오고 자동으로 다음 작업 진행 -> 스케줄링 문제 해결
    - 처리기 관점
    - 주기억장치에서 명령어 수행하면서 다음 작업을 주기억장치의 다른 부분으로 읽어 들임.
    - 분기명령어를 수행하여 사용자 프로그램의 시작 부분으로 분기 후 종료 or 에러 발생 전까지 명령어 수행
    - 작업 다 되면 모니터 프로그램 내의 명령어 수행
  • 작업 제어 언어(job control langauge, JCL): 포트란 명령어
    - $FTN => 대용량 저장장치로부터 포트란 컴파일러 적재(주기억장치 or 대용량 저장장치). 주기억장치에 저장되면 컴파일-적재-수행 방식(compile, load and go)이라고도 불림
    - $LOAD => 컴파일 작업 후 제어를 다시 얻음. 모니터는 로더를 호출하고 로더는 컴파일러가 차지하고 있던 메모리 위치로 목적 프로그램을 적재한 뒤 제어를 그 프로그램으로 옮김
    - 프로그램에서는 입력 명령어를 통해 운영체제 내의 입력 루틴 호출
    - 입력 루틴이 JCL 라인 읽으면 모니터로 제어가 넘어가고 다음 JCL 명령어 전까지 라인을 버리기 때문에 읽지 않도록 점검해야함
  • 필요한 하드웨어 기능
    - 메모리 보호
    - 수행중인 사용자 프로그램은 모니터 포함 메모리 영역을 변경하면 안됨. 시도를 발견하면 처리기가 감지하여 제어를 모니터로 넘기고 모니터는 작업 중단 후 에러 출력 -> 다음 작업 재개
    - 타이머
    - 각 작업이 시작할 때 설정되어 시간을 넘어가면 제어를 모니터로 넘김
    - 특권 명령어
    - 모니터만이 실행할 수 있는 명령어. 모니터가 모든 입출력 장치를 제어할 수 있도록 특권 명령어화되어있음.
    - 인터럽트
    - 초창기 컴퓨터는 인터럽트 안됐지만 이제는 가능하다
  • 사용자 모드(User mode)와 커널모드(kernel mode)
    - 메모리 보호 + 특권 명령어 => 동작 모드
    - 사용자 모드(user mode)
    - 특권 명령어 수행 불가
    - 메모리의 특정 영역 사용 불가
    - 커널 모드(Kernel mode)
    - 특권 명령어 수행 가능
    - 보호 메모리 영역 접근 가능
  • 문제
    - 주기억장치의 일부를 모니터가 계속 차지
    - 약간의 컴퓨터 시간을 모니터가 사용
    => 오버헤드의 발생
    - 긴 I/O 시간동안 CPU를 놀리면서 효율이 떨어짐
    => 낮은 시스템 이용률

멀티프로그래밍 일괄처리 시스템(Multiprogrammed Batch System)

  • 한 작업이 입출력 완료를 대기해야 할 때 처리기가 그 틈을 이용해 다음 프로그램 실행
  • CPU의 사용률을 높일 수 있음


얘네들이 하나씩 순차적으로 실행되면 30분이라는 시간이 걸린다. 하지만 JOB3의 경우만 봐도 디스크에 읽어 프린트만 하면 되므로 처리기 시간을 최소한으로 요구하기 때문에 자원을 비효율적으로 사용하고 있음을 알 수 있다.

하지만 멀티프로그래밍 운영체제 하에서 병행 수행된다고 보면 각각 서로 차지하는 자원의 사용률이 다르기 때문에 병행수행을 한다 해도 문제될 것이 없다. 이러한 병행 수행의 경우 전체를 동시에 수행하는 것처럼 보이겠지만 사실은 인터럽트를 통해 동시에 수행하는 듯한 효과를 낸다.
이렇게 병행수행을 한다면 30분 걸릴 일이 15분으로 줄어들게 된다.


효율을 비교하면 시간당 작업처리량이 거의 2배에 버금가는 미친 성능임을 알 수 있다.
또한 자원들을 놀리지 않고 알차게 사용하면서 야무지게 써먹는다

시분할 시스템

멀티프로그래밍을 이용하면 일괄 처리로 효율을 내지만 많은 작업이나 트랜잭션 처리와 같은 작업은 대화형 모드가 필수적으로 필요하다.

터미널이 대표적인 대화형 모드이다.

과거에는 대화형 작업을 처리하기 위해서 시분할(time sharing)기법이 사용되었다. 이를 통해 각 사용자 프로그램이 짧은 시간동안 번갈아 수행되도록 해주는 운영체제를 통해 다수의 사용자가 터미널을 이용하여 동시에 시스템에 접근할 수 있다.

초기 개발된 시분할 운영체제는 MIT의 CTSS(Compatible Time-Sharing System)으로, IBM 709용으로 개발되었다.

job1: 15,000
job2: 20,000
job3: 5,000
job4: 10,000

위 그림은 CTSS의 동작이다.
제어가 대화형 사용자에게 할당되면 사용자 프로그램과 데이터가 주기억장치의 나머지에 할당되었다. 프로그램은 항상 5000번째 워드 위치에 적재하도록 해서 상주 모니터와 메모리와의 관리를 용이하게 만들었다.

시스템 클록은 대략 0.2초마다 1회의 비율로 인터럽트를 발생시켰고, 매 클럭 인터럽트마다 제어가 운영체제에 넘겨져 처리기가 다른 사용자에게 할당되는 방식이다.

위의 사진에서 메모리 용량이 합쳐서 넘지 않는 이상은 함께 실행된다. JOB3의 경우는 메모리 요구량이 적으므로 JOB2가 함께 남아있으면서 디스크 쓰기 시간을 줄일 수 있다. 이후에도 일부분을 저장하여 나중에 디스크 쓰기 시간을 줄일 수 있었다.

당시에는 최대 32명의 사용자를 지원할 수 있어 효율적이었다.

일괄처리 멀티프로그래밍과 시분할의 비교

일괄처리 멀티프로그래밍시분할
주요 목적처리기 이용률 극대화응답시간의 최소화
운영체제에 대한 명령어 소스작업과 함께 제공되는 작업 제어 언어 명령어터미널에서 입력되는 명령어

주요 성과

프로세스 분야에서

프로세스는

  • 수행 중인 프로그램
  • 컴퓨터 상에서 수행 중인 프로그램의 인스턴스(instance, 객체)
  • 처리기에 할당되어 수행될 수 있는 개체(entity)
  • 단일 순차 실행 쓰레드, 현재 상태, 연계된 시스템 자원 등에 의해 특정지어지는 활동 단위

라고 정의할 수 있다. 이러한 프로세스는 멀티프로그래밍 일괄처리, 시분할, 실시간 트랜잭션 등의 개발 과정에서 타이밍과 동기화 문제를 발생시켰고, 이러한 문제의 해결을 위해 프로세스라는 개념이 탄생하게 되었고, 이어 인터럽트라는 도구 또한 사용하게 되었다.

하지만 이러한 개념을 이용하여 시스템 소프트웨어를 설계한다고 하더라도 이는 매우 어려웠다. 각 프로그램의 작업은 순서대로 처리되어야 할 수많은 단계가 있고 이 사건 순차의 모든 가능한 조합을 분석하는게 불가능했을 뿐더러, 이러한 작업처리 과정들 간의 조정 및 협업을 지원하는 체계적 방법이 없었기 때문이다.

그러다보니 프로그래머들도 임시방편적인 조치만 취하게 되고, 이는 곧 다양한 에러로 이루어지게 되는데, 주요 에러는 다음과 같았다.

  • 부적절한 동기화: I/O 요청이 완료되었음을 알리는 신호가 분실되거나 중복 전달(타이밍 문제)
  • 상호배제 실패: 동기화의 문제로 여러 프로그램이 동시에 공유 자원의 사용을 시도
  • 비결정적인(nondeterminate) 프로그램 연산: 메모리를 공유하는 프로그램들을 처리기가 인터리빙 방식으로 실행시킬 때, 동일한 공유 메모리에 덮어쓰기 하면서 프로그램의 수행을 서로 방해
  • 교착상태(deadlock): 두 개 이상의 프로그램이 서로 상대방 프로그램에 할당된 자원의 방출(release)를 기다리면서 대기

메모리 인터리빙(Memory Interleaving)

메모리의 접근시간을 최소화하기 위해 메모리를 복수개의 모듈(Bank)로 나누고 각 모듈에 연속적인 주소를 부여하여 동시에 접근을 가능하게 하는 기법
CPU의 대기 시간을 최소화하고 처리 속도를 높일 수 있기 때문에, 캐시 기억장치, 고속 DMA(Direct Memory Access) 전송 등에서 사용된다.

이러한 문제들의 해결을 위해서는 처리기가 수행하는 프로그램들의 감시 및 제어가 필요했는데, 이에 대한 기반을 프로세스 개념이 제공한다. 프로세스는 다음과 같은 세 가지 구성요소로 이루어진다.

  • 수행 가능한 프로그램
  • 프로그램 수행에 필요한 관련 데이터(변수, 작업공간, 버퍼 등)
  • 프로그램 수행 문맥

수행 문맥(execution context, process state)

운영체제가 프로세스를 감독하고 제어하기 위한 내부 데이터
프로그램 카운터나 데이터 레지스터 같은 다양한 처리기 레지스터 내용 포함
프로세스 주소 공간으로부터 분리됨


위 사진은 프로세스의 구현 예이다.
각 프로세스는 데이터와 프로그램, 문맥을 가진다.
하나의 프로세스 당 하나의 문맥을 가지고 있어 해당 문맥을 참고하여 우선순위를 정하고 프로세스 처리를 한다.
현재는 프로그램 카운터가 프로세스 B의 프로그램을 가리키고 있으므로 프로세스 B가 실행중인 것을 알 수 있다.
프로세스는 자신의 메모리 영역만을 볼 수 있으며, 다른 메모리에 침범시 운영체제가 kill한다.

베이스(Base) 레지스터와 경계(limit) 레지스터
위 그림의 베이스, 경계 레지스터는 프로세스가 차지하고 있는 메모리 영역을 정의한다.
베이스 레지스터에는 메모리 영역의 시작 주소가 들어 있고, 경계 레지스터에는 그 영역의 크기가 저장된다.

메모리 관리

저장장치 할당에 대한 효율적이고 체계적인 제어를 요구하는 시스템 관리자를 만족시키기 위해 운영체제는 저장장치를 관리하는데 있어 다음 책무를 가진다

  • 프로세스 분리(isolation): 서로의 데이터나 메모리 영역을 침범하지 못하도록 분리하는 기법 제공
  • 자동 할당 및 관리: 프로그램이 사용하는 메모리 영역은 필요할 때마다 메모리 계층구조를 따라 동적으로 할당하며 자동으로 이루어짐.
  • 모듈식 프로그래밍 지원: 프로그램 모듈을 정의, 작성, 삭제가 가능하고 그 크기를 동적으로 변경 가능
  • 보호 및 접근 제어: 메모리 계층 어떤 레벨이라도 메모리가 공유되면 한 프로그램이 다른 프로그램의 메모리 주소 공간을 참조할 수 있게 함.
  • 장기 저장: 많은 응용 프로그램은 컴퓨터 전원이 꺼진 후에도 유지되는 정보 저장 수단을 필요로 함

이러한 요구사항들은 가상메모리와 파일 시스템을 통해 해결할 수 있다.

가상메모리란?

물리적으로 이용 가능한 주기억장치의 크기에 상관없이 프로그램이 메모리의 주소를 논리적 관점에서 참조할 수 있도록 하는 기법

위 사진과 같이 B.0~B.3의 경우 연속적인 메모리는 제약이 많다.
따라서 메모리를 각자 흩어서 배치해놓고 주기억장치에 각자 흩어져 있는 메모리들의 물리적 주소를 가상 주소과 동적 사상(mapping)을 제공함으로써 프로세스를 분리하면서도 정상적으로 읽어들일 수 있다.

메모리 관리 유닛(Memory Management Unit, MMU)가 처리기와 주기억장치 사이에 위치하여 매핑을 담당한다. 실기억장치에 없는 가상 주소가 참조되면 실기억장치의 내용 중 일부가 보조기억장치(디스크)로 교체되어 나가는 것을 swap out, 주기억장치에 원하는 데이터 블록이 들어오는 것을 swap in이라 한다.

정보 보호와 보안

운영체제는 보호와 보안을 위한 다양한 기법을 지원할 수 있다.

  • 사용성(availability): 시스템이 중지되지 않게 함
  • 기밀성(confidentiality): 접근 권한이 부여되지 않은 데이터를 사용자가 읽지 못하도록 보장
  • 데이터 무결성(data integrity): 데이터가 불법적으로 수정되지 못하게 보호
  • 신빙성(authenticity): 사용자 신원과 메시지나 데이터의 유효성에 대한 적절한 인증

스케줄링과 자원 관리

운영체제의 핵심 작업 중 하나는 다양한 자원 관리 및 활성 프로세스들로부터 자원 사용 요구를 스케줄링 하는 것이다. 이러한 과정에서 아래의 정책을 고려해야 한다.

스케줄링 정책

  • 공정성: 특정 자원을 사용하고자 경쟁하는 모든 프로세스들은 그 자원을 대체적으로 동등하고 공정하게 접근
  • 반응 시간 차등화: 다른 서비스 요건을 지닌 작업 클래스들을 구별하면서 모든 요구 조건들을 포괄적으로 만족시킬 수 있도록 할당 및 스케줄링
  • 효율성: 작업 처리량 극대화, 반응시간 최소화, 시분할 등 가능한 많은 수의 사용자를 동시에 수용하면서도 충돌이 일어나지 않도록 균형 잡기

디스패처 전략

  • Round-robin 기법
    - 시분할 시스템을 위해 설계된 선점형 스케줄링의 하나로서, 프로세스들 사이에 우선순위를 두지 않고, 순서대로 시간단위(Time Quantum/Slice)로 CPU를 할당하는 방식의 CPU 스케줄링 알고리즘이다.
    - 컴퓨터 자원을 사용할 수 있는 기회를 프로그램 프로세스들에게 공정하게 부여하기 위한 한 방법으로서, 각 프로세스에 일정시간을 할당하고, 할당된 시간이 지나면 그 프로세스는 잠시 보류한 뒤 다른 프로세스에게 기회를 주고, 또 그 다음 프로세스에게 하는 식으로, 돌아가며 기회를 부여하는 운영방식
    - 위의 사진에서 단기 큐(Short-Term Queue)의 경우 주기억장치에 적재되어 있고 처리기만 있으면 즉각 실행가능한 준비 상태의 프로세스들로 구성
    - 장기 큐(Long-Term Queue)의 경우 처리기를 사용하기 위해 대기하고 있는 새로운 작업들의 리스트
    - 운영체제는 장기 큐에서 단기 큐로 프로세스를 이동시키고 실행시키는데, 주기억장치 용량이나 처리기 능력이 초과되지 않도록 관리해야 한다

인터럽트(Interrupt)

인터럽트가 발생하면 운영체제는 처리기에 대한 제어를 넘겨받아 인터럽트 처리 루틴을 수행한다. 프로세스는 시스템 호출(System call)을 통해 입출력 장치 처리기 등의 운영체제 서비스 요청이 가능하다. 이 경우 서비스 호출 처리기는 운영체제로의 진입 역할을 한다.

인터럽트 or 서비스 호출이 처리되고 나면 운영체제는 단기 스케줄러를 호출하여 다음에 수행할 프로세스를 선정한다.

profile
문이과 통합형 인재(人災)

0개의 댓글