운영체제의 개념
- 운영체제의 정의
- 운영체제는 하드웨어 자원을 관리하고 다른 프로그램을 실행하기 위해 설계된 소프트웨어(C,C++ 작성)입니다. 엄밀하게는 커널을 지칭하며, 일반적으로는 커널(하드웨어 자원을 직접 조작하는 핵심 영역)과 여러 부가적인 프로그램으로 구성됩니다.
- 커널: 하드웨어 자원 관리 및 보호
- 부가 프로그램(시스템도구): 쉘(GUI, CLI) 등, 사용자와 커널 간 인터페이스 제공
- 쉘 : 사용자(유저)와 운영체제를 연결하는 인터페이스 역할을 합니다.
- 시스템콜 : 쉘과 응용프로그램은 커널영역을 사용하기 위해 **시스템 콜(System Call)** 함수를 호출합니다.
- 운영체제는 하드웨어 자원을 관리하고 다른 프로그램을 실행하기 위해 설계된 소프트웨어(C,C++ 작성)입니다. 엄밀하게는 커널을 지칭하며, 일반적으로는 커널(하드웨어 자원을 직접 조작하는 핵심 영역)과 여러 부가적인 프로그램으로 구성됩니다.
- 응용프로그램과 실행 흐름
- 응용프로그램은 사용자와 운영체제를 연결하는 인터페이스.
- Library / API (라이브러리 / API) : 응용프로그램이나 쉘이 운영체제와 상호작용할 때 사용하는 인터페이스.
- 응용프로그램은 운영체제 커널영역과 운영체제의 부가적 프로그램 위에서 동작하며, 자원 접근 시 운영체제의 API(라이브러리)를 호출합니다.
- API 호출 → 시스템 콜 실행 → 커널 모드로 전환 → OS가 명령 실행 → 결과 반환 순으로 작업이 처리됩니다.
- [user - application/shell - library/api - system call - operating system - hardward 의 계층 구조]
- CPU 보호 모드
- 운영체제는 커널 모드에서만 하드웨어를 조작할 수 있습니다.
- CPU는 Protection Ring을 통해 명령 실행 권한을 검증하며, 일반 응용프로그램은 제한된 유저 모드에서 동작합니다.
1.1 정리
운영체제는 시스템콜을 제공
프로그래밍 언어별 운영체제 지원을 위해 운영체제별 API제공
응용프로그램 개발시 운영체제 기능이 필요한 경우, 해당 API를 사용해서 프로그램 작성
응용프로그램 실행시 해당 API를 호출하면, 시스템 . 콜호출, 커널 모드로 변경 후, OS 내부에서 해당 명령이 실행되고, 응용 프로그램에 결과 리턴
2. 운영체제의 역할
2.1. 시스템자원(컴퓨터 하드웨어) 관리자 ; CPU, Memory, I.O Device, 저장매체 : 프로세스별 CPU를 얼마나 사용할지, 프로그램이 어디주소에 어느정도 메모리 공간을 차지할지, 저장매체에 어디에 어떻게 저장할지, 키보드와 마우스를 어떻게 표시할지 결정
2.2. 사용자와 컴퓨터간 커뮤니케이션
2.3. 응용프로그램 제어 : 운영체제는 응용프로그램을 실행시키고, 응용프로그램의 권한을 관리하며, 로그인을 통해 응용프로그램 사용자도 관리함.
3. 프로세서와 스케쥴링시스템(개념과 목적)
- 스케쥴링시스템 : CPU코어가 어떤 프로그램을 얼마만큼 어떤순서로 실행할지 결정하는 시스템
어떤 목적을 위해서 프로세스의 작업순서를 구성할까?
- 배치처리시스템 : 복수의 프로그램을 순차적으로 실행시키도록 함. 프로그램은 동작되기위해 현재 프로그램이 완료되기를 기다려야함
- 시분할시스템 : 다중 사용자 지원을 위해 컴퓨터 응답시간을 최소화하는 시스템 (시간분할 후 프로그램 지속전환)
- 멀티테스킹 : 단일CPU에서 여러 응용프로그램이 동시에 실행되는 것처럼 보이도록 하는 시스템 (시간분할 후 프로그램 지속전환)
- 멀티프로그래밍 : 최대한 CPU 활용도를 높이기 위한 시스템 (한 프로세스가 외부장치신호를 기다릴때 다른 프로세스를 작업함)
- 팁 : 메모리 계층구조에 따라 접근속도가 상이하여 가급적이면 외부저장장치 접근을 않도록 하는게 좋은 개발방식임.
- 멀티프로세싱 : 여러 개의 코어로 응용 프로그램을 병렬로 실행해서 실행속도를 높이는 기법
4. 스케쥴러와 스케쥴링 알고리즘(구현)
어느순서대로 프로세스의 작업순서를 배치할까?
- FIFO : 배치처리시스템을 목적으로 들어온 순서대로 처리하는 알고리즘
- SJF : 프로세스 실행시간이 짧은 프로세스부터 먼저 실행하는 알고리즘. 프로그램 실시간 성능이 보장된(실행시간이 일정한)한 RTOS(ㄱReal Time)에 적합한 알고리즘. 윈도우같은 GPOS(General Purpose)에는 불가능한 구현임.
- 우선순위 기반 스케쥴러 : 우선순위가 변하는 동적, 그대로인 정적 스케쥴러아 있음.
- RoundRobin스케쥴러 : Queue순서로 작업을 진행하며, 일정시간 작업후 Queue로 다시 삽입시킴.
- 프로세스상태기반 스케쥴러 : new/ready/blocked/running/exit으로 프로세스의 상태를 기록하고 ready/blocked/running 세가지 상태를 Round Ronbin방식으로 실행. 기본적인 현대 스케줄링 알고리즘임.
5. 프로세스와 컴퓨터 구조
- 프로세스란?
- 운영체제안에서 실행중인 프로그램을 프로세스라고 한다. 프로그램은 실제 실행하기전에는 단순한 파일에 불과하며, 프로그램을 실행하면 프로세스가 만들어진다. 다시말하면, 프로세스는 실행중인 프로그램의 인스턴스이다.
- 프로세스의 특징
- 프로세스는 독립적인 메모리공간을 갖고 있으며 운영체제에서 별도로 분리된 작업단위로 관리된다. 때문에 프로세스간 서로의 메모리에 접근할 수 없으며, 하나의 프로세스가 충돌해도 다른 프로세스에 영향을 미칠 수 없다 프로세스 간 통신(IPC)을 위해 별도의 메커니즘 필요하다.
- 프로세스의 메모리 영역 - 4가지 영역으로 구분됨.
- text/코드영역 : CPU가 실행할 명령어가 저장됨. 실행 파일의 기계어 코드가 위치하며, 읽기 전용.
- data영역 : 초기화된 전역 변수, 정적 변수, 상수 데이터가 저장됨. 프로그램 전체에서 그대로 유지될 데이터,전역변수가 저장되어있다. 다시말해, 사이즈가 변하지 않는 primitive data와 object의 참조 주소를 저장하고 있다.
- Java는 코드영역과 데이터 영역이 메소드영역으로 하나로 관리된다.
- stack영역 : 함수 호출 시 생성되는 로컬 변수, 함수 반환 주소 등 임시 데이터가 저장됨. 위에서 아래로(높은 주소 → 낮은 주소) 증가. 함수 호출 시 스택에 쌓이고, 함수 반환 시 제거됨.
- heap영역 : 코드 실행에 따라서 동적으로 만들어지는 데이터. 동적으로 변하는 데이터는 heap 영역에서 저장하고 있음. 크기가 유동적으로 변경되며, 아래에서 위로(낮은 주소 → 높은 주소) 증가.
- 프로세스 실행의 주요요소
- PC(Program Counter) : 다음실행할 명령어 주소를 가리키는 레지스터, Clock신호에 따라서 1씩 증가한다.
- SP(Stack Pointer) : 스택영역의 최상단의 주소를 가리키는 레지스터. 최근 호출된 함수의 로컬 변수와 데이터가 저장된 위치를 가리킴.
- 프로세스의 실행과정
- PC가 순차적으로 프로그램을 읽어나감
- PC가 함수를 만나면 현재 주소를 return 주소로 SP에 저장하며, 함수의 명령어가 있는 위치로 PC를 변경함
- 함수 코드를 읽어가며 로컬변수 등을 Stack 영역에 쌓아나가고, SP는 이에 따라 증가함
- PC가 Return 명령어를 만나면, SP는 값을 감소시키면서 return 주소를 만날때까지 Stack영역의 데이터를 지워나감
- SP가 return 주소를 만나면 PC는 return주소를 받아서 원상복귀함
- PCB(Process Control Block) : 프로세스 생성시 메모리의 별도공간에 생성되며 ID, Register(PC,SP) 등 프로세스 관련 정보를 저장.
- IPC(Inter Process Communication) : 멀티프로세스 작업시, 프로세스간 통신이 필요하나 프로세스는 본질적으로 서로 접근할 수 없다. 그래서, 모든 프로세스가 공통적으로 갖는 커널공간(약 4GB)에 공유할 자원을 저장하여 활용한다.
6. 멀티쓰레드와 멀티프로세스
- 스레드(소프트웨어적) : 프로세스 내에 존재하는 작업 단위, 실행흐름.
- 프로세스는 스레드가 동작하기위한 실행환경과 자원을 제공하는 컨테이너 역할을 하며, 스레드는 개별 스택영역을 할당받음.
- 프로세스는 하나 이상의 스레드를 반드시 포함한다.
- 멀티스레드 : 프로세스 내에서 작업의 실행흐름을 여러개를 가져가는 것.
- 예시1 : 유튜브에서 영상재생화 댓글작성을 동시에 실행할 수 있음
- 예시2 : 워드프로세서에서 문서작성, 맞춤법검사, 자동저장을 동시에 실행할 수 있음
- 멀티스레드 vs 멀티프로세스 : 하나의 프로세스 내에 메모리 영역을 공유하는 여러개의 스레드 생성가능하나 (단, 스택영역은 별도로 확보함). 프로세스는 서로 메모리영역을 별도로 생성하여 프로세스 간의 데이터 접근이 불가함.
- 그러므로 멀티스레드는 프로세스 내의 데이터를 공유하고 멀티프로세스는 데이터공유가 불가함
- 그러므로 동기화 문제가 발생시 한가지 쓰레드의 문제로 해당 쓰레드가 소속된 프로세스 전체가 영향을 받음
- 멀티프로세스는 코드구성 측면에서도 복잡하며, 여러 프로세스 생성과정에서 메모리 공간차지로 인해 멀티스레드가 선호됨
- 컨텍스트스위칭(문맥교환) : 현재 작업하고 있는 프로세스의 SP, PC 데이터를 PCB에 저장하고 실행할 대상인 프로세스의 SP,PC데이터를 불러와 바꾼다.
- 멀티쓰레드의 비용 : Context Switching이라는 비용이 발생하고, 때문에 멀티쓰레드가 반드시 효율적인 것은 아니다. 하나의 코어로 1~1만까지 숫자를 더하는 연산이 있다면 멀티쓰레드로 작업시 Context Switching만 발생하고 효율성이 떨어질 것.
7. 동기화 이슈
- 동기화 : 작업들 사이에 실행 시기를 맞추는 것. 여러 스레드가 동시에 공유 자원에 접근할 때, 일관성 있는 상태를 유지하기 위해 자원 접근을 조정하는 것을 의미해요.
- 동기화 이슈 : 동기화 문제는 여러 스레드가 동시에 공유 자원에 접근하거나 수정할 때 발생하는 문제를 말해요. 공유 자원은 메모리 공간, 파일, 데이터베이스 등 여러 스레드가 동시에 접근할 수 있는 자원인데, 동기화가 제대로 이루어지지 않으면 데이터 불일치나 예기치 않은 결과가 나올 수 있어요.
- 원인 : 이는 하나의 명령이 Aseembly어 기준으로는 복수의 명령어로 이루어져 있기 때문. Assembly언어를 시행중에 데이터를 저장하지 못하고 스케줄러에 의해 Context Swithing이 발생한 사이에 다른 스레드가 저장되기전 데이터로 작업을 시작하면 작업순서가 섞이기시작함.
- 해결책 : 상호배제기법(Mutual Exclusion, Mutex) 특정 쓰레드가 임계자원(공유자원,Critical Resource)을 사용하고 있는 동안에는 다른 쓰레드가 접근하지 못하도록 임계영역(Critical Section)에 Lock을 걸어둠.
- 해결책2 : 뮤텍스가 임계영역에 하나의 스레드를 허용한다면 세마포어(semaphore)는 n개의 자원만을 허용하여 처리속도를 위해 일부타협하는 방식.
* 프로그램이 불규칙적으로 결과값을 내어놓으면 동기화 문제일 가능성이 높음을 인지할 것.
- 경쟁상태(RaceCondition) : 두 개 이상의 스레드가 동시에 같은 자원에 접근하거나 수정하려고 할 때, 실행 순서에 따라 결과가 달라지는 상황
- 교착상태(DeadLock) : 두 개 이상의 스레드가 서로가 가진 자원을 기다리면서 무한 대기 상태에 빠지는 것
*교착상태인것을 인지하고 임계자원을 공유하지 않도록 코드수정
- 기아상태(Starvation) : 프로세스의 우선순위가 낮은 프로세스는 작업의 기회를 갖지못하는 것
8. 가상메모리와 페이징시스템
- 프로그램의 크기가 큰 경우에는 메모리에 전체 프로그램을 올리는데 물리적 한계가 존재함
- 가상메모리 : 메모리가 실제 메모리보다 많아 보이게 하는 기술로, 프로그램을 동작할때 CPU가 사용하는 프로세스의 영역은 매우 작다는 점을 이용하여 메모리를 페이지로 조각내어 일부만 메모리에 올리는 기술
- 페이징시스템 : 크기가 동일한 프로세스 블럭인 페이지를 프로세스 내의 상대주소(논리주소/가상주소)를 실제 메모리 내의 주소(물리주소)와 맵핑하여 페이지테이블에 저장함. 그리고 CPU가 해당 가상주소를 요청할때, MMU를 통해서 물리주소로 변환함.
- 페이지 테이블은 메모리 상의 PCB에 존재하며, 테이블 내에는 메모리의 페이지와 페이지 내에서의 변위정보, 페이지가 메모리 위의 존재여부가 기록되어있다.
- MMU와 TLB : MMU는 CPU의 CR3에 저장되어있는 메모리 내 PCB의 테이블을 접근해야하며, 이 접근 빈도를 줄이기 위해서 TLB라는 캐쉬메모리에 자주사용하는 테이블정보를 기록함.
- 다중단계페이징시스템 : 프로세스를 시작할때 모든 페이징 정보를 바로 만들지 않고, 응답성을 위해서 당장 필요한 페이징정보를 만들고 나머지는 순차적으로 만든다.
- 페이지교체알고리즘 : 요구페이징 기술에 따라서 실행에 필요한 페이지는 메모리에 적재되고 불필요한 페이지는 다시 저장매체로 돌아감. CPU가 요청하는 페이지가 MMU가 TLB. CR3, Page Table을 거쳐 메모리에 존재하지 않을때 페이지폴트 인터럽트가 발생함.
- 인터럽트와 IDT : 인터럽트는 미리 정의되어 각 번호와 실행코드를 가르키는 주소가 IDT(Interrupt Descriptor Table)이 정의되어 있으며 이는 부팅시 메모리에 올라간다. 인터럽트 시스템콜이 발생하면 인터럽트에 맞는 IDT를 확인하여 해당 코드를 실행한다.
9. 파일시스템
- 파일시스템 : 관리편의를 위해서 데이터를 블록단위(보통 4KB)로 고유번호를 부여해서 관리함. 그러나 사용자입장에서 블록단위로 번호로 관리하기는 어렵고, 더 온전하고 추상적인 객체인 파일이 필요함. 사용자는 파일단위, 각 파일은 컴퓨터 내에서 블록단위로 관리됨,
- 윈도우 계열은 FAT이라는 자료구조에 기록하고, 리눅스계열은 inode방식을 사용함.
- inode파일시스템 기본구조 : 수퍼블록(파일 시스템정보) 아이노드 블록(파일 상세정보) 데이터블록 (실제데이터)으로 이루어짐.
- 수퍼블록 : 파일 시스템 정보 및 파티션 정보를 포함함
- 아이노드블록 : 파일명과 inode번호를 매칭하여, inode를 기반으로 파일의 데이터에 접근하는 메타데이터 저장방식(파일 권한, 소유자 정보, 파일 사이즈, 생성시간, 데이터 저장위치 등)
- inode의 데이터 저장공간인 directb block은 1개의 주소당(4byte) 데이터블록 1개(4kb)를 저장할 수 있어 모든 데이터를 직접적으로 주소를 12개 밖에 가르키지 못함. 때문에 간접주소방식을 차용하는데, 다른 데이터블록의 주소를 보유하고 있는 데이터블록의 위치를 저장하는 방식으로 single indirect(4kb/4byte = 2^10블록), double indirect(4kb*4kb/4byte = 2^20블록), triple indirect(4*4*4kb/4byte = 2^30블록)을 채용함. *이러한 저장방식으로 인해서 특정 파일시스템마다 최대 파일사이즈가 정해져있음.
- 디렉토리 엔트리 : 폴더기준으로 계층구조를 정리한 데이터도 있어야 유저가 탐색이 가능할것이다. 폴더 디렉토리 구조를 별도로 저장한 파일이 디렉토리 엔트리임. 해당 파일의 inode 데이터에는 폴더 내의 보유 파일과 디렉토리가 담겨있음. 하부 디렉토리에 접근하기 위해서는 순서대로 상부 디렉토리에 접근하여 타고내려와야함.
- 가상파일시스템 : 시스템콜의 read와 write를 통해서 외부기기(마우스, 네트워크,) 들을 파일을 읽고 쓰는 것처럼 다룸. 디바이스를 다루는 파일을 특수파일이라고 부르고 1. 저장매체를 다루며 블록(4kb)단위로 전송하는 블록디바이스 2. 키보드 마우스 등 byte단위로 전송하는 캐릭터디바이스가 존재함.
'개발기술 > Computer Science' 카테고리의 다른 글
Blocking / Non-Blocking I/O (0) | 2025.02.15 |
---|---|
CS공부 - 네트워크 (0) | 2024.06.22 |
CS공부 - 기타공부 (0) | 2024.06.17 |
CS공부 - 컴퓨터구조 (0) | 2024.01.19 |
CS를 위한 이산수학 정리 (0) | 2023.12.20 |