-
다룰 내용
- 쓰레드
- 가상 메모리
- 파일 시스템
- 부팅, 가상머신
스레드
- Light Weight Process 라고도 함.
- 프로세스
- 프로세스 간에는 각 프로세스의 데이터 접근 불가
- 스레드
- 하나의 프로세스에 여러개의 스레드 생성 가능
- 스레드들은 동시에 실행 가능
- 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능
- 스레드 장점
-
- 사용자에 대한 응답성 향상
- 자원 공유 효율
- IPC 기법과 같이 프로세스간 자원 공유를 위해 번거로운 작업 필요없음
- 프로세스 안에 있으므로, 프로세스의 데이터를 모두 접근 가능
- 작업이 분리되어 코드가 간결
- 작성하기 나름
-
- 스레드 단점
- 스레드 중 한 스레드만 문제가 있어도, 전체 프로세스가 영향을 받음
- 프로세스는 독립적인데 스레드의 경우 데이터를 공유
- 스레드 vs 프로세스
- 프로세스는 독립적, 스레드는 프로세스의 서브셋
- 프로세스는 각각 독립적인 자원을 가짐, 스레드는 프로세스 자원 공유
- 프로세스는 자신만의 주소영역을 가짐, 스레드는 주소영역 공유
- 프로세스간에는 IPC 기법으로 통신해야 함, 스레드는 필요없음
동기화 (Synchronization) 이슈
- 동기화: 작업들 사이에 실행 시기를 맞추는 것
- 여러 스레드가 동일한 자원(데이터) 접근시 동기화 이슈 발생
- 동일 자원을 여러 스레드가 동시 수정시, 각 스레드 결과에 영향을 줌.
- 해결 방안
- Mutual exclusion (상호 배제)
- 스레드는 프로세스 모든 데이터를 접근할 수 있으므로
- 여러 스레드가 변경하는 공유 변수에 대해 Exclusive Access 필요
- 어느 한 스레드가 공유 변수를 갱신하는 동안 다른 스레드가 동시 접근하지 못하도록 막기
동기화 (Synchronization) 와 세마포어
- Critical Section (임계 구역)에 대한 접근을 막기 위해 LOCKING 메커니즘 필요
- Mutex (binary semaphore)
- 임계 구역에 하나의 스레드만 들어갈 수 있음
- Semaphore
- 임계 구역에 여러 스레드가 들어갈 수 있음
- counter를 두어서 동시에 리소스에 접근할 수 있는 스레드 수 제어
- Mutex (binary semaphore)
- 세마포어 (Semaphore)
- P: 검사 (임계영역 들어갈때)
- S값이 1이상이면 임계영역 진입후 S값 1 차감 (0이면 대기)
- V: 증가 (임계영역에서 나올때)
- S값 1더하고, 임계영역을 나옴
- S: 세마포어값 (초기 값 만큼 여러 프로세스가 동시 임계영역 접근 가능)
- P: 검사 (임계영역 들어갈때)
교착상태 (Deadlock)와 기아상태 (Starvation)
- 무한대기상태: 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태
- 교착상태 발생 조건
- 해결 방법
- 교착상태 발견 (deadlock detection) 과 회복
- 기아 상태 (starvation)
- 특정 프로세스의 우선 순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태
- 교착 상태와 기아 상태
- 교착상태는 여러 프로세스가 동일 자원 점유를 요청할 때 발생
- 기아상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스는 영원히 자원할당이 안되는 경우를 주로 의미함
- 기아 상태 해결 방안
- 우선순위 변경
- 프로세스 우선순위를 수시로 변경해서, 각 프로세스가 높은 우선수위를 가질 기회주기
- 오래 기다린 프로세스의 우선순위를 높여주기
- 우선순위가 아닌, 요청 순서대로 처리하는 FIFO 기반 요청 큐 사용
- 우선순위 변경
가상 메모리
- 가상 메모리 (Virtual Memory System): 메모리가 실제 메모리보다 많아 보이게 하는 기술
- 실제 사용하는 메모리는 작다는 점에 착안해서 고안된 기술
- 프로세스간 공간 분리로, 프로세스 이슈가 전체 시스템에 영향을 주지 않을 수 있음
가상 메모리가 필요한 이유
- 하나의 프로세스만 실행 가능한 시스템 (배치 처리 시스템 등)
- 프로그램을 메모리에 로드
- 프로세스 실행
- 프로세스 종료 (메모리 해제)
- 여러 프로세스 동시 실행 시스템
- 메모리 용량 부족 이슈
- 프로세스 메모리 영역간에 침범 이슈
ex) 리눅스는 하나의 프로세스가 4GB
근데 통상 메모리는 8, 16GB 인데 어떻게 작동하는가 ?- 가상 메모리 기본 아이디어
- 프로세스는 가상 주소를 사용하고, 실제 해당 주소에서 데이터를 읽고/쓸때만 물리 주소로 바꿔주면 된다.
- virtual address (가상 주소): 프로세스가 참조하는 주소
- physical address (물리 주소): 실제 메모리 주소
- MMU (Memory Management Unit)
- CPU에 코드 실행시, 가상 주소 메모리 접근이 필요할 때, 해당 주소를 물리 주소값으로 변환해주는 하드웨어 장치
가상메모리 (Virtual Memory System) 와 MMU
- CPU 는 가상 메모리를 다루고, 실제 해당 주소 접근시 MMU 하드웨어 장치를 통해 물리 메모리 접근
- 하드웨어 장치를 이용해야 주소 변환이 빠르기 때문에 별도 장치를 둠
- 프로세스 생성시, 페이지 테이블 정보 생성
- PCB 등에서 해당 페이지 테이블 접근 가능하고, 관련 정보는 물리 메모리에 적재
- 프로세스 구동시, 해당 페이지 테이블 base 주소가 별도 레지스터에 저장(CR3)
- CPU가 가상 주소 접근시, MMU가 페이지 테이블 base 주소를 접근해서, 물리주소 가져옴
페이징 시스템 (paging system)
- 페이징 개념
- 크기가 동일한 페이지로 가상 주소 공간과 이에 매칭하는 물리 주소 공간을 분리
- 하드웨어 지원이 필요
- ex) Intel x86 system(32bit) 에서는 4kb, 2mb, 1gb 지원
- 리눅스에서는 4KB 로 페이징
- 페이지 번호를 기반으로 가상 주소/물리 주소 매핑 정보를 기록/사용
- 프로세스 (4GB)의 PCB에 Page Table 구조체를 가리키는 주소가 들어있음.
- Page Table 에는 가상 주소와 물리 주소간 매핑 정보가 있음.
페이징 시스템 구조
- page 또는 page frame: 고정된 크기의 block (4KB)
- paging system
- 가상 주소 v = (p, d)
- p: 가상 메모리 페이지 (페이지 번호)
- d: p 안에서 참조하는 위치 (변위)
- 가상 주소 v = (p, d)
페이지 테이블 (page table)
- page table
- 물리 주소에 있는 페이지 번호와 해당 페이지의 첫 물리 주소 정보를 매핑한 표
- 가상 주소 v = (p, d) 라면
- p: 페이지 번호
- d: 페이지 처음부터 얼마 떨어진 위치인지
- paging system 동작
- 해당 프로세스에서 특정 가상 주소 액세스를 하려면
- 해당 프로세스의 page table 에 해당 가상 주소가 포함된 page 번호가 있는지 확인
- 존재하면 이 page 가 매핑된 첫 물리 주소를 알아내고 p’
- p’ + d 가 실제 물리주소가 됨
- 해당 프로세스에서 특정 가상 주소 액세스를 하려면
다중 단계 페이징 시스템
- 32bit 시스템에서 4KB 페이지를 위한 페이징 시스템은
- 하위 12bit 오프셋
- 상위 20bit 페이징 번호, 2의 20승 개의 페이지 정보가 필요함
- 페이징 정보를 단계를 나누어 생성
- 필요없는 페이지는 생성하지 않으면, 공갼 절약 가능
- 페이지 번호를 나타내는 bit 를 구분해서 단계를 나눔 (리눅스는 3단계, 최근 4단계)
- MMU 와 TLB (컴퓨터 구조)
- TLB(Translation Lookaside Buffer): 페이지 정보 캐쉬
페이징 시스템과 공유 메모리
- 프로세스간 동일한 물리 주소를 가리킬 수 있음 (공간 절약, 메모리 할당 시간 절약)
- 물리 주소 데이터 변경시
- 물리 주소에 데이터 수정 시도시, 물리 주소를 복사할 수 있음 (copy-on-write)
요구 페이징 (Demand Paging 또는 Demanded Paging)
- 프로세스 모든 데이터를 메모리로 적재하지 않고, 실행 중 필요한 시점에서만 메모리로 적재함
- 선행 페이징 (anticipatory paging 또는 prepaging)의 반대 개념: 미리 프로세스 관련 모든 데이터를 메모리에 올려놓고 실행하는 개념
- 더 이상 필요하지 않은 페이지 프레임은 다시 저장매체에 저장 (페이지 교체 알고리즘 필요)
- 페이지 폴트 (page fault)
- 어떤 페이지가 실제 물리 메모리에 없을때 일어나는 인터럽트
- 운영체제가 page fault 일어나면, 해당 페이지를 물리 메모리에 올림
페이지 폴트가 자주 일어나면 ?
- 실행되기 전에, 해당 페이지를 물리 메모리에 올려야하니 시간이 오래걸린다.
페이지 폴트가 안 일어나게 하려면 ? - 향후 실행/참조될 코드/데이터를 미리 물리 메모리에 올리면 됨
- 앞으로 있을 일을 예측해야함 -> 거의 불가능
페이지 교체 정책 (page replacement policy)
- 운영체제가 특정 페이지를 물리 메모리에 올리려 하는데 물리 메모리가 다 차있다면 ?
- 기존 페이지 중 하나를 물리 메모리에서 저장 매체로 내리고 (저장)
- 새로운 페이지를 해당 물리 메모리 공간에 올린다.어떤 페이지를 물리 메모리에서 저장 매체로 내릴 것인가 ?
-> Page Replacement Algorithm
- FIFO Page Replacement Algorithm
- 가장 먼저 들어온 페이지를 먼저 내리자
- 최적 페이지 교체 알고리즘 (OPTimal Replacement Algorithm)
- 앞으로 가장 오랫동안 사용하지 않을 페이지를 내리자.
- 일반 OS 에서 구현 불가 -> 알수가 없음.
- LRU (Least Recently Used) Page Replacement Algorithm
- 가장 오래 전에 사용된 페이지를 교체
- OPT 교체 알고리즘이 구현 불가능하므로 과거 기록을 기반으로 시도
- LFU (Least Frequently Used) Page Replacement Algorithm
- 가장 적게 사용된 페이지를 내리자
- NUR (Not Used Recently) Page Replacement Algorithm
- LRU 와 마찬가지로 최근에 사용하지 않은 페이지부터 교체하는 기법
- 각 페이지마다 참조 비트 (R), 수정 비트 (M)을 둠 (R, M)
- (0,0), (0,1), (1,0), (1,1) 순으로 페이지 교체
스레싱 (Thrashing)
- 반복적으로 페이지 폴트가 발생하여, 과도하게 페이지 교체 작업이 일어나, 실제로는 아무일도 하지 못하는 상황
세그멘테이션 기법
- 가상 메모리를 서로 크기가 다른 논리적 단위인 세그먼트 (Segment)로 분할
- 페이징 기법에서는 가상 메모리를 같은 크기의 블록으로 분할
- ex) x86 리얼 모드
- Code Segment, Data Segment, Stack Segment, Extra Segment 로 나누어, 메모리 접근
- 참고
내부 단편화 (페이지 기법) - 페이지 블록만큼 데이터가 딱 맞게 채워져있지 않을 때 공간 낭비
외부 단편화 (세그멘테이션 기법) - 물리 메모리가 원하는 연속된 크기의 메모리를 제공해주지 못하는 경우
세그멘테이션/페이징 모두 하드웨어 지원 필요 - 다양한 컴퓨터 시스템에 이식성을 중요시하는 리눅스는 페이징 기법을 기반으로 구현
파일 시스템
- 파일 시스템: 운영체제가 저장매체에 파일을 쓰기 위한 자료구조 또는 알고리즘
파일 시스템이 만들어진 이유 (블록)
- 0과 1의 데이터를 어떻게 저장매체에 저장할까 ?
- 비트로 관리하기는 오버헤드가 너무 큼
- 블록 단위로 관리하기로 함 (보통 4KB)
- 블록마다 고유 번호를 부여해서, 관리
- 사용자가 각 블록 고유 번호를 관리하기 어려움
- 추상적(논리적) 객체 필요: 파일
- 사용자는 파일단위로 관리
- 각 파일에는 블록 단위로 관리
- 저장매체에 효율적으로 파일을 저장하는 방법
- 가능한 연속적인 공간에 파일을 저장하는 것이 좋음
- 외부 단편화, 파일 사이즈 변경 문제로 불연속 공간에 파일 저장 기능 지원 필요
- 블록체인: 블록을 링크드 리스트로 연결
- 끝에 있는 블록을 찾으려면, 맨 처음 블록부터 주소를 따라가야함
- 인덱스 블록 기법: 각 블록에 대한 위치 정보를 기록해서, 한 번에 끝 블록을 찾아갈 수 있도록 함
- 블록체인: 블록을 링크드 리스트로 연결
- 다양한 파일 시스템
- Windows: FAT, FAT32, NTFS
- 블록 위치를 FAT라는 자료 구조에 기록
- 리눅스 (UNIX): ext2, ext3, ext4
- 일종의 인덱스 블록 기법인 inode 방식 사용
- Windows: FAT, FAT32, NTFS
파일 시스템과 시스템콜
- 동일한 시스템콜을 사용해서 다양한 파일 시스템 지원 가능토록 구현
- read/write 시스템 콜 호출시, 각 기기 및 파일 시스템에 따라 실질적인 처리를 담당하는 함수 구현
- ex) read_spec/write_spec
- 파일을 실제 어떻게 저장할지는 다를 수 있음
- ex 리눅스) ext4 외 NTFS, FAT32 파일 시스템 지원
- read/write 시스템 콜 호출시, 각 기기 및 파일 시스템에 따라 실질적인 처리를 담당하는 함수 구현
inode 방식 파일 시스템
- 파일 시스템 기본 구조
- 수퍼 블록: 파일 시스템 정보
- 파일 시스템 정보 및 파티션 정보 포함
- 아이노드 블록: 파일 상세 정보
- 데이터 블록: 실제 데이터
- 수퍼 블록: 파일 시스템 정보
Inode 와 파일
- 파일: inode 고유값과 자료구조에 의해 주요 정보 관리
- 파일이름:inode 로 파일이름은 inode 번호와 매칭
- 파일 시스템에서는 inode 를 기반으로 파일 액세스
- inode 기반 메타 데이터 저장
부팅, 가상 머신
Boot
- 컴퓨터를 켜서 동작시키는 절차
- Boot 프로그램
- 운영체제 커널을 Storage에서 특정 주소의 물리 메모리로 복사하고 커널의 처음 실행위치로 PC 를 가져다 놓는 프로그램
- 부팅 과정
- 컴퓨터를 키면 BIOS가 특정 Storage 를 읽어와 bootstrap loader 를 메모리에 올리고 실행한
- bootstrap loader 프로그램이 있는 곳을 찾아서 실행시킴
가상머신
- 가상머신 (Virtual Machine): 하나의 하드웨어 (CPU, Memory 등)에 다수의 운영체제를 설치하고, 개별 컴퓨터처럼 동작하도록 하는 프로그램
- Virtual Machine Type1 (native, bare metal)
- 하이퍼 바이저 (VMM): 운영체제와 응용프로그램을 물리적 하드웨어에서 분리하는 프로세스
- 하이퍼 바이저 또는 버추얼 머신 모니터(VMM) 라고 하는 소프트웨어가 Hardware 에서 직접 구동
- Xen, KVM (AWS 등에서 사용)
[image:05CAC80A-456C-4DC2-A2EF-E8F86D9D0858-627-000006AEA7BC6D55/스크린샷 2021-04-24 오후 6.43.07.png]
- Xen, KVM (AWS 등에서 사용)
- Virtual Machine Type2
- 하이퍼바이저 또는 VMM 라고 하는 소프트웨어가 Host OS 상위에 설치
- VMWare, Parallels Desktop (Mac)
- 하이퍼바이저 또는 VMM 라고 하는 소프트웨어가 Host OS 상위에 설치
- Full Virtualization (전가상화) vs Half Virtualization (반가상화)
- 전가상화: 각 가상머신이 하이퍼바이저를 통해서 하드웨어와 통신
- 하이퍼바이저가 마치 하드웨어인 것처럼 동작하므로, 가상머신의 OS는 자신이 가상 머신인 상태인지를 모름
- 반가상화: 각 가상머신에서 직접 하드웨어와 통신
- 각 가상머신에 설치되는 OS는 가상 머신의 경우, 이를 인지하고, 각 명령에 하이퍼바이저 명령을 추가해서 하드웨어와 통신
- 전가상화: 각 가상머신이 하이퍼바이저를 통해서 하드웨어와 통신
최근 하드웨어 성능 개선으로 전가상화 기술을 선호
또 다른 가상 머신 Docker
- 가상 머신은 컴퓨터 하드웨어를 가상화 (하드웨어 전체 추상화)
- 하이퍼바이저 사용, 추가 OS 필요 등 성능 저하 이슈 존재
- Docker는 운영체제 레벨에서 별도로 분리된 실행 환경을 제공 (커널 추상화)
- 리눅스 처음 설치했을때와 유사한 실행환경을 만들어주는 리눅스 컨테이너 기술 기반
- 리눅스 컨테이너 기술이므로 macOS, windows에 설치할 경우는 가상 머신 기반 제공
가상머신 정리
- Bare-Metal 방식이 가장 성능이 좋다.
- 하드웨어 직접 액세스 하기 때문
- AWS 환경도 Bare-Metal 기반 가상 머신 기술 활용 (KVM)
- Docker는 경량 이미지로 실행환경을 통째로 백업, 실행 가능
- Date Engineering 에서 Docker로 시스템 환경 설정 + 프로그램을 한번에 배포
- ex ) 프로그램 업데이트 -> Docker 이미지 작성 -> Jenkins로 배치잡 생성 및 실행 (AWS EC2 재생성 및 Docker 이미지 설치, 실행)
※ 출처
패스트캠퍼스 컴퓨터 공학 강의
'CS' 카테고리의 다른 글
네트워크 (2) 2021.05.31 시스템 프로그래밍 - 쉘, 쉘스크립트 (0) 2021.05.09 운영체제 - 1 (0) 2021.04.18 리눅스 중요 명령어 (0) 2021.01.16 HTTP 8. 캐시와 조건부 요청 (0) 2021.01.08