🎁 모든 강의 30% + 무료 강의 선물🎁

블로그

강동훈

[인프런 워밍업 클럽 3기 - CS] - 1주차 발자국 (운영체제) - 1

💻 운영체제 들어가기📌 개요개인용 컴퓨터: Windows / MacOS대형 컴퓨터, 서버: Unix / Linux스마트폰, 테블릿: Android / IOS스마트워치, 냉장고, 세탁기: Embeded OS ❓컴퓨터는 운영체제가 있어야 동작하는가?✅ 없어도 동작은 가능하지만 처음 설계를 제외한 다른 기능 추가가 불가(유연성 X) - 전화기(통화만 가능) / 스마트폰(업데이트 및 설치) 운영체제가 하는 일1⃣ 프로세스 관리 (CPU)→ 여러 프로그램을 동시에 실행하고, CPU 자원을 효율적으로 배분2⃣ 메모리 관리 (메모리)→ 실행 중인 프로그램이 필요한 메모리를 할당하고 관리3⃣ 하드웨어 관리 (하드웨어)→ 키보드, 마우스, 프린터 등 장치를 제어하고 하드디스크 특정 영역의 데이터 저장관리4⃣ 파일 시스템 관리 (파일)→ 하드디스크의 효율적인 파일 저장과 관리 📌 역사🗓 1940년대- 미국 펜실베니아 대학교에서 미국 탄도 계산을 위해 30톤 무게의 전자 디지털 계산기 발명- 종이에 수기로 작성하여 테스트 진행 후, 수동으로 스위치와 배선을 연결하여 프로그래밍- 펀치 카드를 이용한 입출력은 속도가 느리며 진공관의 유지 보수 비용도 크다.- 하드웨어의 비용이 비싸기에, CPU의 효율적인 활용이 중요해진다. 🗓 1950년대- 아주 작은 크기의 직접회로 개발.- 컴퓨터가 삽입된 펀치카드를 직접 읽어 계산하고 프린터로 출력.- 기존 과정 (오버헤드 과다 발생)1. 프로그래머가 오퍼레이터에게 펀치카드 전달.2. 펀치카드를 컴퓨터에 삽입 후, 결과 도출.3. 오퍼레이터가 결과를 프로그래머에게 전달.- 싱글 스트림 배치 시스템 (Single-stream Batch Processing Systems)1. 오퍼레이터에게 여러개의 펀치카드를 전달.2. 컴퓨터는 다수의 펀치카드를 한 번에 하나씩 읽어가며 결과를 도출- 입출력 관리자(I/O Device Controller) 를 개발하여 입출력 중에도 CPU 계산 가능- 입출력이 끝나면 CPU에게 인터럽트 신호를 주고, CPU는 신호를 받아 처리- 출력은 CPU와 입출력 관리자 분리가 가능하지만, 입력은 작업이 완료되어야지만 처리가 가능하여 어쩔 수 없이 CPU의 대기가 필요해짐. 🗓 1960년대- 시분할 시스템(Time Sharing System)- CPU 시간을 여러 개의 프로그램에 분배하여 동시에 실행되는 것 같은 효과 제공- 하나의 컴퓨터에 다수의 터미널을 연결시켜, 여러 사용자의 작업이 가능해짐.- 벨 연구소에서 유닉스(UNIX) 운영체제 개발- 멀티 프로그래밍: 여러 개의 프로그램 동시 실행 가능- 다중 사용자: 여러 사용자가 한 대의 컴퓨터를 공유하여 사용- 트리구조 파일 시스템: 루트("/")를 기준으로 파일과 디렉터리가 계층형 구조로 정리- 보안 및 접근 권한: 파일, 디렉터리에 대한 권한('r', 'w', 'x') 설정 가능- 높은 이식성: 다양한 하드웨어에 쉽게 적용 가능- 쉡 기반 CLI 제공: GUI가 아닌 CLI를 통해 운영- 여러 프로그래밍 간 메모리 영역을 침범하는 문제 발생 🗓 1970 ~ 1980년대- 개인용 컴퓨터의 등장(애플 맥킨토시, MS DOS)- GUI(Graphic User Interface)의 등장 🗓 1990 년대- GUI 환경의 개인용 컴퓨터의 보급으로 다양한 응용 프로그램 등장- Excel, Word - Winow 운영체제의 대중화- UNIX를 기반으로 한 오픈소스 LINUX 운영체제의 등장➡ CPU의 효율성과 오버헤드의 감소를 위한 고민이 끊임없이 이루어짐. 📌 구조1. 사용자는 인터페이스를 통해 커널에 접근- GUI: 그래픽으로 커널과 상호작용으로 일반 사용자도 접근 가능- CLI: 텍스트 형태의 명령어로 커널과 상호작용 2. 어플리케이션을 시스템 콜을 통해 커널 접근어플리케이션이 직접 커널에 접근하여 하드 디스크에 파일을 저장할 경우, 중요한 데이터의 손실이 발생할 수 있다. 이를 방지하기 위해 시스템 콜을 이용하여 운영체제를 통해 하드디스크의 빈 공간에 데이터를 저장한다. 3. 커널이 하드웨어에 접근드라이버를 통해 커널은 하드웨어에 접근할 수 있다. 커널이 모든 하드웨어에 대한 드라이버를 저장할 수는 없으니, 하드웨어의 제조사에서 드라이버를 만들어 제공하고 커널이 이를 설치하면 접근 가능하다. 📌 컴퓨터 하드웨어와 구조기존에는 하드웨어로 프로그램을 만들었기에, 프로그램의 수정마다 배선와 스위치를 수동으로 변경해야 한다. ✅ 폰 노이만 구조 (Von Neumann Architecture)1. 프로그램 내장 방식- 프로그램과 데이터가 같은 메모리에 저장- 실행한 명령어를 CPU가 메모리에서 읽어와 수행2. 순차적 명령 실행- CPU는 한 번에 하나의 명령어를 순차적으로 실행3. 메모리, CPU, 입출력 장치로 구성- CPU(Central Pocessing Unit)1. 산술논리 연산장치: 실제로 데이터 연산을 담당2. 제어장치: 모든 장치들의 동작을 제어하고 지시3. 레지스터: CPU내에 계산을 위해 임시적으로 저장하는 공간- Memory1. RAM: 랜덤으로 데이터를 읽어도 속도는 일정, 휘발성2. ROM: 전력이 끊겨도 데이터 저장이 되지만 수정 불가 (BIOS)- 입출력 장치: 사용자와 컴퓨터 간 데이터 입/출력 관리 📌 컴퓨터 부팅 과정1. 컴퓨터의 전원을 누름2. ROM에 저장된 BIOS 실행1. CPU, RAM, 하드웨어에 이상 여부를 확인2. 이상이 없다면 하드디스크에 저장된 마스터 부트 레코드를 메모리로 올림3. 운영체제 동작3. 모니터에 운영체제의 동작을 실행 ✅ 마스터 부트 레코드(Master Boot Record, MBR)하드디스크, SSD, USB등 저장장치에서 부팅과 파티션 정보를 관리하는 0번 섹터1. 부트 로더(bootloader) 저장 - BIOS가 MBR을 읽고 부트 로더를 실행하여 운영체제로 부팅2. 파티션 정보 저장- 디스크의 파티션 구조를 관리 (최대 4개의 파티션)3. 디스크 식별- 디스크의 고유한 식별 정보를 포함 📌 인터럽트✅ 폴링(Polling)CPU가 지속적으로 장치나 하드웨어의 상태를 확인하여 필요한 작업을 처리하는 방식.- CPU의 비효율적인 자원 소모- 다수의 장치를 관리할 수록 CPU는 주기적으로 다수의 장치를 확인해야 하므로 다른 중요한 작업의 처리 속도가 느려질 수 있다.- 상태 확인 주기와 타이밍- 처리가 완료되어도 다음 폴링 주기까지 기다려야 하며 사용자 응답 또한 지연된다. ✅ 인터럽트(Interupt)프로세서가 현재 실행 중인 작업을 중단하고, 중요한 작업이나 이벤트를 즉시 처리- 하드웨어 인터럽트 - 시스템 외부의 하드웨어 장치에서 발생한 이벤트에 반응- 소프트웨어 인터럽트 - 소프트웨어, 프로그램에 의해 발생   

시스템 · 운영체제운영체제감자워밍업클럽3기

강동훈

[인프런 워밍업 클럽 3기 - CS] - 3주차 발자국(운영체제)

💻 가상메모리📌 개요32bit CPU 를 사용한다면 약 4GB(2^32)의 메모리, 가상 메모리를 가진다. ❓그러면 가상 메모리의 용량을 뛰어넘는 프로세스들을 어떻게 실행되는 것인가?✅ 물리 메모리 내용의 일부를 스왑 영역에 저장하고 필요 시에만 물리 메모리로 스왑 메모리 관리자(MMU Memory Management Unit)은 물리 메모리 + 스왑 영역을 전체 메모리 공간으로 보고 가상 주소를 물리 주소로 변환시킨다 (동적 주소 변환 DAT) ❓메모리 관리자는 어떻게 메모리 공간을 관리하나?✅ 물리 메모리의 0번지는 운영체제의 영역이며 나머지 영역에 대해 "가변 분할 방식(세그멘테이션)"과 "고정 분할 방식(페이징)"으로 구분하여 나눈다. 또한 매핑 테이블을 관리하여 가상주소를 물리주소로 전환이 가능하다. 📌 세그멘테이션(배치정책)세그멘테이션(Segmentation): 함수, 모듈 등으로 세그먼트를 분할(코드, 힙, 데이테, 스택,,)프로그램 입장에서는 각 세그먼트는 모듈 별로 분리되어 있다고 판단프로세스 입장에서는 각 세그먼트는 인접하게 판단각 세그멘테이션이 모듈로 처리되어 역할에 맞게 분할되어 관리가 가능하다외부 단편화가 발생할 수 있다. 세그멘테이션 테이블 : 세그멘테이션에서 사용되는 매핑 테이블Base Address : 세그멘테이션 메모리 시작 주소Bound Address: 세그멘테이션 크기, 접근 가능 최대 범위 물리 주소 변환 과정1. CPU가 논리주소, 세그멘트 번호 전달2. 메모리 관리자는 Segment Table Base Register 를 통해 물리 메모리 n 번지에 저장된 세그먼테이션 테이블 로드3. 세그멘트 번호를 인덱스로 테이블에서 Base Address, Bound Address 조회4. Bound Address(메모리 크기)와 논리 주소를 비교1. Bound Address > 논리 주소 = Base Address + 논리 주소 = 물리 주소2. Bound Address < 논리 주소 = 메모리 침범 -> 에러 발생- 컨텍스트 스위칭마다 해당 세그멘테이션 테이블에 프로세스의 데이터를 수정해야 함으로 비용이 큰 작업이다. 📌 페이징(배치정책)고정 분할 방식: 메모리를 정해진 크기의 페이지로 나누어 관리프로세스는 같은 크기의 페이지로 분할되며, 메인 메모리는 같은 크기의 프레임으로 분할된다. 페이지 테이블page number: 조회할 페이지 번호frame number: 물리메모리 프레임 번호물리 주소 변환 과정1. CPU 논리주소 전달2. 메모리 관리자는 Page Table Base Register을 통해 물리메모리 n번지에서 페이지 테이블 로드3. 페이지 번호 = 논리주소 / 페이지 크기4. 오프셋은 논리주소 % 페이지 크기5. 페이지 테이블에서 페이지 번호를 인덱스로 프레임, 오프셋를 알아냄6. 만약 프레임에 invalid로 저장되면 스왑영역에 저장 세그멘테이션 VS 페이징1. 세그멘테이션은 Base Address가 필요하지만 페이징은 각 페이지 영역이 동일하여 필요 없음2. 세그멘테이션 외부 단편화 발생, 페이징 내부 단편화 발생3. 세그멘테이션 논리적 영역별로 구분, 페이징은 고정된 페이지에 저장하여야 하니 논리적으로 구분 불가4. 각 프로세스마다 페이지 테이블을 갖고 있기에, 페이지 테이블의 크기 관리가 중요하다. 📌 페이지드 세그멘테이션페이지 + 세그멘테이션 프로세스 접근 권한- 코드: RE- 데이터: RW(o)- 힙: RW- 스택: RW세그멘테이션 테이블권한 비트Page Number페이지 개수물리 주소 변환 과정CPU가 0x12300번지 접근 요청메모리 관리자가 메모리에서 세그멘테이션 테이블이랑 페이지 테이블 로드세그먼트 번호를 통해 인덱스를 확인 후, 접근 권한 위반 여부를 파악페이지 크기와 비교하여 메모리 침범 여부를 확인페이지 넘버를 통해 페이지 테이블의 프레임 확인물리 메모리의 프레임 번호 + 접근 요청된 메모리 오프셋 = 물리 주소단점1. 물리메모리에서 데이터를 가져오기 위해서는 메모리 접근 두 번 해야함 (세그멘테이션 테이블, 페이지 테이블) 📌 디멘드 페이징(가져오기 정책)지역성 이론1. 공간의 지역성: 현재 위치에서 가까운 데이터에 접근 확률이 높음2. 시간의 지역성: 현재 시간에서 가까운 데이터에 접근 확률이 높음(최근) 디멘드 페이징: 필요한 데이터만 메모리에 올리고 사용하지 않는 데이터는 스왑 영역으로 이동보조저장장치에서 데이터를 가져오는 것은 레지스터보다 몇 배는 더 많은 시간이 소요스왑영역이 보조저장장치에 있기에, 스왑영역에 데이터를 저장하는 것을 최소화해야 함. 스왑 인(swap in): 스왑 영역 -> 물리 메모리스왑 아웃(swap out): 물리 메모리 -> 스왑 영역 페이지 테이블 엔트리(PTE)1. 접근 비트: 데이터 접근 여부(읽기, 실행 작업 시, 1)2. 변경 비트: 데이터 쓰기 여부(쓰기 작업 시, 1)3. 유효 비트: 페이지가 물리 메모리에 있는지(있음 0)4. WRE 비트: 접근 권한 비트5. 프레임: 프레임 번호 저장 디멘드 페이징 과정1. 페이지 테이블에서 유효비트와 프레임 번호를 확인2. 유효비트가 0일 경우, 물리 메모리에서 해당 프레임 번호로 데이터 반환3. 1일 경우, 스왑영역에서 프레임 번호로 데이터 추출4. 물리 메모리에서 빈 프레임을 확인5. 빈 프레임이 있으면 물리 메모리로 데이터를 적재하고 페이지 테이블 수정6. 빈 프레임이 없으면 물리 메모리에서 필요하지 않은 데이터를 스왑 영역으로 이동 후, 빈 프레임으로 이동 📌 페이지 교체정책페이지 교체정책: 가득찬 메모리에서 스왑영역으로 보낼 페이지를 고르는 기법1. 무작위 선택(Random): 지역성을 고려하지 않아, 자주 사용되는 페이지가 교체될 수 있음2. 가장 오래된 페이지 교체(FIFO): 가장 오래된 페이지가 자주 사용될 수도 있음3. 가장 오랫동안 사용하지 않을 페이지 교체(Optimum): 사실상 구현이 불가(이론상)4. 최근 사용이 가장 적은 페이지 교체(Least Recently Used)1. 지역성 이론에 따라, 최근 사용이 적은 페이지는 앞으로도 사용이 적을 것이다는 추정2. optimum 알고리즘과 근접한 성능을 갖지만, 지역성 이론에 따르지 않는다면 성능이 안좋아짐3. 시간을 기록하는 비트 수가 많아짐 Belady의 역설: 페이지 폴트를 줄이기 위해 메모리를 늘려 프레임을 늘렸더니 페이지 폴트가 더 많이 발생(FIFO에서 발생) LRU 알고리즘의 성능은 좋지만 구현이 어렵고 시간을 기록할 비트가 많이 필요하며 시간이 오래 지나면 오버 플로우가 발생한다. 클락 알고리즘(clokc algorithm)접근 비트를 하나만 이용일정시간마다 접근 비트를 0으로 초기화페이지 조회 시, 접근 비트 1로 수정페이지를 원형으로 연결페이지 폴트 발생 시, 클락 핸드(원형 페이지를 순회하는 포인터)를 시계방향으로 돌려접근 비트가 1이면 0으로 수정하고접근 비트가 0이면 교체할 페이지로 선택향상된 클락 알고리즘접근 비트와 변경 비트 모두 확인접근 비트 0 / 변경 비트 0접근 비트 0 / 변경 비트 1접근 비트 1 / 변경 비트 0접근 비트 1 / 변경 비트 1순서대로 페이지 교체 우선 순위 선정 하드웨어적으로 접근비트를 지원하지 않는 시스템에서 FIFO를 사용해야 함.(FIFO 최적화 필요)2차 기회 페이지 교체 알고리즘- FIFO와 동일하게 동작- 만약 페이지 폴트없이 페이지 접근이 성공하면, 가장 첫 체이지를 큐의 가장 뒤로 이동 📌 스레싱과 워킹셋스레싱: CPU 사용률을 높이기 위해 더 많은 프로세스를 실행하지만 물리 메모리의 공간 초과로 스왑에 더 많은 시간이 할당되어 CPU 사용률이 낮아지는 것- 물리메모리의 크기가 부족하여 스레싱 발생- 물리적으로 메모리의 성능을 늘리는 것은 한계가 있음(스레싱이 발생하지 않는다면 업그레이드에 대한 효율이 없음)- 페이지를 적게 할당하면 page fault가 많이 발생 / 페이지를 많이 할당하면 다른 프로세스가 사용할 페이지가 적음- 프로세스를 실행하며 page fault가 많이 발생하면 페이지를 더 할당- page fault가 적게 발생하면 페이지를 조금 할당- 적절한 페이지 수가 결정되어 지역성 이론에 따라 유지할 페이지들을 골라야 함. 워킹셋: 현재 메모리에 올라온 페이지는 다시 사용할 확률이 높기 때문에 하나의 세트로 묶어서 메모리에 저장- 프로세스 준비 -> 실행 상태로 컨텍스트 스위칭할 때 사용된다. 💻 입출력장치📌 주변장치(I/O 디바이스, 저장장치)I/O Device하드웨어완 연결할 수 있는 외부 인터페이스I/O 데이터 전달을 위한 버스 인터페이스(address, data, control 버스 3개)장치 상태 및 데이터 저장을 위한 레지스터(C메모리로 전달되기도 함)컨트롤러, 로직I/O 처리 과정CPU는 I/O 작업을 입출력 제어기에게 맡기고 다른 작업CPU, 메모리, 그래픽 카드(입출력 장치지만 대용량 데이터를 다룸)는 시스템 버스를 이용하고 (고속으로 이용)입출력 제어기는 고속 입출력 버스를 통해 빠른 장치(HDD 등)데이터 전송과 저속 입출력 버스를 통해 느린 장치(마우스 키보드 등)입출력 제어기는 입출력 두 개의 버스에서 온 데이터를 시스템 버스를 통해 메모리로 옮김입출력 제어기가 메모리에 접근하려면 CPU가 필요한데, 효율성이 떨어지니 DMA(Direct Meomry Access)를 통해 메모리에 저장CPU와 DMA 메모리 공간을 분리 - Memory Mapped I/O 📌 마우스 / 키보드마우스과거는 볼을 사용하여 마우스 움직임 계산현재는 카메라로 초당 1500회의 사진을 찍어 DPS를 통해 마우스 좌표를 계산DPS 입력 감지 시, 디바이스 컨트롤러가 인터럽트 발생마우스 드라이버가 데이터를 운영체제에 이벤트 전달 > Foreground 애플리케이션 전달 > 애플리케이션 데이터 처리키보드디바이스 컨트롤러 입력 감지 및 인터럽트 발생키보드 드라이버 이벤트 전달 > 운영체제 Foreground 애플리케이션 전달 > 애플리케이션 데이터 처리📌 하드디스크/Flash Memory(SSD) 하드디스크의 구조sector: track에서 여러개의 sector로 나뉘고 하드디스크의 가장 작은 단위 track: platter에 여러개의 track이 존재하고 표면의 자성으로 N극은 0, S극은 1platter: 원판 형태로 데이터 저장cylinder: 모든 헤드는 같이 움직이고 여러개의 헤드가 가리키는 트랙의 집합spindle: platter를 지지하는 막대read/write head: disk arm에 달려있어, platter의 표면을 읽음 과정cylinder C로 가서 track B에 있는 sector D를 읽어라disk arm은 헤드를 cylinder C로 이동시키고(seek, seek time < 하드 디스크가 느린 이유)track B에 Sector D가 head에 닿을때까지 spindle을 회전Flash Memory하드디스크기계적으로 움직여 소음도 일어나고 속도가 느림자기적으로 처리 -> 고장 가능성이 높음충격에 약함flash memory전기적으로 데이터를 읽기 때문에 조용하고 속도가 빠름안전함덮어쓰기가 불가능지우기 가능한 횟수가 정해져있어서, 지우고 쓰기가 여러번 쓰일 수 없음 💻 파일시스템📌 파일과 파일 시스템파일 시스템 기능파일, 디렉토리 생성, 수정, 삭제접근 권한 관리무결성 보장백업과 복구암호화파일 -> 블록 단위로 저장 -> 메모리 관리자가 바이트로 변환 -> 사용자가 접근운영체제는 File Descriptor를 갖고 있으며 파일마다 독립적인 File Descriptor가 존재하여 파일이 오픈되면 메모리에 올라간다. 사용자가 파일을 실행하면 운영체제가 file descriptor를 전달하여 파일을 찾아온다. 파일 구조순차파일구조: 파일 내용이 연속적으로 이어져있음직접파일구조: 해시 함수를 통해 해시 테이블에 데이터 저장인덱스파일구조: 순차 + 직접 파일구조 📌 디렉토리Root Directory: 최상위 디렉토리디렉토리 헤더는 디렉토리 정보가 시작하는 위치를 가리킨다.다단계 디렉토리: 하나의 디렉토리에 하위의 디렉토리를 만들 수 있는 트리 구조 📌 파일과 디스크블록: 디스크 공간을 일정한 크기로 나누고 주소를 할당(1 ~ 8KB)연속할당: 파일 구성 블록들을 디스크에 연속적으로 할당시작주소만 알면 파일을 읽을 수 있음내부 단편화 발생불연속할당: 데이터를 분산하여 저장연결할당: 시작 블록 주소만 알고 있으며, 연결리스트를 통해 블록 저장인덱스할당: 인덱스 블록의 주소를 저장하고, 인덱스 블록에 저장된 데이터 블록 인덱스들로 데이터 블록을 읽어옴 📌 더 찾아본 점 ❓ 페이징, 세그멘테이션, 페이지드 세그멘테이션페이징 테이블 구성: 페이지 번호 / 프레임 번호 / 유효/무효 비트페이징 테이블 엔트리: 페이지 테이블에서 페이지에 대한 위치 정보를 담은 각 행CPU가 (p, d) 전달페이징 테이블에서 p에 대한 f를 찾고 반환물리 주소에서 f 번 프레임의 d 번째 위치 (페이지 크기 * f + d)세그멘테이션 테이블 구성: 세그멘테이션 번호 / Base Address / Bound AddressCPU가 (s,d) 논리주소 전달세그먼트 테이블에서 s에 대한 base address와 limit 확인d가 limit 보다 크면 에러물리 주소 = base address + d페이지드 세그멘테이션: 프로세스를 각 세그멘테이션으로 구분하고 세그멘테이션을 고정 크기의 페이지로 분할CPU는 (s,p,d) 논리주소 전달세그먼트 번호를 통해 p를 확인하고 d와 페이지 개수를 비교하여 메모리 침범인지 확인p를 통해 페이지 테이블에서 인덱스를 확인하고 프레임 번호를 확인물리 주소: 프레임 번호 시작 주소 + d = f \* 페이지 크기 + d ❓ 메모리에 없는(invalid)데이터를 어떻게 저장장치에서 가져올까?Demand Paging: 프로그램 실행 중에 필요한 페이지만 물리 메모리에 저장하고, 실행 중에 요구되는 페이지에 대해서는 저장장치에서 로드Page Fault: 페이지 테이블에서 가져오려는 데이터가 invalid 한 상황. 운영체제에게 trap을 발동시키고 이를 통해 요구되는 페이지를 메모리로 로드 1. 페이지 테이블에서 찾으려난 데이터가 valid인지 invalid인지 확인2. invalid일 경우, page fault가 발생되고 운영체제의 trap에 걸림(프로세스 대기).3. 물리 메모리에서 비어있는 frame 주소를 찾음4. 제 2 저장장치에서 요구되는 페이지를 찾고 해당 프레임에 할당5. 물리 주소 프레임 위치를 페이지 테이블에 매핑6. 인터럽트가 끝나고 프로세스 중단된 명령어부터 다시 실행 ❓ Second-Chance Algorithm?FIFO 알고리즘에 접근 비트(reference bit)를 추가하여 접근 여부를 파악0이면 해당 페이지를 교체, 1이면 0으로 수정한 후 다음 FIFO page로 이동향상된 Second-Change Algorithm(clock algorithm)원형 큐로 생성포인터가 각 큐를 순회하며 접근 비트가 0인 것을 발견.최악의 경우(모든 접근 비트가 1), 모든 접근 비트를 0으로 수정하고 FIFO와 동일하게 가장 앞에 페이지를 교체 ❓ Thrashing, Working set?프로세스가 page in, page out으로 너무 많은 swapping을 하는 현상많은 프로세스를 메모리에 올려(멀티 프로그래밍) 실행 시키면, 어느 순간 CPU 효율성이 떨어지는 현상프로세스 실행 > page fault > process wait queue > page in > next page > page fault ...Working Set지역성 이론에 따라서 최근에 가장 많이 조회된 페이지들의 집합working set안에 있다 - 자주 참조되는 페이지 / 없다 - 교체 대상 페이지t1 시간에는 {1,2,5,6,7} 로 워킹셋 생성, t2에 {3,4} 로 워킹셋 수정Δ (델타) 를 통해 working set window를 생성하고 그 사이즈를 적절히 정하는게 중요운영체제는 각 프로세스의 working set을 모니터링하면서 사이즈에 맞게 frame을 할당충분한 프레임이 남는다면 프로세스를 더 실행 / 각 프로세스의 워킹셋 총합이 사용가능한 프레임의 수가 초과되면 프로세스 중지이를 통해 멀티 프로그래밍 정도를 높이면서 CPU 효율성을 유지❓ 입출력 장치의 I/O 인터럽트가 발생해도 끊김이 없는 이유?interrupt-request line을 통해 CPU는 명령어를 실행한 후 인터럽트가 발생하였는지 감지현재 실행 중인 프로세스의 데이터, 상태를 저장인터럽트 핸들러를 실행인터럽트의 원인을 확인하고 필요한 작업을 수행수행 후, 상태값을 복원하여 이전 작업으로 복귀아무런 작업이 없는 컴퓨터에서 10초 동안 23,000개의 인터럽트가 발생 - 초당 수백개의 인터럽트를 처리해야 함. 현재 운영체제에서는 조금 더 정교한 interrupt handling 특징들이 있음1. 중요한 프로세스 작업 중 인터럽트 핸들링을 지연시킬 능력이 필요하다2. polling을 통한 인터럽트 발생 확인이 아닌, 적절한 인터럽트 핸들러를 통해 효율적으로 인터럽트 관리3. multilevel interrupt를 통해 상위 - 하위 우선순위의 인터럽트를 구분하고 여러 인터럽트 동발생 시, 긴급성에 따라 응답4. 운영체제의 attention을 바로 받을 수 있을 만한 명령어가 필요 (page fault는 trap) 📌 백엔드 면접 질문✏ 페이지 폴트(Page Fault)는 언제 발생하며, 운영체제는 이를 어떻게 처리하는가??✅ 페이지 폴트란 프로세스가 논리 주소로 데이터를 요청할 때, 메인 메모리에 데이터가 없는 경우 발생하는 인터럽트이다.스왑 영역에 저장되어 있는 페이지를 가져오기 위해 프로세스를 대기 상태로 변경 시켜, 운영체제에 트랩을 발생시키고스왑 영억에서 데이터를 가져와 메인 메모리에 저장하고 페이지 테이블을 다시 변경해서 프로세스를 이어서 실행시킵니다. ✏ Node.js에서 가상메모리는 어떻게 관리되는가?V8 엔진은 JS코드가 저장되는 Code segment, 함수 호출과 실행 컨텍스트를 저장하는 Call Stack, 객체와 데이터를 저장하는 Heap Memory로 구분된다. V8에서는 페이징 기법을 통해 힙 영역을 가상 메모리로 관리한다. 힙 영역에 각각의 space(new space, old space, large object space,,)들은 페이지로 구성되어 있으며 각 페이지는 large object space를 제외하고는 1MB정도이다. 또한 가비지 컬렉터를 통해 단편화가 많이 일어난 페이지에 대해 메모리 압축을 진행한다. - 살아있는 객체들을 한 곳으로 이동시키고 포인터 갱신 ✏ Node.js에서 파일을 읽는 방법은?- Node.js는 싱글스레드에서 동작하지만 내부적으로 멀티 쓰레드(Worker Pool)에서 작업을 한 후에 이벤트 루프를 통해 결과를 반환한다. 이벤트 루프는 비동기 작업에 대해 작업이 완료되면 콜백함수를 task queue에 저장하고 콜스택이 비어있으면 task queue에서 콜백함수 실행. readFile 메서드는 비동기로 실행되며 콜백 함수를 통해 파일 읽기 작업이 마무리되면 콜백이 실행되며 readFileSync는 동기적으로 실행되고 blocking 상태가 되어, 파일을 읽을 때까지 작업이 대기된다. 📔 회고🚀 최종 목표 : 더 효율적인 백엔드 개발을 위해 기본적인 운영체제 지식들을 확실히 잡아가기🚀 매주 규칙:각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분강의를 듣고 최대한 이쁘게 (?) 정리해놓기 매 강의 듣고 해당 내용 공룡책 & 강의 1회 정독 및 수강매 강의에 대한 내용 백엔드 면접 질문을 추려서 답변하고 개념 구체화하기이번 인프런 워밍업 클럽을 진행하면서 커리큘럼에 맞춰 매일 강의를 듣고 지키려고 하였던 나의 목표 및 규칙이다.규칙부터 살펴보자면,각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분 : 10 / 10강의를 듣고 최대한 이쁘게 (?) 정리해놓기 : 8 / 10매 강의 듣고 해당 내용 공룡책 & 강의 1회 정독 및 수강 : 7 / 10매 강의에 대한 내용 백엔드 면접 질문을 추려서 답변하고 개념 구체화하기 : 7 / 10매 강의를 듣고 섹션별, 유닛별로 모든 내용을 정리하여 저장하였으니 10점을 주었다.강의를 듣고 최대한 이쁘게 정리를 하려고 노력하였지만 2점이 감점된 이유는 시간이 지날 수록 점점 이모지 사용이 줄고 글간, 행간과 같은 사소한 부분을 신경쓰지 않게 된 것같다,, 그래도 이 노력을 통해서 일관된 템플릿을 형성할 수 있었다는 점, md파일로 매일 정리해보며 파일 정리에 조금 익숙해진 것 같다.매 강의를 듣고 관련된 내용을 공룡책에서 찾아서 읽어보고 어려운 내용에 대해서는 공룡책 관련 강의와 함께 수강하려고 노력하였다. 2주차까지는 강의에서 나온 내용과 공룡책이 챕터 별로 일치하여 찾아보기가 편하여 공룡책에 나온 내용을 읽어보고 스스로 정리해보며 부족한 부분을 기록하였다면, 이번 주차부터는 공룡책에 안나오는 내용들이 점차 등장하여 미리 궁금한 내용들은 정리해두고 다른 블로그나 공식문서들을 참고하여 지식을 채워갔다. 7점을 준 이유는 아무래도 공룡책 챕터 별로 범위가 넓고 깊이 있게 다루기 때문에 정독의 수준에는 미치지 못한 것 같다. 또한 이해가지 않은 부분은 쉽게 넘어가고 전체적인 흐름만 파악하려 하였기에 아쉬운 점이 조금 남은 것 같다.매 강의를 듣고 GPT를 이용하여 관련된 강의 내용에 관련된 백엔드 면접 질문들을 추려서 스스로 답변하면서 정리해보았다. 관심이 많던 Node.js 를 기반으로 더 깊이있게 공부해봤던 것 같고 CS 지식들을 실무에 적용시켜서 생각해보려고 노력하였다. 하지만 Node.js 프롬프트를 이용한 질문은 유료라 한도가 항상 잡혀서 아쉬운 점이 컸던 것 같다. 무료 프롬프트는 어딘가 의심이 드는 답변들이 많아 두번 세번 더 찾아봐야하는 문제점이 있어, 한정된 질문들에 대해 소중하게 답변했던 것 같다. 7점을 주었던 이유는 면접 질문을 정리하고 스스로 공부해봤던 개념들을 따로 정리해놓지는 않아서 부족하게 진행되었던 것 같고 이번 기회에 매일 면접 질문들을 답변해보면서 공부를 한 것들을 기록하여 정리해보려 한다.그래서 최종적으로 내가 설정하였던 목표에 대해서는더 효율적인 백엔드 개발을 위해 기본적인 운영체제 지식들을 확실히 잡아가기 : 8/10나름 높은 점수를 주었지만 이 점수는 나의 과정에 대한 점수이지 결과에 대한 점수는 아닌 것 같다. CS에 대해서는 아직 부족한 부분이 많지만 이번 로드맵을 통해 CS가 더 흥미로워졌고 더 깊이 공부해보고 싶은 생각이 들었다.무엇보다 가장 좋았던 부분은 CS에 대한 전반적인 틀을 잡을 수 있었고 공부 해야할 방향성이 조금씩 잡혀나가는 것 같다는 느낌이 들었다. 이를 기반으로 더 깊이 있게 공부하면서 실무적으로 계속 연결하여 생각해보고 백엔드 개발에서 더 효율적이고 올바른 판단을 하기 위해 꾸준히 노력해 볼 생각이다.     

시스템 · 운영체제운영체제인프런워밍업감자

강동훈

[인프런 워밍업 클럽 3기 - CS] - 2주차 발자국(운영체제)

💻 운영체제📌 프로세스 동기화프로세스는 다른 프로세스와 데이터를 주고 받으며 통신한다.여러 프로세스가 공유자원에 접근하여 데이터를 수정하고 읽을 경우, 동기화 문제가 발생할 수 있다.공유 자원 : 프로세스 간 공유되는 변수나 파일임계 구역: 여러 프로세스가 동시에 사용하면 안되는 구역경쟁 조건: 공유 자원을 서로 사용하기 위해 경쟁하는 것상호배제의 요구사항임계 구역에는 하나의 프로세스만 접근할 수 있다여러 요청에도 하나의 프로세스만 접근 가능하다임계 구역에 들어간 프로세스는 최대한 빠르게 나와야 한다.상호배제 메커니즘세마포어세마포어 변수를 갖고있는 프로세스가 먼저 실행되고 작업이 완료되면 signal()을 통해 변수 반환세마포어 변수가 없는 프로세스는 대기 wait()세마포어 변수를 할당받으면 프로세스 실행 가능공유 자원 수에 따라 세마포어의 수 증가모니터운영체제의 차원이 아닌 프로그래밍 언어에서 처리자바에서 synchronized가 붙은 함수가 실행되면 다른 프로세스가 접근 불가함수를 임계 구역에 감싸지 않아도 되어 편리하게 구현 가능 📌 데드락교착상태(데드락): 여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무도 작업을 진행하지 못하는 상태필요조건1. 상호배제: 한 프로세스가 리소스를 점유하였다면 다른 프로세스 접근 불가2. 비선점: 점유중인 프로세스의 리소스를 뺏어갈 수 없음3. 점유와 대기: 한 프로세스는 리소스를 점유하고 있는 상태에서 다른 프로세스의 리소스 점유를 대기해야 함4. 원형대기: 점유와 대기를 하는 프로세스들의 관계가 원형이어야 함.회피교착상태는 발생할 수 밖에 없다 > 발생의 원인을 줄이거나 빠르게 해결 안정상태 (시스템 총 자원이 14라 가정)현재 총 12개의 작업이 할당되었다.P1이 4개의 자원을 요청하면 사용 가능한 자원이 2(14-12)개 남아있기에 거절P2가 2개의 자원 요청하면 사용 가능한 자원 2개 할당P2의 작업이 마무리되면 사용 가능한 자원 6개로 증가나머지 프로세스들의 요청 예상 자원 커버 가능 불안정상태현재 사용 가능 자원은 1(14-13)개이다.모든 프로세스들의 요청 예상 자원을 할당해줄 수 없다.모든 프로세스들이 최대 자원을 요구하지 않는다면 교착 상태에 빠지지 않을 수 있지만가능성이 높다 가벼운 교착상태 검출 : 타이머 이용. 프로세스가 일정 시간동안 작업을 진행하지 않는다면 교착상태로 검출 일정시간마다 체크포인트 생성, 교착상태 예상 시에 롤백무거운 교착상태 검출: '자원 할당 그래프'를 통해 프로세스에 할당된 자원을 모니터링교착상태를 일으킨 프로세스 강제종료체크포인트로 롤백  📌 메모리1. 레지스터: 가장 빠른 기억 저장소이자 휘발성 메모리. 메인 메모리 데이터를 CPU레지스터를 가져와 연산 후 계산 결과를 다시 메인 메모리에 저장2. 캐시: 메인 메모리에서 필요할 것 같은 데이터를 미리 캐시에 저장3. 메인메모리(RAM): 실제 운영체제와 프로세스들이 저장되는 휘발성 메모리4. 보조저장장치: 비휘발성 메모리이며 프로그램, 파일을 저장 물리 주소(절대 주소): 메모리 공간의 실제 주소논리 주소(상대 주소): 사용자가 다루는 메모리 주소1. 사용자가 프로그램 실행 - 사용자 입장에서는 0x0000 메모리로 작업2. 프로세스는 실제 물리주소 0x4000 주소에 저장3. 사용자가 0x0100 주소의 데이터 요청 (논리 주소)4. 논리 주소(0x0100)와 재배치 레지스터(실행 중인 프로세스의 물리주소 - 0x4000)을 더해서 0x4100의 값을 전달 메모리 할당 방식❓ 유니 프로그래밍 환경에서는 하나의 프로세스만 메모리에서 동작이 가능하다. 만약 메모리의 용량을 초과한 프로그램을 실행시키려면?✅ 스왑 과정이 존재하기 때문에 실제 메모리에 전체 프로세스가 올라가있는 것에 비하면 속도가 느리다.메모리 오버레이: 실행시킬 프로세스를 분할시켜, 사용되는 부분을 메모리에 올리고 나머지는 하드디스크 스왑 영역에 저장 ❓ 멀티 프로그래밍 환경에서는 어떻게 동작?1. 가변 분할 방식(세그멘테이션): 프로세스가 크기에 따라 메모리를 분리- 연속된 메모리 공간에 할당되기에 내부 단편화 현상 없음- 외부 단편화 발생: 연속된 공간에 할당을 해야하니 5MB 프로그램을 3MB와 2MB 공간에 할당이 불가하다.2. 고정 분할 방식(페이징): 프로세스 크기 상관없이 메모리 분리 (만약 5MB 프로그램을 2MB 고정 분할 메모리에 저장시키려면 2 / 2 / 1로 분리) -> 비연속 메모리 할당- 구현이 간단하고 오버헤드가 적음- 내부 단편화 발생: 위 예시에서 2MB 분할 공간에 1MB만 사용3. 버디 시스템(가변 + 고정): 2의 승수로 메모리를 분할하여 할당- 전체 메모리 영역을 하나의 프로세스가 올라갈 수 있을 정도로 2의 승수로 나눠서 분할- 최소한의 내부 단편화, 간단한 메모리 합치기 조각 모음 : 외부 단편화에서 분리된 메모리 공간을 합치는 작업 - 실행 중인 프로세스를 일시적으로 멈춰야 해서 오버헤드 발생 📌 더 찾아본 점IPC(Interprocess Communication)란?프로세스 간 협업을 위해 데이터를 공유하기 위해서는 IPC 기술이 필요하다 공유 메모리(Shared Memory): 공유 메모리 지역을 지정하고 프로세스들은 공유 메모리에 접근하여 데이터를 공유한다. (producer-consumer problem)메세지 패싱(Message Passing): 협력하는 프로세스 간 메세지 전달을 통해 데이터 동기화(communication link)를 통해서 각 프로세스가 소통한다. race condition이란?다수의 프로세스(혹은 쓰레드)가 같은 데이터를 동시에 접근하거나 처리하면, 실행되는 순서에 따라서 결과가 달라진다.이를 해결하려면 특정 시간에 하나의 프로세스만 공유 자원을 다뤄야 한다. 즉, 프로세스는 동기적으로 실행되어야 한다.1. 상호배제(Mutual Exclusion)을 보장해주어야 한다.- 한 프로세스가 "임계영역(citical section)"을 실행 중일 때, 다른 프로세스는 임계 영역을 실행할 수 없다.2. 데드락(deadlock)을 회피(진행)- 임계 영역에 들어갈 프로세스를 정하는 건, 임계 영역에 들어가야하는 프로세스들만 참여할 수 있다. - 영역에 들어가는 과정이 무한정 지연되는 것을 방지3. 유한 대기(Bounded Waiting) (starving 기아 상태 방지)- 임계 영역에 들어가기를 요청한 프로세스는 무한정 기다리면 안된다. 상호배제 메커니즘Mutex Locks: 임계 영역에 진입하면 lock을 acquire()와 release()를 통해 주고 받음Semaphore: 공유자원 수용가능 수에 따라 정수형 변수 s 변수를 초기화. wait(s)와 signal(s)를 통해 각 작업에서 s값을 중가, 차감 자원할당 그래프(Resource0Allocation Graph)운영체제에서 자원이 할당되어 있는 상태를 그래프로 그려, 시각적으로 데드락의 여부를 판단- T = {T1, T2, ..., Tn}: 실행 중인 쓰레드- R = {R1, R2, ..., Rm}: 할당될 자원 타입- T_i → R_j: i 쓰레드가 j 자원을 요청한다- R_j → T_i: j 자원을 i 쓰레드에 할당되어 있다.위 예제에서는 3개의 쓰레드와 4개의 자원이 있으며 2개의 순환 구조를 갖고 있다.T1 → R1 → T2 → R3 → T3 → R2 → T1T2 → R3 → T3 → R2 → T2모든 쓰레드는 하나의 자원을 점유 중인 상태에서 다음 자원을 점유하기 위해 대기 상태에 있고, 이러한 상태가 원형을 이루어지고 있기 때문에 데드락에 빠질 확률이 높다고 판단한다. 메모리 주소 바인딩1. symbolic address: 소스 프로그램에 변수와 같이 메모리 주소를 상징적으로 저장2. relocatable address: 실제 메모리 주소가 결정될 수 있는 재배치 가능 주소3. absolute address: 컴파일 타임에 결정되는 메모리 주소 1. compile time: 컴파일 시점에 물리 주소가 결정 (`absolute address`로 결정)2. load time: 컴파일 시점에 메모리 위치가 확정나지 않았다면, relocatable code로 변환. 프로세스가 로드되어 메모리에 올라갈 때 물리 주소가 결정3. execution time: 프로그램 실행 도중에 메모리 주소가 변경될 수 있다면 런타임까지 바인딩 지연. MMU에 의해서 논리 주소를 물리 주소 결정 📌 백엔드 면접 질문해보기데드락과 라이브락의 차이점?데드락은 두 개 이상의 쓰레드가 자원을 점유하고 있지만 다른 자원을 점유하기 위해 대기 중인 교착 상태를 의미합니다. 라이브락이란 두 개 이상의 쓰레드가 충돌을 회피하기 위해 실패 작업을 반복하지만 진전이 없는 상태를 의미합니다.데드락은 교착 상태에서 모든 프로세스가 멈춰버리지만 라이브락은 실패 작업을 계속 시도하기 때문에 멈추지는 않습니다. 락 기반 동기화와 락 프리 알고리즘이란?락 기반 동기화란 하나의 프로세스만 공유자원을 사용하도록 강제하여 동기화시키는 방법입니다. 뮤텍스나 세마포어가 락 기반 동기화에 해당됩니다. 락 기반 기법은 두 개 이상의 스레드가 서로 상대방의 락의 해제를 기다린다면 데드락이 발생할 수 있으며, 낮은 우선순위의 스레드가 자원을 먼저 점유하면 높은 우선순위의 스레드가 대기를 해야하는 우선순위 역전 등의 문제가 있습니다.락 프리 알고리즘이란 락을 사용하지 않고도 동기화를 유지시킬 수 있는 알고리즘입니다. 해당 알고리즘은 CAS(Compare And Swap) 같은 원자적 연산을 통해 동기화를 보장하는데, 원자적 연산이란 연산이 중간에 중단없이 시작되지 않거나 완전히 수행되는 것(all or nothing)을 의미하며 CAS는 해당 원자적 연산을 기반으로 현재값을 읽고 예상했던 값과 일치할 경우에만 값을 변경하며 일치하지 않는다면(다른 쓰레드의 개입) 업데이트하지 않는 방식입니다. Node.js에서 데드락이 발생할 수 있을까? 공식 문서에 따르면 Node.js에는 락이 존재하지 않아서 데드락이 발생될 확률이 매우 적다고 적혀있습니다. 다만 libuv에서 제공하는 동기적인 메서드를 실행할 때, js파일에 대해 대기 상태가 발생할 수 있는데 이는 데드락이라기 보다는 Blocking에 해당합니다. 또한 이러한 동기 I/O 메서드에 대해서도 콜백을 포함한 비동기 처리 함수가 함께 제공됩니다. (readFileSync / readFile) V8 엔진 메모리 관리 방식은? V8 엔진은 node.js의 실행 엔진이며 컴파일과 GC를 포함하고 있다.V8 메모리 구조(Resident set)은 크게 Heap과 Stack 메모리로 구분된다.Heap에는 크게 New Space와 Old Space가 존재하며 New Space는 짧은 생명주기를 갖는 새로 생성된 객체들이 저장되며 2번의 minor GC에도 제거되지 않은 객체는 Old Space로 이동되어 저장된다. New Space는 minor GC, Old Space는 Major GC로 참조되지 않는 변수들을 가비지 컬렉팅 한다. Buffer와 Stream의 메모리 사용 방식 차이? Buffer: 데이터를 조각(chunk)내어 buffer에 다 차우면(buffering) 일괄로 데이터를 전송. - 메모리의 사용 비율이 크지만 데이터 처리 속도가 크게 향상Stream: 데이터 청크와 버퍼의 크기를 작게하여 지속적으로 데이터를 전달하는 방식 - 메모리 사용이 적지만 데이터 실시간 효율성이 높아짐 📔 회고🚀 최종 목표 : 더 효율적인 백엔드 개발을 위해 기본적인 운영체제 지식들을 확실히 잡아가기🚀 매주 규칙:각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분강의를 듣고 최대한 이쁘게 (?) 정리해놓기 매 강의를 듣고 궁금하거나 이해가 안가는 부분은 추가적으로 더 찾아서 정리해두기매 강의 내용을 백엔드 관점에서 고민해보고 GPT와 대화를 통해 정리첫 주차 발자국과 미션을 수행한 후에 이번 주에는 더 구체적이고 집중적으로 강의를 듣고 복습할 수 있게 방식을 수정하였다.규칙 3번에서 매 강의를 듣고 궁금하거나 이해가 안가는 부분에 대해서는 보통 검색을 통해 블로그를 찾아보고 정리하였었다. 하지만 블로그에 적혀있는 글마다 내용이 다르기도 하고 궁금증이 해소되지 않는 부분들이 있어, 더 찾아보던 도중 CS로 유명한 공룡책(Operating Systerm Concepts) 무료 영문 pdf파일을 발견하였고 그 날 강의에 해당하는 주제에 맞춰 공룡책을 공부하고 개념을 탄탄히 하는 것에 집중하였다. 추가적으로 인프런 강의 중에 무료로 공룡책에 대한 내용을 설명해주는 강의도 있어 함께 공부를 하니 더 깊이 있고 쉽게 개념을 잡아갈 수 있었던 것 같다.규칙 4번에서 처음에는 백엔드 관점으로 강의 내용을 살펴보려 하였는데, 생각보다 모호하고 막연하다고 생각하여 규칙을 조금 변경하였다. GPT에는 Node.js 전문가 프롬프트가 제공되어 있어서, 해당 프롬프트를 이용하여 오늘 배운 내용에 대해 이야기하고 백엔드 면접 질문을 리스트로 달라고 요청하면 기초부터 고급 그리고 node.js를 활용한 심화 질문까지 리스트업해준다. 해당 부분에 대해서 스스로 답변해보고 답변하지 못한 부분이나 설명이 부족한 부분은 다시 AI와 대화하면서 지식을 채울 수 있었던 것 같다.결과적으로 3. 매 강의 듣고 해당 내용 공룡책 & 강의 1회 정독 및 수강 / 4. 매 강의에 대한 내용 백엔드 면접 질문을 추려서 답변하고 개념 구체화하기 이렇게 수정하여 2주차를 진행하였다. 기존 독학으로 CS를 공부하였을 때는, 그 범위가 너무 넓어 어떤 부분을 공부하고 있는지도, 어디까지 공부해야할 지도 전혀 감을 잡을 수 없었는데 이렇게 강의를 수강하고 그 강의의 깊이있는 개념까지 찾아가며 공부하다보니 확실히 체계가 잡히고 개념도 탄탄히 공부해 볼 수 있는 것 같다. 해당 방식으로 공부하면 딱 몰입할 수 있을만큼 적당히 공부하는 것 같아서 다음 주에는 추가적인 규칙을 넣기보다 기존 규칙을 유지해보려고 한다. 

시스템 · 운영체제인프런워밍업운영체제발자국

강동훈

[인프런 워밍업 클럽 3기 - CS] - 1주차 발자국 (운영체제) - 3

💻 CPU 스케줄링📌 CPU 스케줄링 개요1. 프로그램들이 실행되면 메모리에 올라가 프로세서가 되고2. 프로세서들은 1개 이상의 쓰레드가 있으며3. CPU를 차지하기 위해 운영체제의 명령을 기다린다. ✅ CPU 스케줄링 고려사항1. 어떤 프로세스에게 CPU 사용권을 줘야 하나?2. CPU를 할당받은 프로세스가 얼마의 시간동안 CPU를 사용할 수 있는가?CPU Burst: 프로세스가 CPU를 할당받아 연속적으로 실행하는 구간I/O Burst: 프로세스가 입출력(I/O) 작업을 수행하는 구간 📌 다중큐✅ 프로세스 실행 과정1. 프로세스가 생성되면 준비 상태로 전환2. 준비 상태에서 CPU 사용권을 받으면 실행 상태3. 실행 중 I/O 요청은 대기 상태, 할당시간을 초과하면 준비 상태4. 작업이 끝난다면 완료 상태로 전환된다. ✅ 준비 & 대기 상태 관리1. PCB 정보 내에 우선순위 정보를 탐색하여 준비 상태 다중 큐(Ready Queue) 에 넣는다.2. 준비 상태 다중 큐에서 운영체제는 적당한 PCB를 선택하여 실행 상태로 전환시킨다. (적당한 - 스케쥴링 정책에 따라)3. I/O 요청으로 대기 상태가 된다면 I/O 작업에 따라 분류된 큐에 들어간다.4. I/O 작업이 마무리되면 인터럽트를 발생시켜 실행 상태로 전환한다.준비 & 대기 상태 -> Queue로 관리 📌 스케줄링 목표1. 리소스 사용률- CPU, I/O device2. 오버헤드 최소화- 스케쥴링 계산, 컨텍스트 스위칭의 빈도3. 공평성- 모든 프로세스 공평하게 할당- 프로세스의 중요도에 따라 상대적으로 공평하게 할당4. 처리량- 같은 시간 내 더 많은 처리5. 대기 시간- 작업 요청부터 작업 실행 전까지 대기 시간을 짧게6. 응답 시간- 작업 응답 시간을 짧게모든 목표를 동시에 달성할 수는 없다.사용자가 사용하는 시스템에 따라 목표를 다르게 설정한다.- 터치 스크린 -> 응답시간이 중요- 과학 계산 -> 처리량이 중요- 일반 목족 -> 밸런스 유지 📌 FIFOFIFO(First In First Out): 스케줄링 큐에 들어온 프로세스 순서대로 먼저 실행된다. ✅ 특징1. 한 프로세스가 완전히 끝나야 다른 프로세스가 시작함.2. 짧은 작업의 프로세스가 긴 작업의 프로세스를 대기할 수도 있음.3. I/O 작업을 대기하는 동안 CPU는 다른 작업을 하지 않음 => CPU 사용률 저하 ✅ 평균대기시간프로세스가 여러 개 실행될 때 모두가 실행되기까지의 평균 대기 시간- 프로세스_1 (Burst Time: 25초) - 대기 시간: 0초- 프로세스_2 (5초) - 대기 시간: 25초- 프로세스_3 (4초) - 대기 시간: 30초❗평균 대기 시간: 55 / 3 = 18.3초- 프로세스_3 (4초) - 대기 시간: 0초- 프로세스_2 (5초) - 대기 시간: 4초- 프로세스_1 (Burst Time: 25초) - 대기 시간: 9초❗ 평균 대기 시간: 13 / 3 = 4.3초프로세스 실행 순서에 따라 평균 대기 시간의 편차가 크기 때문에, 현대 운영체제에서는 사용 X일괄처리시스템에서 주로 사용 📌 SJFSJF(Shortest Job First): Burst Time이 가장 짧은 작업부터 우선 실행 ✅ 특징1. FIFO의 단점이었던 '실행 순서에 따른 평균 대기 시간 차이'를 극복하기 위해 설계2. 프로세스의 종료 시간를 예측하기 어려움 (Burst Time 파악이 힘듦)3. Burst Time이 긴 프로세스는 계속 뒤로 밀려가서 대기 시간이 점차 길어진다.4. 2,3 의 문제점으로 CPU 스케쥴링으로 채택되지 않음. 📌 RRRR(Round Robin): 일정 시간동안만 프로세스를 실행하고 다음 프로세스를 실행 ✅ 특징1. 타임 슬라이스(`Time Slice`) : CPU가 할당되는 일정한 시간 ✅ 평균대기시간타임 슬라이스 : 10s- 프로세스\_1 (Burst Time: 25초) - 대기 시간: 0 + 14 + 0초- 프로세스\_2 (4초) - 대기 시간: 10초- 프로세스\_3 (10초) - 대기 시간: 14초❗평균 대기 시간: 38 / 3 = 12.67초 FIFO 알고리즘과 평균 대기 시간이 비슷하다면 RR 알고리즘이 더 비효율적RR 알고리즘은 Context Switching이 일어나기 때문에 자원의 사용이 더 필요.- 타임 슬라이스가 큰 경우- 먼저 들어온 프로세스가 실행되니 FIFO 알고리즘과 동일 (타임 슬라이스: 무한대)- 웹 브라우저, 음악 플레이어가 5초마다 끊김(타임 슬라이스: 5s)- 타임 슬라이스가 작은 경우- 여러 프로세스가 동일하게 실행되는 것처럼되지만 Context Switching 처리량의 증가로 오버헤드가 너무 크다(1ms) 최적의 타임 슬라이스1. 여러 프로세스가 버벅이지 않고 동시에 실행하는 것 같은2. 오버헤드가 너무 크지 않은 운영체제 타임 슬라이스1. Windows: 20ms2. Unix: 100ms 📌 MLFQMLFQ(Multi Level Feedback Queue):✅ 가정- CPU Bound Prcess(P1): CPU 연산만 하는 프로세스 - CPU 사용률, 처리량 중요- I/O BOund Process(P2): 대부분 I/O 작업만 진행 - 응답 속도1. Time Slice가 100초일 때P2 (1초) 작업 후 I/O 작업 요청P1 (100초) 실행P1 10초 정도 작업 중, P2의 작업이 완료되어 인터럽트 발생 후 준비 큐에 삽입P1 90초 나머지 실행P2 1초 실행 I/O 작업...2. Time Slice가 1초일 때P2 (1초) 작업 후 I/O 작업 요청P1 (1초) 실행P2 I/O 작업이 마무리되지 않았기 때문에 P1 준비 큐에 삽입되었다가 바로 실행10 번 과정P2 I/O 작업 완료 후, 인터럽트 실행, 준비 큐 삽입P2 1초 실행 후 I/O작업 - 1번 CPU 사용률을 100% 지만 I/O 사용률은 10/101 (I/O 작업 시간 / 두 프로세스 총 실행시간) = 약 10%- 2번 CPU 사용률을 100% 지만 I/O 사용률은 10/11 (I/O 작업 시간 / 두 프로세스 총 실행시간) = 약 90%- 1번에 비해서 CPU와 I/O 이용률이 높아 효율적이지만- 컨텍스트 스위칭을 자주하기 때문에 P1은 손해- P2는 이득 ✅ 특징- MLFQ는 기본적으로 CPU 사용률과 I/O 사용률이 좋게 나오는 타임 슬라이스를 가진다.- CPU Bound Process는 큰 타임슬라이스를 준다.- 주어진 타임 슬라이스 내에 작업이 완료되면 I/O Bound Process, 초과하면 CPU Bound Process로 추측- 우선순위가 매겨진 여러 큐를 준비하여 우선순위가 높을 수록 타임 슬라이스가 크게 설정한다.- 타임슬라이스가 초과될수록 점처 우선순위가 낮은 큐로 이동- 결국 FIFO처럼 프로세스 연속적으로 작업이 가능 📌 더 찾아본 점❓선점형(preemptive) VS 비선점형(non-preemptive)?✅ 선점형 스케쥴링은 하나의 프로세스가 현재 사용중인 CPU의 사용권을 점유할 수 있다.반대로 비선점형 스케쥴링은 하나의 프로세스가 마무리되어야 CPU의 사용권을 할당받을 수 있다. ❓추가적인 스케쥴링 방식?✅1. SRTF(Shortest-Remaining-Time First)- SJF의 단점 "100초짜리 A가 실행 중에 1초, 2초의 B,C 프로세서가 준비 상태라면, 100 초를 기다려야 한다"- SJF는 비선점형이기 때문에 작업을 기다려야 하지만, STCF는 큐의 남아있는 작업 시간을 계산하여 CPU의 점유를 뺏는 선점형이다.- 100초 A작업 도중 2초 작업 B가 도착하면, A의 남은 작업 시간과 비교하여 짧은 B가 먼저 실행된다.2. Priority- 비선점형: 도착한 프로세스마다 우선순위가 부여되고 동시에 도착한 프로세스의 경우 우선순위로 실행- 만약 우선순위가 낮더라도 먼저 실행 중이라면 작업이 종료될 때까지 대기- 선점형: 도착한 순서가 다르더라도 프로세스의 priority에 따라 높은 우선순위 별로 CPU 점유3. MLQ(Multi-Level Queue)- 여러 개의 우선순위가 부여된 큐로 관리되며 프로세스의 우선순위에 따라 각 큐에 삽입- 프로세스의 타입, 특징, 중요도에 따라 우선순위가 부여 - I/O 작업은 백업과 같은 배치 작업보다 높은 우선순위를 갖는다.- 각 큐의 요구조건마다 다른 CPU 스케쥴링 알고리즘을 사용한다.1. 고정 우선순위 선점 스케쥴링 (선점형)- 큐별로 우선순위가 고정되어 있고, 가장 하위 큐는 상위 큐에 프로세스가 없을 때만 동작이 가능하다.- 하위 큐의 프로세스가 동작하는 도중, 상위 큐의 프로세스가 들어오면 CPU 사용권을 빼앗긴다.2. 타임 슬라이싱 (비선점형)- 큐의 우선순위 별로 CPU 사용 시간의 점유율을 산출한다. > 1순위 50% / 2순위 30% / 3순위 20%- 프로세스의 큐 간 이동이 불가하여 유연성이 떨어진다.- 특정 큐에 프로세스가 몰리거나 우선순위 큐에 의해 하위 우선순위의 프로세스 대기 시간이 길어질 수 있음(기아 현상)4. MFLQ(Multi-Level Feedback Queue)- MLQ에서 큐 간 이동이 불가하여 유연성이 부족한 문제 극복- 우선순위에 따른 여러 큐가 존재하며 프로세스의 우선순위는 동적으로 변경된다.- CPU 점유 시간을 초과하면 우선 순위가 낮아지며, 점유 시간 이내에 작업이 마무리된다면 우선 순위 유지- 에이징 - 모든 프로세스를 일정 주기마다 최상위 큐로 이동 / 오래 기다린 프로세스 상위 큐로 승격 (기아 현상 방지) 📔 회고블로그 글을 통해 "인프런 워밍업 클럽"에 대해 알게 되었고 마침 CS 공부를 계획하였던 나는 새로운 기수가 시작되자마자 바로 신청하였다.이번에 CS 로드맵에 참여하면서 목적없이 강의를 듣고 공부하기 보다는이 로드맵을 통해 어떤 것을 얻고 싶고 클럽이 진행하는 동안 어떤 것을 꾸준히 지켜나갈 것인지 정하여 공부하는 것이 나의 성장을 더 효율적으로 끌어올려 줄 것 같아, 미리 선정하고 수업에 임하였다. 🚀 최종 목표 : 더 효율적인 백엔드 개발을 위해 기본적인 운영체제 지식들을 확실히 잡아가기🚀 매주 규칙:각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분강의를 듣고 최대한 이쁘게 (?) 정리해놓기매 강의를 듣고 궁금하거나 이해가 안가는 부분은 추가적으로 더 찾아서 정리해두기 강의를 듣고 정리하는 것이 손에 익지 않아, 초반에는 공부하는 시간보다 틀을 잡는데 시간이 더 소요되었지만점차 강의를 듣고 정리하는 방법이 손에 익으면서 정리하는 시간이 많이 줄었고 요약에 대한 아웃라인도 대강 잡혀나갔다. 다만 회고를 하다보니 목표는 "백엔드 관점에서의 운영체제"로 설정하였는데, 1주차는 운영체제에 대해서만 공부를 한 것 같아서 다음 주부터는 각 강의를 듣고 백엔드 관점에서 고민해보는 시간을 가져보고 다양한 의견을 GPT와 주고 받으며 정리해보면 좋을 것 같다. 매 강의 내용을 백엔드 관점에서 고민해보고 GPT와 대화를 통해 정리    

시스템 · 운영체제운영체제워밍업클럽감자CS

강동훈

[인프런 워밍업 클럽 3기 - CS] - 1주차 발자국 (운영체제) - 2

💻 프로세스와 쓰레드 📌 프로그램과 프로세스 프로그램: 저장장치에 저장된 명령문의 집합체 (Application, .exe,,,) 프로세스: 실행 중인 프로그램. "실행 중"은 하드디스크에 저장된 프로그램이 메모리에 올라갔을 때를 의미한다. 프로그램은 저장장치에 저장만 되는 수동적인 존재이지만, 프로세스는 메모리, CPU 스케줄링 알고리즘, 입/출력도 사용하는 능동적인 존재.  ✅ 프로세스의 구조1. 코드 영역 - 자신을 실행한는 코드가 저장2. 데이터 영역 - 스태틱 변수와 전역 변수 저장3. 스택 영역 - 지역 변수와 함수 호출을 위한 정보 저장4. 힙 영역 - 프로그래머가 동적으로 메모리를 할당 - free(), malloc()을 통해 메모리 관리 ✅ 컴파일 과정1. 전처리기를 통해 매크로로 정의한 숫자를 치환하고 필요한 파일을 불러온다.2. 파일의 확장자(.i)3. 컴파일 (C언어 > 어셈블리어)4. 파일의 확장자(.s)5. 어셈블리어 > 기계어6. 파일의 확장자(.o)7. 링킹을 통해 파일의 확장자(.exe)로 변경 ✅ 프로세스 실행 과정1. 두 숫자를 더하는 코드를 작성2. 컴파일3. .exe 파일을 실행4. 메모리에 파일이 올라감 (프로세스)5. CPU 내 제어장치가 파일을 읽어가며 레지스터 저장 및 연산6. 결과 메모리 저장  📌 멀티프로그래밍과 멀티프로세싱 ✅ 유니 프로그래밍(메모리 관점) 메모리에 오직 하나의 프로세스가 올라온 것 (I/O 작업이 일어나면 대기) ✅ 멀티 프로그래밍(메모리 관점) 메모리에 여러 개의 프로세스가 올라온 것 (I/O 작업 대기 시, 다른 프로세스 실행) ✅ 멀티 테스킹메모리에 올라온 여러 프로세스들을 번갈아가며 짧게 실행시키며 동시에 실행시키는 체감 ✅ 멀티 프로세싱(CPU 관점) CPU가 여러 개 있는 것을 멀티 프로세서 라고 하며, 멀티 프로세서로 작업하는 것을 멀티 프로세싱 이라고 한다. 과거-> 유니 프로그래밍 + 스와핑 방식1. 메모리에 하나의 프로세스를 올려 처리 한 후, 저장장치에 저장2. 다른 저장장치의 프로세스를 메모리에 올려 CPU 처리3. 스와핑이란 하나의 프로세스가 마무리되면 저장장치로 내리고 새로운 프로세스 메모리에 올리는 기법 현재-> 멀티 프로그래밍 + 멀티 프로세싱 방식1. 메모리에 여러 프로세스가 올라오고2. 시분할 처리를 통해 각각의 프로세스 짧은 시간동안 교대로 처리  📌 PCB운영체제는 여러 개의 프로세스를 전부 관리하고 공평하게 실행해야 한다.프로세스 관리는 PCB(Proccess Control Block) 를 생성하여 연결리스트의 자료구조로 관리한다. 프로세스 종료 시에는 연결리스트에서 해당 PCB를 제거한다.  ✅ PCB 구조1. 포인터: 부모, 자식 프로세스에 대한 포인터를 저장 - 프로세스 계층 구조 파악 및 프로세스 종료 시, 프로세스 상태 추적 가능2. 프로세스 상태: 현재 어떤 상태에 있는지 나타내는 정보 (생성, 준비, 실행, 대기, 완료)3. 프로세스 ID: 프로세스 식별자 저장 - 프로세스는 고유한 PID를 가짐 - 프로세스 구분하는데 사용되며 시스템 내에 유일해야 함4. 프로그램 카운터: 다음에 실행될 명령어의 주소를 저장 - 현재 실행 중인 명령어의 다음 주소를 저장 - Context Switch가 발생하면, 해당 프로세스가 진행해야 할 명령어의 주소로 복구5. 레지스터 정보: 프로세스가 실행될 때 사용된 레저스터 정보 - 프로세스 중단, 전환 시, PCB에 레지스터 값 저장한 후, 다시 실행될 때 복구6. 메모리 관련 정보: 프로세스가 메모리에 저장된 위치 정보 - 프로세스가 사용하는 메모리 영역(코드, 데이터, 스택, 힙,,)과 주소를 관리 - 가상 메모리 시스템에서 중요 - 프로세스 간 메모리 영역 분리7. CPU 스케줄링 정보: 우선순위, 최종 실행시간, 점유 시간 등 CPU를 얼마나 효율적으로 사용할 지에 대한 정보8. I/O 상태 정보 : 프로세스가 현재 어떤 입출력 작업을 수행 중인지에 대한 정보9. 열린 파일 목록(Open File List) : 현재 열고 있는 파일들의 목록 관리  📌 프로세스 상태1. 생성 (New): 메모리에 프로그램 적재 요청 - PCB 생성2. 준비 (Ready): CPU 자원 할당을 위해 기다리는 상태3. 대기 (Waiting): 입출력 요청 시, 입출력이 완료될 때까지 대기하는 상태 - 입출력 완료까지 CPU 대기는 비효율적 - 입출력을 기다리는 것은 대기 상태로 두고 CPU는 다른 작업 (시스템 자원 낭비 최소화) - 입출력이 완료되면 준비 상태로 전환4. 실행 (Running): 스케쥴러에 의해 CPU를 할당받아, 부여된 시간만큼 실행되는 상태 - CPU 개수만큼 실행 프로세스가 생성 - 부여된 시간을 초과하면 CPU를 강제로 빼앗으며 준비 상태로 전환. - 실행 도중, 입출력 요청을 하면 다시 준비 상태로 전환5. 완료 (Terminated): 프로세스 종료 - 메모리에서 데이터 제거 및 PCB 제거  📌 컨텍스트 스위칭프로세스를 실행 중인 상태에서 다른 프로세스를 실행하기 위해 실행중인 프로세스 상태를 저장하고 교체운영체제에 의해 실행 중인 프로세스의 내용이 PCB에 수정되고, 다음 프로세스의 PCB 내용대로 CPU가 세팅 됨.  ✅ 과정1. 프로세스 A의 CPU 점유 시간 초과2. 인터럽트 발생3. CPU의 레지스터 값 등을 PCB A에 저장4. PCB B를 참조해서 이전 프로세스 B의 작업을 이어감 - 프로그램 카운터(다음에 실행될 명령어 주소)를 통해 이어서 명령어 실행 가능5. 프로세스 B의 CPU 점유 시간 초과6. 인터럽트 발생7. CPU의 레지스터 값 등을 PCB B에 저장  📌 프로세스 생성과 종료 프로세스 생성1. .exe 실행2. 코드 영역, 데이터 영역를 메모리에 올려 스택과 힙 구조의 공간을 확보.3. PCB를 만들어서 값을 초기화컴퓨터 부팅 시에 0번 프로세스가 한번만 생성되며, 나머지 실행되는 모든 프로세스는 fork()로 복사하여 자식프로세스를 생성한다.exec()함수를 통해 자식 프로세스의 코드를 복사된 부모 프로세스의 코드에 덮어쓸 수 있다. #include <stdio.h> #include <unistd.h> int main() { int pid; pid = fork(); // 부모 프로세스는 pid = 1; // 자식 프로세스는 pid > 1; // 실패 시 -1 리턴 if(pid == 0){ // 자식 execlp("InternetBrowser", "0", NULL); exit(0); } else { // 부모 wait(NULL); printf("인터넷 브라우저 닫힘"); exit(0); } }1. 해당 프로세스를 fork()를 통해 부모와 자식 프로세스는 동일한 코드를 갖고 있는다. (pid는 서로 다름)2. CPU 스케쥴링에 따라 프로세스가 실행된다.3. 만약 부모 프로세스가 먼저 실행되면, 조건문에 의해 else절이 실행4. wait() 함수는 exit() 신호가 오기 전까지 하위 코드를 실행하지 않음5. 스케쥴링에 의해 자식 프로세스로 스위칭6. if절이 실행되어 execlp()를 통해 InternetBrowser 프로세스가 실행7. 인터넷 브라우저 실행에 실패할 경우, exit() 함수가 실행 (성공 시, InternetBrowser 프로세스 실행)8. 스케쥴링에 의해 부모 프로세스로 스위칭9. 자식 프로세스의 exit() 신호로 wait() 함수를 통과하여 하위 코드가 실행exit(): 자식 프로세스가 부모 프로세스에게 정상 종료를 알리는 함수부모 프로세스는 자식 프로세스의 exit status를 읽고 자식 프로세스를 정리❗ 부모 프로세스가 자식 프로세스보다 먼저 종료되거나, 자식 프로세스의 비정상 종료 시 좀비 프로세스라고 부른다.  📌 쓰레드프로세스가 생성될 때마다 PCB와 메모리(코드, 데이터, 스택, 힙 등)영역을 만들어줘야 한다. 웹브라우저의 탭이 추가될 때마다 프로세스의 복사가 계속해서 이루어진다면 시스템 자원의 낭비가 점차 늘어난다.=> 하나의 프로세스 안에 1개 이상의 쓰레드를 생성.운영체제는 프로세스 내 쓰레드 단위로 관리 비교1. 안정성: 프로세스는 독립적이기 때문에 다른 프로세스의 영향을 받지 않지만 쓰레드는 자원을 공유하기에 프로세스에 문제가 생기면 모든 프로세스에 영향을 끼친다.2. 속도와 자원: 각 프로세스는 IPC를 통해 다른 프로세스와 통신을 해야하니 오버헤드가 크다. 쓰레드간에 통신은 자원이 공유되니 오버헤드가 적다.  📌 더 찾아본 점❓프로그래밍 개념 구분?❓멀티 프로그래밍과 멀티 태스킹의 차이?✅ 멀티 프로그래밍은 메모리 관점에서 여러 프로그램을 메모리에 올려두고 CPU가 필요할 때마다 실행멀티 테스킹은 CPU 관점에서 여러 작업을 빠르게 전환(시분할)하며 동시에 작업하는 것처럼 보임 ❓`exec()`함수는 무엇인가?✅ 자식 프로세스가 새로운 프로그램을 실행할 때, 자식 프로세스의 코드, 데이터, 힙, 스택 등을 새로운 프로그램으로 덮어쓰는 함수.- 자식 프로세스의 메모리 공간을 새로운 프로그램으로 대체하며 exec() 이후에는 자식 프로세스 코드가 실행되지 않음.- execl(), execp(), execv(), execvp(), execlp() 등이 exec()함수의 계열에 속한다.- 예제 코드에서 execlp("InternetBrowser", "0", NULL); 가 성공적으로 실행되면 자식 프로세스 코드가 새로운 프로세스로 대체되었기에, 하위 exit(0) 코드는 영영 실행되지 못하지만 실패 시에는 하위 코드가 실행된다. ❓좀비 프로세스는 무엇인가?✅ 부모 프로세스가 자식 프로세스의 종료 상태를 수거하지 않아 남아있는 프로세스- 실행되지 않은 채로 PCB만 남아있음- 메모리를 계속 점유하고 있어, 시스템 자원을 낭비함 ❓쓰레드는 어떤 정보를 포함하고 있는가?✅ TCB(Thread Control Block)에 쓰레드의 상태 및 제어 정보를 저장1. TID & PID: 쓰레드 식별 고유 ID, 쓰레드가 속한 프로세스 ID2. State: 쓰레드의 실행 상태 (`Running`, Waiting, Ready, Terminated)3. Register Contents: 스위칭 복원을 위한 CPU 레지스터 정보4. Program Counter: 쓰레드 마지막 명령어 주소5. Stack Pointer: 쓰레드 스택에서 현재 실행 중인 함수 위치 포인터6. Priority : 여러 쓰레드 동시 실행 시, 우선순위 

시스템 · 운영체제운영체제'워밍업클럽CS감자

ostep / 가상화 / CPU / 원리: 제한적 직접 실행 (한글판 9장, 영문판 6장)

들어가며이 책에서는 어떤 문제를 해결하는 개념을 다룰 때 다음의 2가지로 나누어 설명하고 있습니다.저수준 기법 (mechanism)어떻게 문제를 해결할 것인지예: 어떻게 CPU 가상화를 할 것인지 -> 제한적 직접 실행고수준 정책 (policy)문제를 해결해서 무엇을 할 것인지예: 가상화한 CPU자원을 어떤 프로세스에게 할당할 것인지 -> CPU 스케줄링CPU 가상화들어가며CPU라는 자원은 시분할로 가상화하는 것이 자연스럽다.CPU 가상화 기법의 필요조건들빨라야 한다.기법: 제한적 "직접 실행"사용자 프로세스는 가상의 명령어를 해석하는 것이 아니라, 하드웨어에서 지원하는 명령어를 직접 실행한다.예를 들어서 x86 CPU에서 돌아가는 OS의 경우 x86 기계어를 직접 실행한다.일부 명령어는 사용자 프로세스가 사용할 수 없어야 한다.예: 입출력장치에 직접 접근하는 명령어는 사용자 프로세스가 아닌 커널에서만 사용할 수 있다.기법: "제한적" 직접 실행하드웨어 지원 기능: mode bit, trap 및 return-from-trap 명령어 OS의 특정 기법을 구현하기 위해서는 하드웨어가 지원하는 기능과 운영체제 소프트웨어가 협력하는 경우가 많다.mode bitmode bit은 CPU에 존재하며 mode bit의 세팅 여부에 따라 커널 모드(kernel mode)와 사용자 모드(user mode)로 나뉜다.CPU는 사용자 모드인 경우 일부 명령어들의 실행만 지원한다.지원하지 않는 명령어를 실행할 경우 interrupt가 발생하여 OS가 문제의 프로세스를 kill할 수 있다.trap, return-from-trap 명령어위와 같이 사용자 프로세스는 일부 명령어를 직접 실행하지 못하고 OS를 통해 간접적으로 실행해야 한다. 이 과정에서 사용할 수 있는 명령어들이 trap 및 return-from-trap 명령어들이다.trap 명령어kernel mode로 전환하고, 해당 trap과 관련된 커널의 코드가 실행된다.이 때 trap 0xdeadbeef와 같이 trap 명령어에 임의의 주소값을 전달할 수 있다면 사용자 프로세스가 임의의 커널 코드를 실행시킬 수 있는 큰 문제가 일어난다.따라서 trap 명령어 실행 시 실행시킬 수 있는 handler가 몇 개로 정해져 있다. 이를 trap table이라 한다. trap 0x80과 같이 trap 명령어는 index를 전달하는 방식으로 동작한다.CPU에서 trap handler를 등록하는 방법을 별도로 제공해주며, 커널은 이를 사용하여 부팅 시 trap table을 초기화한다.x86 아키텍처에서는 trap 명령어를 int라고 부르지만, 교재와 강의에서는 trap 명령어와 인터럽트를 구분해서 설명하고 있다.필자 주: 공룡책에서 시스템 호출은 소프트웨어 인터럽트 중 하나로 처리된다고 말하는 것으로 볼 때, 여기서 ostep에서 구분하고자 하는 인터럽트는 하드웨어 인터럽트로 추정됩니다.return-from-trap 명령어user mode로 전환하고 trap 명령어를 호출한 곳으로 되돌아간다.⚠ 필자 주: 인터넷에서 잠깐 찾아보았을 때 trap이라는 단어가 다른 맥락에서도 사용됨을 확인했습니다. 조사한 바로는 trap 및 여러 단어들의 용례가 사용되는 의미가 하나로 합의되지는 않았다고 합니다. 하지만 여기서도 공룡책에서도 "trap instruction"라는 용어가 일관적으로 사용되는 것으로 보았을 때 OS 공부할 때 "trap 명령어"라는 말을 사용해도 무방해 보입니다.사용자 프로세스 하나가 실행 중일 때 제어권을 가져와서 다른 사용자 프로세스로 넘기는 과정이 필요하다.예전에 사용했던 기법: 협조(cooperative) 방식사용자 프로세스가 제어권을 양보할 때까지 OS가 기다린다.문제: 사용자 프로세스가 프로그래머의 실수든 고의든 오랫동안 제어권을 양보하지 않으면 OS는 제어권을 가져올 수 없다.현재 사용하는 기법: 비협조 방식하드웨어 지원 기능: timer interruptCPU에서 일정 갯수의 클럭 실행 후 발생시키는 인터럽트timer interrupt 발생 시 제어권이 interrupt handler로 넘어가 OS가 다시 제어권을 가져올 수 있다.문맥 전환 (context switch)문맥 전환 시 저장해야 하는 데이터: 레지스터, PC, SP출처강의: https://pages.cs.wisc.edu/~remzi/Classes/537/Fall2021/Discussion/videos.html책: https://pages.cs.wisc.edu/~remzi/OSTEP/Korean/

시스템 · 운영체제osostep

야나

[그림으로 쉽게 배우는 운영체제] 운영체제 프로세스 쓰레드 CPU 스케줄링(1)

* 해당 포스팅은 그림으로 쉽게 배우는 운영체제 - by 감자 멘토님 강의를 수강후 작성하는 글 입니다. KEYWORD- 운영체제: 하드웨어 자원을 관리하고 사용자와 시스템 간 인터페이스를 제공하는 소프트웨어.- 프로세스: 실행 중인 프로그램으로, CPU에서 작업이 진행되는 단위.- 프로그램: 실행 가능하지만 실행되지 않은 상태의 명령어 집합.- 쓰레드: 프로세스 내에서 실행되는 작은 작업 단위.- CPU: 명령어를 해석하고 연산을 수행하는 컴퓨터의 중앙 처리 장치.- 메모리: 데이터를 저장하고 프로세스가 작업을 수행할 때 사용되는 공간.- 애니악: 최초의 범용 전자 디지털 컴퓨터.- 펀치카드: 데이터를 입력하기 위해 구멍을 뚫어 정보를 표현하던 초기 입력 장치.- I/O 디바이스 컨트롤러: 입출력 장치와 시스템 간의 통신을 제어하는 장치.- 싱글스트림 배치시스템: 작업을 순차적으로 처리하는 초기 컴퓨터 운영 방식.- 시분할 시스템: 여러 사용자가 시스템을 동시에 사용할 수 있도록 자원을 할당하는 시스템.- 파일시스템: 데이터를 파일 형태로 저장하고 관리하는 시스템.- 유닉스: 멀티태스킹, 멀티유저 환경을 지원하는 운영체제.- 유니프로그래밍: 한 번에 하나의 프로그램만 실행하는 방식.- 멀티프로그래밍: 메모리에 여러 프로그램을 동시에 올려서 CPU가 번갈아 가며 처리하는 방식.- 멀티프로세싱: 여러 CPU가 동시에 여러 프로세스를 처리하는 방식.- 시분할처리: CPU 시간을 여러 작업에 나누어 사용하는 처리 방식.- 스와핑: 메모리에서 프로세스를 내보내고 다시 불러오는 과정.- 베이스 레지스터: 프로세스의 메모리 시작 주소를 저장하는 레지스터.- 커널: 운영체제의 핵심 부분으로 하드웨어와 소프트웨어 자원을 관리함.- 인터페이스: 시스템과 사용자 또는 다른 시스템 간의 상호작용을 위한 접점.- GUI: 그래픽을 통해 사용자와 컴퓨터가 상호작용하는 방식.- CLI: 명령어를 통해 사용자와 컴퓨터가 상호작용하는 방식.- 시스템 콜: 응용 프로그램이 운영체제의 기능을 요청할 때 사용하는 함수.- 드라이버: 하드웨어와 운영체제가 통신할 수 있도록 돕는 소프트웨어.- 그래픽카드: 그래픽 처리와 관련된 연산을 담당하는 하드웨어.- 폰노이만 구조: 프로그램과 데이터를 메모리에 저장하고 처리하는 컴퓨터 구조.- 메인보드: CPU, 메모리, I/O 장치가 연결된 컴퓨터의 중심 회로 기판.- 제어장치: CPU 내부에서 명령어의 실행을 제어하는 장치.- 산술논리 연산장치: CPU 내부에서 산술 및 논리 연산을 수행하는 장치.- 레지스터: CPU 내에서 데이터와 명령어를 일시적으로 저장하는 고속 메모리.- 프로그램 카운터: 다음에 실행할 명령어의 주소를 저장하는 레지스터.- 메모리 주소 레지스터: 메모리 내 데이터의 주소를 저장하는 레지스터.- 메모리 버퍼 레지스터: 메모리에서 읽거나 쓸 데이터를 임시 저장하는 레지스터.- 명령어 레지스터: 현재 실행 중인 명령어를 저장하는 레지스터.- RAM: 휘발성 메모리로, 데이터를 일시적으로 저장함.- ROM: 비휘발성 메모리로, 데이터를 영구적으로 저장함.- 바이오스: 컴퓨터 부팅 시 하드웨어 초기화와 운영체제 로딩을 관리하는 펌웨어.- 폴링방식: CPU가 장치의 상태를 주기적으로 확인하는 방식.- 인터럽트: 외부 신호로 CPU의 작업을 중단하고 다른 작업을 처리하게 하는 신호.- 인터럽트 서비스 루틴: 인터럽트 발생 시 실행되는 코드.- Code 영역: 프로그램의 명령어가 저장되는 메모리 영역.- Data 영역: 초기화된 전역 변수와 정적 변수가 저장되는 메모리 영역.- Heap 영역: 동적으로 할당된 메모리 공간.- Stack 영역: 함수 호출 시 생성되는 지역 변수와 함수 정보가 저장되는 메모리 영역.- 컴파일: 고급 프로그래밍 언어를 기계어로 번역하는 과정.- 어셈블리어: 기계어와 1:1 대응하는 저급 프로그래밍 언어.- 기계어: CPU가 직접 실행할 수 있는 이진 코드.- 링커: 여러 목적 파일을 결합해 실행 가능한 프로그램으로 만드는 도구.- 연결리스트: 노드가 서로 연결된 데이터 구조로, 각 노드는 데이터와 다음 노드의 참조를 포함함.- PCB: 프로세스 제어 블록으로, 프로세스에 대한 정보를 저장하는 데이터 구조.- 포인터: 메모리 주소를 가리키는 변수.- 컨텍스트 스위칭: CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 작업.- 프로그램 카운터: 현재 실행 중인 명령어의 다음 명령어 주소를 가리키는 레지스터.- 부모프로세스: 다른 프로세스를 생성하는 프로세스.- 자식프로세스: 부모 프로세스에 의해 생성된 프로세스.- fork 함수: 새로운 프로세스를 생성하는 시스템 호출.- exit 함수: 프로세스가 실행을 종료할 때 호출하는 함수.- 좀비 프로세스: 실행이 종료되었으나 부모 프로세스가 회수하지 않은 프로세스.- IPC: 프로세스 간 통신으로, 프로세스 간 데이터를 주고받는 방법.- TCB: 쓰레드 제어 블록으로, 쓰레드의 실행 상태를 저장하는 데이터 구조.- 프로세스와 쓰레드 차이: 프로세스는 독립된 메모리 공간을 갖고, 쓰레드는 프로세스 내 자원을 공유함.- CPU Burst: 프로세스가 CPU를 사용하는 시간.- I/O Burst: 프로세스가 I/O 작업을 수행하는 시간.- 큐 자료구조(Queue): FIFO 방식으로 데이터를 저장하고 처리하는 자료구조.- CPU 스케줄링: 여러 프로세스 간에 CPU 시간을 배분하는 방식.- 생성상태: 프로세스가 생성된 초기 상태.- 준비상태: 프로세스가 실행 준비가 된 상태.- 대기상태: 프로세스가 입출력 작업을 기다리는 상태.- 실행상태: 프로세스가 CPU에서 실행 중인 상태.- 완료상태: 프로세스가 실행을 완료한 상태.- 스케줄러: CPU 자원을 프로세스에 할당하는 운영체제의 구성 요소.- 오버헤드: 시스템 자원 사용 시 발생하는 추가 비용.- 스케줄링 알고리즘: CPU 시간을 프로세스에 할당하는 방법을 결정하는 알고리즘.- FIFO (First In, First Out): 먼저 들어온 데이터가 먼저 나가는 방식으로, 큐 자료구조에서 사용하는 원칙.

시스템 · 운영체제운영체제프로세스쓰레드CPU

수뼈

인프런 워밍업 클럽 스터디 3기 - CS 전공지식(운영체제) <셋째 주 미션>

1. 메모리의 종류는 어떤 것들이 있나요? 각 메모리의 특징도 함께 적어주세요.강의에서 배운 메모리에는 Register, Cache Memory, RAM, 보조저장장치(SSD/HDD)가 있습니다. 나열한 순서대로 처리 속도가 느려진다는 것이 공통된 특징입니다. 각 메모리의 고유 특징은 다음과 같습니다.Register는 명령어나 연산의 중간 결과값 등을 일시 저장하는 임시 기억장치로, 보통 CPU 내부에 위치합니다. CPU가 연산해야 할 데이터를 RAM에서 가져와 여기에 저장한 후에 연산을 시작합니다. 따라서, CPU의 연산이 이루어지는 곳이라는 점이 차별적 특징입니다.Cache Memory는 CPU와 메인 메모리 간 데이터 접근 속도의 차이를 최소화하기 위해 사용되는 고속 임시 저장소입니다. CPU가 자주 사용할 만한 데이터를 RAM에서 미리 가져와놓고(=Caching), CPU가 필요할 때 RAM보다 우선적으로 접근하도록 하는 용도로 쓰입니다. Cache Hit이 많으면 시스템의 성능이 올라가겠지만 Cache Miss가 많으면 추가 Latency가 발생해 오히려 Cache Memory가 없는 시스템보다도 시스템의 성능이 떨어질 수 있으므로 Cache Hit Ratio를 향상시키는 게 중요합니다.RAM(Random Access Memory)는 CPU가 즉각적으로 접근할 수 있으며, 프로그램 실행과 데이터 처리를 위해 일시적으로 명령어나 데이터를 저장하는 휘발성 메모리 장치입니다. CPU에서 직접 접근이 가능한 유일한 저장 장치라는 게 가장 큰 특징입니다.마지막으로 보조저장장치(SSD/HDD)는 데이터의 장기 저장을 목적으로 설계된 비휘발성(Non-volatile) 메모리입니다. 시스템에 전원이 들어오지 않아도 저장된 데이터가 지워지지 않는다는 고유 특징을 갖고 있습니다.2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터(Boundary Register)입니다. 경계 레지스터에는 유저 및 응용프로그램이 접근하면 안 되는 OS 영역의 크기 정보가 들어 있습니다. MMU는 사용자의 요청 가상 주소가 Base Register의 값과 Boundary Register의 값을 더한 벗어나는지 검사하고, 만약 벗어났다면 OS 영역을 침범했다고 판단하고 그 프로세스를 종료시킵니다.3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식은 외부 단편화로 인한 Overhead가 발생한다는 단점이 있지만, 각 논리 영역을 다른 프로세스와 공유하기 위한 추가 분할 작업을 할 필요 없고 각 영역에 대한 메모리 접근 보호에도 편의성이 높다는 장점이 있다. 한편 고정 분할 방식은 구현이 쉽고 오버헤드가 적다는 장점과 내부 단편화로 인한 Overhead라는 단점이 있습니다. 현대에는 이 두 방식을 혼합해 외부 단편화 문제를 없애고 내부 단편화 시 남는 메모리 공간을 최소화한 버디 시스템을 활용합니다.4. CPU 사용률을 올리기 위해 멀티프로그래밍을 했지만, 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워지는 것을 뭐라고 할까요?스레싱(Thrashing)입니다. 이 문제를 해결하려면 하드웨어적으로는 물리 메모리 증설로 해결할 수 있으며, 소프트웨어적으로는 Working Set Model을 활용해 완화할 수 있습니다.5. HDD나 SSD는 컴퓨터를 실행시키는 데 꼭 필요한 걸까요? 이유를 함께 적어주세요.컴퓨터를 '연산 장치'로 규정한다면 필요 없겠지만, 'Personal Virtual Workspace'로 본다면 꼭 필요하다고 생각합니다. 저는 몸이 불편해 현실에서 할 수 있는 작업이 매우 제한되어 있고, 따라서 이미 매우 범용적으로 컴퓨터를 활용하는 현대인들과 비교해서도 압도적으로 많은 작업에 컴퓨터를 활용하고 있습니다. 비휘발성 보조저장장치가 없다면 제가 작업한 것들을 유지하기 위해 컴퓨터를 24/7 켜놓거나 클라우드 공간에 업로드해야 합니다. 전자는 전기세 폭탄 문제와 정전 등 대처 불가능한 외부 문제를, 후자는 보안 문제가 있습니다. 이건 좀 비논리적이고 가벼운 설명이었고(한 번쯤 해 보고 싶었습니다 ㅋㅋ), Computer Architecture적 관점에서도 약 30GB 정도인 윈도우11 기준으로 OS 설치에만 30GB의 RAM이 필요하니 컴퓨터 부품값이 현격히 상승합니다.6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제하더라도 파일의 데이터는 지우지 않고 헤더 정보만 지우는 것이기 때문입니다. 유저가 파일을 삭제하면 파일 할당 테이블의 헤더 정보만 삭제한 뒤, 헤더가 없는 블록을 Free Block List에 따로 관리합니다.

시스템 · 운영체제운영체제

이지민

인프런 워밍업 클럽 CS 3기 3주차 미션 (운영체제)

운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터 - 가장 빠른 기억장소로 CPU내에 존재하며 전원이 공급되지 않으면 데이터가 사라지는 휘발성 메모리 - 레지스터의 크기에 따라 32bit CPU, 64bit CPU로 나뉨캐시 -레지스터와 메모리의 중간 다리 역할을 하는 메모리- 레지스터가 필요로 할 것 같은 데이터를 메인메모리에서 미리 가져와서 저장해두는 장소 - 휘발성 메모리 - 성능 상의 이유로 L1, L2, L3등 여러 개가 존재메인 메모리 - 실제 운영체제와 다른 프로세스들이 올라가는 공간 - 전원이 공급되지 않으면 데이터가 사라지는 휘발성 메모리 - 보조저장장치보다 가격이 비싸고 휘발성이기 때문에 실행 중인 프로그램만 올림보조기억장치 - 가격이 저렴하고 전원이 공급되지 않아도 데이터가 지워지지 않는 비휘발성 메모리사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요? 경계 레지스터메모리 관리자가 사용자 프로세스가 경계 레지스터의 값을 벗어났는지 검사하고 만약 벗어났다면 그 프로세스를 종료시킵니다. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요? 가변 분할 방식은 프로세스의 크기에 딱 맞게 메모리가 할당되기 때문에 내부단편화 문제가 발생하지 않으나 메모리에 충분한 공간이 있음에도 연속된 빈 공간이 부족하여 메모리를 할당할 수 없는 외부단편화 문제가 발생할 수 있습니다.고정 분할 방식은 메모리를 같은 크기로 나누기 때문에 구현이 간단하고 오버헤드가 작으나 고정 크기가 프로세스가 필요한 크기보다 클 때 내부의 빈 공간이 사용되지 않고 낭비되는 문제인 내부단편화가 발생합니다.CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?CPU 사용률을 올리기 위해 멀티프로그래밍의 정도를 올렸지만 메모리 부족으로 인해 잦은 스왑이 일어나 CPU 사용률은 계속 떨어지게 되는 현상을 스레싱(Thrashing)이라고 합니다.HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?메인 메모리의 경우 휘발성 메모리로 전원이 끊기면 모든 데이터가 삭제됩니다. 따라서 전원이 끊겨도 운영체제나 다른 프로그램들을 안전하게 보관할 필요가 있으므로 보조기억장치는 반드시 필요합니다.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일시스템은 빈 공간을 효율적으로 관리하기 위해 빈 공간을 모아둔 free block list를 가지고 있습니다. 파일을 삭제하면 데이터까지 삭제되는 것이 아니라 파일의 헤더만을 지우고 free block list에 추가하기 때문에 포렌식을 통해 파일의 데이터를 복구할 수 있습니다.

시스템 · 운영체제

jhworld

인프런 워밍업 클럽 CS - 3주차 운영체제 미션

운영체제 1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터CPU 내부에 위치한 메모리로, 메모리 중 속도가 가장 빠르지만 용량이 매우 작다.캐시메인 메모리에서 CPU까지 데이터를 가져오는 데 시간이 다소 걸리는 편이다. 이를 개선하기 위해 자주 사용하는 데이터를 캐시에 저장하여 속도를 높이는 역할을 한다. L1, L2, L3로 나뉘며, L1이 가장 빠르지만 용량이 작고, L3는 상대적으로 느리지만 용량이 크다.메인 메모리 (RAM)실행 중인 프로그램과 데이터를 저장하는 휘발성 메모리로, 전원이 꺼지면 데이터가 사라진다.보조 저장 장치 (HDD, SSD)가장 용량이 크지만 속도가 메모리보다 느리다. 전원을 꺼도 데이터가 보존된다. 2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터 3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식프로세스의 크기에 맞게 동적으로 메모리에 할당하는 방식으로 메모리를 효율적으로 사용할 수 있다는 장점이 있다. 하지만 프로세스가 종료되면서 메모리의 빈 공간이 여기저기 흩어지면 외부 단편화가 발생할 수 있다는 단점이 있다.고정 분할 방식미리 정해진 크기로 나누어진 메모리 공간에 프로세스를 할당하는 방식으로 관리 방식이 단순하고 할당 속도가 빠르다는 장점이 있다. 하지만 프로세스 크기가 파티션보다 작으면 남는 공간이 생겨 내부 단편화가 발생하는 단점이 있다. 4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스래싱CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 페이지 부재가 너무 자주 발생하여 CPU가 대기상태에 빠지는 현상을 스래싱이라고 한다. 5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?없어도 실행가능하지만 데이터를 저장하기 위해서는 HDD나 SSD가 필요하다. 6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제하면 파일 데이터 자체를 삭제하는 것이 아니라 저장된 위치를 가리키는 정보만 삭제되므로 실제 데이터는 디스크에 그대로 남아 있다. 그래서 포렌식으로 파일을 복구할 수 있는 것이다.

시스템 · 운영체제

강동훈

[인프런 워밍업 클럽 3기 - CS] - 3주차 미션 (운영체제)

메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요. 레지스터CPU 내에 존재하며 가장 빠른 기억장치휘발성 메모리(컴퓨터가 종료되면 데이터가 사라짐)적은 용량, 높은 가격캐시레지스터와 메인 메모리의 속도 차이를 줄이기 위해 메인 메모리에서 미리 필요할 것 같은 데이터를 미리 저장휘발성 메모리L1 ~ L3 여러 개의 캐시로 구분메인메모리실제 운영체제와 프로세스가 저장되는 공간휘발성 메모라보조저장장치비휘발성 메모리(컴퓨터가 종료되어도 데이터가 사라지지 않음)프로그램, 파일 등을 저장 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?메모리의 운영체제 영역에 사용자 프로세스가 침범하게 되면 운영체제가 동작하지 않을 수도 있기 때문에, 경계 레지스터는 사용자 프로세스가 접근할 수 있는 메모리 영역을 제한하여 운영체제의 메모리에 침범하지 못하도록 보호하는 역할을 한다. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식은 프로세스의 크기에 따라 메모리를 분할하여 동적으로 할당하는 방식을 의미한다. 필요한 크기만큼 할당하기에 메모리의 활용도나 다양한 크기의 프로세스를 한 번에 저장할 수 있다는 장점이 있다. 단점으로는 분할된 공간이 일정하지 않아, 외부 단편화가 발생하고 비어있는 메모리가 많아진다면 조각 모음이 필요해진다는 단점이 있다. 세그멘테이션 또한 가변 분할 방식이며, 프로세스의 모듈을 세그먼트로 구분하여 필요한 모듈을 분리하여 메모리에 올려 관리할 수 있다는 장점이 있다. 고정 분할 방식은 메모리를 정해진 크기의 파티션으로 나누어 프로세스를 할당하는 방식을 의미한다. 정해진 크기에 맞춰 프로세스가 분할되어 저장되기에 구현이 빠르고 오버헤드가 적으며 외부 단편화가 발생하지 않는다는 장점이 있다. 하지만 파티션의 크기보다 작은 프로세스가 저장되면 내부 단편화가 발생한다는 단점이 있다. 페이징은 고정 분할 방식이며 프로세스를 일정한 페이지로 분할하여 프로세스를 나누고 메인 메모리는 프레임으로 나누어 페이지 테이블을 통해 논리 주소를 물리 주소로 변환시킬 수 있다. 고정 분할 방식은 고정된 크기에 따라서 메모리를 분할하는 기법을 의미한다. 페이징이라고도 하며,CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?멀티 프로그래밍이란 CPU가 한 번에 여러 개의 프로세스를 실행하는 방식을 의미한다. 메모리에 여러 프로세스를 올려 스케쥴링 기법에 따라서 효율적으로 CPU 사용률을 높이는 방식이다. 하지만 메인 메모리의 공간에는 물리적으로 한계가 있기 때문에 여러 프로세스가 실행될 수록 메인 메모리에 저장할 수 있는 공간이 부족해져 필요하지 않은 페이지는 스왑 영역에 저장되게 된다. 이 때, 계속되는 컨텍스트 스위칭으로 찾으려는 데이터가 메인 메모리에 없으면 page fault 를 발생시키는데, page fault는 운영체제 trap을 발동시켜 실행 중인 프로세스를 대기 상태로 만들고 스왑 영역에서 데이터를 찾아 다시 메인 메모리에 올리고 페이지 테이블을 수정시킨 뒤 프로세스를 재실행 시키게 된다. 이런 page fault로 인한 자원 소요가 멀티 프로그래밍으로 인해 점차 늘어나게 되고 결국, CPU의 사용률이 떨어지는 것을 스레싱(Thrashing)이라고 한다. 이를 해결하기 위해서 워킹셋(Working set)을 설정할 수 있는데, 워킹셋은 지역성 이론에 따라 최근 가장 많이 조회된 페이지들의 집합을 저장하는 기법이다. 워킹셋은 현재 진행 중인 페이지들에 따라 계속해서 변화하며 운영체제는 워킹셋을 모니터링하며 충분한 프레임이 남으면 프로세스를 더 실행시키고, 워킹셋의 총합보다 프레임의 수가 초과되면 프로세스를 중지시키며 적절한 수의 프로세스를 조절할 수 있다. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?   '컴퓨터를 실행' 시키기 위해서는 HDD나 SDD가 꼭 필요하진 않다. 컴퓨터 전원 버튼을 누르면 ROM에 저장되어 있는 BIOS가 실행되면서 CPU, RAM, 하드웨어 등에 이상이 있는지 확인하고 이상이 없다면 하드 디스크에 저장되어 있는 마스터 부트 레코드를 메모리에 올려 운영체제를 실행시킨다. 하지만 하드 디스크가 없기 때문에 운영체제는 실행하지 못하고 단순히 컴퓨터의 기본적인 부팅만 가능하다. 즉, 컴퓨터는 실행 시킬 수 있지만 운영체제가 없기 때문에 컴퓨터를 통해서 어떠한 작업을 진행할 수는 없다. 그렇다면 운영체제를 HDD나 SSD가 아닌 곳에 저장을 시켜서 컴퓨터를 실행시킬 수 있나? 휘발성 메모리는 전기가 통하지 않으면 데이터가 사라지니, 비휘발성 메모리에 저장을 시켜야 하고 과거, 윈도우를 구매할 때 USB나 CD에 담아서 판매하는 것을 봤던 기억이 있다. BIOS는 우선적으로 HDD나 SSD에서 부팅 장치를 찾지만 이 후, USB 드라이브 혹은 CD 등에서 부팅 가능한 장치를 찾아서 부트 로더를 실행 시킬 수 있을 것 같다.   파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?디스크의 공간을 일정한 크기로 나눈 블록에 파일을 분할하여 저장된다. 파일의 헤더에는 파일명, 크기, 생성 시간 등 메타 데이터가 저장되어 있는데, 파일을 삭제하면 디스크에서 해당 데이터를 제거하는 것이 아닌 파일의 헤더만 제거하게 된다. 파일의 헤더가 제거되면 더 이상 파일을 참조할 수 없어, 읽고 쓰는 것이 불가하게 된다. 파일이 저장되어 있던 블록은 free block list로 연결되게 되고 새로운 파일이 해당 블록을 덮어쓰기 전까지는 혹은 해당 블록에 쓰여져 있던 데이터보다 작은 데이터가 덮어 씌어진 다면 남은 부분에 대해서는 이전 데이터를 포렌식으로 복구할 수 있게 된다. 즉, 덮어씌어진 부분을 제외하면 파일 데이터는 물리적으로 계속 남아있다. 📒 회고이번에도 미션을 진행하면서 단순히 강의 이론에 대한 내용을 회고할 뿐만 아니라 강의에서 배운 내용을 응용해볼 수 있는 질문에 답변해볼 수 있어서 인상 깊었던 것 같다. 강의 초반에 배웠었던 BIOS 부터 복습해보면서 컴퓨터를 실행하였을 때, 어느 순서대로 동작이 되는지 다시 한 번 찾아보기도 하였으며 답변을 하며 스스로 떠오르는 질문에 대해서도 자료를 찾아보며 '이렇게 동작하지 않을까?' 라는 생각을 이어나가볼 수 있었다. 다만 조금 아쉬운 것은 이론적으로 컴퓨터의 동작을 추측해본 것에만 그치고 '실제로 그렇게 동작하는 가?' 라는 것에 대해서는 확신이 없없다는 것이고, 미션에 대한 답이 나오면 다시 해당 내용을 찾아볼 생각이다.

시스템 · 운영체제미션운영체제인프런워밍업

cs

[인프런 워밍업 클럽 3기 CS] 운영체제 3주 차 미션

운영체제1. 메모리의 종류와 특징1. 레지스터(Register) – CPU 내부에 위치, 가장 빠름, 용량 작음.2. 캐시(Cache) – CPU와 RAM 사이에 위치, 자주 사용하는 데이터를 저장하여 속도 향상.3. 메인 메모리(RAM) – 휘발성(전원 차단 시 데이터 삭제), 실행 중인 프로그램이 사용.4. 가상 메모리(Virtual Memory) – RAM이 부족할 때 HDD/SSD 일부를 메모리처럼 사용.5. 보조 저장 장치(HDD/SSD) – 비휘발성, 데이터를 영구 저장하는 장치. 2. 사용자 프로세스가 운영체제 메모리 영역에 침범하지 못하도록 만든 레지스터• 베이스 레지스터(Base Register): 프로세스의 메모리 시작 주소 저장.• 한계 레지스터(Limit Register): 프로세스가 접근할 수 있는 최대 범위 설정.• 이 두 개를 사용하여 운영체제 메모리를 보호함. 3. 가변 분할 방식 vs. 고정 분할 방식 가변 분할 방식고정 분할 방식장점메모리를 효율적으로 사용 가능내부 단편화 없음단점외부 단편화 발생 가능고정 크기로 인해 메모리 낭비 발생 4. CPU 사용률이 0%에 가까워지는 현상• 스레싱(Thrashing)• 이유: 멀티프로그래밍을 너무 많이 실행하여 페이지 부재(Page Fault)가 증가하고, 스왑(Swap)이 빈번하게 발생하여 CPU가 거의 사용되지 않음. 5. HDD나 SSD는 컴퓨터 실행에 필수인가?• 필수는 아님.• 이유: 운영체제(OS)가 RAM에서 실행되면 부팅이 가능하므로, HDD/SSD 없이도 실행 가능. 다만, OS를 저장할 공간이 필요하므로 일반적으로 사용됨. 6. 파일을 삭제해도 포렌식으로 복구할 수 있는 이유• 파일을 삭제해도 실제 데이터는 삭제되지 않음.• 운영체제는 단순히 파일의 메타데이터(인덱스)만 삭제하고, 기존 데이터는 그대로 남아 있음.• 새로운 데이터가 덮어쓰기 전까지 복구 가능.

시스템 · 운영체제

cs 1개월 전
호준

[인프런 워밍업 클럽 3기 - CS] 3주차 운영체제 미션

1. 메모리의 종류는 어떤 것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터 : 가장 빠른 기억장소로 CPU 내에 존재한다. 컴퓨터의 전원이 꺼지면 데이터가 사라지는 휘발성 메모리이다.캐시 : 메인 메모리에 있는 데이터를 레지스터로 옮기는 시간이 오래 걸리므로, 필요할 것 같은 데이터를 저장해둔다. 캐시는 성능 상의 이유로 여러 개를 둔다. 컴퓨터의 전원이 꺼지면 데이터가 사라지는 휘발성 메모리이다.메인 메모리 : 실제 운영체제와 다른 프로세스들이 올라가는 공간. 하드디스크나 SSD보다 속도는 빠르지만 비싸기 때문에 실행중인 프로그램만 올린다. 컴퓨터의 전원이 꺼지면 데이터가 사라지는 휘발성 메모리이다.보조저장장치(HDD, SSD) : 속도가 느리고 용량이 크고 가격이 저렴하다. 컴퓨터의 전원이 꺼져도 데이터가 사라지지 않는 비휘발성 메모리이다. 2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터. 메모리 관리자가 사용자 프로세스가 경계 레지스터의값을 벗어났는지 검사하고 만약 벗어났다면 종료시킨다.  3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식장점 : 메모리의 연속된 공간에 할당되기 때문에 더 크게 할당되어 낭비되는 공간인 "내부 단편화"가 없다.단점 : 메모리의 빈 공간이 연속적으로 존재하지 않게 되는 "외부 단편화"가 발생한다.고정 분할 방식장점 : 구현이 간단하고 오버헤드가 적다.단점 : 작은 프로세스도 큰 영역에 할당되어 "내부 단편화"가 발생한다. 4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱  5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?말 그대로 "컴퓨터를 실행"시키는 것이라면 운영체제 설치 없이도 전원이 들어오고 바이오스 진입까지는 가능하기 때문에 아니라고 볼 수 있으나, 현실적으로는 운영체제를 설치해야 하여 필수적이라고 보는 게 타당한 것 같다. 6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제할 때 파일시스템은 파일의 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더만 삭제하고 사용했던 블록의 데이터는 그대로 남아있기 때문에 복구가 가능하다. 

시스템 · 운영체제워밍업클럽

수뼈

인프런 워밍업 클럽 스터디 3기 - CS 전공지식(운영체제) <둘째 주 미션>

1. FIFO 스케줄링의 장단점이 뭔가요?장점은 쉬운 구현과 실행 결과 예측의 용이성이고, 단점은 호위 효과와 사용성 저하입니다. FCFS(First Comes, First Served) Algorithm이라고도 하는 FIFO Scheduling은 이름대로 모든 프로세스를 단일 Ready Queue에 넣고 순차 실행합니다. Time Slice, Timeout Interrupt 등을 통한 Context Switching도 구현되지 않은 때의 비선점 알고리즘인 만큼 구현이 쉽고 실행 결과 예측이 용이합니다. 그러나 Burst Time이 긴 게 먼저 오느냐, 짧은 게 먼저 오느냐에 따라 평균 대기 시간 차이가 크게 벌어지는 Convoy Effect가 발생하며, 멀티 프로세싱이 불가능하므로 사용성이 크게 저하됩니다.2. SJF를 사용하기 어러운 이유가 뭔가요?각 프로세스의 Burst Time 예측 불가능성, Burst Time이 긴 프로세스의 Starvation 때문입니다. SJF(Shortest Job First) Scheduling은 Burst Time이 짧은 프로세스를 우선 실행하는 알고리즘입니다. 따라서 각 프로세스의 Burst Time을 정확히 예측하고, 그걸 바탕으로 Ready Queue에 줄세워야 하는데 이것은 외부 환경 등에 의해 큰 영향을 받는 Burst Time 특성상 현실적으로 줄세우기가 불가능하단 것이 첫 번째 이유입니다. 두 번째로, 어찌어찌 모든 프로세스를 잘 줄세웠다고 해도 Burst Time이 아주 긴 프로세스는 최악의 경우, 컴퓨터가 종료될 때까지 단 한 번도 실행되지 못할 수도 있습니다.3. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?매우 큰 Context Switching Overhead가 발생해 시스템 성능을 크게 저하됩니다. 컨텍스트 스위칭 작업에는 CPU 레지스터나 프로그램 카운터 같은 상태 정보 저장 및 복원, 메모리 캐시 무효화 등의 오버헤드 요소가 산재해 있습니다. 만약 타임 슬라이스가 극단적으로 짧다면 CPU가 연산보다 컨텍스트 스위칭에 더 많은 리소스와 시간을 소모하게 되어 전체 시스템 처리량을 크게 낮추고 응답 시간도 늘어나게 됩니다.4. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?OS는 Timeout Interrupt가 일어난 프로세스는 CPU Bound Process로, I/O Burst가 일어난 I/O Bound Process는 I/O Bound Process로 판단합니다. 어떤 프로세스가 할당된 시간 동안 작업을 완수하지 못한 채 타임아웃 인터럽트가 발생하면, 이는 프로세스가 긴 CPU burst를 수행하고 있다는 신호이므로 CPU Bound Process로 간주되어 낮은 우선순위 큐로 이동할 가능성이 큽니다. 반면 Timeout Interrupt 전에 I/O Burst을 발생시키면 CPU를 별로 안 쓴다는 뜻이므로 I/O Bound Process로 판단되어 높은 우선순위 큐에 배치되어 빠른 응답성을 유지합니다.5. 공유자원이란 무엇인가요?여러 프로세스나 스레드가 동시에 접근하고 사용할 수 있는 하드웨어나 소프트웨어 자원을 의미합니다. CPU, 메모리, 파일, 프린터, 네트워크 등이 모든 HW 자원이 여기에 해당할 수 있습니다. 동기화 문제가 발생하지 않도록 주의해야 합니다.6. 교착상태에 빠질 수 있는 조건에는 어떤 것들이 있을까요?상호 배제(Mutual Exclusion), 비선점(No Pre-emption), 점유와 대기(Hold and Wait), 원형 대기(Circular Wait)이 있습니다. 상호 배제는 하나의 프로세스가 자원을 사용 중일 때 다른 프로세스는 해당 자원을 사용할 수 없는 조건입니다. 비선점은 한 프로세스가 자원을 할당받으면, 그 프로세스가 자원을 자발적으로 해제할 때까지 다른 프로세스가 강제로 빼앗을 수 없는 조건입니다. 점유와 대기는 프로세스가 최소한 하나의 자원을 보유한 상태에서, 추가 자원을 요청해 대기하는 상황입니다. 마지막으로 원형 대기 (Circular Wait)란 프로세스들이 점유와 대기 상태로 원형으로 대기하는 것입니다. 예를 들어, 프로세스 A가 프로세스 B가 보유한 자원을 기다리고, 프로세스 B는 프로세스 C의 자원을, 그리고 마지막으로 프로세스 C는 다시 프로세스 A의 자원을 기다리는 형태입니다.

시스템 · 운영체제운영체제

jurjur

CS 2주차 미션

운영체제 FIFO 스케줄링의 장단점이 뭔가요? 장점단순하고 직관적단점한 프로세스가 완전히 끝나야 다음 프로세스가 실행됨.때문에 실행시간이 짧고 늦게 도착한 프로세스가 실행시간이 길고 빨리 도착한 프로세스의 작업을 기다려야함. SJF를 사용하기 여러운 이유가 뭔가요? 어떤 프로세스가 얼마나 실행 될지 예측이 힘듦.BurstTime이 긴 프로세스는 아주 오랫동안 실행 되지 않을 수 있음.  RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?컥텍스트 스위칭이 너무 자주 발생함.프로세스의 처리 양보다 컨텍스트 스위칭을 처리하는 양이커져 오버헤드가 너무 커지는 상황이 발생. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU를 실행하는 프로세스가 스스로 CPU를 반납하면 CPU 사용량이 적음I/O Bound Process 가능성이 높음.CPU를 사용하는 프로세스가 타임 슬라이스 크기를 오버해서 강제로 Cpu를 뺏기는 상황CPU Bound Process 가능성이 높음.  공유자원이란무엇인가요?통신을 할 때 공동으로 이루는 함수나 파일을 공유자원이라고 함. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요? 상호 배제어떤 프로세스가 한 리로스를 점유 했다면 그 리소스는 다른 프로세스에게 공유가 되면 안됨.비선점리소스를 갖고 있는 프로세스 한테서 다른 프로세스가 리소스를 빼앗을 순 없음.점유와 대기리소스A를 갖고 있는 프로세스가 리소스 B를 원하는 상태원형 대기점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있는 상태. 자료구조와 알고리즘 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?콜 스택에 계속해서 함수가 생성되어 실행되어 결국 메모르가 부족한 오류가 발생하게 됨. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n){ // 재귀 로직 if (n == 0) return 0; return (n%2 != 0 ? n : 0) + sumOdd(n - 1) } console.log(sumOdd(10)) // 25 다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.import fs from "fs"; import path from "path"; function traverseDirectory(directory) { const files = fs.readdirSync(directory); for (const file of files) { const filePath = path.join(directory, file); const fileStatus = fs.statSync(filePath); if (fileStatus.isDirectory()) { if (filePath.includes("git")) continue; // 특정 디렉토리 제외 console.log("디렉토리:", filePath); traverseDirectory(filePath); // 재귀 호출 } else { console.log("파일:", filePath); } } } traverseDirectory("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력  

시스템 · 운영체제운영체제자료구조

강동훈

[인프런 워밍업 클럽 3기 - CS] - 2주차 미션 (운영체제)

FIFO 스케줄링의 장단점이 뭔가요?FIFO(First In First Out) 스케줄링이란 대기 큐에 들어온 작업 순서대로 실행하는 스케줄링을 의미한다. 비선점형 스케줄링으로, 하나의 프로세스가 CPU에 할당받아 작업이 시작되면 해당 프로세스의 작업이 마무리되기 전까지 중단되지 않는다.✅ 장점 스케줄링 구현이 단순하다들어온 작업 순서대로 모든 작업이 실행되기 때문에 기아(Starvation)현상에 빠지지 않는다.컨텍스트 스위칭이 자주 발생하지 않아,오버헤드가 적다✅ 단점들어온 작업 순서에 따라, 작업의 시간이 긴 프로세스가 먼저 실행될 경우 작업의 시간이 짧은 프로세스들은 오래 대기해야 하며 응답시간 또한 길어진다. (Convoy Effect, 호위효과)I/O작업을 대기하는 동안 CPU는 다른 작업으로 전환할 수 없기 때문에(비선점형), CPU 사용률이 저하된다.✅ 평균대기시간case 1: 프로세스_1 (Burst Time: 25초) - 대기 시간: 0초프로세스_2 (5초) - 대기 시간: 25초프로세스_3 (4초) - 대기 시간: 30초평균 대기 시간: 55 / 3 = 18.3초case2:프로세스_3 (4초) - 대기 시간: 0초프로세스_2 (5초) - 대기 시간: 4초프로세스_1 (Burst Time: 25초) - 대기 시간: 9초평균 대기 시간: 13 / 3 = 4.3초프로세스의 실행 순서에 따라 평균대기시간의 편차가 커지기 때문에 현대 운영체제에서는 잘 사용하지 않는다.먼저 들어온 작업 순서대로 처리를 해주는 작업 혹은 성능의 저하없이 모든 작업을 순서대로 처리하는 일괄 처리 시스템에서 효율적이다. SJF를 사용하기 여러운 이유가 뭔가요?SJF (Shortest Job First) 스케줄링은 Burst Time이 가장 짧은 작업부터 우선 실행하는 스케줄링이다. FIFO의 단점이었던 '실행 순서에 따른 평균 대기시간 편차'를 극복하기 위해 설계되어 실행 시간이 짧은 프로세스 먼저 작업하는 기법이다. 하지만 두 가지 큰 단점이 존재한다. 첫 번째는 Starvation(기아) 현상이 발생할 수 있다. 짧은 작업을 우선적으로 처리하기 때문에, 긴 작업의 프로세스는 계속 대기를 하게 되어 실행의 순서가 보장되지 않는다. 두 번째는 실제 Burst Time을 예측하기 힘들다는 것이다. 짧은 실행 순서를 먼저 실행시키는 SJF 스케줄링에서, 실제 작업이 얼마나 CPU를 사용할 것인지 혹은 I/O 작업이 언제 응답 받을 수 있는지 예측될 수 없기 때문에 실 Burst Time을 예측하여 짧은 프로세스 먼저 실행시키기 어렵다. SJF는 결론적으로 실행 시간이 예측 가능하며 짧은 작업이 많은 환경에서 평균 대기 시간을 효율적으로 줄일 수 있는 스케줄링 기법이다. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?RR(Round Robin) 스케줄링이란 타임 슬라이스만큼 프로세스를 실행하고 다음 프로세스를 실행하는 스케줄링이며 타임 슬라이스는 CPU가 할당되는 일정한 시간을 의미한다.타임 슬라이스가 아주 작게 실행되면 여러 프로세스가 동일한 시간에 실행되는 것처럼 보일 수 있지만 짧은 시간을 주기로 Context Switching이 많아져 오버헤드가 증가한다. 타임 슬라이스가 너무 크게 실행되면 FIFO 스케줄링과 유사하게 동작하여 효율성이 떨어지게 된다. 즉, RR 스케줄링은 최적의 타임 슬라이스를 설정하는 것이 중요하며 최적의 타임 슬라이스는 여러 프로세스가 버벅이지 않으면서 동시에 실행시키는 효과를 줌과 동시에 오버헤드가 너무 크지 않은 정도의 할당 시간을 의미한다. 윈도우에서는 20ms, 유닉스에선 100ms정도로 설정된다. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?MLFQ(Multi Level Feedback Queue)란 프로세스를 여러 개의 우선순위 큐로 분류하고, 실행 시간에 따라 큐 간 이동이 가능한 스케줄링 알고리즘이다. 처음 프로세스가 실행되면 높은 우선순위의 큐에서 실행되며, 실행되는 시간에 따라 우선순위가 변동되어 점차 다른 큐에 할당된다. 주어진 타임 슬라이스 내에 작업이 완료된다면 I/O Bound Process로 간주하여 높은 우선순위를 유지하고,해당 타임 슬라이스를 초과하면 CPU Bound Process로 간주되어 낮은 우선순위 큐로 이동하게 된다. 실행 순서는 우선순위가 높은 큐부터 순차적으로 실행되며, 낮은 우선순위의 큐는 오래 동안 실행되지 않는 상태인 기아(Starvation) 현상을 겪을 수도 있기 때문에 Aging을 통해 문제를 해결할 수 있다. Aging은 낮은 우선순위 큐에서 오랫동안 기다린 프로세스들을 점진적으로 다시 우선순위를 높여주는 기법이다.  I/O Bound Process가 우선순위가 높은 이유처음에는 I/O 작업은 요청을 한 뒤에 응답까지 기다려야 하니, 작업 시간이 예측하기 힘들고 오래걸리지 않나? 라고 생각하였고타임 슬라이스 안에 작업이 보통 완료하지 못하지 않을까라는 생각에 우선순위가 높은 이유가 궁금하여 다시 해당 부분을 찾아보았다. I/O 작업은 CPU를 거의 사용하지 않고 보통 외부 장치를 통해 응답을 기다리는 작업들이다. CPU의 점유를 가로채지 못하는 비선점형 스케줄링 기법에서는 I/O작업이 실행되면 응답까지 기다려야 하니(대표적으로 FIFO 같은 기법) 작업이 빠르다고 말할 수는 없지만, 선점형 스케줄링 기법에서는 I/O 작업이 요청되면 해당 프로세스는 대기 상태로 상태값이 변경되고 응답이 오기 전까지(인터럽트) 다른 프로세스의 작업을 실행할 수 있기 때문에 작업이 빠르다고 얘기할 수 있으며 우선순위 또한 높게 가져갈 수 있는 것이다. 공유자원이란무엇인가요?공유자원이란 여러 프로세스 간 공유되는 자원(변수나 파일 등)을 의미한다. 여러 프로세스는 서로 통신을 하며 한 가지 작업을 동시에 수행할 수도 있는데, 이 과정에서 공유자원을 여러 프로세스가 접근하게 되면 경쟁 조건이 발생하면서 동기화 문제가 생긴다. 경쟁 조건이란 다수의 프로세스(혹은 쓰레드)가 같은 데이터(공유자원)에 동시에 접근 혹은 조작의 순서에 따라 결과의 일관성을 해칠 수 있는 상태를 의미하며 이를 해결하기 위해서는 상호 배제가 필요히다. 상호배제는 하나의 프로세스만 접근할 수 있는 구역인 임계구역을 설정하여 데이터의 동기화를 유지시키는 것을 의미한다. 상호배제 요구사항임계영역엔 하나의 프로세스만 접근 가능하다여러 요청에도 하나의 프로세스만 접근을 허용한다임계구역에 들어간 프로세스는 최대한 빠르게 나와야 한다. 상호배제의 매커니즘Mutex임계 구역에 진입하면 lock을 획득하고 acquire()와 release()를 통해 획득 및 반납프로세스가 임계구역에 진입하기 위해 무한 루프가 돌며 이를 spinlock이라고도 부른다Semaphore공유자원 수용 가능 수에 따라 정수의 변수 s를 선언wait(s) signal(s) 를 통해 s값을 증가 차감한다함수 호출 순서를 잘못하면 문제가 발생한다.Monitor세마포어의 단점을 해결한 상호배제 메커니즘운영체제의 차원이 아닌 프로그래밍 언어에서 처리한다자바에서 synchronized 붙은 함수가 실행되면 다른 프로세스가 접근 할 수 없음함수를 임계 영역을 감싸지 않아도 되어 편리함. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?교착상태(Deadlock)란 여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무도 작업을 진행하지 못하는 상태를 의미한다. 교착상테 필요조건상호배제: 한 프로세스가 리소스를 점유하였다면 다른 프로세스 접근 불가비선점: 점유중인 프로세스의 리소스를 뺏어갈 수 없음점유와 대기: 한 프로세스는 리소스를 점유하고 있는 상태에서 다른 프로세스의 리소스 점유를 대기해야 함원형대기: 점유와 대기를 하는 프로세스들의 관계가 원형이어야 함.데드락의 발생은 막을 수 없으니, 발생 후의 해결 방법을 고민해본다. 1. 가벼운 교착상태 검출: 타이머 이용. 프로세스가 일정 시간동안 작업을 진행하지 않는다면 교착상태로 검출 - 일정시간마다 체크포인트 생성, 교착상태 예상 시에 롤백2. 무거운 교착상태 검출: '자원 할당 그래프'를 통해 프로세스에 할당된 자원을 모니터링 - 교착상태를 일으킨 프로세스 강제종료 - 체크포인트로 롤백 자원할당 그래프(Resource Allocation Graph)란 무엇일까?운영체제에서 자원이 할당되어 있는 상태를 그래프로 그려, 시각적으로 데드락의 여부를 판단- T = {T1, T2, ..., Tn}: 실행 중인 쓰레드- R = {R1, R2, ..., Rm}: 할당될 자원 타입- T_i → R_j: i 쓰레드가 j 자원을 요청한다- R_j → T_i: j 자원을 i 쓰레드에 할당되어 있다.위 예제에서는 3개의 쓰레드와 4개의 자원이 있으며 2개의 순환 구조를 갖고 있다.T1 → R1 → T2 → R3 → T3 → R2 → T1T2 → R3 → T3 → R2 → T2모든 쓰레드는 하나의 자원을 점유 중인 상태에서 다음 자원을 점유하기 위해 대기 상태에 있고, 이러한 상태가 원형을 이루어지고 있기 때문에 데드락에 빠질 확률이 높다고 판단한다. 📔 회고미션을 수행하면서도 강의를 들었을 때 고민하지 못했던 부분에 대해서 더 찾아보고 전체적인 흐름을 다시 정리해볼 수 있었다.MLFQ 스케줄링에서 I/O Boud Process를 정리하면서 우선순위가 높은 이유에 대해서 생각해보진 못했던 것 같은데,선점형과 비선점형의 특징을 알고, 선점형에서 I/O 작업이 응답 대기를 통해 다른 프로세스로 전환될 경우 CPU 작업 처리 비중은 적으니 빠른 작업 실행과 높은 우선순위를 가져갈 수 있다라는 것을 다시 한 번 전체적인 흐름과 다른 개념과의 연관을 통해 정리해볼 수 있었다.또한 질문의 답변을 통해서 강의를 듣고 추가로 공부해봤던 것들에 대해서 한 번 더 정리해볼 수 있는 시간을 가졌는데, 뮤텍스와 같은 상호배제 메커니즘이나 처음에 이해하지 못했던 자원 할당 그래프를 직접 다시 확인해보고 개념들을 이해해볼 수 있었던 것 같다.   

시스템 · 운영체제운영체제인프런워밍업미션

cs

[인프런 워밍업 클럽 3기 CS] 운영체제 2주 차 미션

운영체제1. FIFO 스케줄링의 장단점장점:• 구현이 간단하고 직관적이다.• 공정한 스케줄링 방식으로, 먼저 도착한 프로세스가 먼저 실행된다. 단점:• Convoy Effect(호위 효과)가 발생할 수 있다. → 실행 시간이 긴 프로세스가 먼저 도착하면 짧은 프로세스들이 오래 대기해야 한다.• 응답 시간이 일정하지 않아 실시간 시스템에 부적합하다. 2. SJF(Shortest Job First)를 사용하기 어려운 이유• 프로세스의 실행 시간을 미리 알 수 없다. (CPU Burst Time 예측이 어렵다.)• 새로운 작업이 짧은 실행 시간을 가진다면, 긴 실행 시간의 작업이 계속 뒤로 밀리는 기아 상태(Starvation)가 발생할 수 있다.• 동적 우선순위 조정을 위해 예측 기법(Exponential Averaging 등)을 적용해야 하는데, 오버헤드가 발생할 수 있다. 3. RR 스케줄링에서 타임 슬라이스가 아주 작으면 발생하는 문제• 문맥 전환(Context Switching) 비용 증가 → CPU가 프로세스를 너무 자주 교체하면 성능 저하 발생• CPU 사용률 감소 → 실행보다 문맥 전환에 더 많은 시간이 소비됨• 오버헤드 증가 → 캐시 효율성이 떨어지고, 프로세스 실행이 지연됨 4. MLFQ에서 CPU Bound Process와 I/O Bound Process를 구분하는 방법• I/O Bound Process: 자주 입출력을 수행하기 때문에 짧은 CPU Burst 후 대기 상태로 전환됨 → 높은 우선순위 큐에 머무름• CPU Bound Process: CPU를 길게 사용하는 프로세스 → 시간이 지나면서 우선순위가 낮은 큐로 이동• MLFQ는 시간 제한(Time Quantum)과 큐 강등을 통해 CPU Bound와 I/O Bound 프로세스를 자동으로 분리함 5. 공유 자원이란?• 여러 프로세스가 동시에 접근할 수 있는 자원• 예: 파일, 데이터베이스, 프린터, 메모리, CPU 등• 공유 자원을 잘못 관리하면 경쟁 상태(Race Condition), 데드락(Deadlock) 등의 문제가 발생할 수 있음 6. 교착 상태(Deadlock) 발생 조건교착 상태가 발생하려면 다음 4가지 조건이 동시에 만족해야 함:1. 상호 배제(Mutual Exclusion): 한 번에 한 프로세스만 자원을 사용할 수 있음2. 점유 및 대기(Hold and Wait): 이미 자원을 가진 프로세스가 추가 자원을 기다림3. 비선점(Non-preemption): 자원을 강제로 빼앗을 수 없음4. 순환 대기(Circular Wait): 프로세스들이 자원을 서로 기다리는 순환 구조를 가짐 교착 상태를 예방하려면 위 조건 중 하나 이상을 제거해야 함.

시스템 · 운영체제

cs 1개월 전
jhworld

인프런 워밍업 클럽 CS - 2주차 운영체제 미션

운영체제FIFO 스케줄링의 장단점이 뭔가요?- 장점단순하고 직관적이다.- 단점한 프로세스가 완전히 끝나야 다음 프로세스가 시작되기 때문에 실행시간이 짧고 나중에 도착한 프로세스가 실행시간이 길고 먼저 도착한 프로세스가 끝날 때까지 기다려야한다는 점이 단점이다. SJF를 사용하기 여러운 이유가 뭔가요?Burst Time이 긴 프로세스는 Burst Time이 짧은 프로세스가 먼저 실행되기 때문에 오랫동안 실행되지 않을 수도 있다. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요? 타임 슬라이스에서 실행되는 프로세스의 처리량보다 컨텍스트 스위칭이 많이 발생해 오버헤드가 너무 크다. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?프로세스가 타임 슬라이스를 초과하여 강제로 CPU를 뺏긴다면 CPU 사용이 많은 CPU Bound Process로 판단할 수 있고, 반대로 스스로 CPU를 반납한다면 비교적 CPU 사용이 적은 I/O Bound Process로 볼 수 있다. 공유자원이란무엇인가요?프로세스 간 통신을 할 때, 공동으로 이용하는 변수나 파일 등을 공유자원이라고 말한다. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?1. 어떤 프로세스가 한 리소스를 점유했다면 그 리소스는 다른 프로세스에게 공유가 되면 안된다. (상호배제)2. 프로세스 A가 리소스를 점유하고 있을 때, 다른 프로세스 B가 리소스를 빼앗으면 안된다. (비선점)3. 프로세스가 리소스 A를 가지고 있는 상태에서 다른 리소스 B를 원하는 상태여야 한다. (점유와 대기)4. 점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있어야 한다. (원형 대기)

시스템 · 운영체제운영체제

호준

[인프런 워밍업 클럽 3기 - CS] 2주차 운영체제 미션

1. FIFO 스케줄링의 장단점이 뭔가요?장점 : 먼저 도착하고 프로세스가 먼저 실행되고 끝나는 알고리즘으로, 단순하고 직관적이다.단점 : 한 프로세스가 완전히 끝나야 다음 프로세스가 시작되기 때문에, 실행 시간이 짧고 늦게 도착한 프로세스가 실행 시간이 길고 빨리 도착한 프로세스의 작업을 기다려야 한다. 또한 I/O 작업이 있다면 CPU는 I/O 작업이 끝날 때까지 쉬고 있기 때문에 CPU 사용률이 떨어진다. 2. SJF를 사용하기 어러운 이유가 뭔가요?어떤 프로세스가 얼마나 실행될 지 예측하기 어렵다.실행 시간이 짧은 프로세스를 먼저 실행하므로, 실행 시간이 긴 프로세스가 먼저 도착했더라도 짧은 프로세스가 중간에 계속 들어오면 실행 시간이 긴 프로세스는 계속 실행하지 못하게 된다. 3. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?컨텍스트 스위칭이 너무 자주 일어나게 되어 오버헤드가 너무 커지고 성능이 저하된다. 4. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU를 사용하는 프로세스가 실행하다가 스스로 CPU를 반납하면 CPU 사용이 적은 것이므로 I/O Bound Process라고 취급한다.반대로 타임 슬라이스 크기를 오버하여 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황이면 CPU Bound Process라고 취급한다. 5. 공유자원이란 무엇인가요?프로세스 간 통신을 할 때 공동으로 이용하는 변수나 파일 등의 자원. 6. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야 할까요?상호 배제 : 어떤 프로세스가 한 리소스를 점유했다면 해당 리소스는 다른 프로세스에게 공유되면 안된다.비선점 : 어떤 프로세스가 한 리소스를 점유했다면 다른 프로세스가 해당 리소스를 빼앗을 수 없다.점유와 대기 : 어떤 프로세스가 한 리소스를 점유한 상태에서 다른 리소스를 원하는 상태.원형 대기 : 점유와 대기를 하는 프로세스들의 관계가 원형을 이룬 상태.

시스템 · 운영체제워밍업클럽

인프런 워밍업 클럽 CS 3기 1주차 미션 (운영체제)

운영체제 while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }1. 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?폴링방식을 사용하지 않고 인터럽트를 사용하면 좋을 것 같습니다. 프로그램과 프로세스가 어떻게 다른가요?프로그램은 저장 장치에 저장된 명령문의 집합입니다.프로세스는 간단히 말해 실행중인 프로그램으로 메모리에 올라가 실행되는 상태입니다.즉 프로그램은 저장장치만 사용하는 수동적인 존재라 볼 수 있고프로세스는 메모리, CPU, 입출력 자원을 활용하는 능동적인 존재입니다. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍은 메모리에 여러 개의 프로세스가 올라와 실행되는 것 입니다.(메모리 관점)멀티프로세싱은 CPU가 여러개의 프로세스를 동시에 처리하는 방식입니다.(CPU 관점)운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?PCB(Process Contorl Block)을 활용합니다.PCB는포인터, 프로세스 상태 (생성, 준비, 실행, 대기, 완료), 프로세스 ID, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보, CPU 스케줄링 정보 등을 가지고 있습니다.컨텍스트 스위칭이란 뭔가요?컨텍스트 스위칭은 실행 중인 프로세스의 상태를 저장하고, 다른프로세스의 상태를 복원해서 사용하는 것입니다.컨텍스트 스위칭 과정은1. 현재 실행 중인 프로세스의 상태 저장- PCB에 프로그램 카운터, 레지스터 값, 프로세스 상태 등 저장*2. 새로운 프로세스의 PCB를 로드- 프로그램 카운터를 새로운 프로세스의 위치로 변경- 레지스터 값을 복원3. 새로운 프로세스 실행입니다.발생 이유는 CPU 점유 시간이 종료됐거나, I/O 요청이 발생했거나, 다른 인터럽트가 발생했을 경우 컨텍스트 스위칭이 발생합니다.

시스템 · 운영체제과제워밍업

jhworld

인프런 워밍업 클럽 CS - 1주차 운영체제 미션

운영체제  while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }1. 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?폴링방식의 단점을 해결하기 위해 인터럽트를 이용하면 된다. 프로그램과 프로세스가 어떻게 다른가요?프로그램은 하드디스크와 같은 저장장치에 저장된 명령문의 집합체를 말한다.우리가 흔히 윈도우 운영체제에서 볼 수 있는 .exe 파일의 모습을 하고 있다..exe 파일을 누르면 프로그램이 실행되어 메모리에 올려지는데, 이때 실행중인 프로그램을 프로세스라고 한다. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍은 메모리에 여러 프로세스를 올려서 하나의 CPU로 처리하는 것을 말한다.반면 멀티프로세싱은 여러 개의 CPU에서 여러 프로세스를 처리하는 것을 말한다. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?운영체제는 프로세스를 관리하기 위해 프로세스가 만들어지면 해당 프로세스의 정보를 가지고 있는 PCB를 생성하고, 프로세스가 종료되면 PCB를 제거한다. 컨텍스트 스위칭이란 뭔가요?실행 중인 프로세스가 다음 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고 다른 프로세스의 상태 값으로 교체하는 작업을 말한다.

시스템 · 운영체제

박예은

[인프런 워밍업 클럽 CS 3기] 1주차 운영체제 미션

Q1) 아래 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }플레이어가 스킬을 사용한 경우에 이벤트를 발생시키거나 콜백 함수가 실행되도록 구현하여 무한 반복문을 돌면서 불필요한 자원 낭비를 막을 수 있다. Java Script의 경우 eventListener를 사용하여 이벤트를 다룰 수 있고, C언어는 select나 kqueue와 같이 멀티플렉싱을 지원하는 시스템 콜 함수를 사용하여 작업이 완료된 경우 후속 작업을 처리하도록 구현할 수 있다. 폴링 방식(Polling)I/O 작업이 완료되었는지 CPU가 주기적으로 확인하는 것→ CPU의 낭비가 심하다.⇒ 인터럽트 방식을 사용인터럽트(Interrupt)I/O 관리자에게 I/O 작업을 맡기고, CPU는 다른 작업을 처리.I/O 작업 완료 시, 인터럽트 발생 → CPU가 완료된 I/O 작업을 이어서 처리⇒ CPU의 낭비 없이 CPU의 처리량을 높일 수 있다. Q2) 프로그램과 프로세스가 어떻게 다른가요?프로그램저장장치에 저장된 코드의 집합으로, 정적인 상태이다.수동적프로세스실행 중인 프로그램으로, 프로그램이 메모리에 적재되어 운영체제의 관리하에 실행되는 동적 개체이다.능동적  Q3) 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍하나의 메모리에 여러 개의 프로세스를 적재하여 실행시키는 것이다.시분할(time-sharing) 시스템을 통해 여러 개의 프로세스가 동시에 실행되는 것처럼 보이게 할 수 있다. 실제로는 한 번에 하나의 프로세스만 실행된다.멀티프로세싱여러 개의 프로세서(CPU)가 여러 개의 프로세스를 실행시키는 것이다.실제로 여러 개의 프로세스가 동시에 실행될 수 있다. (병렬처리)동시에 작업되는 프로세스의 최대 수 = CPU 개수 Q4) 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요? 프로세스가 생성될 때 운영체제는 PCB(Process Control Block)를 생성한다. PCB에는 Process ID, 프로세스 상태, 포인터, PC(Process Counter), 레지스터 정보 등이 포함되어 있다. 이 정보를 통해(특히 PC, 레지스터 정보) 시분할 시스템에서 CPU 할당 시 이전 작업 상태를 이어받아 실행할 수 있다.  Q5) 컨텍스트 스위칭이란 뭔가요?한 프로세스가 I/O 작업 요청이나 CPU 점유시간 초과 등으로 인해 CPU를 반납해야 할 경우, 인터럽트가 발생하여 운영체제가 해당 프로세스로부터 CPU 제어권을 회수한다.이때, 현재 실행 중인 프로세스의 레지스터 값 등을 PCB에 저장한다.이후, 다음에 실행할 프로세스의 PCB에 저장된 레지스터 값을 CPU에 로드하고,PC에 저장된 다음으로 실행할 명령어의 주소를 보고 프로세스의 작업을 이어서 진행한다.

시스템 · 운영체제CSOS

[워밍업 클럽 CS 3기] 1주차 미션 (운영체제)

while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요? 인터럽트 방식을 이용하여 이를 해결할 수 있다. 폴링 방식처럼 계속 주기적으로 체크하지 않고, 스킬을 사용하였을 때에 CPU에게 신호를 주고, 이 신호를 받았을 때만 CPU가 ISR(Interrupt Service Routine)을 실행하여 작업하면, 성능을 높일 수 있다. 프로그램과 프로세스가 어떻게 다른가요?프로그램이란, HDD(하드디스크)와 같은 저장장치에 저장된 명령문의 집합체이다.프로세스란, 실행중인 프로그램으로, 자세히는 HDD에 저장된 프로그램이 메모리(RAM)에 올라가 실행 중인 프로그램을 의미한다. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍이란, 메모리에 하나의 프로세스가 아니라 여러 개의 프로세스를 올려 처리하는 기술이다.멀티프로세싱이란, 여러개의 CPU(멀티프로세서)를 사용하여 여러 작업을 각 CPU가 맡아 동시에 처리하는 기술이다. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요? PCB(Process Control Block)을 통해 프로세스를 관리한다.  컨텍스트 스위칭이란 뭔가요?컨텍스트 스위칭은 프로세스를 실행하는 중에 다른 프로세스를 실행하기 위하여 실행중인프로세스의 상태를 저장하고, 다른 프로세스의 상태값으로 교체하는 작업이다. 

시스템 · 운영체제

강동훈

[인프런 워밍업 클럽 3기 - CS] - 1주차 미션 (운영체제)

1주차 운영체제 미션 while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?✅ 폴링방식이란 CPU가 지속적으로 장치나 하드웨어의 상태를 확인하여 변화를 확인하는 방식이다. 예제 코드의 경우 while문을 통해 1초마다 반복적으로 isActivated의 상태를 확인해주고 있다.하나의 스킬만 확인한다면 큰 문제는 없을 수 있지만 점차 확인해야할 스킬의 수가 많아지거나, 스킬을 사용하는 객체의 수가 증가할수록 CPU는 다수의 장치를 지속적으로 확인해야 하기에 다른 중요한 작업의 처리 속도가 늦어질 수 있다. 또한 상태 확인 주기를 1초로 고정하였기 때문에 0.1초에 작업이 완료되어도 다음 다음 폴링 주기(0.9초 후)까지 사용자 응답이 지연된다는 단점이 있다. 해당 방식을 해결하기 위해서는 폴링 방식 대신 인터럽트로 변경해볼 수 있다. 인터럽트는 프로그램 실행 중, 특정 이벤트가 발생하면 즉시 실행은 중단하고 해당 작업을 먼저 수행하는 방식을 의미한다.// 스킬명, 쿨타임 const SKILL = { Q: { name: "Q", time: 1 }, W: { name: "W", time: 2 }, E: { name: "E", time: 3 }, R: { name: "R", time: 4 }, }; // 스킬 사용 상태 확인 const skillState = Object.values(SKILL).reduce((acc, skill) => { acc[skill.name] = { isActive: false, lastUsed: 0 }; return acc; }, {}); document.addEventListener("keydown", (event) => { const inputKey = event.key.toUpperCase(); const skill = skillState?.[inputKey]; const now = Date.now(); if (!skill) return; if (!checkSkillActivated(skill)) return; // 현재 - 마지막 스킬 사용 시간이 쿨타임보다 적다면 사용 가능 if (now - skill.lastUsed >= skill.time * 1000) { skill.isActive = true; skill.lastUsed = now; // 쿨타임 이후, 스킬 활성화 false setTimeout(() => { skill.isActive = false; }, SKILL[inputKey].time * 1000); } }); const checkSkillActivated = (skill) => { if (!skillState?.[skill]) return false; return skillState[skill].isActive; }; 기존에는 스킬을 1초마다 체크하게 확인 하였다면작성된 코드에서는 스킬을 사용할 때만 스킬을 체크하도록 수정하였다. 이벤트 리스너를 통해서 키 입력을 받으면해당 스킬이 존재하는지.스킬을 사용할 수 있는지 체크하여 스킬을 발동시키고 쿨타임과 스킬 사용 활성화를 true로 설정하였다.setTimeout을 통해 스킬의 쿨타임 뒤에 스킬 사용 활성화를 false로 변경해주었다. 프로그램과 프로세스가 어떻게 다른가요?✅ 프로그램이란 저장장치에 저장된 명령문의 집합체이며 프로세스는 실제 실행 중인 프로그램을 의미한다.프로그램은 실행하기 전까지 저장장치에 저장만 되어 있는 수동적인 존재이지만 프로세스는 실행되면 .exe 파일이 실행되어 메모리에 코드, 데이터, 스택, 힙 영역 등에 올라가며 CPU 연산과 I/O를 사용하는 능동적인 존재이다. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?✅ 멀티프로그래밍이이란 메모리에 여러 개의 프로세스를 올려 하나의 CPU 작업을 수행하는 것을 의미한다. I/O 작업으로 해당 프로세스에서 CPU가 연산을 수행하지 못한다면 대기하지 않고 다른 프로세스에 할당되어 사용된다.멀티프로세싱이란 여러 개의 CPU로 다수의 프로세스 작업들을 동시에 수행하는 것을 의미한다. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?✅ PCB(Process Control Block)을 통해 프로세스를 관리한다. PCB에는 포인터 구조, 프로세스 상태, PID, 프로그램 카운터, 레지스터 정보 등 프로세스에 필요한 다양한 정보들을 담고 있으며 운영체제는 PCB를 통해 상태를 조회하고 컨텍스트 스위칭을 실행할 수 있다.PCB 정보포인터 구조 : 부모, 자식 프로세스에 대한 포인터(주소) 저장프로세스 상태: 프로세스의 현재 상태를 저장(생성, 준비, 대기, 실행, 완료)PID: 프로세스 식별 ID 저장프로그램 카운터: 다음에 실행되어야 할 명령어 위치 저장레지스터 정보: 프로세스 실행될 때, CPU에 저장되었던 레지스터 정보 저장 컨텍스트 스위칭이란 뭔가요?✅ 프로세스가 실행 중인 상태에서 다른 프로세스를 실행하기 위해 실행 중인 프로세스 상태를 저장하고 다른 프로세스로 교체하는 것을 의미한다. 운영체제에 의해 실행 중인 PCB의 내용이 수정되고, 교체될 PCB의 내용이 CPU에 세팅된다. 컨텍스트 스위칭 과정1. 프로세스 A의 CPU 점유 시간 초과2. 인터럽트 발생3. CPU의 레지스터 값 등을 PCB A에 저장4. PCB B를 참조해서 이전 프로세스 B의 작업을 이어감- 프로그램 카운터(다음에 실행될 명령어 주소)를 통해 이어서 명령어 실행 가능5. 프로세스 B의 CPU 점유 시간 초과6. 인터럽트 발생7. CPU의 레지스터 값 등을 PCB B에 저장 📒 회고이번 주말은 여러 일정이 겹쳐있어서 미션을 수행할 시간이 많이 부족했뿐만 아니라, 생각보다 미션이 오래 걸렸던 것 같다.다음 주 부터는 미리미리 강의 정리하면서 발자국도 함께 작성하는 것이 중요할 것 같고 미션도 올라오는 대로 바로 시작해야안정적으로 미션을 제출할 수 있을 것 같다. 추가로 스터디에서 사람이랑 미션에 대해서도 얘기해보며 집단 지성을 이용해서 조금 더 획기적인 아이디어들을토론하고 고민해보는 것도 좋은 생각일 것 같다!

시스템 · 운영체제미션운영체제

채널톡 아이콘