Abstraction(구분) 이 무엇을 구분할 수 있도록 하는건지
abstraction이 무엇인가?
- 하나의 운영체제가 컨트롤 해야하는 프로그램과 하드웨어 그리고 사용자가 여러개이기 때문에 이들을 구분지어서 관리할 필요가 있기 때문
Abstraction: Process
- CPU와 같은 하드웨어 구성요소로 하여금, 각 프로그램을 구분하여 인식/실행 할 수 있도록 하기 위함
Abstraction: Address Space가 왜필요한지
- 프로텍션 도메인: 서로가 서로의 주소 공간을 침범할 수 없게 하기 위해서
- 실행 컨텍스트의 보호 ex) 게임과 음악이 섞여 아이템이 사라질 수 도 있음
- 프라이버시 이슈. ex) 구분하지 않는다면 해커가 침입할 수 도 있음.
Abstraction: File
- 어디까지가 프로세스의 바이너리 데이터인지, 해당 바이너리 데이터가 어디에 저장되어 있는지 관리/유지 하기 위해서
I/O 이슈
- I/O 가 CPU보다 많이 느림. 근데 어떤 JOB이 계속 대기해야하면 CPU 낭비
이런 낭비를 막기 위해서
Spooling
- 문서를 메모리의 버퍼에 로드 해놓고 프린터가 자신의 속도로 데이터를 가져옴. CPU는 자기 일 계속 할 수 있게
멀티 프로그래밍이 기존 배치와 다른점
장점
- 메모리에 잡을 여러개를 동시에 놓을 수 있음
- CPU가 쉬는시간을 최대한 줄일 수 있음
단점
- job1과 job2 를 실행한지가 구분이 없어(cpu에 실행중인게 뭔지 몰라)
- 어떤 job 에 우선순위를 줄것인가? 누구를 먼저 실행시킬 것인가? => 자발적인 양보가 없으면 스케줄링이 안됨
=> 타임
멀티 프로그래밍 vs 멀티태스킹
멀티 프로그래밍
- 메모리에 여러개의 프로그램 동시에 다올리고 운영체제가 순차적으로 처리
- 한번에 하나씩 처리
멀티태스킹
- 타임 쉐어링을 통해 여러개의 테스크들이 CPU 같은 자원을 공유하는 방법
- 정해진 타임 슬라이스 시간 동안 CPU를 점유하고 비켜서 작업들이 동시에 실행되는것처럼 보임
Policy와 메카니즘의 차이
Policy
- 무엇이 되게 할것인가? (목적, 목표)
- ex) 하이레벨에서 CPU 타임을 공정하게 하고 싶다
메카니즘
- 무엇을 어떻게 할 것인가?(how, 도구)
- ex) 타임쉐어링을 써보자
레이어링 장점 단점
장점
-독립적임: 고장난 레이어만 고치면 됨
-모듈러리티: 핵심 함수들끼리 레이어를 나눠서 각각을 나눔
불완전한 레이어링의 단점(MS-dos)
- 오버헤드 발생
- 보안 문제 ex) 은행 프로그램인데 app 레이어에서 bios에 접근해서 악의적인 문제 발생
시스템콜이 어떻게 불리는지
- 시스템의 무결성 문제를 방지하기 위해 레이어에 접근할 수 있는 권한을 분리를 했음
- 유저모드에서 커널레벨기능를 사용하기 커널을 통하는 메카니즘
모놀리틱 커널 vs 마이크로 커널
모놀리틱
장점
- 시스템콜 불러도 커널 하나에서 컨트롤 할 수 있으니 overhead 적음
단점
- 커널이 덩치도 크고 유기적으로 연결되어 있어 유지 보수어려움
마이크로
장점
- 서비스가 따로따로 구현되어 있어 의존성 낮음.
- 독립적인 개발 가능하고 유지보수 쉬움
- 불필요한 서버는 종료시켜서 리소스,CPU,메모리 등 확보 가능
- Mono 커널보다 안정적
- 안정적인 의료 컴퓨터 분야에 적합
단점
프로그램을 프로세스로 바꾸는 과정
컴파일러
링커
- 여러 Obj 파일과 라이브러리들을 연결해 Exe로 변환
로더
-
Exe 파일을 실제 메모리에 올려주는 역할
프로세스 컨트롤 블락(PCB)이 왜필요한지, 어떤걸 관리하기 위해서 필요한건지
왜필요한지
-
운영체제에서 여러가지 프로세스들이 각기 다른 프로세스라는걸 구분하기 위해서
어떤걸 관리하기 위해서?
-
프로세스 상태
-
프로그램 카운터
-
CPU 레지스터
-
CPU 스케줄링 정보
-
메모리 관리 정보
-
I/O 상태 정보
컨텍스트 스위치가 왜 필요?
-
타임쉐어링을 사용함으로 할당된 시간이 끝나면 다음 프로세스로 교체가 되어야한다. 이때 기존 하던 작업을 백업하고 로드 하는 과정(컨텍스트 스위치)가 필요하다
컨텍스트 스위치란?
-
PCB에 있는 내용을 백업하고 복원하는 작업
-
메모리에 백업하는것으로 I/O 작업이다. 이거 하고있는 동안에는 CPU가 아무것도 못함 => 성능 안좋음
프로세스 구조에 따른 문맥전환 차이
-
레지스터의 용량에 따라 백업/복원의 양이 달라짐.
-
레지스터 용량이 클 수록 컨텍스트 스위치 오버헤드가 커질 수 있음. 반대로 작을 수록 오버헤드도 작음
병목현상
- CPU 와 메모리, I/O 의 속도 차이가 너무 커서 CPU가 기다려야함
Interrupt vs Trap
Interrupt
- 비동기적 이벤트 처리 ex)프로그램 실행과 상관없이 외부에서 발생하는 I/O
왜 프로그램의 상태를 저장하고 복원하는지?
- I/O를 처리하기 위해 ISR 루틴으로 점프하고 다시 하던 일을 실행해야함으로
Trap
- 동기적 이벤트 처리이기 때문에 실행상태를 저장하지 않음
Polling vs DMA
폴링 대비 DMA 장점
- DMA 컨트롤러라는 프로세서가 CPU의 비서로 대신 I/O 해옴
- CPU가 I/O 시간동안 다른 일 할 수 있어서 성능굳.
DMA가 I/O 를 처리하는동안 CPU가 할일이 있는경우 최대 성능 => Parallelism이 필요
폴링 대비 DMA 단점
- 추가적인 하드웨어 (DMA 컨트롤러 프로세스)를 설치하는 비용이 많이듬
CPU와 I/O Burst 패턴
- CPU Burst 주기가 적을 수록 frequency는 높아
비선점형 스케줄링 vs 선점형 스케줄링
비선점형 스케줄링(OS가 강제로 너 나와 못함)
- 자발적으로 I/O를 하면서 양보를 하는 경우에만 다음 프로세스 실행
선점형 스케줄링(너 나와)
- OS가 강제로 실행중인 프로세스의 수행을 정지시킬 수 있는
4가지 스케줄링 기법 어떤지 그림과 설명
First-come, First-served(FCFS)스케줄링
- 먼저온 애 먼저라 운영체제가 관여할 수 없음
- 대기시간이 랜덤 갸차임 => 짧은 대기시간을 항상 보장X
Shortest-Job-First 스케줄링
비선점형에서는
중간에 끼어들기 못함
선점형에서는
돌고있어도 중간에 끼어드는 얘가 더 빠르면 끼어들기함
Priority 스케줄링
기아상태가 어떤것?
- Burst time이 긴편인 애는 시작이 빨라도 우선순위 애들한테 계속 밀림.
이를 해결할 수 있는 방법?
- Aging 기법
기다리는 시간에 따라 우선순위를 높여주자
라운드로빈 스케줄링
- Time sharing과 유사
- 선점형 방식
- Time Quantum(일정시간) 만큼 지나면 너 나와
- 큐를 정할때 1.스위칭 오버헤드 2.평균 버스트 타임 고려해야함
ex) 큐가 클경우: =>FCFS 되서 의미X
큐가 작을경우: context Switching에 필요한 시간보다 낮다면 효율 넘 떨어짐. (포카락로 생선 발라먹는 느낌)
장점
응답시간이 짧다
단점
문맥전환이 많음
멀티레벨 큐 스케줄링
어떤 방식인지?
- ready 큐를 여러개 줘서 각각에 대해 다른 스케줄링 알고리즘을 부여
=> 프로세스들을 구분해줌
Shared 메모리 장단점
어떤 방식?
장점
- 공유메모리가 설정되면 그 이후의 통신은 커널 도움없이 바로 접근 가능
단점
- 공유 메모리를 위해서 메모리 일부를 오직 그 목적으로 사용해야함.
- 동기화 문제있음. => 누군가가 메모리 영역에 접근하는 순서를 정해줘야함 => Locking이나 세마포어가 대안
메세지 패싱
어떤 방식?
장점
단점
- 커널을 항상 통해야함. => context switching 발생 => 성능 안좋아짐
소켓
- 프로세스의 위치와 상관없이 Remote 통신 가능
- 포트를 이용하여 통신하는 방식
- 다른 IPC와 달리 프로세스가 같은 PC에 있던 멀리있던 통신을 할 수 있음.
- Local끼리는 포트번호, 다른 PC면 IP주소+포트 번호
쓰레드
장점
- 프로세스에서 할 작업을 여러개로 나눈후 각각을 쓰레드화하면 병렬적으로 빨리 작업완수 가능
단점
- 쓰레드도 프로세스만큼은 아니지만 context switching overhead가 있음.
그래서 쓰레드의 수가 임계점을 넘어가면 효율 감소
프로세스와 쓰레드의 차이(자료구조 관점)
프로세스
- PCB 전체를 갖고 코드데이터 영역을 독립적으로 갖음
- 프로세스 간에 컨텍스트 Switch 비용이 큼
쓰레드
- 프로세스의 코드, 데이터 영역을 쓰레드간에 공유
- 컨텍스트 스위치 비용도 상대적으로 적음.
유저쓰레드와 커널 쓰레드의 매핑
many-to-one
- 여러개의 유저쓰레드가 하나의 커널쓰레드로 매핑되는것
단점
- 하나의 쓰레드가 커널에 접근(시스템콜)하면 나머지 쓰레드는 대기해야 = 병렬성과 거리가 멈
one-to-one
- 각각의 모든 유저 쓰레드를 각각의 커널 쓰레드에 매핑!
장점
- 쓰레드와 커널이 한 조가 되니까 시스템콜 호출 시 다른 쓰레드들이 Block 되는 문제 해결
-여러개의 쓰레드를 멀티프로세서에서 동시 실행가능 = 병렬 가능!
단점
- 커널 쓰레드도 한정적이기 때문에 무한으로 즐길 수 없음
many-to-many
- 유저쓰레드가 실제로 동작하거나 필요할 때만 커널 쓰레드들을 매핑해주는 방식
장점
- 가능한 만큼만 만들기 때문에 One-to-One 보안
-시스템 콜해도 Block 되는 현상도 해결
동기화를 잘못해서 발생하는 문제(예시로)
- 은행 입출금 문제
- 입금 처리와 출금 처리를 동시에 할때
int balance =1000;에서
balance += 500;
balance -= 500; 을 동시에 수행
동기화가 잘 되지 않으면
register1 = balance + 500 (register 현재 1500)
register2 = balance - 500 (register 현재 500)
balance = register1 (balance 현재 1500)
balance = register2 (balance 현재 500)
해서 500원이 먹히는 사태가 발생할 수 있음
동기화를 하기 위해 만족할 3 조건
상호배제
- 한 프로세스가 Critical 섹션에 진입해 있다면 다른 프로세스는 진입 불가!
진행
- 프로그램이 잘 진행되기 위해서 바톤터치가 잘 이루어져 매끄러운 진행이 되야함
Bounded Waiting
- 다른 애들에 치여서 못나가는 애들은 기다리는 시간이 너무 길지 않도록 LImit 를 설정해 줘야함. =(우선순위 aging 처럼)
명령어를 이용해서 동기화를 이용하는게 좋은이유
- 하드웨어에서 특정시간동안 실행되는 명령어는 오직 하나임을 이용함.
- 동기화를 위한 변수들도 공유자원이기 때문에 데드락현상 발생할 수 있음
- 저 변수에 접근할때 다른 프로세스들이 접근 못하게 명령어 사용.
세마포어-Busy Waiting
어떤방식?
- s라는 세마포어 변수를 설정하고 루프 식을 돌게 두며, 줄어든값에 기반해 어떤 프로세스를 먼저 내보낼지를 정하는 방식
장점
- 기존 명령어로 해결하지못한 Bounded Waiting을 해결
단점
- 계속 loop를 도는 방법 => CPU 사이클을 낭비함. =>기다리는 프로세스 수가 많아질수록 낭비 사이클은 더 커짐.
- 누가 Critical 세션에 진입할지 결정되지 않음
세마포어-Sleep Queue
어떤방식?
- 슬립 큐를 추가해서 대기중인 프로세스를 관리하는 방식.
- 세마포어의 값이 양수가 되어 critical section에 진입 가능하면 대기중인 프로세스를 깨워 실행시킴
장점
- 누가 critical 세션에 진입할지를 결정할 수 있게됨
데드락
이게 뭐야?
- 서로에게 필요한 락을 서로가 잡고 있어서 교착상태에 빠지는것
모니터
하이레벨에서 동기화를 제어함으로서 얻는 장점?
- shared 메모리를 사용하기 위해 반드시 모니터에 진입해야함으로 쉽게 동기화 문제를 해결할 수 있음
철학자의 식탁
데드락이 발생하는 이유?
starvation 이 어떻게 발생하는지?
- 어떤 프로세스(철학자)는 자원을 사용하려면 기다려야 하기 때문에 발생
starvation 해결법?
- 왼쪽 친구와 오른쪽 친구가 먹고 있지 않을 때 Critical Section에 진입함(필요한 자원이 모두 사용가능할때만 자원에 접근)
동기화 문제 해결하기 위한 체크요소들
Data Consistency(일관성)가 확보되었는지
데드락이 발생하는지
Starvation의 가능성이 있는지
이게 다 만족되고 나서...
Concurrency(병렬성)를 얼마나 제공하는지
메모리관리가 왜 필요한지?
페이징
페이징이 뭐야?
- 현재 실행되고 있는 코드부분만 메모리에 있으면 프로세스가 실행이 가능. 이걸 페이지단위로 쪼개서 관리를 하자
왜 출현하게된 배경?
- 매핑이 필요하기 때문
- 프로세스 수는 점점 증가하지만 메모리는 한정적이기 때문
가상메모리
Baisc 아이디어
- 프로세스가 수행되기 위해 모든 프로그램이 실제 메모리에 있을 필요가 없음. 현재 실행되고 있는 코드 부분만 실제 메모리에 있으면 프로세스는 실행이 가능하기 때문
페이징에서 데이터를 접근할때 항상 왜 두번의 메모리 접근이 필요한지
- 페이지 테이블이 물리 메모리에 있기 때문.
- 페이지테이블에서 매핑정보 얻느라 한번, 그 매핑정보로 다시 메모리에 가기 때문에 한번. => 메모리 접근 속도가 떨어질 수 있음
TLB(해결방법)
- 레지스터이기때문에 빠름
- locality를 살려서 자주 사용되는 매핑 정보를 미리 저장해놓음
멀티레벨, 인버티드 페이지 테이블
왜 멀티레벨, 인버티드 페이지 테이블 필요?
멀티레벨 페이지 테이블이란?
인버티드 페이지 테이블이란?
- 기존에는 페이지의 개수를 기준으로 프레임을 검색함. => 페이지 개수에 따라 용량이 늘어남.
반면, 인버티드 페이지 테이블은 물리 메모리를 index로 만듬. => 한정된 용량 만큼만 페이지테이블이 만들어짐.
Locality
로컬리티를 고려하면 왜 성능이 이득인지?
- 필요한 페이지만 메모리에 올려서 사용하다보니 (loop를 도는동안) locality에 의해서 계속 비슷한 영역 사용이 예측되기 때문
Page Replacement
어떻게 하는게 좋은 페이지 replacement 인지? 왜 그런지?
- I/O작업횟수를 줄일 수 있기 때문에 페이지 Fault 빈도를 낮추는게 가장 좋은 알고리즘.
- 다시 참조되지 않는 페이지를 먼저 replacement 하는게 중요
LRU 알고리즘(예시)
이게 뭐야?
- 가장 오랜 시간 참조되지 않은 페이지부터 먼저 교체함
- 페이지 사용의 Locality(지역성)을 고려하여 Optimal 알고리즘이 되려고함
Swapping
이게 뭐야?
왜 필요?
- 페이지 아웃 만으로 메모리 부족을 해결하지 못할때 필요
ExternalFragmentation이 뭐야?(그림으로)
이게 뭐야?
Contiguous Allocation
- 파일을 물리적으로 연속된 디스크 블럭에 저장한다
장점
- 구현 쉬움
- 물리적으로 연속된 공간에 있어서 전체 파일을 통으로 읽을때 성능 굳굳
단점
- 파일은 반드시 한번에 끝까지 기록되어야함
- 운영체제에서 파일의 끝에 예비용 Block을 남겨놓을 경우 디스크 공간 낭비
Linked List Allocation
- 디스크의 Block을 링크드 리스트로 구현하여, 파일의 데이터를 저장하도록 함
장점
- 파일의 Data Block은 디스크의 어디든지 위치 가능
- 공간의 낭비가 없음
단점
-
Random Access 불가능
(파일의 특정 위치를 찾기 위해서는 해당 파일의 시작 Node부터 찾아가야함)
-
Pointer 사용으로 인해 데이터 저장 공간이 반드시 2의 배수가 아닐 수 있음 => 성능 저하
-
Disk block pointer의 크기를 결정하는 요소는 번호 번호가 많을 수록 크기가 커짐
아이노드가 나오게 된 배경
- 기존에는 디스크 블럭에 대한 포인터 수가 한정되어 있기 때문에 최대 파일의 크기가 고정되었음.
=>아이노드의 데이터 블럭 인덱스들을 테이블 형태로 관리하는 방법으로 해결