본문 바로가기

CS/운영체제

[운영체제] OS 서비스/프로그램

운영체제

 프로그램 또는 사용자가 특정 프로그램이나 서비스를 실행할 수 있도록 환경을 제공하거나 도와주는 시스템으로, 다음과 같은 서비스들을 유저에게 제공하게 된다.

Operating System Services

  • User Interface : 유저가 시스템을 사용하는데 도움을 주는 시각적인 인터페이스.
    • CLI(Command Line Interface) : 커맨드 라인 형태의 인터페이스.
      • 커널의 일부로 구현되거나, 시스템 프로그램 형태로 구현된다.
      • 사용자의 커맨드를 읽어 들이고(fetch) 실행한다.
      • 커맨드는 처음부터 지정되어 있을 수도 있지만 ( ls, pwd 등 ), 사용자에 의해 구성된 프로그램일 수도 있다. 사용자 프로그램의 추가는 쉘을 변경하지 않는다.
    • GUI(Graphic User Interface) : 텍스트가 아닌, 아이콘과 같은 그래픽 요소를 통해 사용자와 컴퓨터를 연결하는 인터페이스.
      • 마우스, 키보드, 모니터 등의 하드웨어와 연관되어 동작한다.
      • 아이콘은 특정 파일, 프로그램이나 명령 등을 가리킬 수 있다.
      • 일반적으로 이벤트 기반으로 동작하며, 하드웨어에 존재하는 다양한 버튼들은 클릭, 정보 보기, 실행 등 다양한 동작을 실행할 수 있도록 도와준다.
    • 터치 스크린
    • Batch : 연속적으로 수행하고자 하는 작업을 기술해두는 파일
  • Program Execution : 운영체제의 주된 역할 중 하나. 실행하고자 하는 프로그램을 메모리 상에 저장 및 실행한다.
  • I/O 작업 : 파일 혹은 I/O 디바이스에 대한 입출력 작업을 수행.
  • File-System Manipulation : 파일/디렉토리를 탐색, 읽기, 쓰기, 생성, 삭제, 권한 부여 등의 역할을 수행한다. 이 중 권한 관련 작업의 경우, 특정 사용자에게 특정 파일에 대한 접근을 허용하거나, 거부할 때 사용된다.
  • Communication(통신) : 네트워크의 경우, 패킷의 형태로 동일 환경에서는 메시지의 형태로 통신을 수행한다. 통신은 동일 컴퓨터의 프로세스 사이뿐만 아니라 다른 컴퓨터의 프로세스 사이에서도 발생할 수 있다.
  • Error Detection : OS에서 발생할 수 있는 에러 ( CPU, 메모리, I/O 기기... , 프로그램 충돌... ) 들을 적절히 처리하고, 프로그램이 지속적으로 수행될 수 있도록 돕는다. 
  • Resource Allocation(자원 할당) : 하드웨어의 공유 자원을 여러 사용자 및 여러 프로세스에 대해 적절히 분배한다. 하드웨어 측면에서 얼마나 성능을 이끌어내는가와 관련이 있으며, 잘못된 자원 할당은 사용자에게 부정적인 경험을 발생시킬 수 있으므로, 적절하게 수행되어야 한다.
  • Logging : 컴퓨터의 리소스가 얼마나, 어떻게 사용되었는지에 대해 계속하여 추적하고 기록한다.
  • Protection : 시스템 자원에 대한 권한을 할당하거나, 권한이 없는 사용자의 접근을 거부한다.
  • Security : 악의적인 외부 및 내부 공격에 대해 시스템을 방어한다.

운영체제 기반 컴퓨터의 계층

OS를 사용하는 컴퓨터는 대략 위와 같은 구조를 가진다.

  • User + Application
  • OS : UI, 시스템 콜, 시스템콜을 통해 접근 가능한 서비스들 ( 위에서 언급 ) 
  • Hardware : CPU, Memory ...

 현재 사용되는 대부분의 OS 기반 컴퓨터의 경우, 각 계층은 자신과 인접한 계층과만 통신할 수 있다. 예를 들어 유저는 하드웨어에 직접 내용을 저장할 수 없다. 만약 유저가 특정 정보를 메모리와 같은 하드웨어에 저장하고 싶다면 OS에서 기본적으로 제공하는 시스템 콜을 이용하거나, 시스템 콜 기반의 API를 사용해야만 한다.

 유저가 C언어 기반 프로그램을 만들던 도중, 파일 입출력 기능이 필요하다는 것을 알게 되었다고 생각해보자. 유저가 C언어의 도움 없이 보조기억장치의 내용을 바꿀 수 있을까? 아마 현대인 중 가능한 사람은 극히 드물 것이다. 대신 유저는 C언어에서 제공하는 fopen 함수 혹은 시스템 콜 open을 이용하여 하드웨어 내의 특정 파일을 읽어올 수 있다. 이처럼 현대의 운영체제는 각 계층 사이의 접근 가능성을 명확히 구분한다. 


시스템 콜

  유저 혹은 프로그램이 커널 및 OS에 접근하여 OS가 제공하는 서비스를 이용하기 위해 사용되는 프로그래밍 인터페이스이다. C, C++ 등의 언어로 구현되며, 시스템 콜을 직접 사용하기보다는 특정 기능들을 시스템 콜을 이용하여 만들어 둔 API(Application Programming Interface)라는 형태로 사용하는 경우가 많다. 단, API가 없다면 직접 시스템 콜을 통해 특정 기능을 구현해야 한다. 

 예를 들어, 특정 파일을 복사하기 위해서는 시스템 콜을 통해 다음 일련의 동작들을 수행해야 한다.

입력 파일 이름 얻어오기
출력 파일 이름 얻어오기
입력 파일 열기
출력 파일 생성하기
루프
    입력 파일의 내용 Read
    출력 파일에 Write
출력 파일 닫기
성공 메시지 화면에 출력
프로그램 종료

이런 자질구레한 동작을 코딩할 때마다 시스템 콜을 이용하여 반복하는 대신, 우리는 API를 이용한다.

ssize_t read(int fd, void *buf, size_t count);

 일련의 시스템 콜은 시스템 콜 인터페이스에 의해 테이블 형태로 인덱싱 되어 관리된다. 해당 인터페이스는 커널을 통해 요구된 시스템 콜을 실행하고, status 및 value를 받아온다. 결과적으로, 시스템 콜을 호출한 유저는 시스템 콜이 정확히 어떻게 구현되어 있는지 알 방법이 없다. ( 리눅스의 경우 오픈소스 기반이라 시스템 콜의 구현을 볼 수 있기는 하다. )

 유저는 시스템 콜에 대한 세부 구현사항을 알 수도, 알 필요도 없고 그저 시스템 콜 인터페이스에 의해 전달된 결과를 받아 이용하면 된다. 유저와 커널의 역할은 명확하게 구분되는데, 커널은 작업을 수행하고 결과를 책임진다.

시스템 콜 파라미터 패싱

 특정 기능을 위한 함수를 만드는 경우와 마찬가지로, 특정 시스템 콜은 동작을 수행에 파라미터를 요구한다. 이때 다음과 같은 방식으로 시스템 콜에 파라미터를 넘겨줄 수 있다.

  • 레지스터를 통해 전달 : 파라미터로 넘길 데이터를 레지스터에 저장한다. 직관적이고 빠르다는 장점이 있지만, 파라미터의 개수가 레지스터의 개수보다 많은 경우 이 방법을 사용할 수 없다.
  • 블럭/구조체의 주소 전달 : 메모리 내의 특정 블록 자체 혹은 테이블 형태의 구조체의 주소를 레지스터에 파라미터로 전달한다. 리눅스 환경에서 자주 사용한다고 한다.
  • 스택 : 일련의 파라미터를 스택 구조내에 Push 하고, 필요한 경우 Pop 하여 사용한다. 파라미터 개수에 제한이 없다.

파라미터를 패싱하는데 구조체 혹은 테이블의 주소를 전달하는 방식.

시스템 콜의 타입

 시스템 콜은 OS에서 제공하는 서비스에 접근하는데 사용된다. 따라서 시스템 콜의 타입 역시 OS가 제공하는 서비스의 타입과 어느 정도 연관성이 있다.

  • Process Control
    • create, terminate, end, ebort, load, execute
    • 프로세스 속성 읽거나 쓰기
    • 일정 시간 대기
    • 이벤트, 시그널
    • free 메모리 할당
    • Dump
    • Single Step execution - 디버깅
    • 공유 데이터에 대한 접근 권한 관리
  • File Management
    • create(파일 기본 정보 생성, 메모리 영역에 연결-> 작성 가능하게), delete
    • open(파일을 메모리 영역에 로드), close
    • read, write, reposition
    • 파일 속성 읽고 쓰기
  • Device management : 디바이스 읽기 쓰기, 정보 가져오기, attach / detach 등 ...
  • Information maintenance : 시간, 시스템 데이터, 프로세스 · 파일 · 디바이스 속성 get/set
  • Communications
    • connection 생성, 삭제
    • host name, process name을 이용하여 각 프로세스 혹은 호스트 식별, 메시지 통신(message passing model)
    • 특정 메모리 영역에 대한 접근 권한 생성 및 취득 (shared memory model)
    • 상태 정보 전달
    • 리모트 기기에 대한 연결
  • Protection : 접근 권한 설정, 허가, 엑세스 거부 등

시스템 프로그램

 사용자가 프로그램을 가공/생성하기 쉽도록 여러가지 기능 및 환경을 제공하는 프로그램으로, 시스템 콜은 아니지만 시스템 콜을 이용하여 구현된다.. 과거에는 운영체제 범주 내에 포함되는 경우가 많았지만, 현대에는 일반적인 어플리케이션으로 취급하기도 한다. 이 경우, OS의 역할은 커널(컴퓨터에 상주하는 프로그램들)로 제한되는 경우가 많다.

 

  • 파일 관리 ( CRUD, rename, print, list 등 파일을 조작하는데 필요한 기능들 )
  • 상태 정보 : date, time performance, logging ... 레지스트리를 이용하기도 한다.
  • 파일 수정 : vim, vi 등, 파일 생성 및 수정을 위한 에디터 + 특별한 커맨드들. 
  • 프로그래밍 언어 지원 : 컴파일러, 어셈블러, 디버거, 인터프리터 ...
  • 프로그램 로딩 및 실행 : Absolute Loader, Relocatable Loader, Linkage Editor, Overlay Loader, Language ...
  • 통신 : 소켓, 파이프, 공유 메모리 등 컴퓨터 자원을 이용한 통신 및 웹페이지, 메일, 원격 통신 등 포함.
  • 백그라운드 서비스 : 시스템 시작/종료, 프로세스 스케줄링, 메모리 관리 등에 사용되는 서비스들로, 사용자가 직접 사용하지는 않지만, 컴퓨터 동작에 꼭 필요한 서비스들.
  • 어플리케이션 : 유저에 의해 동작하는 프로그램.

'CS > 운영체제' 카테고리의 다른 글

[운영체제] CPU 스케줄링  (0) 2022.04.11
[운영체제] 스레드 & Concurrency  (0) 2022.04.06
[운영체제] 프로세스  (0) 2022.04.03
[운영체제] 운영체제  (0) 2022.03.17
[운영체제] 개요  (0) 2022.03.11