블로그
전체 6#카테고리
- 알고리즘 · 자료구조
2025. 03. 23.
0
인프런 워밍업 클럽 스터디 3기 - CS 전공지식 (운영체제, 자료구조, 알고리즘) 회고
3주간의 기간동안 기초적인 자료구조와 알고리즘을 배우고, 운영체제에 대한 기본지식을 갖출 수 있어서 유용한 시간이었다.마지막 주의 운영체제에서는 모르고 있던 개념들을 많이 익힐 수 있었는데, 특히 메모리에 대한 수업이 기억에 남았다.운영체제메모리 관리자: 동적주소변환을 통해 사용자 데이터를 물리 메모리에 배치함(프로세스 배치 및 처리 관리)배치정책의 종류세그멘테이션과 페이징주변장치: 캐릭터디바이스와 블록디바이스로 나뉘며, 메인보드에 있는 버스로 연결되어있다.-> I/O버스는Address버스, Data버스, Control버스로 구성되어 있으며 세가지 버스르 따로 받을 수 있다.-> 장치의 상태와 데이터를 보관할 수 있는 각종 레지스터가 존재하며, 레지스터들은 입출력작업에서 데이터를 저장하는 역할을 한다. 이 값은 CPU(메모리)로 이동되기도 한다. 캐릭터디바이스: 상대적으로 데이터 전송단위가 작음-> 마우스, 키보드, 사운드카드, 직렬/병렬포트블록디바이스: 상대적으로 데이터 전송단위가 크며 블록단-> 하드디스크, SSD, 그래픽카드 DMA: 직접 메모리 접근, 입출력제어기에서 데이터를 직접 저장하거나 가져올 때 사용함입출력제어기: 고속입출력, 저속입출력이 있음-> 시스템버스는 고속으로 작동하는 CPU와 메모리가 사용(그래픽카드의 경우 대용량의 데이터를 다루기때문에 시스템버스에 연결)-> 입출력버스는 주변장치가 사용(느리고 빠른 장치를 구분해 병목현상을 해소)
2025. 03. 23.
0
인프런 워밍업 클럽 스터디 3기 - CS 전공지식 (운영체제, 자료구조, 알고리즘) 미션
운영체제 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.주기억장치(RAM): 실행 중인 프로그램과 데이터를 저장하는 공간, 속도가 빠름, 전원이 꺼지면 데이터가 소멸된다보조기억장치(HDD/SSD): 데이터를 영구적으로 저장하는 공간, 속도가 느림, 비휘발성이라 전원이 꺼져도 데이터 유지된다가상 메모리(Virtual Memory): RAM이 부족할 때 보조기억장치를 임시 메모리처럼 사용한다, 실행 가능한 프로그램 크기를 확장할 수 있다레지스터(Register): CPU 내부에 있다, 용량이 작고 가장 빠른 속도, 연산이나 명령어를 실행하는 것에서 직접 사용된다캐시 메모리(Cache Memory): CPU와 메인 메모리 사이에 있고 속도를 높이는 역할을 한다, 자주 사용하는 데이터를 저장하고 빠르게 접근할 수 있다 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?-> 경계레지스터: CPU내에 존재하며, 메모리 관리자가 사용자 프로세스가 경계레지스터의 값을 벗어났는지 검사하고 만약 벗어난 경우 그 프로세스를 종료한다. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?-> 가변분할방식은 메모리를 동적으로 할당해서 공간을 활용하는 것이 유용한 장점이 있다. 하지만 연속된 공간이 부족한 경우에는 압축이 필요하다.-> 고정분할방식은 관리가 간편하고 쉽다는 장점이 있지만, 프로세스 크기에 따라서 미리 메모리를 나눠야 하기 때문에 공간의 낭비가 심하다. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요? -> 스레싱 5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요. -> 필수적이지는 않지만, OS가 저장되어있지 않으면 부팅이 불가능하므로 일반적으로는 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?-> 실제 데이터가 삭제되지 않고 사용했던 블록의 데이터가 그대로 남아있기 때문이다. 따라서 새로운 데이터를 덮어쓰기 전에는 복구할 수 있다.자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블정렬: 이해가 쉽고 구현이 간단, 성능이 좋지못함, O(n²)선택정렬: 이해가 쉽고 구현이 간단, 성능이 좋지못함, O(n²)삽입정렬: 이해가 쉽고 구현이 간단, 성능이 좋지못함, O(n²)병합정렬: 이해와 구현이 어려움, 성능이 좋음, O(n log n)퀵정렬: 이해와 구현이 어려움, 성능이 좋음, 평균적으로 O(n log n), 최악의 경우는 O(n²)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.-> 메모리가 부족하다면 타뷸레이션을 이용한다. 왜냐하면 메모리를 최소로 사용할 수 있고, 빠른 속도로 해결할 수 있기 때문이다.
2025. 03. 16.
0
인프런 워밍업 클럽 스터디 3기 - CS 전공지식 (운영체제, 자료구조, 알고리즘) 미션
운영체제 2주차 과제 FIFO 스케줄링의 장단점이 뭔가요?-> 장점은 구현이 쉽다는 것이고 단점은 앞에 긴작업이 있으면 뒤에서 오래 기다려야 합니다.SJF를 사용하기 여러운 이유가 뭔가요?-> 실행시간을 예측하기가 어렵고 계산의 정확도가 떨어지기 때문입니다.RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?-> 오버헤드가 커져서 프로세스가 실행되는 것보다 전환되는 시간이 더 오래걸릴 수 있습니다.운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?-> CPU Bound Process는 낮은 우선순위의 큐로 이동되고, I/O Bound 프로세스는 실행을 일찍하고 높은 우선순위를 유지합니다.공유자원이란무엇인가요?-> 여러 프로세스들이 모두 사용할 수 있는 자원이고 경쟁이 발생할 수 있습니다.교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?-> 상호배제와 비선점, 점유와 대기, 원형대기가 필요조건이다. 알고리즘 2주차 과제 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?-> 기저조건이 없거나 설정이 잘못되면 재귀가 무한으로 반복됩니다. 또한 함수가 종료되지 않고 계속 호출되어서 오버플로우가 발생하며 프로그램이 정상적으로 작동되지 않는 문제가 발생합니다.0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n) { // 재귀 로직 if(n다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.const fs = require("fs"); // 파일을 이용하는 모듈 const path = require("path"); // 폴더와 파일의 경로를 지정해주는 모듈 function traverseDirectory1(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); } } } traverseDirectory1(".");
2025. 03. 16.
0
인프런 워밍업 클럽 스터디 3기 - CS 전공지식 (운영체제, 자료구조, 알고리즘) 회고
알고리즘 2주차 회고이번주 배운 알고리즘 개념은 재귀와 정렬이다.재귀는 어떠한 것을 정의할 때 자신의 참조하는 것이다.아래는 재귀를 위해 실습한 코드 일부...function sumArray(arr){ if(arr.length == 1) return arr[0]; return sumArray(arr.slice(0, -1)) + arr[arr.length -1]; } let arr = [1,2,3,4,5]; let sum = sumArray(arr); console.log(sum);재귀에서는 하노이의 탑을 이용한 방식이 있는데, 값을 이동시킬 때 사용할 수 있는 개념이라고 생각했다.예를 들면 int a=5이고 int b=4일때, a와 b의 값을 서로 바꾸는 경우 temp라는 값을 두고 바꾸는 것도 하노이의 탑과 유사할 것이다.버블정렬은 앞의 숫자와 옆의 숫자를 비교해서 자리를 바꾸는 것인데, 반복할 수록 비교할 횟수가 줄어들긴 하지만 성능이 O(n제곱)이라 좋지 않다. 선택정렬은 배열의 첫번째부터 마지막까지 비교를 하면서 정렬하는데 버블정렬과 동일하게 구현은 쉽지만 성능이 O(n제곱)으로 좋지않다.운영체제 2주차 회고스케줄링 개념을 집중해서 익혔다. 그리고 데드락에 대한 수업을 듣고 교착상태 해결방법에 대해 배울 수 있어서 유익했다.하지만 실제 상황에서 교착상태 문제 해결을 위한 능력을 갖추려면 더 공부가 필요...ㅜㅜCPU스케줄링: 운영체제에서 프로세스들에게 CPU를 할당하고 해제하는 것프로세스 상태스케줄링의 목표: 리소스 사용률, 오버헤드 최소화, 공평성, 처리량, 대기시간, 응답시간 -> 모든 것을 완벽하게 고려하기는 어렵기 때문에 밸런스 유지가 중요하다.종류: FIFO(순서대로 진행), SJF(짧은작업 먼저 진행), RR(정해진시간을 두고 순서대로 진행), MLFQ(가장 일반적으로 쓰이며 타임슬라이스를 이용해서 우선순위를 따져 진행)데드락(교착상태): 여러 프로세스가 서로 다른 프로세스 작업이 끝나기를 기다리거나 아무 프로세스도 작업을 시작하지 못한 상태교착상태는 상호배제와 비선점, 점유와 대기, 원형대기가 필요조건이다.교착상태 해결을 위해서는 교착상태 회피와 교착상태 검출이 사용될 수 있다.
2025. 03. 09.
0
인프런 워밍업 클럽 스터디 3기 - CS 전공지식 (운영체제, 자료구조, 알고리즘) 회고
기본적인 cs지식을 찬찬히 배울 수 있어서 유익한 강의였다.헷갈리던 스택과 큐는 그림으로 그려서 남기고... 자료구조와 알고리즘스택 : 단순한 구조의 리스트 (FILO), 먼저 들어온 것이 나중에 나가는 구조 -> 들어갈때는 1 - 2 - 3 순서이지만, 나올때는 3 -2 -1 이다.큐: FIFO, 먼저 들어간 것이 먼저 나옴 -> 들어간 순서 그대로 1 - 2- 3 이 나온다.해시테이블: 해시와 테이블이 합쳐진 자료구조, key와 value가 짝을 이룬다.운영체제 컴퓨터를 사용하면서도 어떻게 구성되는지 무슨 역할을 하는지에 대해 모르고 사용했던 것 같다.운영체제의 간단한 역사를 알게 되었고, 컴퓨터의 구조에 대해 배울 수 있어서 유익했다.코드만 작성하는 것이 아니라 서비스까지 고려한다면 컴퓨터의 운영체제에 대해 잘 알고 있어야 좋은 코드를 작성하고 효율적인 구성을 할 수 있겠다는 생각이 든다. 컴퓨터와 하드웨어의 구조 메인보드(CPU,메모리), 하드디스크, 그래픽카드, 출력단자(모니터), USB단자(마우스, 키보드), 스피커 오늘날은 대다수가 폰노이만 구조: CPU(중앙처리장치)와 메모리(RAM)을 두고 사이를 버스로 연결한다. 버스는 데이터를 전달해주는 통로이고, 메모리에 프로그램을 올려서 사용한다.CPU구조: 산술논리연산장치, 제어장치, 레지스터메모리 종류: RAM(전력이 끊기면 데이터 소실, 저장 위치 상관없이 읽는 속도 일정), ROM(한번 쓰면 수정 불가)바이오스의 역할: CPU, RAM, 하드디스크, 키보드, 마우스, 전원, 하드디스크에 이상이 없는지 확인 부팅과정-> ROM의 바이오스 실행 - 이상이 없다면 부트로더를 메모리로 가져와서 실행 - 운영체제 실행 - 모니터에 화면이 나옴
2025. 03. 09.
0
인프런 워밍업 클럽 스터디 3기 - CS 전공지식 (운영체제, 자료구조, 알고리즘) 미션
1주차 미션 자료구조와 알고리즘여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요?이유를 함께 적어주세요.-> 해시맵을 이용하겠습니다. key, value를 함께 갖고 있기때문에 검색을 빨리 할 수 있어서 효율적이기 때문입니다. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다.주문은 들어온 순서대로 처리됩니다.이 때 여러분이라면 어떤 자료구조를 선택하실 건가요?이유를 함께 적어주세요.-> 들어온 순서대로 처리하려면 큐를 사용합니다.큐는 FIFO방식으로 선입선출방식으로 먼저 들어온 주문이 먼저 처리되기 때문입니다. 우리가 구현한 스택은 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) {let result = 0;for (let i = 0; i result += name.charCodeAt(i);}return result % 10;}운영체제while(true){wait(1); // 1초 멈춤bool isActivated = checkSkillActivated(); // 체크}위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?-> 리소스 낭비를 줄이기 위해서 인터럽트 방식을 사용할 수 있습니다.cpu는 입출력관리자를 통해 완료신호를 받으면 인터럽트 서비스 루틴을 실행해서 작업을 완료합니다.인터럽트 서비스 루틴은 비동기적으로 동작하므로 성능이 좋습니다. 프로그램과 프로세스가 어떻게 다른가요?-> 프로그램은 정적인 개념으로 실행되지 않은 상태이며, 코드나 파일입니다. 프로세스는 실행중인 프로그램으로 동적인 개념입니다. 프로그램이 실행된 것을 프로세스라고 할 수 있습니다. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?-> 멀티프로그래밍은 cpu에서 여러 프로그램을 번갈아서 실행하는 방식이고, 멀티프로세싱은 여러개의 cpu를 사용해서 여러 프로그램을 실행하는 방식입니다. 4.운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?-> PCB(process Control Block)을 사용해서 관리합니다. PCB는 연결리스트라는 자료구조로 저장되고, 프로세스가 종료되면 연결리스트에서 해당 PCB를 제거합니다. 포인터,프로세스상태,프로세스ID,레지스터정보,메모리정보 등으로 이루어져있습니다. 컨텍스트 스위칭이란 뭔가요?-> 실행중인 cpu가 프로세스를 변경할 때에 현재의 프로세스 상태를 저장해 두고 새로운 프로세스의 상태값으로 교체하는 작업입니다. 컨텍스트 스위칭이 일어나면 cpu가 다시 세팅되는데 프로세스상태,프로그램카운터,레지스터 정보 등의 PCB 값이 변경됩니다. 하지만 자주 발생하게 되면 성능이 저하될 수도 있습니다.
알고리즘 · 자료구조