블로그
전체 102025. 03. 23.
0
[인프런 워밍업 클럽 3기] CS - 3주차 발자국
[3주차 학습 내용]동적 프로그래밍메모이제이션: 계산 결과를 기억해 중복된 계산을 하지 않는 기법 속도는 빠르지만 메모리의 사용량이 있다.하향식 타뷸레이션: 계산에 필요한 값을 전부 계산 한 뒤 테이블에 저장하는 기법상향식 운영체제페이지드 세그멘테이션, 디맨드 페이징, 페이지 교체 정책스레싱과 워킹셋, 입출력 장치,파일 시스템회고개념을 간단히 정리할 수 있는 시간이 있어 좋았고 한번 더 복습하고 부족한 부분을 찾아 보면서 공부해야겠다.
2025. 03. 23.
0
[인프런 워밍업 클럽 3기] CS - 3주차 미션
3주차 미션운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터CPU 내부에 있는 초고속 메모리용량이 적고 가격이 비쌈휘발성의 성질을 가져 컴퓨터가 종료되면 데이터도 같이 사라짐캐시 메모리CPU와 RAM 사이에서 데이터 속도를 높이기 위한 메모리메인 메모리와 레지스터 사이 속도 차이가 있어서 필요한 데이터를 미리 가져와 저장하는 공간메인 메모리실행 중인 프로그램과 데이터를 저장휘발성 메모리보조기억장치데이터를 영구 저장하는 장치 (비휘발성)속도는 RAM보다 느리지만 대용량 저장 가능사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터프로세스가 접근할 수 있는 메모리의 최대 범위를 저장경계 레지스터 값을 벗어나면 프로세스를 종료메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?고정 분할 방식 (Fixed Partitioning)장점:같은 크기로 나누어 관리가 쉽고 구현이 간단하며 오버헤드가 적음단점:내부 단편화 발생 → 프로세스가 할당된 파티션보다 작으면 공간 낭비파티션 크기를 적절히 설정해야 하므로 유연성이 부족함가변 분할 방식 (Variable Partitioning)장점:내부 단편화 문제 해결 → 필요한 만큼만 메모리를 할당하므로 공간 낭비가 적음파티션 크기를 유연하게 조정 가능해 고정 분할 방식보다 유연한 운영 가능단점:외부 단편화 발생 → 작은 빈 공간이 여기저기 생겨 전체 메모리를 충분히 활용하기 어려움CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱멀티프로그래밍을 과도하게 증가시켜 페이지 부재 증가프로세스가 실제 작업을 수행하지 못하고 페이지 교체 작업에만 CPU 자원을 소비HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?이유를 함께 적어주세요. 실행 시키기엔 필수가 아니지만 휘발성 메모리를 실행하고 종료할때 데이터가 날아가기 때문에 저장할 수 있는 공간인 HDD/SSD는 꼭 필요하다고 생각함.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제하면, 운영체제는 파일이 저장된 위치를 빈 공간으로 표시할 뿐, 실제 데이터는 그대로 남아 있어 새로운 데이터가 덮어 쓰기 전에는 복구가 가능함.자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블정렬장점: 거의 정렬된 배열에서는 빠르게 정렬 가능 , 구현이 쉬움단점: 큰 데이터는 비효율적시간복잡도: O(n²) (평균/최악) O(n) (최선)선택정렬장점: 추가적인 메모리 사용이 거의 없음단점: 데이터의 크기가 커질수록 성능이 매우 떨어짐시간복잡도: O(n²) (평균/최선/최악)삽입정렬장점: 거의 정렬된 배열에서는 매우 빠름단점: 선택 정렬과 비슷하게 데이터 크기가 커질수록 성능이 떨어짐시간복잡도: O(n²) (평균/최악) O(n) (최선)병합정렬장점: 큰 데이터를 정렬하는 데 적합하고 최악의 경우에도 O(n log n)을 보장단점: 이해와 구현이 어려움. 메모리 공간을 차지함시간복잡도: O(n log n) (평균/최선/최악)퀵정렬장점: 평균적으로 가장 빠른 정렬 알고리즘 중 하나단점: 피벗 선택이 잘못되면 성능이 급격히 떨어짐 (O(n²))시간복잡도: O(n log n) (평균/최선) O(n²) (최악)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요. 메모리가 부족한 환경에서는 스택 메모리를 많이 쓰는 재귀보다 반복문 기반의 타뷸레이션이 효율적일 것 같다 생각합니다.
2025. 03. 16.
0
[인프런 워밍업 클럽 3기] CS - 2주차 발자국
학습 내용자료구조와 알고리즘재귀프로그래밍에서 콜스택과 같다.콜스택은 함수가 호출되면서 올라가는 메모리 영역상향식 재귀와 하향식 재귀가 존재 (재귀 함수를 사용하는 방식과 반복문을 사용하는 방식)버블 정렬: 앞과 뒤의 값을 비교해서 자리를 비교하는 알고리즘가장 단순하지만 성능이 좋지 않다.O(n^2)의 시간복잡도를 가지고 있다.선택 정렬: 정렬되지 않은 첫번째 값을 시작으로 마지막 원소까지 비교하여 가장 작은 값과 자리를 바꾸는 알고리즘이해와 구현이 간단하지만 버블정렬과 마찬가지로 O(n^2)의 시간복잡도를 가지고 있다.삽입 정렬: 정렬되지 않은 영역에서 데이터를 꺼내 정렬된 영역에 데이터 삽입버블 정렬과 선택 정렬과 장단점은 같음O(n^2)의 시간복잡도를 가지고 있다.데이터 삽입 시 역순으로 순회하면서 삽입할 원소와 비교 후 오른쪽 원소에 덮어 쓰기 진행.운영체제SJF, RR, MLFQ, 프로세스 간 통신, 공유자원과 임계구역, 세마포어, 모니터데드락, 교착상태 회피, 메모리 종류회고간단하게 정리하여 복습하는 시간을 가질 수 있어서 좋았다.
2025. 03. 16.
0
[인프런 워밍업 클럽 3기] CS - 2주차 미션
2주차 미션운영체제FIFO 스케줄링의 장단점이 뭔가요?장점 : 먼저 들어온 작업을 먼저 처리하는 방식으로 구현이 단순하고 직관적단점 : 작업시간이 긴 작업이 앞에서 발생한다면 이 작업이 끝날때 까지 완전 끝날때 까지 뒤에 있는 작업들이 비효율적으로 대기시간이 길어짐. 대기시간이 길어지면 응답 시간이 길어질 수 있음.SJF를 사용하기 여러운 이유가 뭔가요?실행 시간 예측이 불가능 하고, burst time이 긴 프로세스가 아주 오랫동안 실행이 되지 않을 수 있음. burst time이 짧은 프로세스가 중간에 계속 들어오면 burst time이 긴 프로세스는 계속 뒤로 밀림.RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?컨텍스트 스위칭이 많이 발생해 오버헤드가 증가함.운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU를 사용하는 프로세스가 실행하다가 스스로 CPU를 반납하면 CPU 사용이 적은 것이므로 I/O Bound Process라고 취급한다.반대로 타임 슬라이스 크기를 오버하여 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황이면 CPU Bound Process라고 취급한다.공유 자원 이란 무엇인가요?여러 프로세스가 동시 접근하여 사용하는 자원 (EX 파일)여러 프로세스가 사용하기에 Race Condition , Deadlock 등의 문제가 발생 할 수 있음문제 해결을 위해 여러 프로세스가 동시에 사용되면 안되는 구역인 임계구역을 설정하고 관리 해야함.,교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?상호 배제(Mutual Exclusion)한 번에 한 프로세스만 자원을 사용할 수 있어야 함.점유와 대기(Hold and Wait)이미 자원을 가진 프로세스가 추가 자원을 기다려야 함.비선점(No Preemption)프로세스가 자원을 강제로 빼앗길 수 없어야 함.순환 대기(Circular Wait)프로세스들이 원형으로 자원을 점유한 채 서로 기다려야 함.자료구조와 알고리즘재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?기저조건이 없으면 무한 루프에 빠져 스택 오버 플로우가 발생할 수 있고 , 불필요한 연산이 증가 하여 성능이 저하됨.0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function OddSum(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); traverseDirectory(filePath); // 재귀 호출 } else { console.log('파일:', filePath); } } } traverseDirectory("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력
2025. 03. 09.
0
[인프런 워밍업 클럽 3기] CS - 1주차 발자국
학습 내용자료구조와 알고리즘 시간 복잡도 배열, 연결 리스트, 스택, 큐, 덱, 해시 테이블, 셋자료구조 7가지 구현하기 운영체제운영체제 개념프로세스와 쓰레드에 대한 개념 및 관리 방법CPU 스케줄링에 대한 개념 및 동작 방법 회고항상 배운 것에 복습하는 부분이 약하여 스터디에 지원하였다다시 한번 아는 것에 대한 정리와 복습을 하고 다시 개념 정리를 하는 시간을 가질 수 있어 너무 유익했다오히려 복잡하게 생각해 간단하게 설명을 하지 못한 부분을 강의를 통해 간단하게 정리할 수 있고머리 속으로도 정리 할 수 있어 더 성장 할 수 있을 거 같다.꼭 들었던 강의를 한번씩 더 복습하는 습관을 길러야겠다.
2025. 03. 09.
0
[인프런 워밍업 클럽 3기] CS - 1주차 미션
1주차 미션운영체제 while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 } 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식 입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?폴링 방식을 사용하게 되면 CPU가 주기적으로 이벤트 발생 여부를 확인하는데 불필요한 연산 때문에 성능이 좋지 않고 , 계속 이벤트 체크를 해주어야 하기 때문에 자원이 낭비되는 문제가 발생함.이를 위해 인터럽트 방식을 사용해야 한다.인터럽트 방식은 이벤트가 발생했을 때 , 서비스 루틴(ISR)을 실행하여 이벤트를 처리하고 ISR은 비동기적으로 동작해 성능이 좋음. 프로그램과 프로세스가 어떻게 다른가요?프로그램 : 저장 장치에 저장된 명령문의 집합체 (파일 , 코드)를 뜻함프로세스 : 메모리에 올라가 실행중인 프로그램을 의미 멀티 프로그래밍과 멀티 프로세싱이 어떻게 다른가요?멀티 프로그래밍 : 메모리에 여러 프로세스가 올라온 형태멀티 프로세싱 : CPU 여러 개를 사용해 여러 작업을 동시에 처리하는 방식멀티 프로그래밍은 동시에 실행하는것 처럼 시분할 방식을 가지고 , 멀티 프로세싱은 병렬처리가 이루어져 여러 프로그램을 동시에 실행함. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?PCB를 사용. 프로세스가 만들어지면 운영체제는 프로세스 정보를 가지고 있는 PCB를 생성. PCB 는 서로 연결되어 있는 연결 리스트 형태를 가지고 프로세스를 효율적으로 관리함.컨텍스트 스위칭이란 뭔가요?CPU가 실행 중인 프로세스를 변경할 때 , 현재 실행중인 프로세스의 상태를 저장하고 , 다른 프로세스의 상태값으로 교체.컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경되며 , 컨텍스트 스위칭이 자주 일어나는 환경에서는 오버헤드가 발생할 가능성이 있음.자료구조 & 알고리즘여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.해시맵을 사용하여 빠르게 검색하고 중복을 피하기 위해 키-값 저장을 할 수 있는 해시맵을 사용할 것같습니다. 학생의 고유 값인 학번 이나 이름을 키로 사용해 빠르게 검색하는 부분에 효율적으로 저장/관리 할 것 같습니다.여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.주문이 들어온 순서라면 큐를 사용하여 먼저 들어온 주문을 먼저 처리(FIFO) 선입선출 방식으로 처리하고 데이터의 삽입 삭제가 O(1)로 효율적인 처리가 가능하기 때문입니다.우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다. 반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요. public class Stack { private final int[] stack; // 스택 배열 생성 private final int capacity; private int size; public Stack(int capacity) { this.capacity = capacity; this.stack = new int[capacity]; this.size = 0; } public static void main(String[] args) { Stack stack = new Stack(3); stack.push(1); stack.push(2); stack.push(3); stack.push(4); // 스택의 사이즈가 0일 경우 -1 return System.out.println(stack.peek()); // 제일 스택 위에 있는 값 3 System.out.println(stack.pop()); // 3 System.out.println(stack.pop()); // 2 System.out.println(stack.pop()); // 1 System.out.println(stack.pop()); // -1 } // 스택이 비었는지 검증 public boolean isEmpty() { return size == 0; } // 스택이 가득 차있는지 검증 public boolean isFull() { return size == capacity; } // 데이터 삽입 (출구 쪽에 삽입) public void push(int data) { if (isFull()) { // 가득 차있을경우는 스택에 값을 삽입하지 않음. return; } // 마지막 인덱스에 삽입 stack[size] = data; size++; } // 데이터 삭제 (출구 쪽에서 삭제) public int pop() { if (isEmpty()) { // 스택에 값이 없을경우 -1 return return -1; } // 마지막 인덱스의 데이터 반환 후 크기 감소 int poppedValue = stack[size - 1]; size--; return poppedValue; } // 스택 가장 위의 값 public int peek() { if (isEmpty()) { // 스택이 비었을 때 검증 return -1; } return stack[size - 1]; } }해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요.(힌트: charCodeAt() 함수를 이용 예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력)hashFunction(name){ let hashValue = 0; for (let i = 0; i
알고리즘 · 자료구조