블로그
전체 6#카테고리
- 웹 개발
#태그
- 인프런워밍업클럽
- 인프런워밍업클럽3기
- CS
- 감자
2025. 03. 23.
0
[인프런 워밍업 클럽 3기] CS - 3주차 발자국
[인프런 워밍업 클럽 3기 - CS 전공지식 스터디]의 3주차 발자국을 작성한 글입니다.정렬 알고리즘, 가상메모리, 입출력 장치에 대해 학습했다.코딩테스트 연습을 할 때, 단순히 라이브러리로 정렬을 했는데, 다른 정렬에 대해서도 알 수 있는 시간이었다. 특히 각 정렬 알고리즘의 시간복잡도와 장단점을 이해하며, 정렬에 대한 개념을 이해할 수 있었다.운영체제의 내부 동작을 더 깊이 이해할 수 있었고, 평소에는 당연하게 사용했던 컴퓨터 시스템에 대해 생각하는 시간을 가질 수 있었다.앞으로도 "왜 이런 방식으로 동작하는 지"에 대한 생각을 가지고 학습해나가려 한다.
인프런워밍업클럽
・
인프런워밍업클럽3기
・
CS
2025. 03. 23.
0
[인프런 워밍업 클럽 3기] CS - 3주차 미션
[인프런 워밍업 클럽 3기 - CS 전공지식 스터디]의 3주차 미션 내용을 작성한 글입니다.운영체제Q1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.A1.- 레지스터(Register) - CPU 내부에 있는 매우 작은 용량의 초고속 메모리 - 명령어 수행에 직접적으로 사용되며, 접근 속도가 가장 빠름- 캐시(Cache) - CPU와 메인 메모리(RAM) 사이에 위치하는 고속 메모리 - 접근 속도는 레지스터보다는 느리지만, 메인 메모리보다 훨씬 빠름- 주기억장치(Main Memory, RAM) - 프로그램이 실행되는 동안 데이터를 저장하는 휘발성 메모리 - 전원이 꺼지면 데이터가 사라짐- 보조기억장치(Secondary Storage, HDD/SSD 등) - 데이터를 영구적으로 저장하는 장치 - RAM보다 훨씬 큰 용량과 비교적 저렴한 가격을 가짐 Q2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?A2. 경계 레지스터, 접근 주소가 올바른 범위 내인지 확인해 불법 접근을 차단한다. Q3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?A3.- 고정 분할 방식 - 구현이 단순하고 관리가 쉬움 - 메모리를 효율적으로 사용하기 어렵다.- 가변 분할 방식(Variable Partitioning) - 필요한 만큼 동적으로 메모리를 할당 - 압축 등의 추가 작업이 필요할 수 있음 Q4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?A4.스래싱(Thrashing), 너무 많은 프로세스를 동시에 메모리에 두려다가, 실제로는 페이지 부재가 연속으로 발생하고 디스크 스왑 작업만 과도하게 일어나 CPU가 작업을 거의 못 하게 된다. Q5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.A5.- HDD나 SSD와 같은 보조기억장치가 있어야 운영체제를 설치하고 부팅할 수 있다.- 하지만 외부 저장장치 없이도 OS를 구동할 수 있습니다.- 즉, 일반적 PC에서 표준 운영체제를 쓰기 위해서는 HDD/SSD 가 거의 필수적이나, 특수 환경이나 임시 부팅을 통해서면 꼭 필요지는 않다. Q6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?A6.- 운영체제의 파일 시스템은 파일을 삭제할 때 실제 데이터 영역을 즉시 ‘0’으로 지우기보다, 파일에 대한 메타데이터를 지우거나 갱신하는 방식으로 처리하는 경우가 많습니다. - 실제 데이터 블록 자체는 덮어쓰기가 일어나지 않는 한 그대로 남아있기 때문에, 이를 전문적인 포렌식 기법을 통해 스캔하면 파일이 부분적 또는 완전히 복구될 수 있다.자료구조와 알고리즘 Q1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.A1.- 버블정렬: 구현이 간단하지만 비효율적, O(n²)- 선택정렬: 메모리 쓰기가 상대적으로 적음, 수행 시간이 오래 걸림, O(n²)- 삽입정렬: 정렬되어 있거나, 데이터 개수가 적을 때 빠름, 역순으로 정렬된 경우 비효율적, O(n²)- 병합정렬: 최악의 경우에도 O(n log n)으로 동작, 추가적인 메모리 공간이 필요, O(n log n)- 퀵정렬: 평균적으로 매우 빠름, 평균적으로 O(n log n), 최악의 경우는 O(n²) Q2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다.여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.A2.메모리가 부족한 시스템이라면, 재귀 호출 스택을 많이 쓰는 메모이제이션보다는 반복문 기반의 타뷸레이션 방식을 이용할 것이다.- 타뷸레이션 방식을 이용하면 스택 오버플로를 방지하고, 함수 호출 오버헤드를 줄일 수 있다.
인프런워밍업클럽
・
인프런워밍업클럽3기
・
CS
2025. 03. 16.
1
[인프런 워밍업 클럽 3기] CS - 2주차 발자국
[인프런 워밍업 클럽 3기 - CS 전공지식 스터디]의 2주차 발자국을 작성한 글입니다.[강의 수강]학습 내용 요약운영체제: 프로세스 동기화, 데드락, 메모리자료구조와 알고리즘: 재귀 알고리즘학습 회고여러 프로세스가 실행될 때, 발생할 수 있는 문제를 알게 되었고 그 원인에 대해 이해하게 되었다. 재귀 함수를 통해 문제 해결을 단순화 할 수 있다는 점을 알 수 있었다. 올바른 기저조건을 사용해 재귀 함수를 구현해야 한다는 점을 기억해야겠다.강의 자료 내 그림을 나만의 방식으로 표현해서 이해해보도록 해야겠다.[미션]미션 해결 과정과 회고각각의 스케줄링 알고리즘의 특징에 대해 다시 이해하며 정리하는 시간이 되었다. 재귀로 구현되지 않은 함수를 재귀로 직접 바꿔보며, 코드의 변화를 알 수 있었다.전체적으로, 강의로 들은 내용을 코드로 다시 한번 복습할 수 있어서 이해하기 좋았다.
웹 개발
・
인프런워밍업클럽
・
인프런워밍업클럽3기
・
CS
2025. 03. 16.
0
[인프런 워밍업 클럽 3기] CS - 2주차 미션
[인프런 워밍업 클럽 3기 - CS 전공지식 스터디]의 2주차 미션 내용을 작성한 글입니다. 운영체제Q1. FIFO 스케줄링의 장단점이 뭔가요?A1. 장점: 구현이 매우 쉽고 단순하다.단점: 평균 대기 시간이 길어질 수 있다. Q2. SJF를 사용하기 여러운 이유가 뭔가요?A2.CPU 실행 시간을 미리 알기 어렵다. 가장 짧은 작업부터 처리하면 효율적이지만만, 실제 OS가 각 프로세스의 CPU 사용 시간을 정확히 알 수 없다. Q3. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?A3.아주 작은 타임 슬라이스로 인해, 프로세스가 실행되다가 Context Switching이 발생한다. 효율이 떨어지고 시스템 성능이 저하될 수 있다. Q4. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?A4.MLFQ에서는 타임 슬라이스 전부 소진하면 더 낮은 우선순위 큐로 내려간다.I/O Bound 프로세스는 CPU를 짧게 쓰고 자주 I/O를 수행하기 때문에, 상대적으로 높은 우선순위를 부여받고, CPU Bound 프로세스는 계속 CPU를 사용하려 하기 때문에, 낮은 우선순위로 내려간다. Q5. 공유자원이란무엇인가요?A5.여러 프로세스가 동시에 사용하거나, 사용하고 싶어 하는 자원 Q6. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?A6. 상호 배제, 점유 대기, 비선점, 환형 대기 자료구조와 알고리즘Q1. 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?A1.무한 재귀가 일어나고, 결국 스택 오버플로가 발생하여 프로그램이 중단될 수 있다. Q2. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.A2.function sumOdd(n){ if (n Q3. 다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다.다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.const fs = require("fs"); // 파일을 이용하는 모듈 const path = require("path"); // 폴더와 파일의 경로를 지정해주는 모듈 function traverseDirectory1(directory){ const stack = [directory]; // 순회해야 할 디렉토리를 저장할 스택 while (stack.length > 0) { // 스택이 빌 때까지 반복 const currentDir = stack.pop(); // 현재 디렉토리 const files = fs.readdirSync(currentDir); // 인자로 주어진 경로의 디렉토리에 있는 파일or디렉토리들 for (const file of files) { // 현재 디렉토리의 모든 파일or디렉토리 순회 const filePath = path.join(currentDir, file); //directory와 file을 하나의 경로로 합쳐줌 const fileStatus= fs.statSync(filePath); // 파일정보 얻기 if (fileStatus.isDirectory()) { // 해당 파일이 디렉토리라면 console.log('디렉토리:', filePath); stack.push(filePath); } else { // 해당 파일이 파일이라면 console.log('파일:', filePath); } } } } traverseDirectory1("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력A4.function traverseDirectoryRecursive(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); traverseDirectoryRecursive(filePath); } else { console.log("파일:", filePath); } } }
웹 개발
・
인프런워밍업클럽
・
인프런워밍업클럽3기
・
CS
2025. 03. 08.
0
[인프런 워밍업 클럽 3기] CS - 1주차 발자국
[인프런 워밍업 클럽 3기 - CS 전공지식 스터디]의 1주차 발자국을 작성한 글입니다.[강의 수강]학습 내용 요약운영체제: 프로세스, CPU 관련 내용자료구조와 알고리즘: 기본 자료구조의 종류와 추상화 구현학습 회고이번 주는 주로 CS의 개요에 대해 학습했다.이전까지는 CS 공부를 체계없이 접했는데, 감자님의 강의를 통해 전체적인 흐름을 잡고 자세한 이해를 할 수 있었다.특히 JS로 자료구조를 공부하며, 이전의 파이썬으로 자료구조를 학습했던 한계를 보완할 수 있었던 것 같다.시간이 부족해 개념에 대해 자세히 공부하지는 못했는데, 스터디가 끝난 후에도 복습하며 구체적으로 이해해봐야겠다.[미션]미션 해결 과정문제를 보고 먼저, 큰 카테고리를 체크한 후 필기한 내용과 추가로 찾아 본 내용을 종합하여 미션을 해결할 수 있었다. 미션 회고강의를 들으면서 단순히 따라하던 코드들을 응용하여 다시 작성해 보며 내부 동작 구조를 이해하는 시간이 되었다.
웹 개발
・
인프런워밍업클럽
・
인프런워밍업클럽3기
・
CS
・
감자
2025. 03. 08.
0
[인프런 워밍업 클럽 3기] CS - 1주차 미션
[인프런 워밍업 클럽 3기 - CS 전공지식 스터디]의 1주차 미션 내용을 작성한 글입니다. 운영체제Q1.while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다.이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다.이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?A1. 인터럽트 방식을 이용한다. 스킬 사용을 완료하면 인터럽트 신호를 보내고, 이를 감지해 체크할 수 있다. 이 방식을 이용하면 주기적으로 확인할 필요가 없으므로, 성능 개선이 가능하다. Q2. 프로그램과 프로세스가 어떻게 다른가요?A2.프로그램은 실행 가능한 코드 명령어나 데이터 등이 보조기억장치에 저장된 정적인 상태이다.프로세스는 메모리에 적재되어 실행되는 동적인 상태이다. Q3. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?A3.멀티 프로그래밍은 하나의 CPU에서 여러 프로그램이 동시에 메모리에 올라가 있다.멀티 프로세싱은 여러 개의 CPU가 존재한 환경에서 프로세스가 동시에 병렬으로 실행할 수 있다. Q4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?A4. 프로세스 관리를 위해 PCB를 이용한다. Q5. 컨텍스트 스위칭이란 뭔가요?A5.CPU가 현재 실행중인 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 로드하여 실행을 넘기는 과정이다.자료구조와 알고리즘Q1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요?이유를 함께 적어주세요.A1.학생 번호와 이름을 사용해 해시 테이블을 사용한다.해시테이블은 삽입과 검색 속도가 빠르기 때문에 관리 프로그램에 적합하다고 생각한다. Q2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다.주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요?이유를 함께 적어주세요.A2.큐 자료구조를 선택할 것이다.주문을 들어온 순서대로 차례로 처리하기 때문에, 선입선출(FIFO) 방식의 큐 자료구조를 선택했다. Q3.우리가 구현한 스택은 0번 인덱스, 즉 입구쪽으로 데이터가 삽입되고 나오는 구조입니다.반대로 마지막 인덱스, 즉 출구쪽으로 데이터가 삽입되고 나오는 구조로 코드를 변경해주세요.A3.import { LinkedList } from './LinkedList.mjs'; class Stack{ constructor(){ this.list = new LinkedList(); } push(data){ // 마지막 인덱스에 삽입 (this.list.count는 리스트의 현재 길이) this.list.insertAt(this.list.count, data); } pop(){ try{ // 마지막 인덱스에서 제거 return this.list.deleteAt(this.list.count - 1); } catch(e){ return null; } } peek(){ // 마지막 인덱스(= top 위치)의 노드 반환 return this.list.getNodeAt(this.list.count - 1); } isEmpty(){ return (this.list.count == 0); } } export { Stack }; Q4.해시테이블의 성능은 해시 함수에 따라 달라집니다. 수업 시간에 등번호를 이용해 간단한 해시 함수를 만들어봤습니다. 이번엔 등번호가 아닌 이름을 이용해 데이터를 골고루 분산시키는 코드로 수정해주세요.힌트: charCodeAt() 함수를 이용예시: name1 = "이운재"; name1.charCodeAt(0); // 51060 이운재의 0번 인덱스 ‘이’의 유니코드 출력A4.이름의 0번 인덱스인 성은 해시충돌이 발생할 가능성이 높기 때문에, 이름에 포함된 문자들의 값을 모두 더한 후 해시 테이블의 크기인 10으로 나눈 나머지를 인덱스로 사용함. hashFunction(name) { let sum = 0; for (let i = 0; i
웹 개발
・
인프런워밍업클럽
・
인프런워밍업클럽3기
・
CS
・
감자