03_운영체제 구조_시스템 호출의 유형

 

시스템 호출은 다섯 가지의 주요 범주로 묶을 수 있다.

 

[프로세스 제어]

  • 끝내기(End), 중기(Abort)
  • 적재(Load), 실행(Execute)
  • 프로세스 생성, 프로세스 종료
  • 프로세스 속성(Attribute) 획득, 프로세스 속성 설정
  • 시간을 기다림
  • 사건을 기다림(Wait Event), 사건을 알림(Signal Event)
  • 메모리 할당 및 자유화

 

[파일 조작(File Manipulation)]

  • 파일 생성(Create file), 파일 삭제(Delete File)
  • 열기(Open), 닫기(Close)
  • 읽기, 쓰기 위치변경(Reposition)
  • 파일 속성 획득 및 설정

 

[장치 관리(Device Management)]

  • 장치를 요청(Request Device), 장치를 방출(Release Device)
  • 읽기, 쓰기, 위치 변경(Reposition)
  • 장치 속성 획득, 장치 속성 설정
  • 장치의 논리적 부착(Attach) 또는 분리(Detach)

 

[정보 유지(Information Maintenance)]

  • 시간과 날짜의 설정과 획득
  • 시스템 자료의 설정과 획득
  • 프로세스, 파일, 장치 속성의 획득
  • 프로세스, 파일, 장치 속성의 설정

 

[통신(Communication)]

  • 통신 연결의 생성, 제거
  • 메시지의 송신, 수신
  • 상태 정보 전달
  • 원격 장치의 부착 및 분리

 

 

[프로세스 제어(Process Control)]

실행 중인 프로그램은 수행을 정상(끝내기) 또는 비정상(중지)으로 끝낼 수 있어야 한다. 프로그램에 문제가 발생해 오류 트랩(trap)을 유발할 경우 때때로 메모리 덤프가 행해지고 오류 메시지가 생성된다. 이 덤프는 디스크에 기록되고 디버거(Bebugger)에 의해 검사될 수 있다. 운영체제는 명령어 해석기로 제어를 전달해야 한다. 명령어 해석기는 이어 다음 명령을 읽는다.

 

몇몇 시스템 에서는 오류가 발생할 경우 특별한 복구 행위를 지시하는 제어카드를 허용한다. 제어카드는 일괄처리의 개념이다. 만약 프로그램이 입력에서 오류를 발견하고 비정상으로 종료하기를 원한다면 프로그램은 오류 수준을 정의하기를 원할 수도 있다. 보다 높은 수준의 오류 매개변수가 보다 심각한 오류를 표시할 수 있다. 이렇게 함으로써 정상 종료를 수준 0의 오류로 정의하여 정상 종료와 비정상 종료를 결합시킬 수도 있다.

 

한 프로그램을 실행하고 있는 프로세스나 작업이 다른 프로그램을 적재(Load)하고 실행(Execute) 하기를 원할 수 있다. 이 기능은 명령어 해석기가 사용자 명령, 마우스의 클릭 혹은 일괄 처리 명령 등을 통하여 지시된 프로그램을 실행하는 것을 허용 한다. 이때 적재된 프로그램이 종료 될 때 어디로 제어를 되돌려 주느냐 하는 문제가 발생 한다.

만약 새로운 프로그램이 종료 되었을 때 제어가 기존 프로그램으로 되돌아 간다면 우리는 반드시 기존 프로그램의 메모리 이미지를 보관해야 한다. 따라서 우리는 실질적으로 한 프로그램이 다른 프로그램을 호출하는 기법을 만든 셈이 된다.

 

Ex) printf() 문을 호출 하는 C 프로그램에서 C 라이브러리는 이 함수 호출을 가로채고 운영체제의 필요한 시스템을 호출 한다. 예제에서는 write() 시스템 함수를 호출 하고 있다.

 

 

시스템 호출의 또 다른 집합은 프로그램을 디버깅하는데 유용하다. 많은 시스템들은 메모리를 덤프(Dump)하기 위한 시스템 호출을 제공하며 프로그램 추적(Trace)은 각 명령어가 실행될 때 이들을 하나씩 나열하며 이러한 시스템 호출은 보다 소수의 시스템에서만 제공 된다.

 

많은 운영체제는 프로그램의 시간 프로파일(Time Profile)을 제공한다. 시간 프로파일은 그 프로그램이 특정 위치 혹은 위치의 집합에서 수행한 시간의 양을 나타낸다. 시간 프로파일은 추적 설비(Tracing Facility)나 정규 타이머 인터럽트를 필요로 한다.

 

프로세스가 끝나면 종료하기 위해 exit() 시스템 호출을 수행하며 호출한 프로세스에게 상태 코드 0을 돌려주거나 0이 아닌 오류 코드를 돌려 준다. 이러한 상태 또는 오류코드는 쉘 또는 다른 프로그램들이 이용할 수 있게 된다.

 

[파일 관리(File Management)]

파일을 생성 삭제 할 수 있어야 한다. 이 시스템 호출은 파일 이름이나 파일 속성의 일부를 요구한다. 파일이 생성되면 그것을 열고, 읽고, 쓰고, 위치 변경을 할 수 있다. 파일을 더 이상 사용하지 않음을 나타내는 파일 닫기가 필요하다.

 

파일 시스템이 파일을 조직하기 위해 디렉토리 구조를 가진다면 우리는 디렉토리에 대해서도 파일과 같은 연산 집합이 필요 하다. 추가로 파일이나 디렉토리에 대해 여러 속성의 값을 결정할 수 있어야 하고 필요에 따라 재설정 할 수 있어야 한다. 파일 속성은 파일 이름, 파일 유형, 보호코드 등 정보를 포함한다. 이러한 기능을 위해서는 최소한 파일의 속성 획득과 파일 속성 설정의 두 시스템 호출이 필요하다. 일부 시스템들은 코드와 다른 시스템 호출을 이용하여 동일한 작업을 수행하는 API를 제공할 수도 있고 또 다른 시스템은 단순히 동일한 작업을 수행하는 시스템 프로그램을 제공하기도 한다. 이 시스템 프로그램이 다른 시스템 프로그램에 의해 호출 가능하다면 다른 프로그램의 입장에서는 이 시스템의 API가 된다.

 

 

[장치 관리(Device Management)]

프로세스는 작업을 계속 수행하기 위해서 CPU, 디스크, 파일의 접근 등에 대한 추가 자원이 필요 할 수 있다. 자원들이 사용할 수 있다면 이들 자원이 할당되고 제어가 사용자 프로그램으로 복귀 될 수 있다. 그렇지 않으면 프로그램은 충분한 자원을 할당 받을 때까지 기다려야 한다.

 

운영체제에 의해 제어되는 다양한 자원들은 장치로 간주 될 수 있다. 이 장치들은 물리장치 또는 추장적 혹은 가상적 장치로 생각할 수 있다. 다수의 사용자가 있다면 독점적인 장치 사용을 보장받기 위해 우선 그 장치를 요청(Request) 해야 한다. 그 장치의 사용이 끝나면 그것을 방출(release)해야 한다.

 

[정보의 유지(Information Maintenance)]

많은 시스템 호출은 단순히 사용자와 프로그램과 운영체제간의 정보 전달을 위해 존재 한다. 운영체제는 현재 운영되고 있는 프로세스들에 관한 정보를 가지고 있으며 이러한 정보에 접근하기 위한 시스템 호출들이 있다. 일반적으로 그 프로세스 정보를 재설정하기 위한 시스템 호출도 있다.(get process attributes, set process attributes)

 

[통신(Communication)]

통신 모델에서는 메시지 전달 방식과 공유 메모리의 두 가지 일반적인 모델이 있다.

메지시 전달 : 통신하는 두 프로세스가 정보를 교환하기 위하여 서로 메시지를 주고 받는다. 통신은 동일 CPU에 있는 프로세스이든지 또는 통신 네트워크에 의해 연결된 다른 컴퓨터에 있는 프로세스이든지 간에 그 이름을 반드시 알고 있어야 한다.

공유 메모리 모델 : 다른 프로세스가 소유한 메모리 영역에 대한 접근을 위해 shard memory create와 shared memory attach 시스템 호출을 사용한다. 정상적으로 운영체제는 한 프로세스가 다른 프로세스의 메모리 접근하는 것을 막으려고 한다. 공유 메모리는 두 개 이상의 프로세스가 이러한 제한을 제거하는 데 동의할 것을 필요로 한다. 그런 후 이들 프로세스들은 이러한 공유 영역에서 자료를 읽고 씀으로써 정보를 교환 할 수 있다. 소량의 자료를 교환할 때 유용하다.

 

자료의 형태와 위치는 운영체제의 제어가 아니라 프로세스들에 의해 결정 된다. 프로세스들은 동일한 위치에 동시에 쓰지 않도록 보장해야 한다. 한 컴퓨터 안에서 수행되기 때문에 최대 속도와 편리한 통신이 장점이지만 보호 영역 및 동기화 프로세스 등의 문제점을 가지고 있다.

 

 

[참고자료]

Operating System Concept

 

 

 

02_운영체제 구조_시스템 호출 (System Call)

 

시스템 호출은 운영체제에 의해 사용 가능하게 된 서비스에 대한 인터페이스를 제공한다. 예를 들어 하드웨어를 접근해야 하는 작업 등의 특정 ROW LEVEL 작업은 어셈블리 명령을 사용하여 작성되어야 하지만 시스템 호출은 일반적으로 C, C++ 등과 같은 언어로 작성된 루틴 형태로 제공 된다.

 

한 파일로부터 자료를 읽어서 다른 파일로 복사하는 간단한 프로그램을 작성하는 예를 들어 보자.파일의 이름을 읽고 파일에 대한 접근 권한을 확인하고 파일을 열고 하는 등의 일련의 과정이 있을 것이다. 이를 도식화 하면 다음과 같다.

 

 

대부분의 사용자들은 이러한 정도의 상세를 결코 알지 못한다. 대부분의 응용 개발자들은 응용 프로그래밍 인터페이스(Application Programming Interface, API)에 따라 프로그램을 설계한다. API는 각 함수에 전달되어야 할 매개변수들과 프로그래머가 기대할 수 있는 반환 값을 포함하여 응용 프로그래머가 사용 가능한 함수의 집합을 명시 한다.

 

 

왜 응용 프로그래머는 실제 시스템을 호출하는 것보다 API에 따라 프로그래밍 하는 것을 선호 할까? 여러 가지 이유가 있지만 가장 큰 이유는 프로그램의 호환성 이다. API에 따라 프로그램을 설계하는 응용 프로그래머는 자신의 프로그램이 같은 API를 지원하는 어느 시스템이든 컴파일 되고 실행 되기 때문이다. 실제 API를 호출 하는 것과 커널을 호출하는 것은 강한 상관관계가 존재 한다.

 

프로그래밍 언어들을 위해 컴파일러에 포함된 라이브러리에 내장된 함수의 집합은 운영체제가 제공하는 시스템 호출에 대한 연결로서 동작하는 시스템 호출 인터페이스를 제공 한다. 각 시스템 호출에는 번호가 할당되고 시스템 호출 인터페이스는 이 번호에 따라 색인되는 테이블을 유지 한다. 시스템 호출 인터페이스는 의도하는 시스템 호출의 상태와 반환 값을 돌려 준다.

 

호출자는 시스템 호출이 어떻게 구현되고 실행 중 무슨 작업을 하는지 알 필요가 없으며 단지 API를 준수하고 호출의 결과로 운영체제가 무엇을 해 줄 것 인지만 이해하면 된다.

 

 

Ex) 파일 IO 호출 인터페이스

 

운영체제에 매개변수를 전달하기 위해서 일반적으로 3가지 방법을 사용 한다.

  • 매개변수를 레지스터 내에 전달
  • 매개변수는 메모리 내의 블록이나 테이블에 저장
  • 블록의 주소가 레지스터 내에 매개변수로 전달

 

[테이블로 매개변수 전달]

 

매개변수는 프로그램의 의해 스택(stack)에 push 또는 pop off 한다. 운영체제는 블록이나 스택 방법을 선호하는데 이는 전달되는 매개변수들의 개수나 길이를 제한하지 않기 때문이다.

 

[참고 자료]

Operating System Concept (홍릉과학출판사)

 

 

01_운영체제 구조 _사용자인터페이스

 

운영체제는 프로그램 실행 환경을 제공 한다. 운영체제는 프로그램과 프로그램의 사용자에게 어떤 서비스를 제공한다. 물론 제공되는 서비스는 운영체제에 따라 다르지만 공통적인 속성은 다음과 같다.

 

  • 사용자 인터페이스(User Interface) : 거의 모든 운영체제는 사용자 인터페이스(UI)를 갖고 있다. 이 인터페이스는 여러 형태를 가지고 있을 수 있으며 명령어 라인 인터페이스(Command Line Interface: CLI)로 문자 명령을 사용 한다. 다른 방법은 일괄 처리 인터페이스(Batch Interface)로 명령과 이들 명령을 제어하는 지시들이 파일로 입력되며 이들 파일이 수행한다. 가장 일반적으로 그래픽 사용자 인터페이스(GUI)가 사용된다. 이것은 입/출력을 가리키고 메뉴에서 고르거나 선택을 행하는 지시 장치를 가진 윈도우 시스템과 텍스트를 입력하는 키보드로 구성 된다.

 

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

 

  • 입/출력 연산(I/O Operation) : 수행중인 프로그램은 입/출력을 요구 할 수 있다. 효율과 보호를 위해 사용자들은 통상 입/출력 장치를 직접 제어할 수 없다. 따라서 운영체제가 입/출력 수행의 수단을 제공해야 한다.

 

  • 파일 시스템 조작(File System Manipulation) : 프로그램은 파일을 읽고 쓸 필요가 있다. 프로그램은 또한 이름에 의해 파일을 생성하고 삭제할 수 있고 지정된 파일을 찾을 수 있어야 하고 파일의 정보를 열거할 수 있어야 한다.

 

  • 통신(Communication) : 한 프로세스가 다른 프로세스와 정보를 교환해야 할 필요가 있는 여러 상황이 있다. 동일한 컴퓨터에서 수행되고 있는 프로세스들 사이에는 공유 메모리 또는 메시지 전달을 통해서 구현 할 수 있으며 다른 컴퓨터에서 수행되는 프로세스의 경우 패킷들이 운영체제에 의해 이동 한다.

 

  • 오류 탐지(Error Detection) : 운영체제는 항상 모든 가능한 오류를 상항 의식하고 있어야 한다. 오류는 시스템 내부(CPU, 메모리, 네트워크 등) 뿐만 아니라 사용자 프로그램에 의해서도 일어 난다.

 

  • 자원 할당(Resource Allocation) : 다수의 사용자나 다수의 작업이 동시에 실행 될 때 각각에 자원을 할당 해야 한다. CPU 사이클, 주 메모리 파일 저장 장치 등의 특수한 할당 코드를 가질 수 있으며, 프린터, USB 저장 장치 및 기타 주변장치를 할당하는 루틴이 있을 수 있다.

 

  • 회계(Accounting) : 우리는 사용자가 얼마나 많은 자원을 사용하는지 관리하고자 한다. 이는 사용기록에 대한 통계를 내기 위해 사용된다. 컴퓨팅 서비스를 개선하기 위한 자료가 된다.

 

  • 보호(Protection)와 보안(Security) : 다중 사용자 시스템 또는 네트워크로 연결된 컴퓨터 시스템에 저장된 정보의 소유자는 통제하기를 원할 수 있다. 한 프로세스가 다른 프로세스를 방해해서는 안 된다. 보호는 시스템 자원에 대한 모든 접근이 통제되도록 보장하는 것을 포함한다. 외부로부터의 시스템 보안 또한 중요하다. 보안은 각 사용자가 자원에 대한 접근을 허용 받기 위해 자기 자신을 인증하는 것부터 시작한다. 시스템이 보호되고 보안이 유지 되려면 시스템 전체에 걸쳐 예방책이 제정되어야 한다. 하나의 사슬은 가장 약한 연결 고리만큼만 강한 법이다.

 

 

 

+ Recent posts