운영체제 - ch.02

Jajuna_99·2023년 4월 21일
0

운영체제

목록 보기
3/10

운영체제 - 2장 운영체제 구조

운영체제 서비스

운영체제는 프로그램과 사용자들에게 프로그램과 서비스들이 실행할 수 있는 환경을 제공해준다.

여기서 다음 서비스들은 사용자들에게 편리한 기능들이다.

  • 거의 모든 운영체제에는 사용자 인터페이스(UI)가 있다. 종류로는 CLI, GUI, 터치스크린, 배치 형식이 있다.

  • 프로그램 수행(program execution) : 시스템은 프로그램을 메모리에 적재해 실행할 수 있어야 한다. 정상적이든, 비정상적이든 실행을 끝낼 수 있어야 한다.

  • 입출력 연산(I/O operations) : 수행 중인 프로그램은 입출력을 요구할 수 있다. 이러한 입출력에는 파일 혹인 입출력 장치가 연관될 수 있다.

  • 파일 시스템 조작(file system manipulation) : 프로그램은 이름에 의해 파일을 생성하고 삭제할 수 있고 지정된 파일을 찾을 수 있어야 하고 파일의 정보를 열거할 수 있어야 한다.

  • 통신(communication) : 한 프로세스가 다른 프로세스와 정보를 교환해야 할 필요가 있는 여러 상황이 있다.
    통신은 공유 메모리메시지 전달(OS를 통해 패킷을 옮기는) 기법을 사용하여 구현될 수 있다.

  • 오류 탐지(error detection) : 운영체제는 모든 가능한 오류를 항상 의식하고 있어야 한다.

    • 오류는 CPU, 메모리 하드웨어, 입출력 장치, 또는 사용자 프로그램에서 일어날 수 있다.
    • 각 유형의 오류에 대해 적당한 조치를 해야한다.
    • 디버깅 설비는 시스템을 효율적으로 사용할 수 있는 사용자와 프로그래머의 능력을 향상시킨다.
  • 자원 할당(resource allocation) : 다수의 프로세스나 다수의 작업이 동시에 실행될 때, 그들 각각에 자원을 할당해 주어야 한다. 운영체제는 여러 가지 다른 종류의 자원을 관리한다. (CPU 사이클, 메인 메모리, 파일 저장장치)

  • 기록 작성(logging) : 어떤 프로그램이 어떤 종류의 컴퓨터 자원을 얼마나 많이 사용하는지를 추적하는 기능

  • 보호와 보안(protection & security) : 네트워크로 연결된 컴퓨터 시스템에 저장된 정보의 사용자는 그 정보의 사용을 통제하는 기능. 서로 다은 여러 프로세스가 병행하게 수행될 때, 한 프로세스가 다른 프로세스나 운영체제 자체를 방해해서는 안 된다.

    • 보호 : 시스템 자원에 대한 모든 접근이 통제되도록 보장하는 것
    • 보안 : 각 사용자가 자원에 대한 접근을 원할 때 인증하는 것. 통산 패스워드를 사용해서 시스템에게 인증하는 것부터 시작한다.

사용자와 운영체제 인터페이스

명령 인터프리터

CLI 혹은 command interpreter는 직접 입력한 명령어만 허용한다.

  • 커널에 구현될 때도 있고 시스템 프로그램에 구현될 때도 있다.
  • 혹은 여러가지로 구현될 수 있다. shells
  • 사용자의 의한 명령어를 가장 먼저 fetch하여 수행한다.
  • 빌트인 명령어나 프로그램의 이름으로 실행할 수 있다. 후자의 경우 셸을 수정할 필요가 없다.

그래픽 기반 사용자 인터페이스

사용자 친화적인 그래픽 기반 사용자 인터페이스 GUI를 통하는 방식이다.

  • 주로 마우스, 키보드, 모니터를 사용해 아이콘(파일, 프로그램, 행동 등을 나타내는)으로 조작한다.
  • 마우스 포인터의 위치에 따라, 마우스 버튼을 누름으로써 프로그램을 호출하거나 파일 혹은 디렉터리를 선택할 수도, 명령을 포함한 메뉴를 잡아당길수도 있다.
  • Xerox PARC 연구 센터에서 개발됐다.

많은 시스템들이 CLI와 GUI를 둘 다 사용한다.

  • 마이크로소프트 윈도우는 GUI와 CLI 명령어 쉘이다.
  • 애플 맥 OS X는 Aqua GUI 인터페이스와 UNIX 커널과 쉘이 사용 가능하다.
  • Unix와 Linux는 CLI이고 선택적으로 GUI를 사용할 수 있다. (CDE, KDE, GNOME)

시스템 콜

시스템 콜은 운영체제에 의해 사용 가능하게 된 서비스에 대한 인터페이스를 제공한다.

이러한 호출은 일반적으로 높은 레벨의 언어 (C or C++)로 호출하는 것이 일반적이다. (HW는 어셈블리 명령)

응용 프로그래밍 인터페이스

프로그램의 의한 접근은 직접 시스템 콜을 사용하기 보다 보통 높은 레벨의 API를 사용한다. (이식성과 편이성 때문에)

가장 흔히 사용되는 API는 Win32 API, POSIX API, Java API이다.

시스템 콜 인터페이스 : 시스템 콜은 통상 숫자가 할당되어 있는데 이런 숫자들을 인덱싱해서 테이블에 관리하는 것이 시스템 콜 인터페이스이다.

시스템 콜 인터페이스는 의도하는 시스템 콜의 상태와 반환 값을 돌려준다.

호출자는 시스템 콜이 어떻게 구현되고 실행 중 무슨 작업을 하는지 아무것도 알 필요가 없다.

단지 API를 준수하고 시스템 콜의 결과로서 운영체제가 무엇을 할 것인지만 이해하면 된다.

운영체제 인터페이스에 대한 대부분의 자세한 내용은 API에 의해 프로그래머로부터 숨겨진다.

실행시간 환경 : 컴파일러 또는 인터프리터를 포함하여 특정 프로그래밍 언어로 작성된 응용 프로그램을 실행하는 데 필요한 전체 소프트웨어 제품군과 라이브러리 또는 로더와 같은 다른 소프트웨어를 함께 가르킨다.

통상 원하는 시스템 콜을 식별하기 위해서는 더 많은 정보를 필요로한다.

정확한 정보의 유형과 양은 운영체제와 콜에 따라 다르다.

3개의 표준적으로 사용되는 운영체제에 파라미터 패스해주는 방법들

  • 가장 간단한 방법 : 매개변수를 레지스터 내에 전달하는 것, 어떤 경우에는 레지스터보다 더 많은 매개변수가 있을 수 있따.

  • 이 경우 메모리 내의 블록이나 테이블에 매개변수를 저장하고, 블록의 주소가 레지스터 내에 매개변수로 전달된다. (Linux와 Solaris에서 사용)

  • 매개변수는 프로그램에 의해 스택넣어질수도 있고 꺼내질수도 있다.

  • 블록이나 스택 방법은 전달되는 매개변수들의 개수나 길이를 제한하지 않는다.

시스템 콜의 유형

시스템 서비스

시스템 서비스(시스템 유틸리티)는 프로그램 개발과 실행을 위해 더 편리한 환경을 제공한다. 다음과 같이 분류된다.

대부분의 사용자 관점에서 보는 운영체제는 시스템 프로그램의 의한 것이지 시스템 콜이 아니다.

  • 파일 관리
    • 생성, 삭제, 복사, 개명, 출력, 열거, dump, 그리고 일반적으로 조작한다.
  • 상태 정보 (저장, 변경된 파일)
    • 어떤 프로그램들은 단순히 시스템에게 날짜, 시간, 사용 가능한 메모리와, 디스크 공간의 양, 사용자 수, 혹은 이와 비슷한 정보를 묻는다.
    • 다른 프로그램들은 더 복잡하여 상세한 성능, 로깅 및 디버깅 정보를 제공한다.
    • 통상 이 프로그램들은 정보를 단말기나 다른 출력 장치 혹은 파일로 포맷하여 출력하거나 GUI의 윈도에 표시한다.
    • 몇몇 시스템은 환경 설정 정보를 저장하고 검색할 수 있는 등록기능을 지원하기도 한다.
  • 파일 변경
    • 텍스트 편집기로 파일을 생성하거나 수정할 수 있도록 한다.
    • 파일의 내용을 검색하거나 변환하기 위한 특수 명령어가 제공되기도 한다.
  • 프로그래밍언어 지원
    • 컴파일러, 어셈블러, 디버거, 인터프리터가 종종 운영체제와 함께 사용자에게 제공된다.
  • 프로그램 적재와 수행
    • 절대 로더, 재배치 가능 로더, 링키지 에디터, 중첩 로더 등을 제공할 수 있다.
    • 고급어나 기계어를 위한 디버깅 시스템도 필요하다.
  • 통신
    • 프로세스, 사용자, 그리고 다른 컴퓨터 시스템들 사이에 가상 접속을 이루기 위한 기법을 제공한다.
    • 사용자가 다른 사용자 화면으로 메시지를 전송하거나, 웹 페이지 이곳저곳을 읽거나, 전자 우편 메시지를 보내거나, 원거리에서 로그인하거나, 한 기계에서 다른 기계로 파일을 전송할 수 있게 한다.
  • 백그라운드 서비스
    • 부트할 때 실행된다.
    • 일부는 자신들의 할 일을 완수하면 종료하는 반면에,
    • 일부는 시스템이 정지될 때까지 계속해서 실행되는 프로세스도 존재한다.
    • 디스크 체크, 프로세스 스케줄링, 오류 기록, 출력 등을 제공한다.
    • 커널 문맥이 아닌 사용자 문맥에서 실행하는 경우, 디먼을 이용해서 작업을 수행할 수 있다.
    • 서비스, 서브시스템, 디먼으로도 알려져있다.
  • 응용 프로그램
    • 시스템에는 없고 사용자에 의해 실행된다.
    • OS에 연관되어 있지는 않다.
    • 커멘드 라인, 마우스 클릭, 손가락 클릭으로 실행된다.

링커와 로더

소스 파일은 임의의 물리 메모리 위치에 적재되도록 설계된 오브젝트 파일로 컴파일 된다. - 이러한 형식을 재배치 가능 오브젝트 파일이라 한다.

링커 : 재배치 가능 오브젝트 파일을 하나의 이진 실행 차일로 결합한다. 다른 오브젝트 파일이나 라이브러리도 포한된다

로더 : 이진 실행 파일을 메모리에 적재하는 데 사용되며, CPU 코어에서 실행할 수 있는 상태가 된다.

링크 및 로드와 관련된 활동은 재배치로, 프로그램 부분에 최종 주소를 할당하고, 프로그램 코드와 데이터를 해당 주소와 일치하도록 조정하여 프로그램이 실행될 때 코드가 라이브러리 함수를 호출하고 변수에 접근할 수 있게 한다.

현대 범용 시스템은 모든 라이브러리를 실행 파일에 링크해 메모리에 적재되지 않는다.

대신 동적 링킹 라이브러리(DLL)을 사용해 실행 파일에서 사용되지 않을 수 있는 라이브러리를 링크하고 로드하지 않아도 된다. 라이브러니는 조건부로 링크되며 프로그램 실행 시간에 필요한 경우 적재된다. (한 번만 적재된다.)

오브젝트 파일 및 실행 파일은 일반적으로 표준화된 형식을 가진다. (Unix Linux는 ELF라 한다.) 이를 통해 운영체제가 어떻게 적재하고 시작할지 않다.

응용 프로그램이 운영체제마다 다른 이유

응용 프로그램들은 하나의 시스템에서 컴파일된다. 보통 다른 운영체제에서 실행되지 않는다.

각 운영체제는 운영체제에 맞는 유니크한 시스템 콜을 제공합니다. (자체 파일 포맷 등)

응용 프로그램들은 다음 세 가지 방법 중 하나로 여러 운영체제에서 실행될 수 있다.

  • 인터프리터 언어(파이썬, 루비)로 쓰여진 언어인 경우, 성능이 떨어지지만 가능하다.

  • 응용 프로그램에 가상머신이 있고, 가상 머신에서 응용 프로그램(자바)을 실행하는 경우

  • 표준 언어(standard language, C)인 경우, 실행될 각 운여ㅇ체제에 각자 컴파일되어야 한다.

Application Binary Interface(ABI) : 아키텍처 수준에서 이진 코드의 여러 구성요소가 주어진 아키텍처에서 특정 운영체제와 상호 작용할 수 있는 방법을 정의한다.

운영체제 설계 및 구현

운영체제의 설계와 구현 정답은 없지만 몇 가지 성공적인 사례들이 있다.

여러 운영체제의 내부 구조는 굉장히 다양하다.

시스템을 설계하는데 첫번째 문제는 시스템의 목표와 명세를 정의하는 것이다.

하드웨어와 시스템의 유형(일괄처리, 시분할, 단일 사용자, 다중 사용자, 분산, 실시간 혹은 범용)의 따라 설계가 영향 받는다.

근본적인 요구 조건은 사용자 목적시스템 목적으로 나눌 수 있다.

  • 사용자 목적 : 운영체제가 사용하기 쉽고, 배우기 쉬우며, 믿을 수 있으며, 안전적이고 빨라야 한다.

  • 시스템 목적 : 운영체제가 설계와 구현이 쉽고, 유지보수가 쉬우며, 유연하고, 믿을 수 있으며, 오류가 없고, 효율적이어야 한다.

한 가지 중요한 원칙은 기법(policy)으로부터 정책(mechanism)을 분리하는 것이다.

  • 기법은 무엇을 한 것인가를 결정하는 것 (CPU 사용에 시간을 제한함)
  • 정책은 어떤 일을 어떻게 할 것인가를 결정하는 것 (시간 측정을 위해 타이머를 사용함)

정책과 기법의 분리는 융통성을 위해 아주 중요하다. (기법이 바뀌는 경우를 위해)

운영체제 설계를 명세하는 것은 소프트웨어 엔제니어링에서 매우 창의적인 작업이다.

구현

구현은 많은 방법이 있다.

  • 초기 운영체제는 어셈블리 언어로 구현됐다. (생산성이 낮았다)
  • 이후 시스템 프로그래밍 언어로 구현됐다. (Algol, PL/1)
  • 현재는 C나 C++로 구현된다.

사실 보통은 여러 언어로 구현된다.

  • 가장 낮은 레벨은 어셈블리
  • 상위 레벨 루티은 C
  • 시스템 프로그램은 C, C++, 스크립트 언어 (PERL, Python, shell script)로 구현된다.

좀 더 상위 레벨의 언어들은 다른 하드웨어에 이식성은 좋지만 속도는 느리다.

에뮬레이션은 다른 시스템의 하드웨어들을 운영체제에서 실행할 수 있게 한다.

운영체제 구조

범용 목적 운영체제는 굉장히 규모가 큰 프로그램이다.

여러 방식의 구조들이 있다.

  • 간단한 구조 : MS-DOS
  • 좀 더 복잡한 구조 : UNIX
  • 계층 구조 : an abstraction (객체지향 구조와 관련되어 보임)
  • 마이크로 커널 : Mach

모놀리식 구조 (original UNIX)

UNIX : (하드웨어 기능 때문에) 제한적인 구조를 가진 운영체제

UNIX 은영체제는 두 가지로 분리되어 있다. (시스템 프로그램과 커널)

  • 시스템 콜 인터페이스 아래와 물리적 하드웨어 위의 모든 것이 커널이다.
  • 시스템 콜을 통해 파일 시스템, CPU 스케줄링, 메모리 관리 그리고 다른 운영체제 기능을 제공한다.
  • 많은 수의 기능들이 하나의 레벨에 있다.

간단한 구조보다는 복잡하지만 완벽한 계층 구조는 아니다.

모놀리식 구조에 모듈 설계가 더해진 형태

계층적 접근

이 방식에서는 운영체제가 여러 개의 층으로 나누어진다. 취하위 층은(층 0) 하드웨어이고 최상위 층(층 N)은 사용자 인터페이스이다.

이러한 시스템은 더 많은 기능을 가진 더 적은 개수의 층을 가지므로 층 기능의 정의 및 상호작용의 문제를 피하면서 모듈화된 코드의 장점을 최대한 활용할 수 있다.

마이크로 커널

모든 중요치 않은 구성요소를 커널로부터 제거하고, 그들을 별도의 주소 공간에 존재하는 사용자 수준 프로그램으로 구현하여 운영체제를 구현하는 방식

대표적인 예로 Mach가 있다. (Mac OS X 커널 (Darwin)은 부분적으로 Mach이다.)

통신은 유저 모듈의 통신을 메시지 전달로 가능하게 한다.

이 구조의 장점은

  • 확장이 쉽고
  • 새로운 구조에 운영체제를 이식하기 쉽고
  • 더 의존성이 높고 (코딩이 적고 커널 모드에서 실행 가능)
  • 더 안전하다

가중된 시스템 기능 오버헤드 떄문에 성능이 나빠진다 두 개의 사용자 수준 서비스가 통신해야 하는 경우 별도의 주소 공간에 서비스가 존재하기 때문에 메시지가 복사되어야 한다.

모듈

많은 근대 운영체제는 loadable kernel modules(LKMs)기법을 사용한다.

  • 객체지향 접근을 사용한다.
  • 각 코어 컴포넌트는 분리되어 있다.
  • 다른 시스템과 알려져 있는 인터페이스로 대화한다.
  • 각각 적재 가능하고 커널 안에 있어야 한다.

계층구조와 유사하지만 더 유연한 구조이다. (Linux, Solarix, etc)

하이브리드 시스템

현대 운영체제는 엄격하게 정의된 하나의 구조를 채택하지 않고 다양한 구조를 결합하여 만든다.

  • 하이브리드는 성능, 보안, 사용성을 위해 여러 방식을 합쳐놓은 것이다.
  • 리눅스나 솔라리스 커널은 운영체제 전부가 하나의 주소 공간에 있다. 모놀리식에 모듈을 추가해 동적 적재를 추가했다.
  • 윈도우도 대부분 모놀리식이고 마이크로커널이다 (사용자 모드 프로세스로서 실행되는 분리된 시스템을 운영체제의 인격이라 부르는)
  • 애플의 맥 또한 하이브리드, 게층 구조, 아쿠아 UI, Cocoa 프로그램 환경으로 구현되어 있다.

운영체제 빌딩과 부팅

시스템에 파워가 들어오면 고정된 메모리 주소에서 시작된다.

운영체제는 하드웨어에 접근이 되야 하드웨어를 작동 시킬수 있다.

  • ROM이나 EEPROM에 간단한 코드로 부트스트랩 로더, BIOS가 저장되어있다.
  • 초기 부트 로더는 일반적으로 부트 로더는 일반적으로 부트 블록이라고 하는 디스크의 정해진 위치에 있는 두 번째 보트 로더를 적재한다. (전체 운영체제를 메모리에 적재하고 실행을 시작하기에 충분히 정교하다)
  • 최신 컴퓨터는 UEFI로 대체되었다.

GRUB : 여러 디스크, 버전, 커널 옵션 중에 커널을 선택할 수 있게 한다.

커널이 적재되야 시스템이 실행된다.

부트 로더는 자주 여러 부트 상태(싱긍 유저 모드 같은)를 제공한다.

profile
Learning bunch, mostly computer and language

0개의 댓글