728x90
반응형
운영체제
운영체제
- 프로세스 간 데이터 동기화 (Synchronization)
- IPC ( Inter-Process Communication ) ★
- 통신 방향에 따른 분류 : Simplex(단방향), Half-duplex(반이중), Full-duplex(전이중)
- 대기 여부에 따른 분류 : 동기화를 지원하는 통신(Interrupt, 대기 O), 동기화 지원하지 않는 통신(Polling, 대기 X)
- 범위에 따른 분류 : 내부 데이터 통신(Thread), 프로세스간 통신, 네트워크간 통신 - 통신 방법 ( 방법들 간 우열은 존재하지 않으며, 상황에 따른 적절한 이용이 중요하다. )
- PIPE (무명 파이프), FIFO (명명 파이프)
PIPE는 부모 자식간 단방향 통신, FIFO는 다른 프로세스 간의 단방향 통신에 사용되며 파일 시스템에 이미지를 갖는다.
- Memory Queue
커널 메모리 공간을 활용해 Queue를 만들어 데이터 처리, 구조체 기반, 다른 프로세스와 단방향 통신에 사용.
- Shared Memory
커널이 관리하는 일정 크기의 공유 메모리 공간을 통해 통신, 다른 프로세스와 양방향 통신에 사용
- Memory Map
파일을 프로세스 메모리에 맵핑하여 사용, 대용량 데이터 공유에 유리하지만,
Page 단위로 작동하므로 공간 낭비 및 불필요한 작업이 발생할 수 있음. 다른 프로세스와 양방향 통신에 사용
- Socket
네트워크 간 컴퓨터들이 자신의 소켓과 상대의 소켓을 연결해 통신한다. 다른 시스템간 양방향 통신에 사용.
※ socket(), bind(), listen(), accept(), read(), write(), close() - 동기화 ( Synchronization )
- 공유 자원에 대해 접근하는 다수에 대해, 데이터 오염을 막기 위한 방법이다.
- 한 프로세스/쓰레드가 공유자원을 배타적 독점하여 상호 배제를 수행한다.
상호 배제 ( Mutual Exclusion ) : 임계 구역이 오직 한 프로세스만 사용할 수 있게 하는 기술. Lock 사용. ★
※ enterCS() // 접근 가능한지 검사, 불가능 시 대기, exitCS() // 임계 구역 작업이 종료되었음을 알림. - Lock을 만드는 방법
- 조건 : 상호 배제 수행, 한정된 시간 대기(기아X), 진행의 융통성(다른 프로세스 block X)
- 소프트웨어적 방법 : Dekker, Peterson, Lamport ... // busy-wait 방식으로 현재는 잘 사용되지 않음.
- 하드웨어적 방법 :
Interrupt금지 ( Context Switching 차단 => 진행의 융통성 조건 불충족 )
전역변수 선언 ( 전역변수도 공유데이터이므로, 문제 해결 불가능 )
지역변수로 상대 lock 변수 설정 ( Context Switching으로 인해 deadlock 발생 가능성 )
=> 원자명령(Atomic Instruction) : 동시에 Load + set을 수행하는 Instruction - 동기화 방식
- TestAndSet(TAS) : 하드웨어의 lock을 위한 Atomic Instruction ★
lock을 읽는 명령과 lock 변수를 1로 저장하는 2개의 명령을 한번에 처리하는 명령어이다.
- Lock 방식 : 동기화 대상이 1개일 때 사용, 상호 배제를 수행하는 Lock을 생성
※ Spinlock (Busy-wait를 수행하며 Lock을 대기, 기아 발생 가능성 있음, 단일코어에서 비효율적)
※ Mutex (Sleep-wait를 수행하며, Queue에 대기 프로세스를 넣어둔다.) ★
- Wait-Signal 방식 : N 개의 공유 자원에 대해 다수의 프로세스가 공유하여 사용할 수 있도록 함.
※ Semaphore ( P연산(Enter), V연산(Exit)이 있고, n개의 자원, 대기 Queue, Cnt변수로 구성 ) ★
- P,V연산이 반대로 사용되거나, 세마포 없이 임계구역에 진입하면 보호 불가능.
- P만 2번 사용하면, 세마포가 풀리지 않으므로, 큐가 무한 대기한다.
※ Binary Semaphore : 공유 자원 1개, 접근 가능 스레드도 1개, 그렇다면 Mutex와 무엇이 다른가?
=> Mutex는 자원을 소유, 소유한 스레드만 해제 가능, Semaphore는 그 반대이다.(소유X, 소유X 스레드 해제O)
- 동기화 문제 해결법
Monitor : 공유 자원을 내부적으로 숨기고, 접근을 돕는 Interface만 제공 (추상화)
이는, 요청받은 작업을 Queue에 저장 후 순서대로 처리하며, 처리 결과만 전달.
우선순위 역전 : 동기화 대기작업으로 인해, 높은 순위의 스레드가 늦게 스케줄링 될 수 있음.
이는, 공유 자원을 소유한 스레드의 우선순위를 일시적으로 올려서 순서대로 수행되게 함. - 생산자-소비자 문제 ( Producer-Consumer Problem )
- 생산자는 꽉 찬 Queue에 더 집어넣으려하면 안되고, 소비자는 빈 Queue에서 꺼내려고 하면 안됨.
- 버퍼 Queue에 읽기/쓰기가 가능한 수를 cnt로 두는, 세마포를 2개 설치해서 해결한다.
- IPC ( Inter-Process Communication ) ★
- 교착상태 (Deadlock) ★
- 서로 자원을 요구하기만 하고 처리하지 못하는 상태
- 프로그램이 스스로 인지하고 해체하는게 불가능하므로 디자인을 잘 해야함.
- 교착상태를 직접적으로 막는 것은 높은 비용이 들어가므로, 일반적으로 적극적으로 대처 X
- 자원 할당 그래프 모델링[Virtex:자원(사각형),프로세스(원), Edge:요청]을 통해 데드락을 찾아볼 수 있음.
- 교착상태의 원인과 해결방안 ★
- 자원적 특성 ( 상호 배제 수행, 비선점 알고리즘 ) -> 제한하기 어려움
- 행위적 특성 ( 점유와 대기, 환형 대기 ) -> 한번에 요청/한번에 반환, 우선순위 ( 이것도 어려움 )
※ 4개 조건 중 하나라도 수행된다면 Deadlock이 발생할 수 있다.
=> 예방(4가지 조건 성립 안되게 시스템 구성), 회피(할당시 마다 가능성 검사),
감지 및 복구(백그라운드에서 교착상태를 계속 감시, 발견하면 복구), 무시(발생하면 알아서 재시작하겠지) - 기아와 교착의 차이
- 기아 : OS정책의 문제로, 특정 프로세스 작업이 지연되는 현상
- 교착 : 여러 프로세스가 작업을 진행하던 도중 불규칙적으로 발생하는 현상 - 은행원 알고리즘 (Banker Algorithm) ★
- 각 고객들이 대출하려는 최대 금액 [Max], 현재 빌린 돈 [Allocated], 빌려줄 수 있는 돈 [Available]
이 때, 각 고객은 원하는 최대 금액을 대출받아야 상환 가능하며, 대출받기만 하면 상환 100% 가능
※ 이 때, 은행이 적절한 순서로 대출을 지급하여 모든 고객이 대출받고 상환하면 Safe한 상태
※ 만약, 각 고객에게 조금씩 빌려줘서, 남은 돈으로 아무도 최대 금액을 대출해줄 수 없으면 UnSafe한 상태
=> 이 때, Unsafe한 상태에서만 Deadlock이 발생한다. (무조건 발생하지는 않는다. 누가 중도상환한다거나..)
=> 은행은 safe한 상태를 유지하기 위해, 최소 고객 한 명에게 대출할 금액은 보유하고 있어야함.
단점 :
- 할당할 수 있는 자원의 수, 사용자의 수, 최대 자원 요구량을 미리 파악해야함.
- 프로세스는 유한한 시간 내에 자원을 반납해야함.
- 항상 Unsafe한 상태를 방지해야 하므로, 자원을 자유롭게 이용하지 못함.
- 교착상태의 원인과 해결방안 ★
- 메모리 관리
- 참조의 지역성 : 공간지역성(참조된 곳 근처 참조, Array), 시간지역성(최근 사용된 곳 다시 참조, Loop)
- 메모리 계층구조 : 레지스터 < 캐시 < 램 < 저장소
- 메모리 관리 정책 : 적재정책(언제?), 배치정책(어디에?), 재배치,교체정책(가득차면 뭘 뺄까?)
- 메모리 주소 ★
- 물리주소 : 하드웨어 관점의 주소로, 물리 메모리에 매겨진 주소
- 논리/가상주소 : 프로세스 내에서 사용되는 주소, CPU가 실행되는 동안 다루는 모든 주소는 논리주소.
※ 프로세스 내에서 매겨진 논리주소는, 물리메모리에 접근하기 위해 MMU를 이용해 물리주소로 변환된다.
MMU (Memory Management Unit) : 논리주소를 물리주소로 변환하는 하드웨어 장치, CPU에 내장됨.
- Base Register(프로세스 할당 위치), Limit Register(메모리 경계, 프로세스 할당 끝)
- 매핑 테이블을 통해 변환됨.
ASLR (Address Space Layout Randomization) : 메모리 주소가 누출되면, 이를 이용해 임의코드 실행가능.
- 이를 방지하기 위해, 프로세스 내 스택/힙 영역 랜덤배치(직접 참조 어려움), 실행마다 메모리 논리주소 변경 - 주소 바인딩
- 프로그램이 메모리의 어떤 물리적 위치에 저장될지 결정하는 과정
- Compile-time (물리주소=논리주소, Batch에서 사용)
- Load-time (상대주소 지정, 프로그램 로드 때 반영, 계산할게 많으면 로드시간이 길어짐)
- Runtime ( 상대주소에 대한 계산을 실행시간에 반영, 실행 중에 MMU가 연산 ) - 메모리 할당 ★
- OS가 새로운 프로세스를 실행하거나, 실행중인 프로세스가 요구하면 물리메모리가 할당됨.
- 이 때, 연속성 여부와 분할크기에 따라 분류된다.
연속 메모리 할당 [ 현재에는 주로 사용되지 않는 방식, 초기 OS에서 사용됨 ]
- 가변크기 할당 : 프로세스의 크기에 맞춰 메모리 할당
- 고정크기 할당 : 메모리 전체를 고정크기 n Byte로 분할하여, 프로세스마다 하나씩 할당 (최대 프로세스 수도 고정)
※ 메모리 할당의 유연성이 떨어져 외부 단편화 문제가 발생하기 쉬움
※ 최초적합, 최적적합, 최악적합 // First > Best > Worst, 그러나 Case-by-Case
불연속 메모리 할당 [ 메모리를 정해진 크기로 분할, 프로세스도 그 크기에 맞춰 분할 ]
- 가변크기 할당 :
Segmentation (프로세스를 세그먼트 크기로 나눠 할당, 관리, 세그먼트 매칭테이블) ★
※ 소프트웨어로 구현, 외부 단편화 문제 발생
Buddy System (메모리를 절반으로 분할하면서, 프로세스를 넣을 수 있는 가장 작은 공간에 할당)
※ 비슷한 크기의 조각들이 모여, 큰 조각을 완성할 수 있다, 내부 단편화 문제 발생
- 고정크기 할당 :
Paging
※ 외부 단편화 : 가변크기 할당에서, 할당된 메모리들 사이에 사용하기 어려운 좁은 공간들 발생 ★
※ 내부 단편화 : 고정크기 할당에서, 할당된 메모리 내부에 낭비되는 공간 발생
=> 해결하기 위해, 조각모음, 압축 등의 방법이 있으나, 실행을 위해 프로세스가 일시적으로 중단되어야함 - 페이징 (Paging) ★
- 프로세스 주소 공간을 동일한 크기로 분할한 Page와 물리메모리를 분할한 Frame을 매칭함.
- 각 프로세스 별로 페이지 테이블을 PCB에 저장하며, OS에서 한 곳에 모아 관리함.
- 구현이 쉽고, 이식성이 높으며, 페이지 크기를 변경할 수 잇어 융통성이 좋고, 단편화 가능성이 적다.
※ 구현 방법 : 하드웨어의 PTBR(Page Table Base Register), MMU
소프트웨어의 OS를 통한 프레임 동적할당,반환, 테이블관리
※ 매핑 방식 : 직접매핑(메모리 주소와 페이지 순서 일치), 연관매핑(Tag를 이용한검색),
직접-연관매핑(Tag단위로 묶어서 순서 일치), TLB
- TLB ( Translation Look-aside Buffer ) : 페이지와 프레임을 연관 매핑으로 저장하는 캐시메모리 ★
- CAM ( Content-Addressable Memory ) : 접근한 테이블 데이터를 보관하여, 다음 접근을 빠르게 함
- TLB는 병렬적으로 작동하므로, 검색속도가 매우 빠름, 그러나 지역성이 떨어지면 TLB Miss 높음. - 페이지 테이블 (Page Table) ★
- 페이지 개수 : (물리 메모리 용량 / 페이지 크기), 32bit 환경에서 페이지 개수는 2^20개
- 32bit 환경에서, 위치 20bit + offset 12bit = 4byte, 테이블 크기 : 4*(2^20) = 4MB
- 페이지 테이블은 각 프로세스마다 존재하므로, 4MB*(프로세스 개수)만큼 공간 차지
1. IPT(Inverted Page Table) : 프레임 번호를 기준으로 테이블 작성. 한개만 존재하나, 전체 검색 필요
※ VA = <PID, PageNum, Offset> // PID = 4Byte, PageNum = 4Byte -> 8*(2^20) = 8MB
2. Multi-level Page Table : 페이지 주소를 10bit씩 쪼개서 디렉토리를 만든다. (Index?)
※ VA = <PageDirIndex, PageTableIndex, Offset> // 최소 4KB ~ 최대 4MB 4KB, 레이턴시 발생
! 1,2번 방식은 64bit환경에서는 사용 불가 [ Page 52bit + Offset 12bit -> 8*(2^52)Byte = 32,000 TB ]
3. Hash Page Table : Page Index들에 대한 Hash function을 만듬. Hash는 O(1)이므로 매우 빠름.
※ 각 항목은 <페이지 번호, 프레임 주소, 다음 번호>의 구성을 가지고, 페이지 번호가 일치하면 프레임주소 반환, 불일치시 다음 번호 조회. - 캐시 메모리 ( Cache Memory ) ★
- 빠르고 비싸고 작은 메모리. ( 평균 엑세스 시간 : Hit Latency + (Miss rate * Miss latency) )
- 캐시의 투명성 ( Transparency ) : 프로그래머는 캐시 조작 불가능, 하드웨어에서 알아서 동작함.
- 메모리 동기화 방식 : Write-Through (작성될때마다 업데이트), Write-Back (블록 교체시 업데이트, Dirty bit)
- 블록 사이즈 32Byte, 개수 2^10개 => Index 10bit, offset 5bit, tag 17bit
※ 캐시 검색은 CPU->Index->Tag로 지연되는데, 이를 줄이기 위해 먼저 데이터를 가져온뒤, 잘못 가져왓으면 cancel한다. - 가상 메모리 ( Virtual Memory )
- 물리 메모리의 크기에는 한계가 있다. 이를 해결하기 위해, 저장소에 가상 메모리를 만든다.
- Swapping ( Swap in, Swap out )을 통해 메모리와 보조기억장치에 프로세스를 이동한다.
- 문제점 : 가상메모리에 대한 페이지 테이블의 용량, Page Fault, Page Allocation, 교체 알고리즘, Thrashing
※ Page Fault : 참조하려는 메모리가 물리메모리에 적재되기 전에 참조됨. ★
※ Page Allocation : Swap in 과정에서, 어느 위치에 메모리를 저장해야 하는가?
※ 교체 알고리즘 : 물리 메모리에 자리가 없다면, 어떤 메모리를 Swap-out해야 하는가?
※ Thrashing : Page-fault가 빈번하게 발생하여 Swapping이 자주 일어나게 되는 것 (CPU의 착각)
=> Working set 모델 : 지역성을 기반으로, 일정시간 동안 참조한 페이지의 집합 ★
- Page-fault의 발생으로 CPU가 노는시간이 길어지면, CPU가 프로세스를 더 참조하려고 하게 된다. - 요구 페이징 ( Demand-Paging )
- 페이지 테이블에 권한을 확인하는 R(Read), W(Write), X(eXecute), A(Accessed), M(Modified), V(Virtual) 비트가 존재한다.
- 보조기억장치는 메모리에 비해 많이 느리므로, Write-Back으로 기능한다.
- Page A에 대한 접근
※ Table[A].V == 1 => return Table[A].Address;
※ Table[A].V == 0 => Page Fault, Table[A].Address 는 가상메모리 주소.
- 메모리 주소 ★
- 파일 시스템 ( File System )
- 파일(File) : 사용자나 응용프로그램 관점에서는 정보를 저장 및 관리하는 논리적인 단위.
컴퓨터 시스템 관점에서 정보 저장의 컨테이너, 저장장치에 저장.
저장장치
- 자기장기반 : HDD, 플로피, 테이프 등 => 자기장에 반응하는 물질을 바르고, Head를 이용해 특정위치 값 Read
- 반도체기반 : SSD, USB => 플래시메모리, 수많은 트랜지스터에서 전자를 주고받아 저장, 전기충전안하면 초기화
- 광학기반 : CD,DVD => 플라스틱을 녹여 홈을 파고, 발사한 레이저의 반사여부로 0,1 판별
※ 반도체 기반이 빠른 이유 : 하드나 CD는 모터 필요, 반도체는 전자적으로만 작동.
디스크
- 플래터(정보가 저장되는 원형판) + 헤드(플래터를 읽고 쓰는 장치) + 제어모듈로 구성
- 제어모듈: 프로세서(명령을 분석) + 디스크캐시(메모리와 디스크 사이의 중간 버퍼)
- 섹터 ( 정보 저장의 최소단위, 0.5KB~4KB ), 트랙 ( 여러 섹터를 포함하는 동심원 )
실린더 ( 같은 반지름을 가진 트랙의 집합 ), 블록 ( OS가 데이터를 입출력하는 논리적 단위, 섹터로 구성 )
- 디스크 용량 : 실린더 개수 * 실린더 당 트랙 수 * 트랙당 섹터 수 * 섹터 크기
※ 디스크 헤드는 한 방향으로만 돌며, 전송시간 : 헤드 탐색시간 + 시작지점 검색시간 + 전송시간
- HDD는 각회전, CD는 선회전을 하며, 파일 헤드 위치가 분산되면 조각모음이 필요하다. (SSD는 X)
※ 각속도 일정 : 바깥쪽 트랙속도가 안쪽보다 빠른 그대로, 구동장치가 단순하고 조용함.
※ 선속도 일정 : 헤드가 안/바깥 위치에 따라 회전속도 변경, 모터 제어가 복잡하고 소음 발생
- 데이터 주소 : <Cylinder #, Head #, Sector #, CHS>
※ OS는 저장매체를 1차원 배열로 보며, 모든 블럭을 0번부터 본다. 프로그램은 Offset으로 참조.
※ 주소 변환 : 파일 내 바이트 -> 논리블록 주소 -> CHS 물리 주소
파티션
- 운영체제가 저장장치를 논리적으로 분할하여 관리를 편하게 한다.
- 여러 디스크를 하나로 묶는 Raid System도 존재함.
※ Raid 0 :
※ Raid 1:
※ Raid : 5
※ Raid : 6 - 파일 시스템 관리
- 탐색(Seek) : 디스크 장치 내 모터를 이용해, 디스크 헤드가 목표 실린더로 이동하는 과정
※ Seek dist, Seek time, 평균적 5ms 내외.
- 회전지연 : 탐색 후 플래터가 회전하여, 헤드 밑에 목표섹터가 도달할 때 까지 기다리는 시간.
- 전송시간 : 내부전송( 플래터->디스크캐시) + 외부전송(디스크캐시->호스트)
- 오버헤드 : 디스크 장치가 명령을 해석하는 시간 (매우 작으므로, 입출력 시간에서 배제) - 디스크 스케쥴 알고리즘 ★
- FCFS : 디스크 Queue에 도착한 순서대로 요청 처리, 구현이 쉽고 기아가 없으나 성능이 낮음.
- SSTF : 디스크 헤드 실린더에서 가장 가까운 요청을 먼저 선택, 먼 위치의 것에 기아 발생 가능성
- SCAN : 안쪽->바깥쪽->안쪽을 번갈아 검색하면서 진행함. 중간에 비해 양끝의 조회 빈도가 낮음.
- LOOK : SCAN기반, 진행 방향에 더 이상 요청이 없을 시 이동 방향 반전
- C-SCAN : SCAN기반, 단방향으로만 이동. 끝지점 도착시 처음으로 돌아가서 다시 검색.
- C-LOOK : C-SCAN + LOOK
야유 모르겟다 귀찮아
손코딩문제 대비
Mutex : pthread_mutex_init(&mutexVariable, NULL); pthread_mutex_lock/unlock(&mutexVariable); pthread_mutex_destory(&mutexVariable);
Semaphore : sem_init(&semVariable, 0, CNT); sem_post(&semVariable); sem_wait(&semVariable); sem_destory(&semVariable);
WebSocket : socket(), bind(), listen(), accept(), read/write(), close()
FILE : fopen("file.txt", O_RDWR); write(file, text, byte); read(file, out text, byte); lseek(file, pos, SEEK_SET);
PIPE : close(pipe[0]); close(pipe[1]); mkfifo("file.txt", 0666);
SHM : shmget((key_t)7777, byte, 0666|IPC_CHEAT); shmat(shm_id, (void *)0, perm); shmctl(shm_id, IPC_RMID, 0);
MSG_Q : asdf
728x90
반응형
'3-1공부 > 운영체제' 카테고리의 다른 글
기말4. 페이지 폴트 (0) | 2022.06.01 |
---|---|
기말3. 캐시, 가상메모리 (0) | 2022.05.31 |
기말2. 메모리관리 (0) | 2022.05.21 |
기말1. Inter-process Communication (0) | 2022.05.06 |
7. 스케줄링 알고리즘 (0) | 2022.04.19 |