본문 바로가기
컴퓨터공학기초 개념/운영체제

컴공기초 - 운영체제 개념 총정리(상)

by devraphy 2021. 7. 16.

1. OS, 응용 프로그램, 시스템콜

▶ OS란? 

- 시스템 자원 관리자

- 시스템 자원이란, 컴퓨터의 모든 하드웨어를 의미(CPU, Memory, 저장매체, 입력장치) 

 

 

▶ OS가 필요한 이유

- 시스템 자원의 효율적 분배와 사용을 관리하기 위해

 

 

▶ 응용 프로그램이란?

- OS 위에서 돌아가는 모든 프로그램 (= SW, application)

 

 

▶ Shell 이란?

- OS의 주요 기능 중 하나는 사용자에게 interface를 제공하는 것

- Shell이 사용자에게 interface를 제공하는 응용 프로그램이다. 

- Shell은 사용자가 필요로 하는 OS의 기능을 연결해주는 역할을 한다. 

- 예를 들어, 리눅스 CLI에서 명령어를 입력하는 등의 행위가 가능한 이유가 shell 덕분이다. 

 

 

▶ API(Application Programming Interface)란?

- OS가 어떤 응용 프로그램을 실행하기 위해서는 interface에게 어떤 명령을 전달하게 된다.

- 이처럼 프로그램 간의 소통에서 사용되는 명령어 또는 코드를 의미한다. 

 

 

▶ System call 이란?

- OS의 기능을 호출하는 함수, 명령어

 


2. 운영체제의 구조

- 대부분의 운영체제는 layer 0 ~ layer 3 까지 사용한다. 

 

 

▶ Ring 0

- 커널 영역의 핵심기능(= system call) 

- 즉, OS가 관리하는 하드웨어를 조작하거나 시스템 영역의 프로그램을 조작하기 위해 접근해야하는 영역이다.

 

 

▶ Ring 3

- 사용자 영역(= 응용 프로그램에서 사용하는 명령어) 

- 사용자가 명령어를 입력하고 어떤 파일에 접근 및 실행하는 등의 행위가 가능한 영역을 의미한다. 

 

 

▶ Shell 

- OS와 사용자를 연결하는 영역

- 사용자 영역과 커널 영역의 사이를 shell이라고 생각하면 된다.

- Ring 3가 Ring 0을 감싸는 형태를 이루고 있어서 shell(껍질)이라는 명칭이 붙었다. 

 

 

▶ 사용자 모드와 커널모드를 분리한 이유

- 응용 프로그램을 사용하여 함부로 OS영역과 컴퓨터 시스템 영역을 해칠 수 없다.

 


3. 프로세스 스케줄링

▶ 프로세스란? 

- 실행중인 응용 프로그램을 지칭한다.

- 스케줄링의 대상(task)이며, 최소 1개 이상의 스레드(메인 스레드)를 보유하고 있다. 

 

 

▶ 스케줄링이란?

- 응용 프로그램 실행을 위해서 CPU를 할당하는 방식 또는 계획을 의미한다. 

 

 

▶ 스케줄링의 종류

  • 배치(일괄) 처리 시스템
    - FIFO 방식으로 Queue 자료구조와 같은 처리 방식의 시스템, 순차 실행 

  • 시분할 시스템
    - 시간을 미세하게 쪼개어 여러개의 응용 프로그램을 번갈아가며 실행하는 시스템 

  • 멀티 테스킹
    - 운영체제의 프로세스 스케줄링을 이용하여, 단일 CPU에서 여러 응용 프로그램을 task 단위로 나누어 번갈아 실행한다. 마치 동시에 실행되는 것처럼 보이게 한다. 

  • 멀티 프로세싱
    - 복수의 CPU를 사용하여 하나의 응용 프로그램을 병렬로 처리한다. 실행 속도가 극대화 된다. 

  • 멀티 프로그래밍
    - 병렬 처리의 초기 모습, 다수의 프로세스를 메모리에 올려 번갈아 가면서 처리하는 방식, 시간대비 CPU 활용을 최대화 하는 시스템, 여러 응용 프로그램을 단일 프로세서(CPU) 상에서 동시에 실행되는 것처럼 보이게 한다. 

 

 

▶ 스케줄링 알고리즘

  • FIFO 스케줄링
    - 순차실행
    - 배치 처리 시스템에 적합

  • 최단작업 우선 스케줄링(SJF, Shortest Job First) 
    - 실행속도가 가장 빠른 프로세스를 우선적으로 CPU에 올리는 방식

  • 우선순위 기반 스케줄링(Priority based) 
    - 정적 우선순위(= 미리 우선순위를 부여)
    - 동적 우선순위(= 상황에 따라 우선순위를 변경하여 실행)

  • Round Robin
    - Queue를 사용한 시분할 시스템을 기본으로 함
    - CPU에 로드된 순서대로 프로세스를 실행
    - 로드된 프로세스의 순서대로 계속 순환하는 방식

  • Multi-programming & wait
    - 실행중인 프로세스가 저장매체에 접근하는 등 다른 작업을 처리하는 동안, 다른 프로세스를 실행
    - 일종의 비동기적 실행방식(작업 종료까지 기다리지 않고 다른 작업을 처리)  

 

 

▶ 프로세스 상태 

 

▶ 프로세스 상태 Queue 

- Ready 상태의 프로세스가 여러개 있는 경우, 어떤 프로세스를 우선적으로 실행시킬지 판단할 수 없게 된다.

- 이와 같은 상황을 방지하기 위해 사용하는 방법 또는 알고리즘 

- 각 프로세스마다 Queue 자료구조를 만들어서 프로세스의 상태변동에 따른 순서를 기록한다. 

- 이를 통해, 프로세스의 순서를 부여하여 다음에 실행해야 하는 프로세스가 무엇인지 알 수 있다.  

 

 

▶ 스케줄러 정책 

  • 선점형 스케줄링(preemptive scheduling)
    - 어떤 프로세스가 CPU를 할당받아 사용중인 경우, 다른 프로세스가 CPU를 뺏어갈 수 있다.
    - FIFO, SJF, Priority based 알고리즘을 사용하기에 적절함 
    - 시분할 시스템이 대표적인 예

  • 비선점형 스케줄링(non-preemptive scheduling)
    - 어떤 프로세스가 CPU를 할당받아 사용중인 경우, 다른 프로세스가 CPU를 뺏어갈 수 없다.
    - Round Robin 알고리즘을 사용하기에 적절함
    - 배치처리 시스템이 대표적인 예

  • 스케줄링 정책과 알고리즘을 종류에 따라 구분하지 않고 목적에 따라 유연하게 조합하자. 

 


4. 인터럽트(Interrupt)

▶ 인터럽트란?

- CPU가 프로그램을 실행 중일 때, 어떤 이벤트 발생을 OS에게 알려, 이를 CPU에서 처리하도록 하는 기술

 

 

▶ 인터럽트가 필요한 이유

- 프로세스 상태를 변경하기 위해서 

- 내/외부에서 발생한 오류를 처리하기 위해서

 

 

▶ 인터럽트의 종류 

  • interrupt (실행 → 대기)
  • time-out (실행 → 준비)
  • wake-up (대기 → 준비)
  • kill (프로세스 종료)

 

 

▶ 인터럽트의 위치 

- 인터럽트는 OS 내부에 IDT(Interrupt Descriptor Table)에 정의되어 있다.


5. 프로세스 구조와 Context Switching

▶ 프로세스 구조 

  • Stack 영역
    - 프로그램이 알아서 사용하는 임시 메모리 영역
    - 지역변수와 매개변수가 올라가는 메모리
    - 함수호출이 완료되면 자동소멸

  • Heap 영역
    - 동적 할당 메모리 영역
    - 동적 할당이란, 개발자가 직접 할당 명령을 통해 사용하는 메모리 영역 

  • Data 영역
    - 전역변수와 static 변수가 올라가는 메모리 영역
    - BSS(= 초기값이 없는 전역변수가 저장되는 영역)
    - Data(= 초기값이 있는 전역변수가 저장되는 영역)
     
  • Code(=text) 영역
    - 소스코드가 올라가는 메모리 영역
    - 함수, 제어문, 상수 등 실행파일을 구성하는 명령어가 올라가는 메모리 영역

 

 

▶ Context Switching이란? 

- 스케줄러에 의해 프로세스가 교체되는 것을 의미

 

 

▶ Context Switching에서 반드시 알아야 하는 개념

  • PC(Program Counter)
    - 다음 실행할 코드의 주소를 가리키는 레지스터로, 명령어 포인터라고 불리기도 한다.
    - PC는 CPU에서 관리하는 메모리 영역으로, 하나만 존재하는 메모리 영역이다. 


  • SP(Stack Pointer)
    - Stack 영역의 최상단 주소를 가리키는 레지스터로, 현재 실행되는 함수의 주소를 가리킨다.
    - Stack 영역에 새로운 데이터가 추가/삭제 되는 경우, Push와 Pop을 사용하여 처리한다. 

    - SP는 CPU에서 관리하는 메모리 영역으로, 하나만 존재하는 메모리 영역이다. 


  • PCB(Process Control Block)
    - 실행중인 프로세스가 교체되기 전, 교체 직전까지의 프로세스 진행상황(PC & SP)을 기록하는 영역
    - 모든 프로세스는 각각의 PCB 영역을 갖고 있다. 
    - PC와 SP는 CPU에 의해 관리되는 단일 메모리 영역으로, 프로세스가 교체되면 초기화 된다. 


6. IPC(Inter-Process Communication)

▶ IPC란? 

- 프로세스 간의 통신 방법

 

 

▶ IPC가 필요한 이유

- 컴퓨터의 구조상 프로세스 간 통신이 불가능 하다.

- 프로세스는 다른 프로세스의 영역을 치범할 수 없기 때문이다. (해킹 방지)

- 그러나 다수의 프로세스를 동시에 실행 시키는 경우, 프로세스간의 상태확인이 필수적이다. 

- 이와 같은 이유로 IPC가 필요하다. 

 

 

▶ 프로세스 공간에 대한 이해

- 각 프로세스는 4GB의 크기를 갖는다. (가상 메모리로 구성) 

- 3~4GB의 가상 주소 영역은 커널 영역을 담당한다. (OS 코드가 올라감)

- 0~3GB의 가상 주소 영역은 사용자 영역을 담당한다. (응용 프로그램 코드가 올라감)

- 커널 영역은 모든 프로세스가 공유하는 영역이다.

- 그러므로 커널 영역을 활용하여 프로세스 간 통신을 구현한다. 

 

 

▶ IPC 기법의 종류 

  • File 기법
    - 커널 영역의 상태 정보를 기입하는 공유 파일을 생성하여 프로세스 상태 정보를 공유한다.
    - 매번 파일을 읽고 쓰는데 시간이 너무 많이 걸려서 비효율 적이다.

  • Pipe 기법
    - 특정 프로세스를 복제하여(fork 메소드) 자식 프로세스를 생성한다.
    - 부모에서 자식으로의 단방향 통신을 이용한 프로세스 상태 공유기법을 사용한다.
    - 커널 영역에서 동작한다. 

  • Message Queue 기법
    - Queue 자료구조를 사용하여 프로세스 A가 메세지를 삽입하면 프로세스 B에서 받는 구조다.
    - 부모/자식 관계 형성 없이 통신이 가능하다.
    - message queue를 2개를 만들어 양방향 통신이 가능하다.
    - 커널 영역에서 동작한다. 

  • 공유 메모리 기법
    - 커널 영역에 공유 메모리를 만들어, 이를 변수처럼 사용하는 기법이다.
    - 공유 메모리에 상태 정보를 업데이트 하는 방식이다. 
    - 공유 메모리에 접근할 수 있는 Key가 있다면 접근이 가능하다. 

  • Signal 기법 (* 가장 많이 사용하는 기법)
    - 프로세스 코드에 signal 핸들러를 등록하여 해당 signal을 처리하는 방식이다. 
    - signal이 발생하면 signal 핸들러를 통해 다른 프로세스에게 어떤 이벤트가 발생되었는지 알려주는 방식이다. 
    - signal은 OS 내부에 기본으로 정의되어 있는 event로, 각 프로세스의 PCB에서 signal 정보를 관리 및 처리한다. 

  • Socket 기법 (* 가장 많이 사용하는 기법)
    - Socket은 다른 컴퓨터와 통신하기 위한 네트워크 기술이다. 
    - 이를 하나의 컴퓨터가 스스로와 통신하는 방식으로 응용한 것이다.

 


7. Thread

▶ 스레드란?

- 스레드는 light weight process라고 불릴만큼, 소규모 프로세스라고 볼 수 있다.

- 프로세스 내부에 존재하는 작은 단위의 프로세스로, 실제로 프로세스의 작업을 수행한다. 

- 하나의 프로세스 내부에는 1개 이상의 스레드가 존재할 수 있다.

- 스레드는 스레드간의 접근이 가능하기에 IPC없이 데이터 통신이 가능하다. 

 

 

▶스레드의 구조

- 스레드는 프로세스의 Heap과 Stack 영역 사이에 존재한다.

- 스레드는 Stack으로 구현되어 있으며, 각 스레드는 SP와 PC를 갖고 있다. 

- Stack으로 구현되어 있기 때문에, 프로세스의 Stack영역에 할당된 함수처럼 동작한다.

- 각 스레드는 할당된 영역을 갖고 있으며, 스레드는 프로세스의 Heap, Data, Code 메모리 영역을 공유한다. 

- 스레드는 프로세스의 메모리 영역을 공유하기 때문에, IPC없이 통신이 가능하다. 

 

 

▶ 스레드의 장점

  • 사용자에 대한 응답성 향상
    - 스레드로 인해 멀티 태스킹, 멀티 프로세싱이 가능

  • 자원 공유의 효율성
    - 프로세스와 달리 스레드는 메모리 영역을 공유하여 통신이 원활하다

  • 작업 분리로 인한 코드의 간결성
    - 한 프로세스 내부의 각 스레드는 맡은 역할이 다르다. (처리 작업이 분류되어 있다.)
    - 그러나, 개발자의 실력에 따라 편차가 크다. 

 

▶ 스레드의 단점

- 스레드 중 하나라도 문제가 발생하면, 하나의 프로세스에서 문제가 발생한 것과 동일하다.

- 다수의 프로세스에서 다수의 스레드를 사용하게 되면 빈번한 Context Switching으로 인한 자원소모가 증가한다.

- 이는 과부하로 인한 성능저하를 발생시킨다.

 


8. 스레드 동기화 이슈

▶ 스레드 동기화 이슈란?

- 스레드는 프로세스 내부의 메모리를 공유한다. 즉, 데이터를 공유한다는 것이다.

- 다수의 스레드가 특정 데이터에 동시 접근, 사용, 수정을 하면서 발생하게 되는 연산 오류 또는 연산 누락 등을 의미한다. 

 

 

▶ 스레드 동기화 이슈에서 반드시 알아야 하는 개념

  • Critical Resource(임계자원)
    - 스레드가 공유하는 데이터 

  • Critical Section(임계영역)
    - 공유된 데이터를 처리하는 로직 

 

 

▶ 해결방안

  • Mutual Exclusion(Mutex)
    - 공유 데이터를 사용하는 메소드/함수의 동시 사용을 막고 순차적으로 사용하도록 하는 방식

  • Semaphore
    - 스레드의 임계영역 출입을 관리하여 스레드 동기화 이슈를 막는 방식
    - 여기에는 두가지 방식이 있다.


    ▶ Busy waiting
    - 임계 영역이 사용중인 경우, 대기중인 스레드는 무한루프를 돌게하는 방식
    - 무한루프로 인해 자원소모가 많아지므로 CPU 효율성이 낮아진다. 


    ▶대기 큐(queue)
    - 임계 영역에 접근하기위해 대기하는 스레드를 무한루프가 아닌 Queue에 넣어 관리하는 방식 

댓글