본문 바로가기

개발기술/Computer Science

CS공부 - 운영체제

운영체제의 개념

-  운영체제는 다른 프로그램과 마찬가지로 코드로 이루어진 프로그램(C,C++)이며, 엄밀하게는 하드웨어 자원을 조작하는 영역인 커널영역을 지칭한다.   일반적으로는 커널 외에 여러가지 부가적인 프로그램이 결합된 것을 운영체제라고 함.

- 부가적인 프로그램 중에 쉘(GUI, CLI)가 포함되며 이는 유저가 운영체제의 기능을 조작할 수 있도록 하는 인터페이스를 제공한다

- 쉘 혹은 응용프로그램이 커널영역을 사용하게 하기 위해서 운영체제는 시스템콜이라는 함수를 제공한다. 

- 운영체제의 프로그램 일부로써 프로그래밍 언어별로 시스템 콜을 호출할 수 있는 API(라이브러리)를 제공한다. 응용프로그램은 API(라이브러리)를 통해서 시스템콜을 진행하여 자원에 접근할 수 있다.

- 응용프로그램은 운영체제의 커널영역과 부가적인 프로그램 위에서 동작하게된다.

[user - application/shell - library/api - system call - operating system - hardward 의 계층 구조]

- 컴퓨터 시스템은 커널영역을 통한 커널모드에서만 조작이 가능하다. CPU에서 명령별로 구분되어있는 Level 수준과 명령의 주체가 일치하는지 검증한다 (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. 프로세스와 컴퓨터 구조

  • 프로세스는text(코드), data(전역변수/초기화된 데이터), stack(임시데이터, 함수리턴주소, 로컬변수, 함수호출) heap (코드에서 동적으로 만들어지는 데이터)  4가지 영역으로 구분됨.
    • text 영역은 CPU가 실행할 명령어, data 영역은 프로그램 전체에서 그대로 유지될 데이터,전역변수가 저장되어있다. 다시말해, 사이즈가 변하지 않는 primitive data와 object의 주소값을 저장하고 있다.
    • 동적으로 변하는 데이터는 heap 영역에서 저장하고 있으며 stack은 함수 호출로 인해 쌓여나가는 임시데이터를 저장한다. 주로, stack영역은 위에서 아래로, heap영역은 아래에서 위로 동적으로 증가한다.
  • PC(Program Counter : 다음실행할 명령어 주소를 가리키는 레지스터, Clock신호에 따라서 1씩 증가한다)와 SP(스택영역의 최상단의 주소를 가리키는 레지스터 (가장 최근에 불러온 함수의 데이터가 저장됨))의 동작과정
    1. PC가 순차적으로 프로그램을 읽어나감
    2. PC가 함수를 만나면 현재 주소를 return 주소로 SP에 저장하며, 함수의 명령어가 있는 위치로 PC를 변경함
    3. 함수 코드를 읽어가며 로컬변수 등을 Stack 영역에 쌓아나가고, SP는 이에따라 증가함
    4. PC가 Return 명령어를 만나면, SP는 값을 감소시키면서 return 주소를 만날때까지 Stack영역의 데이터를 지워나감
    5. SP가 return 주소를 만나면 PC는 return주소를 받아서 원상복귀함

  • PCB(Process Control Block) : 프로세스 생성시 메모리의 별도공간에 생성되며 ID, Register(PC,SP) 등 프로세스 관련 정보를 저장.
  • 컨텍스트스위칭(문맥교환) : 현재 작업하고 있는 프로세스의 SP,PC데이터를 PCB에 저장하고 실행할 대상인 프로세스의 SP,PC데이터를 불러와 바꾼다.
  • IPC(Inter Process Communication) : 멀티프로세스 작업시, 프로세스간 통신이 필요하나 프로세스는 본질적으로 서로 접근할 수 없다. 그래서, 모든 프로세스가 공통적으로 갖는 커널공간(약 4GB)에 공유할 자원을 저장하여 활용한다.

 

 

6. 멀티쓰레드와 멀티프로세스

 

  • 프로세스 : 프로그램 실행파일(코드이미지, 바이너리)의 인스턴스로, 실행파일이 메모리 위에 올라온 상태. 각 프로세스는 독립적인 메모리 공간을 갖으며 하나의 프로그램으로 여러개의 프로세스(창) 생성가능 
  • 스레드(소프트웨어적) : 프로세스 내에 존재하는 작업 단위, 실행흐름. 프로세스는 스레드가 동작하기위한 실행환경과 자원을 제공하는 컨테이너 역할을 하며, 스레드는 개별 스택영역을 할당받음.
  • 멀티스레드 : 프로세스 내에서 작업의 실행흐름을 여러개를 가져가는 것. 
    • 예시1 : 유튜브에서 영상재생화 댓글작성을 동시에 실행할 수 있음
    • 예시2 : 워드프로세서에서 문서작성, 맞춤법검사, 자동저장을 동시에 실행할 수 있음
  • 멀티스레드 vs 멀티프로세스 : 하나의 프로세스 내에 메모리 영역을 공유하는 여러개의 스레드 생성가능하나 (단, 스택영역은 별도로 확보함). 프로세스는 서로 메모리영역을 별도로 생성하여 프로세스 간의 데이터 접근이 불가함.
    • 그러므로 멀티스레드는 프로세스 내의 데이터를 공유하고 멀티프로세스는 데이터공유가 불가함
    • 그러므로 동기화 문제가 발생시 한가지 쓰레드의 문제로 해당 쓰레드가 소속된 프로세스 전체가 영향을 받음
    • 멀티프로세스는 코드구성 측면에서도 복잡하며, 여러 프로세스 생성과정에서 메모리 공간차지로 인해 멀티스레드가 선호됨
  • 멀티쓰레드의 비용 :  Context Switching이라는 비용이 발생하고, 때문에 멀티쓰레드가 반드시 효율적인 것은 아니다. 하나의 코어로 1~1만까지 숫자를 더하는 연산이 있다면 멀티쓰레드로 작업시 Context Switching만 발생하고 효율성이 떨어질 것. 상황

 

 

7. 동기화 이슈

- 동기화 : 작업들 사이에 실행 시기를 맞추는 것

- 동기화 이슈 : 여러 스레드가 동일한 자원(데이터) 접근시 동기화 이슈 발생함.

- 원인 :   이는 하나의 명령이 Aseembly어 기준으로는 복수의 명령어로 이루어져 있기 때문. Assembly언어를 시행중에 데이터를 저장하지 못하고 스케줄러에 의해 Context Swithing이 발생한 사이에 다른 스레드가 저장되기전 데이터로 작업을 시작하면 작업순서가 섞이기시작함.

- 해결책 : 상호배제기법(Mutual Exclusion, Mutex) 특정 쓰레드가 임계자원(공유자원,Critical Resource)을 사용하고 있는 동안에는 다른 쓰레드가 접근하지 못하도록 임계영역(Critical Section)에 Lock을 걸어둠.

- 해결책2 : 뮤텍스가 임계영역에 하나의 스레드를 허용한다면 세마포어(semaphore)는 n개의 자원만을 허용하여 처리속도를 위해 일부타협하는 방식.

* 프로그램이 불규칙적으로 결과값을 내어놓으면 동기화 문제일 가능성이 높음을 인지할 것.

 

- 교착상태 : 여러프로세스가 서로 필요한 자원을 점유하고 있어 후속진척이 불가능할때

*교착상태인것을 인지하고 임계자원을 공유하지 않도록 코드수정

- 기아상태 : 프로세스의 우선순위가 낮은 프로세스는 작업의 기회를 갖지못하는 것

 

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' 카테고리의 다른 글

CS공부 - 네트워크  (0) 2024.06.22
CS공부 - 기타공부  (0) 2024.06.17
CS공부 - 컴퓨터구조  (0) 2024.01.19
CS를 위한 이산수학 정리  (0) 2023.12.20