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에 넣어 관리하는 방식
'컴퓨터공학기초 개념 > 운영체제' 카테고리의 다른 글
컴공기초 - 운영체제 개념 총정리(하) (0) | 2021.07.22 |
---|---|
39. 가상머신의 이해 (0) | 2021.07.12 |
38. 부팅의 이해 (0) | 2021.07.12 |
37. 파일 시스템 - inode 방식과 가상 파일시스템 (0) | 2021.07.09 |
36. 파일시스템 - 파일 시스템의 이해 (0) | 2021.07.09 |
댓글