안녕하세요 컴퓨터에 관심 있는 한선규입니다.
블로그
전체 92025. 03. 23.
0
[인프런 워밍업 클럽 스터디 3기] CS - 3주차 발자국
이번 주차에 가상 메모리를 배우며 정말 흥미를 느꼈습니다.사람들이 주어진 메모리 안에서 최대한 활용하기 위해 엄청 노력하여 만들어낸 여러 기술들을 보며 재밌게 공부한 한 주 였습니다. 메모리의 종류와 주소 체계1. 메모리의 종류컴퓨터에서 사용되는 주요 메모리는 다음과 같이 구분된다.1.1 레지스터 (Register)CPU 내부에 위치하며 가장 빠른 기억장소전원 차단 시 데이터가 사라지는 휘발성 메모리CPU의 비트 수(예: 32비트, 64비트)는 레지스터의 크기를 의미CPU는 연산 시 메인메모리(RAM)의 데이터를 레지스터로 가져와 계산 후 다시 메인메모리에 저장1.2 캐시 메모리 (Cache Memory)레지스터보다 느리지만 메인메모리보다 빠른 휘발성 메모리메인메모리 접근 속도를 개선하기 위해 사용CPU가 자주 사용할 것 같은 데이터를 미리 저장해 속도 차이를 줄임성능 향상을 위해 여러 단계(L1, L2 캐시 등)로 구성됨1.3 메인메모리 (RAM, Random Access Memory)운영체제와 프로세스가 실행되는 공간전원이 꺼지면 데이터가 사라지는 휘발성 메모리프로그램 실행 및 데이터 처리 속도에 직접적인 영향을 줌1.4 보조 저장장치 (HDD, SSD)전원이 차단되어도 데이터가 유지되는 비휘발성 메모리하드디스크(HDD)는 비교적 저렴하지만 속도가 느림솔리드스테이트드라이브(SSD)는 빠르지만 가격이 높음2. 메모리와 주소 체계운영체제는 메모리를 효과적으로 관리하기 위해 1바이트 단위로 구역을 나누고 각 구역에 **주소(Address)**를 부여한다.2.1 32비트 vs 64비트 CPU32비트 CPU레지스터 크기: 32비트연산 장치(ALU), 데이터 버스도 32비트다룰 수 있는 메모리 크기: 2^32=4GB64비트 CPU레지스터 크기: 64비트연산 장치(ALU), 데이터 버스도 64비트다룰 수 있는 메모리 크기 : 2^64 (거의 무한대)2.2 물리 주소와 논리 주소물리 주소 공간: 메모리를 실제로 연결하면 0x0번지부터 시작하는 주소 공간논리 주소 공간: 운영체제가 사용자 프로그램을 위해 제공하는 가상의 주소 공간사용자는 논리 주소만 인식하며, 운영체제가 이를 물리 주소로 변환운영체제 보호를 위해 **경계 레지스터(Boundary Register)**를 사용하여 프로세스가 메모리 접근 시 경계를 넘지 않도록 관리함2.3 절대 주소 vs 상대 주소절대 주소 (Absolute Address): 실제 메모리에서 사용되는 물리 주소상대 주소 (Relative Address): 프로그램이 실행될 때 기준이 되는 시작 주소를 기반으로 한 주소프로그램 실행 시 **재배치 레지스터(Relocation Register)**를 사용해 논리 주소를 절대 주소로 변환2.4 메모리 주소 변환 예시사용자가 논리 주소 0x100의 데이터를 요청CPU가 메모리 관리자에게 0x100번지 데이터를 요청메모리 관리자는 **재배치 레지스터 값(예: 0x4000)**을 더해 **절대 주소 0x4100*의 데이터를 가져옴프로그램 시작 주소가 변경되더라도 재배치 레지스터 값만 수정하면 됨메모리 할당 방식과거 유니프로그래밍 환경에서는 메모리보다 큰 프로그램을 실행할 때 필요한 부분만 메모리에 올리고, 나머지는 하드디스크에 저장하는 메모리 오버레이 기법을 사용했다. 이를 통해 큰 프로그램을 여러 조각으로 나누어 일부만 실행하며, 나머지는 하드디스크의 스왑 영역에 저장했다.현대의 멀티프로그래밍 환경에서는 메모리 할당 방식이 **가변 분할 방식(세그멘테이션)**과 **고정 분할 방식(페이징)**으로 나뉜다.1. 가변 분할 방식 (세그멘테이션)프로세스의 크기에 따라 메모리를 동적으로 나누는 방식하나의 프로세스가 메모리에 연속된 공간에 할당됨 (연속 메모리 할당)✅ 장점낭비되는 공간인 내부 단편화가 발생하지 않음❌ 단점외부 단편화가 발생할 수 있음2. 고정 분할 방식 (페이징)프로세스의 크기와 관계없이 일정한 크기의 블록(페이지)로 나누어 메모리에 할당하나의 프로세스가 메모리 내 비연속적인 공간에 할당됨 (비연속 메모리 할당)✅ 장점구현이 간단하고 오버헤드가 적음❌ 단점사용되지 않는 공간이 발생하여 내부 단편화가 많음메모리 단편화 문제와 해결 방법외부 단편화프로세스가 종료된 후 남은 메모리가 조각나서, 새로운 프로세스가 올라갈 수 없는 현상해결 방법: **조각 모음(Compaction)**을 통해 단편화된 메모리 공간을 정리하지만 조각 모음 과정에서 오버헤드(추가적인 연산 비용)가 발생내부 단편화프로세스 크기보다 큰 고정된 메모리 블록을 할당하면서 사용되지 않는 공간이 생기는 현상해결 방법:할당되는 블록 크기를 조정하여 내부 단편화를 최소화버디 시스템을 사용하여 효율적인 메모리 할당버디 시스템2의 승수 단위로 메모리를 분할하여 할당하는 방식프로세스의 요청 크기에 가장 적합한 크기의 블록을 할당하여 외부 단편화를 방지하지만 내부 단편화는 일부 발생할 수 있음예시2048B(2^11)의 메모리가 있음500B 크기의 프로세스 A가 메모리를 요청512B(2^9) 크기의 블록을 할당이처럼 프로세스 크기에 맞게 할당되며, 불필요한 공간 낭비를 줄일 수 있음.현대의 메모리 관리 방식현재는 가변 분할(세그멘테이션)과 고정 분할(페이징) 방식을 조합하여 사용한다.이를 통해 내부·외부 단편화 문제를 최소화하면서도 효율적인 메모리 활용이 가능하다.가상 메모리 정리운영체제나 프로세스가 4GB 메모리 환경에서 동작하도록 설계되었다면, 그보다 적은 메모리에서는 실행되지 않는 문제가 발생할 수 있음.→ 가상 메모리(Virtual Memory) 를 사용하면 이 문제를 해결 가능.가상 메모리 개념프로세스는 메모리 관리자를 통해 메모리에 접근하며, 물리 메모리에 직접 접근하지 않음.가상 메모리의 크기는 이론적으로 무한대이나, 실제로는 물리 메모리 크기와 CPU의 bit 수에 의해 제한됨.예시: 32bit CPU → 2³² = 약 4GB가 최대 가상 메모리 크기.가상 메모리의 동작 방식운영체제를 포함하여 총 4GB 용량의 프로세스들이 실행되는 경우를 가정하면:필요한 메모리보다 물리 메모리가 부족할 수 있음.가상 메모리 시스템은 사용하지 않는 일부 데이터를 하드디스크의 스왑 영역으로 이동함.실행이 필요할 때 해당 데이터를 다시 물리 메모리로 불러와 실행 → 모든 프로세스가 실행 가능.📌 동적 주소 변환 (Dynamic Address Translation)메모리 관리자는 가상 주소(Virtual Address) 와 물리 주소(Physical Address) 를 매핑하여 변환함.즉, 물리 메모리와 스왑 영역을 합쳐 가상의 주소 공간을 제공.메모리 관리자의 역할메모리 관리자는 다음과 같은 복잡한 문제를 처리함.물리 메모리를 어떻게 나눌지프로세스를 어디에 배치할지부족한 물리 메모리를 어떻게 처리할지가상 메모리 시스템의 할당 방식운영체제는 자신의 영역을 제외한 나머지 메모리를 일정한 크기로 나누어 프로세스에 할당함.📌 메모리 분할 방식:고정 분할 (Fixed Partitioning)가변 분할 (Variable Partitioning)세그멘테이션 (Segmentation)페이징 (Paging)각각의 단점을 보완하기 위해 세그멘테이션-페이징 혼합 기법도 사용함.가상 주소와 물리 주소 매핑가상 메모리 시스템에서 가상 주소는 실제로 메모리 또는 스왑 영역 중 한 곳에 존재함.메모리 관리자는 가상 주소와 물리 주소를 1:1 매핑 테이블로 관리하여 변환을 수행. 📌 2강: 세그멘테이션 정리🔹 세그멘테이션 개념세그멘테이션에서 프로그램은 함수나 모듈 등으로 세그먼트를 구성한다.즉, 프로그램을 구성하는 논리적인 단위(코드, 데이터, 힙, 스택 등)를 개별적인 세그먼트로 관리한다.각 세그먼트끼리는 반드시 인접할 필요가 없다.🔹 논리 주소 vs 물리 주소프로세스가 바라보는 메모리 구조는 코드, 데이터, 힙, 스택이 연속된 것처럼 보인다.하지만 실제 물리 메모리에서는 세그먼트들이 흩어져 존재할 수 있다.CPU와 프로세스가 바라보는 주소를 논리 주소(Logical Address) 라고 한다.논리 주소를 실제 물리 주소(Physical Address) 로 변환하는 역할을 MMU(메모리 관리 장치) 가 수행한다.🔹 MMU의 논리 주소 → 물리 주소 변환 과정1⃣ 세그먼트 테이블(Segment Table) 조회MMU는 세그먼트 테이블(Segment Table) 을 참고하여 변환을 수행한다.운영체제가 프로세스 전환(Context Switching)을 할 때마다 MMU의 Segment Table Base Register 값을 변경하여 해당 프로세스의 테이블을 참조하게 한다.세그먼트 테이블은 다음과 같은 구조를 가진다.세그먼트 번호 Base Address (기본 주소) Bound Address (크기) 0 1500 500 1 5200 1000 2 3700 1200 3 6400 5002⃣ 논리 주소 검증CPU에서 논리 주소를 전달하면, MMU는 해당 주소가 올바른 범위 내에 있는지 확인한다.Bound Address (세그먼트 크기)와 비교하여,논리 주소가 Bound Address보다 크면 → 메모리 침범(Out of Bounds) → 인터럽트 발생 & 프로세스 종료논리 주소가 Bound Address보다 작으면 → 정상적인 접근이므로 변환 진행3⃣ 물리 주소 변환Base Address + 논리 주소 = 물리 주소 를 계산하여 변환한다.🔹 예제: MMU의 주소 변환 과정예제 요청:scss 복사편집 MMU야! 세그먼트 1번에서 0x632(= 1586) 번지 요청! 변환 과정:세그먼트 테이블에서 1번 세그먼트 확인Base Address = 5200Bound Address = 1000논리 주소(0x632)가 Bound(1000)보다 작은지 확인0x632 (1586) ✅ 정상물리 주소 변환Base Address + 논리 주소 = 5200 + 1586 = 0x5832 (물리 주소)3강 📌 페이징 정리1. 페이징의 개념외부 단편화를 해결하기 위해 고안된 메모리 관리 기법메모리를 고정 크기의 페이지(Page) 단위로 나누어 관리페이지는 논리 주소 공간을 일정한 크기로 나눈 것물리 메모리도 같은 크기의 블록(Frame) 으로 나누어 페이지를 배치2. 페이징의 특징✅ 고정 크기의 페이지이므로 외부 단편화는 발생하지 않음✅ 하지만 페이지 크기보다 작은 데이터는 내부 단편화를 유발✅ 논리 주소와 물리 주소 변환을 위해 페이지 테이블(Page Table) 사용📌 페이징의 동작 원리1) 논리 주소와 물리 주소 변환CPU가 논리 주소를 생성하면, MMU(Memory Management Unit) 가 이를 변환논리 주소는 페이지 번호(Page Number) + 오프셋(Offset) 으로 구성물리 주소는 프레임 번호(Frame Number) + 오프셋(Offset) 으로 변환📌 변환 과정CPU가 논리 주소를 생성페이지 번호를 이용해 페이지 테이블에서 프레임 번호를 찾음해당 프레임 시작 주소에 오프셋을 더해 물리 주소 생성💡 예제논리 주소: 0x1000 (16진수)페이지 크기: 16MB (2^24 바이트)계산 항목 값 페이지 번호 논리 주소 / 페이지 크기 = 0x1000 / 0x1000000 = 0 오프셋 논리 주소 % 페이지 크기 = 0x1000 % 0x1000000 = 0x1000📌 페이지 테이블 예시인덱스 (페이지 번호) 프레임 번호 0 3 1 1 2 Invalid … …📌 물리 주소 계산페이지 테이블에서 0번 페이지의 프레임 번호는 3물리 주소 = 3번 프레임 시작 주소 + 0x1000 (오프셋)📌 페이징 vs 세그멘테이션 비교구분 페이징 세그멘테이션 메모리 할당 방식 고정 크기로 나눔 논리적 영역(코드, 데이터, 스택 등)으로 나눔 단편화 내부 단편화 발생(페이지 크기보다 작은 데이터) 외부 단편화 발생(세그먼트 크기만큼 연속된 공간 필요) 크기 조정 모든 페이지 크기가 동일(Bound Address 필요 없음) 세그먼트마다 크기 다름(Bound Address 필요) 공유 및 권한 관리 제한적 (페이지 단위로 공유 어려움) 세그먼트 단위로 공유 및 권한 관리 가능 주소 변환 방식 페이지 테이블 사용 (1차원 배열 구조) 세그먼트 테이블 사용 (크기 가변적)📌 페이징의 단점: 페이지 테이블 크기 관리각 프로세스마다 페이지 테이블을 가짐 → 프로세스가 많아질수록 테이블도 커짐페이지 테이블도 물리 메모리(OS 영역)에 저장됨 → 사용자 메모리 공간 감소해결책: 다단계 페이지 테이블, TLB(Translation Lookaside Buffer) 사용📌 정리페이징은 외부 단편화를 없애지만 내부 단편화가 발생할 수 있음페이지 테이블 크기 관리가 중요한 과제세그멘테이션과 비교했을 때 공유 및 권한 관리가 더 어렵다✅ 페이징의 핵심은 효율적인 메모리 관리를 위해 페이지 크기와 페이지 테이블 크기를 적절히 조정하는 것! 🚀4강: 페이지드 세그멘테이션1. 개요페이지드 세그멘테이션은 세그멘테이션과 페이징의 장점을 결합한 메모리 관리 기법이다.세그멘테이션: 논리적으로 의미 있는 단위(코드, 데이터 등)로 메모리를 나누어 공유 및 접근 보호가 용이함.페이징: 고정된 크기로 메모리를 분할하여 단편화를 줄이고 효율적으로 관리 가능.2. 메모리 접근 권한운영체제는 특정 메모리 번지에 대해 읽기(Read), 쓰기(Write), 실행(Execute) 세 가지 권한을 설정할 수 있다.예시0x0000 ~ 0x1000: 읽기 권한만 허용0x1000 ~ 0x2000: 읽기/쓰기 가능프로세스의 주요 메모리 영역과 권한메모리 영역 설명 권한 CODE 프로그램 실행 코드 읽기(R), 실행(X) (수정 불가) DATA 전역 변수, 상수 읽기(R), 쓰기(W) 가능 여부 결정 STACK & HEAP 동적 할당된 데이터 읽기(R), 쓰기(W) 가능메모리 접근 권한은 가상 주소를 물리 주소로 변환할 때마다 검사되며, 위반 시 프로세스가 강제 종료(error) 된다.3. 페이지드 세그멘테이션 구조페이지드 세그멘테이션에서는 기존 세그멘테이션 테이블을 확장하여 권한 비트, 페이지 번호, 페이지 개수를 포함한다.세그멘테이션 테이블세그먼트 번호 권한 비트 페이지 번호 페이지 개수 0 RW 2 500 1 RE 0 1000 2 R 1 1200 3 RWE n 500Base Address → 페이지 번호로 변경Bound Address → 페이지 개수로 변경권한 비트 추가페이지 테이블인덱스 프레임 번호 0 3 1 1 2 Invalid 3 …4. 가상 주소 변환 과정가상 주소 예시: 0x12300 번지 접근세그먼트 번호 확인MMU Table을 확인 → 0x12300번지는 세그먼트 1에 속함세그먼트 1의 정보를 세그멘테이션 테이블에서 가져옴메모리 접근 권한 검사세그먼트 1의 권한: RE(읽기/실행)만약 쓰기(W) 요청이라면 → 권한 위반 (Error: 프로세스 종료)읽기/실행 요청이라면 → 다음 단계 진행페이지 테이블에서 프레임 번호 확인세그먼트 1의 페이지 번호를 사용해 페이지 테이블을 참조예: 페이지 테이블에서 프레임 3을 찾음물리 주소 변환프레임 3에서 페이지 개수(1000)를 더해 최종 물리 주소 계산스왑 처리 (필요한 경우)만약 해당 프레임이 물리 메모리에 없다면 → 디스크(스왑 영역)에서 가져와 메모리에 적재5. 페이지드 세그멘테이션의 단점메모리 접근이 2단계로 이루어져 성능 저하 발생 1⃣ 세그멘테이션 테이블 접근 2⃣ 페이지 테이블 접근이러한 단점 때문에 현대 운영체제는 페이징과 페이지드 세그멘테이션을 적절히 조합하여 사용한다. 🚀
2025. 03. 23.
0
[인프런 워밍업 클럽 스터디 3기] CS - 자료구조와 알고리즘 3주차 미션
자료구조와 알고리즘 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요. 버블 정렬: 평균적으로 O(n), 최악의 경우 O(n²)구현이 간단하지만, 이중 for문으로 인해 성능이 좋지 않다.선택 정렬: O(n²)구조가 단순하여 쉽게 구현할 수 있으나, 데이터가 많아질수록 비효율적이다.퀵 정렬: 평균적으로 O(NlogN), 최악의 경우 O(n²)병합 정렬보다 비교 횟수가 적고 메모리 사용량도 적지만, 피벗을 잘못 선택하면 성능이 급격히 저하될 수 있다.병합 정렬: O(NlogN)분할 정복 알고리즘을 적용하여 안정적인 성능을 보이지만, 구현이 복잡하다.삽입 정렬: O(n²)코드가 간단하고 이미 정렬된 데이터에는 효율적이지만, 데이터가 많아지면 성능이 떨어진다. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션 방식을 사용할 것이다.이 방법은 계산된 중간 값을 테이블에 저장하며, 일반적인 재귀나 메모이제이션보다 성능이 뛰어나다. 또한, 반복문을 활용해 한 번에 계산을 진행할 수 있어, 메모리가 제한된 환경에서도 효율적으로 사용할 수 있다.
2025. 03. 23.
0
[인프런 워밍업 클럽 스터디 3기] CS - 운영체제 3주차 미션
운영체제 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터: CPU 내부에 위치하여 가장 빠른 기억장소, 휘발성 메모리, 비싼 가격 적은 용량캐시 메모리: 레지스터보단 느리지만 메인 메모리보다 빠른 휘발성 메모리, 메인 메모리 접근 속도를 개선하기 위해 사용, CPU가 자주 사용할 것 같은 데이터를 미리 저장해 속도 차이를 줄임, 성능 향상을 위해 여러 단계(L1, L2 캐시 등)로 구성됨메인 메모리: 운영체제와 프로세스가 실행되는 공간, 휘발성 메모리, 프로그램 실행 및 데이터 처리 속도에 직접적인 영향을 줌보조 저장장치(HDD,SDD): 전원이 차단되어도 데이터가 유지되는 비휘발성 메모리 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터.경계 레지스터는 CPU 내부에 위치하며, 메모리에서 운영체제 영역과 사용자 영역을 분리한다. MMU는 프로세스가 경계를 벗어났는지 감시하며 벗어났을 경우 프로세스를 강제 종료 시킨다.메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식 장점: 낭비되는 공간인 내부 단편화가 발생하지 않음, 단점: 외부 단편화가 발생할 수 있음.고정 분할 방식 장점: 구현이 간단하고 관리가 편하며 오버헤드가 적음, 단점: 사용되지 않는 공간이 발생하여 내부 단편화가 많음4.CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱이라고 합니다. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?네 반드시 필요합니다. 운영체제와 프로그램을 저장해야 하기에 없으면 부팅이 안되거나 프로그램을 실행할 수 없습니다.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요? 파일을 삭제하면 파일 테이블에서 해당 파일의 헤더 정보만 제거되고, 실제 데이터는 삭제되지 않은 채 자유 공간 목록(free block list)에 포함된다. 사용자는 파일이 완전히 삭제된 것처럼 보이지만, 새로운 데이터가 해당 영역을 덮어쓸 때까지 디스크에 그대로 남아 있어 포렌식을 통해 복구할 수 있다.
2025. 03. 16.
0
[인프런 워밍업 클럽 3기 - CS] 2주차 발자국
학습 내용 회고: 이번 2주차는 운영체제를 공부하며 정말 재미를 느꼈습니다. 평소에 윈도우 설정을 보면서 그냥 넘어갔던 용어들 ex.조각 모음 같은 용어의 뜻을 알게 되어 너무 재밌게 수강했습니다. 1강 프로세스 간 통신프로세스 간 통신(Inter-Process Communication, IPC)은 같은 컴퓨터 안에서 프로세스들끼리 데이터를 주고받거나, 네트워크로 연결된 다른 컴퓨터의 프로세스와 데이터를 주고받는 기술이다.한 컴퓨터 내에서의 통신 방법파일(File): 여러 프로세스가 하나의 파일을 읽고 쓰면서 데이터를 공유하는 방식.파이프(Pipe): 운영체제가 제공하는 파이프를 통해 데이터를 주고받는 방식.쓰레드(Thread): 같은 프로세스 내에서 공유하는 CODE, DATA, HEAP 영역 중 DATA와 HEAP을 이용해 통신하는 방식.네트워크를 이용한 통신 방법소켓(Socket) 통신: 네트워크를 통해 데이터를 주고받는 방식.원격 프로시저 호출(RPC, Remote Procedure Call): 네트워크를 통해 다른 컴퓨터의 함수를 호출하는 방식.2강 공유자원과 임계구역프로세스 간 통신을 할 때 여러 프로세스가 공동으로 사용하는 변수나 파일을 공유자원(Shared Resource)이라고 한다.문제점: 동기화(Synchronization) 문제공유자원에 여러 프로세스가 동시에 접근하면 실행 순서에 따라 결과가 달라질 수 있다.컨텍스트 스위칭(Context Switching)으로 인해 실행 순서를 예측하기 어렵다.→ 이를 해결하려면 임계구역(Critical Section) 개념이 필요하다.공유자원 사용 시 발생하는 문제경쟁조건(Race Condition): 여러 프로세스가 동시에 공유자원에 접근하면 충돌이 발생할 수 있음.임계구역 문제 해결을 위한 상호 배제(Mutual Exclusion) 메커니즘임계구역에는 동시에 하나의 프로세스만 접근 가능해야 한다.여러 프로세스가 접근을 요청해도 한 번에 하나만 들어갈 수 있어야 한다.임계구역에 들어간 프로세스는 최대한 빨리 나와야 한다.3강 세마포어(Semaphore)세마포어는 상호 배제(Mutual Exclusion) 메커니즘 중 하나로, 공유자원에 대한 접근을 조절하는 역할을 한다.세마포어 개념프린터 방 예시:공유자원: 프린터프로세스: A, B대기 장소: 대기 큐열쇠 관리자: 운영체제열쇠: 세마포어세마포어는 프로세스가 공유자원에 접근하기 전에 획득하고, 사용이 끝나면 해제하는 방식으로 동작한다.4강 모니터(Monitor)세마포어의 단점을 보완한 상호 배제 메커니즘으로, 운영체제가 아닌 프로그래밍 언어 차원에서 지원하는 동기화 기법이다.모니터의 특징세마포어처럼 wait(), signal()을 직접 호출할 필요 없이 언어 차원에서 동기화 기능을 제공한다.더 안전하고 직관적으로 동기화 코드를 작성할 수 있다.예시: Java에서 synchronized 키워드를 사용하면 동시에 여러 프로세스가 같은 메서드를 실행할 수 없다.예시위 코드에서 프로세스 A가 increase() 메서드를 실행 중이면, 프로세스 B는 decrease()를 실행할 수 없다.결론 모니터는 세마포어보다 더 직관적이고 안전한 동기화 메커니즘을 제공하여, 동기화 코드를 쉽게 작성할 수 있도록 해준다. 데드락(교착상태)여러 프로세스가 서로 다른 프로세스의 작업이 끝나길 기다리다 아무도 작업을 진행하지 못하는 상황을 교착상태라 한다.ex. 프로세스A: 프로세스B가 자원을 줘야 실행 됨 프로세스B: 프로세스C가 자원을 주길 기다리고 있음. 프로세스C: 프로세스 A가 자원 주면 지원해주겠음. 교착상태의 발생 원인은 공유자원 때문이다.교착상태의 필요조건 4가지(모두 충족해야함)상호배제(어떤 프로세스가 리소스를 점유했다면 그 리소스는 다른 프로세스에게 공유 되면 안된다.)비선점(프로세스 A가 리소스를 점유하고 있는데 프로세스 B가 리소스를 빼앗을 수 없어야함.)점유와 대기(어떤 프로세스가 리소스 A를 점유하고 있는 상태에서 리소스 B를 원하는 상태)(오른쪽 포크를 쥔 상태에서 왼쪽 포크를 원하는 상태)원형 대기(점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있어야한다.)(1번은 자원이 공유될 수 있는지, 2번은 점유된 리소스를 빼앗을 수 있는지)교착상태를 예방하는 방법은 너무 비효율적이었다.그래서 교착상태에 빠졌을 때 해결방법을 알아보겠다.교착상태 회피(Deadlock avoidance)운영체제가 프로세스들에게 자원을 할당할 때 어느정도 자원을 할당해야 교착상태에 이르는지 파악하고 발생하지 않는 수준의 자원을 할당한다.교착상태 회피는 할당된 자원의 수를 기준으로 안정 상태와 불안정 상태로 나뉜다.운영체제는 최대한 안정 상태를 유지하려고 자원할당을 한다.불안정상태여도 교착상태에 무조건 빠지는 것이 아닌 확률이 높아지는 것.(은행원 알고리즘)운영체제는 프로세스들에게 자원을 할당하기 전에 자원을 얼마나 가지고 있는지 즉 총 자원을 알고있다.프로세스들은 자기가 필요한 자원의 최대 숫자를 운영체제에게 알려줘야함. 이를 최대 요구 자원 이라 함.안정상태시스템의 총 자원=14 사용가능한 자원=2프로세스 최대 요구 자원 현재 할당된 자원 요청이 예상되는 자원 P1 9 5 4 P2 6 4 2 P3 4 3 1이 상황에서 P1이 4개를 요구하면 요구를 취소하고 P2에게 빌려줌.그 후 P2가 작업을 마치고 6개를 반납함 so P1, P3 요구 전부 가능.불안정상태시스템의 총 자원=14 사용가능한 자원=1프로세스 최대 요구 자원 현재 할당된 자원 요청이 예상되는 자원 P1 9 7 2 P2 6 4 2 P3 4 2 2P1, P2, P3 의 요청 전부 불가능함.지금처럼 불안정상태라해도 모든 프로세스가 최대 요구 자원을 요구하지 않는 이상 교착상태에 빠지진 않지만 요구한다면 교착상태에 빠진다.이는 비효율적이다.교착상태를 어떻게 검출해낼까?가벼운 교착 상태 검출(프로세스가 일정시간 작업을 진행하지 않는다면 교착상태가 발생했다 간주& 해결)(해결: 일정 시점마다 체크포인트를 만들어 작업을 저장하고 타임아웃으로 교착상태가 발생했다면 마지막으로 저장했던 체크포인트로 롤백하는 것)무거운 교착 상태 검출(자원할당 그래프를 이용함, 현재 운영체제에서 프로세스가 어떤 자원을 사용하는지 지켜보고 교착상태가 발생했다면 해결한다. 그래프를 보고 HOW? ,그래프를 보고 순환 구조를 파악한 뒤 교착상태를 발생시킨 프로세스를 강제 종료 시킴. 다시 실행시킬 때 체크포인트로 롤백시킴)(이는 주기적으로 자원할당 그래프를 검사해야 하기 때문에 오버헤드가 발생함)(하지만 가벼운 교착 상태 검출로 검출 될 수 있는 억울하게 종료되는 프로세스는 발생하지 않는다.)컴파일과 프로세스1. 프로그래밍 언어: 컴파일 언어 vs 인터프리터 언어프로그래밍 언어는 컴파일 언어와 인터프리터 언어로 구분할 수 있다.컴파일 언어개발자가 작성한 코드를 컴파일 과정을 거쳐 실행 파일(기계어)로 변환한다.컴파일 과정에서 문법 오류를 검사하고, CPU에서 처리 가능한 기계어로 변환하므로 실행 속도가 빠르다.인터프리터 언어코드를 미리 기계어로 변환하지 않고, 실행 시 한 줄씩 해석하여 실행한다.실행 전 오류 검사를 하지 않으므로 실행 중 오류가 발생할 가능성이 높으며 속도가 느리다.2. 프로세스의 메모리 구조프로세스는 실행될 때 CODE, DATA, HEAP, STACK 영역으로 나뉜다.① 코드(Code) 영역실행해야 할 코드가 저장되는 공간.예시:ret = num1 + num2; ② 데이터(Data) 영역전역 변수나 정적 변수가 저장되는 공간.예시:int global_A = 1; int arr[10]; ③ 스택(Stack) 영역함수 호출 시 생성되는 지역 변수와 함수 호출 기록(스택 프레임)이 저장된다.함수가 종료되면 해당 스택 영역은 자동으로 해제된다.④ 힙(Heap) 영역실행 중 동적 메모리 할당이 이루어지는 공간.개발자가 직접 할당 및 해제해야 한다 (malloc, free 등 사용).3. 컴파일 언어의 실행 과정컴파일 언어로 작성된 코드가 실행 파일이 되기까지의 과정은 다음과 같다.#include #define MY_NUMBER 100 int main() { int num1 = 50; printf("result: %d", num1 + MY_NUMBER); getchar(); return 0; } 실행 과정전처리기 (Preprocessor) → test.i#include 의 내용을 포함시키고, #define MY_NUMBER 100을 치환한다.코드에 있는 모든 주석을 제거한다.컴파일러 (Compiler) → test.sC 코드(test.i)를 어셈블리 코드로 변환한다.어셈블러 (Assembler) → test.o어셈블리 코드를 목적 파일(기계어)로 변환한다.링커 (Linker) → test.exe여러 목적 파일과 라이브러리를 합쳐 실행 파일(Executable)을 생성한다.실행 파일과 프로세스exe 파일에는 코드(Code) 영역, 데이터(Data) 영역이 명확하게 구분되어 있다.운영체제(OS)는 실행 파일을 읽어 새로운 프로세스를 생성하며:코드, 데이터를 프로세스 메모리에 로드.빈 상태의 스택(Stack)과 힙(Heap) 영역을 할당.PCB(Process Control Block) 생성 후 관리 가능하도록 설정.프로그램 카운터(PC)*를 코드 영역의 첫 번째 명령어 주소로 설정하여 실행을 시작한다.이러한 과정을 통해 프로세스가 실행되며, CPU가 이를 스케줄링하여 프로그램이 동작하게 된다. 메모리의 종류와 주소 체계1. 메모리의 종류컴퓨터에서 사용되는 주요 메모리는 다음과 같이 구분된다.1.1 레지스터 (Register)CPU 내부에 위치하며 가장 빠른 기억장소전원 차단 시 데이터가 사라지는 휘발성 메모리CPU의 비트 수(예: 32비트, 64비트)는 레지스터의 크기를 의미CPU는 연산 시 메인메모리(RAM)의 데이터를 레지스터로 가져와 계산 후 다시 메인메모리에 저장1.2 캐시 메모리 (Cache Memory)레지스터보다 느리지만 메인메모리보다 빠른 휘발성 메모리메인메모리 접근 속도를 개선하기 위해 사용CPU가 자주 사용할 것 같은 데이터를 미리 저장해 속도 차이를 줄임성능 향상을 위해 여러 단계(L1, L2 캐시 등)로 구성됨1.3 메인메모리 (RAM, Random Access Memory)운영체제와 프로세스가 실행되는 공간전원이 꺼지면 데이터가 사라지는 휘발성 메모리프로그램 실행 및 데이터 처리 속도에 직접적인 영향을 줌1.4 보조 저장장치 (HDD, SSD)전원이 차단되어도 데이터가 유지되는 비휘발성 메모리하드디스크(HDD)는 비교적 저렴하지만 속도가 느림솔리드스테이트드라이브(SSD)는 빠르지만 가격이 높음2. 메모리와 주소 체계운영체제는 메모리를 효과적으로 관리하기 위해 1바이트 단위로 구역을 나누고 각 구역에 **주소(Address)**를 부여한다.2.1 32비트 vs 64비트 CPU32비트 CPU레지스터 크기: 32비트연산 장치(ALU), 데이터 버스도 32비트다룰 수 있는 메모리 크기: 2^32=4GB64비트 CPU레지스터 크기: 64비트연산 장치(ALU), 데이터 버스도 64비트다룰 수 있는 메모리 크기 : 2^64 (거의 무한대)2.2 물리 주소와 논리 주소물리 주소 공간: 메모리를 실제로 연결하면 0x0번지부터 시작하는 주소 공간논리 주소 공간: 운영체제가 사용자 프로그램을 위해 제공하는 가상의 주소 공간사용자는 논리 주소만 인식하며, 운영체제가 이를 물리 주소로 변환운영체제 보호를 위해 **경계 레지스터(Boundary Register)**를 사용하여 프로세스가 메모리 접근 시 경계를 넘지 않도록 관리함2.3 절대 주소 vs 상대 주소절대 주소 (Absolute Address): 실제 메모리에서 사용되는 물리 주소상대 주소 (Relative Address): 프로그램이 실행될 때 기준이 되는 시작 주소를 기반으로 한 주소프로그램 실행 시 **재배치 레지스터(Relocation Register)**를 사용해 논리 주소를 절대 주소로 변환2.4 메모리 주소 변환 예시사용자가 논리 주소 0x100의 데이터를 요청CPU가 메모리 관리자에게 0x100번지 데이터를 요청메모리 관리자는 **재배치 레지스터 값(예: 0x4000)**을 더해 **절대 주소 0x4100*의 데이터를 가져옴프로그램 시작 주소가 변경되더라도 재배치 레지스터 값만 수정하면 됨메모리 할당 방식과거 유니프로그래밍 환경에서는 메모리보다 큰 프로그램을 실행할 때 필요한 부분만 메모리에 올리고, 나머지는 하드디스크에 저장하는 메모리 오버레이 기법을 사용했다. 이를 통해 큰 프로그램을 여러 조각으로 나누어 일부만 실행하며, 나머지는 하드디스크의 스왑 영역에 저장했다.현대의 멀티프로그래밍 환경에서는 메모리 할당 방식이 **가변 분할 방식(세그멘테이션)**과 **고정 분할 방식(페이징)**으로 나뉜다.1. 가변 분할 방식 (세그멘테이션)프로세스의 크기에 따라 메모리를 동적으로 나누는 방식하나의 프로세스가 메모리에 연속된 공간에 할당됨 (연속 메모리 할당)✅ 장점낭비되는 공간인 내부 단편화가 발생하지 않음❌ 단점외부 단편화가 발생할 수 있음2. 고정 분할 방식 (페이징)프로세스의 크기와 관계없이 일정한 크기의 블록(페이지)로 나누어 메모리에 할당하나의 프로세스가 메모리 내 비연속적인 공간에 할당됨 (비연속 메모리 할당)✅ 장점구현이 간단하고 오버헤드가 적음❌ 단점사용되지 않는 공간이 발생하여 내부 단편화가 많음메모리 단편화 문제와 해결 방법외부 단편화프로세스가 종료된 후 남은 메모리가 조각나서, 새로운 프로세스가 올라갈 수 없는 현상해결 방법: **조각 모음(Compaction)**을 통해 단편화된 메모리 공간을 정리하지만 조각 모음 과정에서 오버헤드(추가적인 연산 비용)가 발생내부 단편화프로세스 크기보다 큰 고정된 메모리 블록을 할당하면서 사용되지 않는 공간이 생기는 현상해결 방법:할당되는 블록 크기를 조정하여 내부 단편화를 최소화버디 시스템을 사용하여 효율적인 메모리 할당버디 시스템2의 승수 단위로 메모리를 분할하여 할당하는 방식프로세스의 요청 크기에 가장 적합한 크기의 블록을 할당하여 외부 단편화를 방지하지만 내부 단편화는 일부 발생할 수 있음예시2048B(2^11)의 메모리가 있음500B 크기의 프로세스 A가 메모리를 요청512B(2^9) 크기의 블록을 할당이처럼 프로세스 크기에 맞게 할당되며, 불필요한 공간 낭비를 줄일 수 있음.현대의 메모리 관리 방식현재는 가변 분할(세그멘테이션)과 고정 분할(페이징) 방식을 조합하여 사용한다.이를 통해 내부·외부 단편화 문제를 최소화하면서도 효율적인 메모리 활용이 가능하다.
2025. 03. 16.
0
[인프런 워밍업 클럽 스터디 3기] 2주차 미션 - 자료구조와 알고리즘
자료구조와 알고리즘 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?재귀함수가 무한 호출 됩니다. 결국 콜 스택이 가득차 종료됩니다. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n) { if (n 다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.const fs = require("fs"); const path = require("path"); function traverseDirectory2(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()) { console.log('디렉토리:', filePath); traverseDirectory2(filePath); // 디렉토리면 재귀 호출 } else { console.log('파일:', filePath); } } } traverseDirectory2("."); // 현재 디렉토리 탐색
2025. 03. 16.
0
[인프런 워밍업 클럽 3기 - CS] 2주차 운영체제 미션
운영체제 FIFO 스케줄링의 장단점이 뭔가요?장점: First in First out으로 단순하고 직관적임단점:먼저 들어온 프로세스가 완전히 끝나야 다음 프로세스가 시작되기에 상대적으로 실행 시간이 짧은 프로세스가 늦게 도착했다 하면 먼저 도착한 프로세스의 종료까지 기다려야 하기에 비효율적이다.SJF를 사용하기 여러운 이유가 뭔가요? 프로세스의 실행량 예측이 힘들다! brust time이 긴 프로세스는 아주 오랫동안 실행되지 않을 수 있다! RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?컴텍스트 스위칭이 자주 일어나 오버헤드가 커지며 성능이 저하됩니다. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?프로세스가 스스로 CPU에 반납하면 CPU 사용이 적은 I/O Bound Process로 판단하고,프로세스가 타임 슬라이스를 초과해 강제로 CPU를 빼앗긴다면 CPU 사용이 많은 CPU Bound Process로 판단한다. 공유자원이란무엇인가요? 프로세스 간 통신을 할 때 여러 프로세스가 공동으로 사용하는 변수나 파일입니다! 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?상호배제(어떤 프로세스가 리소스를 점유했다면 그 리소스는 다른 프로세스에게 공유 되면 안된다.)비선점(프로세스 A가 리소스를 점유하고 있는데 프로세스 B가 리소스를 빼앗을 수 없어야함.)점유와 대기(어떤 프로세스가 리소스 A를 점유하고 있는 상태에서 리소스 B를 원하는 상태)(오른쪽 포크를 쥔 상태에서 왼쪽 포크를 원하는 상태)원형 대기(점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있어야한다.)(1번은 자원이 공유될 수 있는지, 2번은 점유된 리소스를 빼앗을 수 있는지)위의 4조건 모두 만족해야 교착상태를 충족합니다.
2025. 03. 09.
0
워밍업 클럽 CS 3기] 1주차 발자국
notion으로 정리한 내용입니다. 1강. 운영체제의 필요성컴퓨터는 운영체제 없이도 동작 가능단, 초기 설계된 기능만 수행 (예: 유선전화)추가적인 기능 실행 불가운영체제가 하는 일프로세스 관리 → 여러 프로그램을 동시에 실행 가능 (예: 노래를 들으며 게임 실행)메모리 관리 → 모든 프로그램은 메모리에서 실행되므로 효율적 관리 필요하드웨어 관리 → 운영체제가 저장장치와 직접 소통 (예: 하드디스크 데이터 저장)파일 시스템 관리 → 데이터 저장 및 접근 방식 관리2강. 운영체제 발전 과정1950년대: 싱글 스트림 배치 시스템 → 한 번에 하나의 작업 실행1960년대: 시분할 시스템 → 여러 사용자가 CPU를 번갈아가며 사용3강. 운영체제의 구조운영체제 핵심: 커널프로세스, 메모리, 저장장치 관리사용자와의 인터페이스 제공GUI (Graphical User Interface) → 그래픽 기반CLI (Command Line Interface) → 명령어 기반응용 프로그램과의 연결 → 시스템 콜(직접 접근 방지, 메모리 충돌 방지)하드웨어 제어 → 드라이버를 통해 하드웨어 제어4강. CPU와 메모리CPU 구성 요소제어장치 → 모든 장치의 동작 지시 및 제어산술논리연산장치(ALU) → 데이터 연산 수행레지스터 → 계산을 위한 임시 저장소 (변수 역할)메모리 종류RAM (휘발성 메모리): 저장 위치와 관계없이 동일한 속도로 접근 가능, 전원 차단 시 데이터 소멸ROM (비휘발성 메모리): 한 번 저장하면 수정 불가, 컴퓨터 부팅 관련 데이터(BIOS) 저장5강. 컴퓨터 부팅 과정전원 ON → ROM의 BIOS 실행주요 하드웨어 이상 검사 (POST, Power-On Self Test)이상 발견 시 부팅 중단이상 없으면 다음 단계 진행하드디스크의 MBR(Master Boot Record)에서 부트로더 로드운영체제 로딩 및 실행6강. 입출력과 인터럽트CPU의 입출력 작업 처리 방식폴링(Polling) → 주기적으로 입출력 상태 확인 (비효율적)인터럽트(Interrupt) → 폴링의 단점 해결하드웨어 인터럽트 → 입출력 장치가 완료되었을 때 CPU에 신호소프트웨어 인터럽트 → 프로그램에서 발생 (예: 유효하지 않은 메모리 접근, 0으로 나누기 오류 등) 1강: 프로그램과 프로세스프로그램: 저장 장치에 저장된 명령문의 집합. 실행되지 않는 수동적인 존재.프로세스: 실행 중인 프로그램으로, 프로그램이 메모리에 올라가 실행되는 상태.프로그램 vs 프로세스:프로그램은 저장 장치만 사용하지만,프로세스는 메모리, CPU, 입출력 자원을 활용하는 능동적인 존재.프로세스의 구조CODE: 실행할 명령어 저장 (텍스트 영역)DATA: 전역 변수, 정적 변수 저장HEAP: 동적 할당된 메모리 공간STACK: 함수 호출 정보, 지역 변수 저장2강: 프로그래밍과 프로세싱1) 유니프로그래밍 vs 멀티프로그래밍 (메모리 관점)유니프로그래밍: 메모리에 하나의 프로세스만 존재.멀티프로그래밍: 메모리에 여러 개의 프로세스가 올라와 실행됨.2) 멀티프로세싱 (CPU 관점)멀티프로세싱: CPU가 여러 개의 프로세스를 동시에 처리하는 방식.현대 운영체제는 멀티프로그래밍과 멀티프로세싱이 공존.스와핑(Swapping)3강: 프로세스 제어 블록(PCB)운영체제는 프로세스가 생성될 때 해당 프로세스의 정보를 저장하는 PCB(Process Control Block) 를 생성하고 관리한다.PCB는 연결 리스트 형태로 저장되며, 프로세스가 종료되면 운영체제는 해당 프로세스의 PCB를 연결 리스트에서 제거한다.PCB 주요 정보:포인터프로세스 상태 (생성, 준비, 실행, 대기, 완료)프로세스 ID프로그램 카운터레지스터 정보메모리 관련 정보CPU 스케줄링 정보 등4강: 프로세스 상태프로세스는 실행 과정에서 여러 상태를 거치며, 운영체제는 이를 관리한다.생성 (New)PCB를 생성하고, 프로그램을 메모리에 적재하는 과정준비 (Ready)CPU를 사용하기 위해 대기 중인 상태대부분의 프로세스가 이 상태에 머무름CPU 스케줄러가 준비 상태의 프로세스 중 하나를 선택하여 실행 상태로 전환실행 (Running)실제로 CPU를 할당받아 실행되는 상태한 번에 실행되는 프로세스의 수는 CPU 개수와 동일일정 시간이 지나면 다시 준비 상태로 돌아갈 수 있음 (스케줄링 정책에 따라)대기 (Waiting)입출력(I/O) 요청 등의 이유로 CPU가 아닌 다른 자원을 기다리는 상태요청이 완료되면 다시 준비 상태로 전환완료 (Terminated)프로세스 실행이 종료되며, 사용했던 메모리와 PCB가 제거됨5강: 컨텍스트 스위칭 (Context Switching)컨텍스트 스위칭은 실행 중인 프로세스의 상태를 저장하고, 다른 프로세스의 상태를 복원하여 실행하는 과정이다. 이 과정에서 PCB(Process Control Block)의 내용이 변경된다.컨텍스트 스위칭 과정현재 실행 중인 프로세스의 상태 저장PCB에 프로그램 카운터, 레지스터 값, 프로세스 상태 등 저장새로운 프로세스의 PCB를 로드프로그램 카운터를 새로운 프로세스의 위치로 변경레지스터 값을 복원새로운 프로세스 실행컨텍스트 스위칭 발생 이유CPU 점유 시간이 종료됨 (타임 슬라이스 만료)I/O 요청 발생 (입출력이 완료될 때까지 다른 프로세스를 실행)인터럽트 발생 (외부 장치 요청, 시스템 호출 등)프로세스 생성과 종료 배열일반적으로 배열은 운영체제에서 배열의 크기를 알려줌, 운영체제는 배열의 시작 주소만 기억배열의 인덱스 참조는 길이에 상관없이 한 번에 가져옴 O(1) → 참조에 좋은 성능BUT 배열의 데이터 삽입, 삭제 성능은 좋지 않음 (배열의 크기가 정적이기 때문)(JS는 크기를 정해두지 않음)배열의 장점 배열의 단점 참조 O(1) 크기 예측이 힘듦, 메모리낭비 데이터 삽입 삭제 비효율적배열의 단점 해결하고 싶음 → 저장하려는 데이터들을 메모리 공간에 분산해 할당 and 서로 연결→연결 리스트연결 리스트는 노드를 가짐, 노드는 데이터, 포인터를 가지고 있음연결 리스트는 첫 노드의 주소만 알면 다른 노드들에 접근할 수 있음연결 리스트 장점 연결 리스트 장점 데이터 삽입, 삭제 효율적 참조가 비효율적 O(n)배열 연결 리스트 크기 고정 동적 주소 연속 불연속 데이터 참조 O(1) O(n) 삽입, 삭제 O(n) O(n)추상 자료형 : 어떠한 데이터와 그 데이터에 대한 연산을 표기하는 것연결 리스트의 추상자료형모든 데이터 출력 printAll()모든 데이터 제거 clear()인덱스 삽입(원하는 인덱스에 데이터 삽입) insertAt(index, data);마지막 삽입(마지막 데이터 뒤에 데이터 삽입) insertLast(data);인덱스 삭제(원하는 인덱스 데이터 삭제) deleteAt(index);마지막 삭제(마지막 데이터 삭제) deleteLast();인덱스 읽기(원하는 인덱스 데이터 읽기) getNodeAt(index);
2025. 03. 09.
0
[1주차] 인프런 워밍업 클럽 스터디 3기 - CS전공지식, 자료구조와 알고리즘 미션
자료구조와 알고리즘 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.해시테이블을 사용하겠습니다. 학생의 정보를 학번(key)으로 O(1)에 접근 가능하게 만들 수 있기 때문입니다. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.주문은 들어온 순서대로 처리가 되기에 First In First Out 구조 FIFO 구조인 Queue를 이용하겠습니다 우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요.import { LinkedList } from './LinkedList.mjs'; class Stack { constructor() { this.list = new LinkedList(); } push(data) { this.list.insertAt(this.list.count, data); } pop() { try { return this.list.deleteAt(this.list.count - 1); } catch (e) { return null; } } peek() { return this.list.getNodeAt(this.list.count - 1); } isEmpty() { return this.list.count === 0; } } export { Stack }; 해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요. 힌트: charCodeAt() 함수를 이용 예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력hashFunction(name){ return name.charCodeAt(0) % 10; }
알고리즘 · 자료구조
・
자료구조
・
알고리즘
2025. 03. 09.
0
인프런 워밍업 클럽 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 요청이 발생했거나, 다른 인터럽트가 발생했을 경우 컨텍스트 스위칭이 발생합니다.
시스템 · 운영체제
・
과제
・
워밍업