OS - (1) Operating-System Structure

정선용·2021년 11월 1일
0

Operating System

목록 보기
1/12

1. Operating System Structure

1.1 Operating System Service : interface

운영체제란 ? 컴퓨터의 핵심 SW이다. HW를 사용자가 이용하기위한 연결역할.
=> 어떻게 ? HW중 메모리에 항상 load(상주)하며 cpu스케줄링, 메모리관리, 파일관리, 입출력 관리, 프로세스관리 등 자원을 관리, 작업을 처리.
(이 때, CPU의 역할은 사용자들이 입력한 명령어를 해석하고 연산한 후 그 결과를 제어하는 장치이며, 하드웨어의 메인보드 안에 해당)

한마디로, 운영체제는 사용자와 하드웨어를 연결해주는 역할 : 사용자에게 보여지는, 연결되는 방식 : iterface ?

  • cli : 쉘, 사용자가 지정한 명령을 해석, 수행
  • gui : graphic user interface
  • batch : 일괄처리 인터페이스.
    - 작업 처리 방식에 따라 일괄처리 / 시분할방식 / 실시간처리방식으로도 나눌 수 있다.

1.2 System call

@ System call
시스템콜은 커널(운영체제)와 사용자 interface(프로그램)을 이어주는 역할이다. OS에 의해 사용가능하게 된 서비스에 대한 로우레벨 작업을 하는 코드.
프로세스가 하드웨어에 접근해 필요한 기능을 사용할 수 있도록 해준다.
~ linux : posix api 제공 , -> API사용자는 systemcall구현, 작업 알지 못해도 되며 호출 결과만 파악하면 되기때문에 편리

  • 사용자모드와 커널모드
    -커널모드 : program counter가 운영체제 존재부를 가리키고있을 때. 운영체제 코드 수행중. 커널모드 수행중
    -사용자모드 : 사용자 프로그램 존재메모리 가리키는경우. 사용자 프로그램 수행중, cpu가 사용자모드에서 수행중

    program counter:명령어 포인터.
    다음에 수행될 명령어의 주소를 가지고 있는 레지스터,
    PC 값은 word의 크기에 따라 1 또는 명령어 길이(바이트 수)만큼 씩 증가되어
    기억장치에 저장되어 있는 명령어를 수행.

    참고 ) cpu내부 PC, AC, MAR, MBR, IR : CPU 레지스터

  • system call

    • 프로세스 제어(fork, wait..)/ 파일 조작(hw:storage접근)/ 장치 관리 /정보유지 /통신 등을 위해 사용자 interface에서 system call 호출.
      -수행 과정
      • 프로세스가 System Call 호출
        Trap이 발생하여 Kernel Mode 진입 → 이때 현재 상태 저장
        요청받은 System Call 수행
        User Mode로 return
      이 때, kernel에 특정 정보를 전달하기위해 정보(매개변수)를 전달하기도한다.
  • 운영체제 매개변수 전달 방법

    -(1) Register : 매개 변수를 CPU 레지스터 내에 전달한다.
    -(2) Block : 메모리 블록에 저장, 블록 주소가 레지스터 내에 전달 => 매개변수 개수나 길이 제한 x
    -(3) stack : 프로그램스택에 저장 => 매개변수 개수나 길이 제한 x

1.3 Interrupt

하드웨어 장치가 CPU와 커뮤니케이션 하고싶을때, 어떤 사실을 알려주거나 CPU의 자원,서비스를 요청해야할 때 '인터럽트'발생으로 실현. (프로그램이 명령 수행을 위해서는 CPU를 할당받아야함)
: CPU는 program counter가 가리는 곳 명령을 수행한 뒤, 다음 명령을 수행하기 직전에 인터럽트 라인이 세팅되어있는지 체크 . 이러한 루틴을 매번 반복하며 프로그램 명령을 수행한다.
-> 인터럽트 발생 시 CPU는 현재 수행중이던 프로세스 멈추고, 운영체제의 인터럽트 처리 루틴으로 이동해 인터럽트 처리 수행.

  • 개념 : 프로그램 실행 중 cpu 현재 처리 순서를 중단시키고 다른 동작을 수행하도록 요구하는 시스템 동작.

  • 처리 과정
    현재 명령어 수행 즉시 다음 실행할 명령어 주소를 스택에 저장
    Interrupt Service Routine호출 위해 해당 루틴 시작 주소를 PC(program counter)에 적재


    인터럽트 발생 시 수행중이던 프로세스 정보는 프로세스 제어 블록(PCB)에 저장,
    인터럽트 처리 마치면 PCB저장 주소를 복원시켜 원 수행 작업 재개.
    • interrupt vector : 여러 인터럽트에대해 해당 인터럽트 발생 시 처리해야할 루틴 주소를 보관하는 테이블. (일종의 포인터, 함수주소)
    • interrupt handler : 실제 인터럽트 처리위한 루틴, 인터럽트 서비스 루틴(운영체제 코드부에 각종 인터럽트별 처리해야할 내용 프로그램되어있음. =인터럽트서비스루틴)
  • 인터럽트 종류
    (1)하드웨어인터럽트 : 하드웨어 컨트롤러가 cpu 서비스 요청을 위해 발생시키는 인터럽트
    (2) 소프트웨어 인터럽트 : 예외상황 또는 시스템콜.
    프로그램이 허용되지 않은 연산 수행 시도 시 자동적으로 Exception. cpu제어권을 가져와 상황 조치.
    혹은 사용자 프로세스가 운영체제 서비스 요청을 위해 커널의 함수를 호출.
  • 인터럽트(시스템콜) 예시


    C 예시 -> printf, sprintf,fprintf : write() systemcall 호출.

1.4 (Operating) System Structure

운영체제(시스템)은 다양한 structure로 구현.
monolithic : simple structure
Layerd Approach : 운영체제가 계층으로 나누어지는 구조
Micro Kernel : 커널에 핵심적인 요소만 남긴 가벼운 커널(Kernel 모듈화)
=>나머지는 ? : user영역으로.
Modules : 커널을 객체지향적 접근으로 모듈화. 핵심 구성요소들이 분리 가능.
Hybrid Systems : strict하게 구조를 채택하는 것이 아닌 유연하게 다양한 구조를 결합하는 것.

  • monolithic구조
    - 커널의 모든 기능을 단일 주소 공간에서 실행되는 단일 파일로 구성하는 구조(구조랄게 없는 구조). (msdos, 초기 unix등. . .)

    monolithic구조인 msdos는 사용자 프로그램이 I/O루틴에 접근해 디스플레이와 디스크 드라이브에 직접 쓰기가 가능했고 User프로그램에 문제시 전체시스템에 문제가 있을 수 있었다. 초기 unix구조(위 이미지)는 커널/시스템프로그램으로는 구분해 구성했고 커널이 모든기능제공해 monolithic = unix는 kernel부분을 확장해나가며 발전했는데, 구현, 유지보수, 확장이 힘들었다.
    장점으로는 Systemcall overhead가작다(때문에 hybrid식으로 활용되기도함-windows..)

  • Layered Approach
    - 계층적으로 운영체제를 나누어 구성하는 구조. (네트워크 7계층처럼 . . 추상적 객체를 구현 - bottom: 하드웨어 /top사용자 인터페이스 )

    구현,디베겅,유지보수가 쉽다. But Systemcall overhead 다른구조들보다 존재

  • Micro Kernel
    - 커널에 핵심적인 요소만 남긴 가벼운 커널(Kernel 모듈화 : 커널 서비스를 기능에 따라 모듈화 하여 각각 독립된 주소 공간에서 실행 : 상주하는 기능의 범위가 축소되고, 그 때 그 때 필요할 때 마다 로드될 수 있는 서비스들이 증가. : 메모리에 이점)
    - 마이크로커널의 주 기능은 Client와 User공간에 수행되는 다양한 서비스간 메세지패싱방식 통신 제공,
    요즘 유행하는 msa 서버 구성으로 이해. 기존 서버 구성: 내부 url로 요청을보내는 식인데(매핑핸들러) msa구조일 때는 기능이 독립되어 구성되있는 서버로 api호출.(하나의 클라이언트-서버처럼 동작) -> 이런 식으로 내부통신이 아니고 독립된 개별간 통신하기때문에 message통신 하는 것으로 이해. )

    - 대표적기능 프로세스간통신(메세지패싱) /메모리관리 / CPU스케줄링 등 모두 message기반(파일 읽고싶을때 file입출력 usermode의 file system에 message를 보내 요청하는 형태)
    장점은 메모리 상주 감소, 운영체제 확장 쉬움.
    단점은 가중된 시스템동작 오버헤드 때문에 성능감소, 기능많이추가시 속도 느려짐
    *** monolithic vs microkernel
    https://selfish-developer.com/entry/%EB%AA%A8%EB%86%80%EB%A6%AC%EC%8B%9DMonolithic-kernel%EA%B3%BC-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9CMicro-%EC%BB%A4%EB%84%90

  • Module
    - 가장 현대적인 OS구조, 커널을 모듈화.
    커널 각 부분이 정의되고 보호된 인터페이스를 가진다는 점에서 계층구조를 닮았지만, 모듈에서 단계별로가 아닌 임의로 다른 모듈을 호출할 수 있다는점에서 계층구조보다 유연.
    중심 모듈은 핵심 기능만을 가지고 있고 다른 모듈들 적재, 통신방법 안다는 점에서 마이크로커널과 유사하지만, 통신하기위해 메세지전달 호출 필요가 없어 효율적. micro kernel은 sub system(kernel)들 교체 가능하지만, 모듈의 개념은 kernel이 분리되었냐의 여부는 아님. 프로그램 일부 코드롤 동적으로 삽입, 교체의 개념. (모듈에서는 핵심 기능만을 지닌 커널에 다른 모듈들을 적재, 제거하지만 마이크로 커널에서는 핵심 기능만을 지닌 커널에 독립시킨 kernel(sub system)들을 통해 통신해 기능 사용)
    -> 부팅시 혹은 실행중 필요할 때 서비스들을 link 가능. (loadable)
    monolithic 커널은 모듈식일 수 있다. 리눅스가 monolithic이지만 모듈 도입.(초기에는 리눅스에 새로운 하드웨어 추가하려면 monolithic했기 때문에 새로운 컴파일이 필요했지만, 동적으로 kernel안에 코드를 삽입,제거할 수 있는 module방법이 개발되었고 device driver와같이 사용.)

  • hybrid시스템
    다양한 구조를 결합해 보안/성능/편리성 문제 해결, 혼용구조

1.5 system program

  • 시스템 프로그램 : 컴퓨터 시스템 자체를 운영,제어하는 프로그램. (system service, systemcall 호출) = 시스템 유틸리티(System Utility)
    system call은 이러한 system program들이 hw(시스템)을 제어하기 위한 도구이고, 실질적으로 사용자들이 운영체제를 접하고, 바라보는 관점은 시스템 프로그램과 application에 의해 정의.

    -프로그래밍 관련 시스템 프로그램(원시프로그램번역 ->프로그램연결->실행명령어 메모리 적재-> 실행)
    • 컴파일러 : 소스프로그램 -> 목적프로그램으로 번역
    • 어셈블러: 어셈블리어를 0과 1로 기계어코드로 변환
    • 매크로 프로세서: 반복적으로 수행되는 부분을 모아 기호화된 이름으로 묶어서 사용하는 것을 모듈로 만든 것.
    • 링커 : 서로 독립적으로 작성되고 번역된 모듈간 연결을 맺어주는 작업을 하는 프로그램.
    • 로더 : 기계 명령어와 실행가능프로그램들을 기억장치에 배치시키는 일을 수행하는 프로그램
일반적인 프로그램은 disk에 이진 실행 파일로 존재, 
CPU에서 실행하려면 프로그램을 메모리로 가져와 
프로세스 형태로 배치해야함.
  • 일반적 프로그램 실행 과정(https://imbf.github.io/computer-science(cs)/2020/09/03/Operating-System-Structures.html)
    (1) 소스 파일은 임의의 물리 메모리 위치에 적재되도록 설계된 오브젝트 파일로 컴파일 된다.
    (2) 링커는 이러한 재배치 가능 오브젝트 파일을 하나의 binary 실행 파일로 결합한다. (다른 오브젝트 파일 또는 라이브러리도 포함될 수 있다.)
    (3) 로더는 binary 실행 파일을 메모리에 적재하는데 사용되며, 실행 파일이 CPU 코어에서 실행할 수 있는 상태가 된다.

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

  • UNIX 시스템(ex. ./main)의 명령어 라인에 프로그램 이름을 입력 시 example)
(1) 셸은  fork()시스템 콜을 사용하여 프로그램을 실행하기 위한 새 프로세스를 생성한다. 
(2) 그런 다음 셸은 exec() 시스템 콜로 로더를 호출하고 exec()에 실행 파일 이름을 전달한다. 
(3) 로더는 새로 생성된 프로세스의 주소 공간을 사용하여 지정된 프로그램을 메모리에 적재한다.

시스템 대부분에서는 프로그램이 적재될 때 라이브러리를 동적으로 링크할 수 있는 기능을 지원한다. (ex. The dynamic linked library(DLL) of Windows)
링커는 프로그램이 적재될 때 동적으로 링크되고 적재될 수 있도록 재배치 정보를 삽입하기 때문에 여러 프로세스가 동적으로 링크된 라이브러리를 공유할 수 있어 메모리 사용이 크게 절약될 수 있다.

profile
정선용

0개의 댓글