블로그
전체 14#카테고리
- 백엔드
#태그
- 인프런
- 인프런워밍업클럽
- 스터디3기
- 스터디0기
2025. 04. 10.
2
[인프런 워밍업 클럽 3기 CS] 참여 후기
참여하게 된 계기CS 지식은 기술 면접에서도 자주 등장하고 실제 문제를 해결할 때도 중요한 기반이 되는데, 그에 비해 제 지식은 다소 얕다고 느꼈습니다.자료구조나 알고리즘은 어느 정도 익숙하지만 개념 위주로만 알고 있어 정리가 필요했고, 운영체제에 대한 이해는 특히 부족하다는 생각이 들었습니다. 이 기회에 자료구조와 알고리즘을 정리하고 운영체제의 기본을 다지고 싶어 참여하게 되었습니다. 좋았던 점운영체제는 내용이 추상적이고 딱딱하게 느껴질 수 있는데, 강의에서는 이를 예시나 그림으로 풀어 설명해줘서 이해하기가 훨씬 수월했습니다. 프로세스, 스레드, 메모리 구조 같은 어려운 개념도 시각적으로 설명되니 머릿속에 잘 그려졌고, 실무에서 어떻게 연결되는지도 자연스럽게 이해할 수 있었습니다.또한 자료구조와 알고리즘 파트는 깊이 있게 다루지는 않았지만, 주요 개념을 빠르게 훑는 데에는 도움이 되었고, 전체 흐름을 다시 한 번 정리할 수 있는 기회가 되었습니다. 아쉬운 점스터디가 끝나면 항상 아쉬운 점이 남는 것 같습니다. 개인적으로는 복습을 충분히 하지 못해서, 스터디에서 배운 내용을 완전히 소화하지 못한 것 같다는 점이 가장 아쉽게 느껴졌습니다. 조금 더 시간을 들여 복습하거나, 스터디 이후에도 학습을 이어나갈 계획입니다.
인프런
・
인프런워밍업클럽
・
스터디3기
2025. 03. 23.
1
[인프런 워밍업 클럽 3기 CS] 3주 차 발자국
이전에는 한 주 동안 들었던 강의를 정리하는 방식으로 발자국을 작성했었다. 이번에는 마지막인 만큼 회고로 마무리를 해보려고 한다.이번 스터디를 통해 자료구조, 알고리즘, 운영체제에 대한 기초 개념을 이해하는 데 큰 도움이 되었다. 매일 강의를 듣고 미션을 제출하는 과정에서 학습의 기초를 탄탄히 다질 수 있었다.하지만 매일 강의를 듣는 것이 예상보다 힘들었다. 일정한 분량을 매일 소화하려다 보니 때때로 피로감이 쌓였고, 강의 내용이 많아 집중하기 어려운 순간도 있었다. 그럼에도 불구하고 꾸준히 학습하는 습관을 기를 수 있었고, 매주 금요일마다 미션을 제출하는 과정이 나에게 동기 부여가 되어 학습을 지속할 수 있었다. 이번 스터디를 통해 얻은 기초 지식을 바탕으로 앞으로 더 깊이 있는 학습을 이어가며, 부족한 부분을 채워나가고자 한다. 스터디를 주도해주신 감자님, 감사합니다!
2025. 03. 23.
0
[인프런 워밍업 클럽 3기 CS] 운영체제 3주 차 미션
1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터가장 빠른 기억저장소CPU 내에 존재컴퓨터의 전원이 꺼지면 데이터가 사라져 휘발성 메모리라고 함캐시필요할 것 같은 데이터를 미리 가져와 저장하는 곳성능의 이유로 여러 개를 둔다메인 메모리실제 운영체제와 다른 프로세스들이 올라가는 공간전원이 공급되지 않으면 데이터가 지워지기 때문에 휘발성 메모리하드디스크나 SSD보다 속도는 빠르지만 가격이 비싸기 때문에 데이터를 저장하기 보다 실행 중인 프로그램만 올림보조 저장 장치비휘발성 메모리속도가 느리고 가격이 쌈2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터입니다. 경계 레지스터는 사용자 프로세스가 경계 레지스터의 값을 벗어났는지 감시하고 벗어났다면 프로세스를 강제 종료 시킵니다. 3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식장점: 메모리의 연속된 공간에 할당되기 때문에 낭비되는 공간인 내부 단편화가 없음단점: 외부 단편화 발생고정 분할 방식장점: 구현이 간단하고 오버헤드가 적음단점: 작은 프로세스도 큰 영역에 할당되어 낭비되는 내부 단편화 발생 4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱이라고 합니다. 스레싱이 발생하면 CPU가 실제 작업을 수행하기보다 페이지 교체 작업(스와핑)에 대부분의 시간을 소비하게 됩니다. 이로 인해 시스템 성능이 급격히 저하되며, CPU 사용률이 거의 0%에 가까워질 수 있습니다. 5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.필수는 아닙니다. HDD나 SSD는 데이터를 영구 저장하는 역할을 하지만 컴퓨터를 실행하는 데 직접적인 역할을 하지 않습니다. 6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일 시스템은 파일을 삭제할 때 파일 데이터 전체를 삭제하는 것이 아니라 파일의 헤더만 삭제합니다. 파일 헤더를 삭제한 파일 블록은 free block list에 저장이 되기 때문에 복구가 가능합니다.
2025. 03. 23.
0
[인프런 워밍업 클럽 3기 CS] 자료구조와 알고리즘 3주 차 미션
1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬시간 복잡도: O(n^2)장점: 이해와 구현이 간단함 단점: 성능이 좋지 않다. 선택 정렬• 시간 복잡도: O(n²)• 장점: 이해와 구현이 간단함• 단점: 성능이 좋지 않다. 삽입 정렬• 시간 복잡도: O(n²)• 장점: 이해와 구현이 간단함• 단점: 성능이 좋지 않다. 병합 정렬• 시간 복잡도: O(nlogn)• 장점: 성능이 좋음• 단점: 이해와 구현이 어려움 퀵 정렬• 시간 복잡도: Θ(nlogn)• 장점: 평균적으로 매우 빠름• 단점: 최악의 경우 O(n²)으로 성능이 떨어질 수 있음 2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션을 사용할 것입니다. 메모이제이션을 사용할 경우 재귀 호출로 인해 스택을 사용하므로, 스택 오버플로우가 발생할 위험이 있습니다. 반면, 타뷸레이션은 반복문을 활용하여 테이블을 채워나가는 방식이므로 스택을 사용하지 않아 추가적인 메모리 소비를 줄일 수 있습니다. 또한, 타뷸레이션은 불필요한 함수 호출 없이 순차적으로 계산을 진행하므로 실행 속도 면에서도 더 효율적일 수 있습니다. 이러한 이유로, 메모리가 부족한 환경에서는 타뷸레이션을 사용하는 것이 더 적절할 것같습니다.
2025. 03. 16.
0
[인프런 워밍업 클럽 3기 CS] 2주 차 발자국
운영체제프로세스 간 통신프로세스는 독립적으로 실행되기도 하지만 다른 프로세스와 데이터를 주고 받으며 통신을 하는 경우도 있음통신은 한 컴퓨터 내에서 실행되고 있는 다른 프로세스와 할 수 있고, 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와 할 수도 있다.종류한 컴퓨터 내에서파일: 통신을 하려는 프로세스들이 하나의 파일을 이용해 읽고 쓰는 방법파이프: 운영체제가 생성한 파이프를 이용해 데이터를 읽고 쓰는 방법한 프로세스 내에서쓰레드 간 통신: 전역 변수나 힙을 사용네트워크를 이용한 방법운영체제가 제공하는 소켓 통신다른 컴퓨터에 있는 함수를 호출하는 RPC공유자원과 임계구역공유자원프로세스 간 통신을 할 때 공동으로 이용하는 변수나 파일 등공유자원은 여러 프로세스가 공유하기 때문에 각 프로세스의 접근 순서에 따라 결과가 달라질 수 있음컨텍스트 스위칭으로 시분할 처리를 하기 때문에 어떤 프로세스가 먼저 실행되고 나중에 실행되는지 예측하기 어렵다.연산 결과를 예측하기 힘들고 동기화 문제가 발생임계구역여러 프로세스가 동시에 사용하면 안 되는 영역공유자원을 서로 사용하기 위해 사용하는 것은 경쟁조건이라 한다.해결 방법상호 배제의 요구사항임계영역에는 동시에 하나의 프로세스만 접근한다.여러 요청에도 하나의 프로세스의 접근만 허용한다.임계구역에 들어간 프로세스는 빠르게 나와야 한다.세마포어상호배제 매커니즘 중 하나모니터synchronized동시에 여러 프로세스에서 실행시킬 수 없음교착상태(데드락)여러 프로세스가 서로 다른 프로세스의 작업을 끝나기를 기다리다가 아무도 작업을 진행하지 못하는 상태원인은 공유자원 때문필요조건상호배제: 어떤 프로세스가 한 리소스를 점유했다면 그 리소스는 다른 리소스에게 공유되면 안 된다.비선점: 프로세스 A가 리소스를 점유하고 있는데 프로세스 B가 빼앗을 수 없어야 한다.점유와 대기: 어떤 프로세스가 리소스 A를 가지고 있는 상태에서 리소스 B를 원하는 상태여야 한다.원형 대기: 점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있는 것교착상태 해결 방법교착상태 회피프로세스들에게 자원을 할당할 때 어느정도 자원을 할당해야 교착상태가 발생하는지 파악해서 교착상태가 발생하지 않는 수준의 자원을 할당하는 방법전체 자원의 수와 할당된 자원의 수를 기준으로 안정 상태와 불안정 상태로 나눈다.운영체제는 최대한 안정 상태를 유지하려고 자원을 할당한다.불완전 상태에 있다고 교착상태에 빠지는 것이 아니라 교착상태에 빠질 확률이 높아진다.교착상태를 검출하는 방법가벼운 교착상태 검출: 타이머를 이용해 프로세스가 일정시간 동안 작업을 진행하지 않는다면 교착상태가 발생했다고 간주하고 해결함일정 시점마다 체크 포인트를 만들어 작업을 저장하고 타임 아웃으로 교착상태가 발생했다면 마지막으로 저장했던 체크 포인트로 롤백무거운 교착상태 검출: 자원 할당 그래프를 이용해 현재 운영체제에서 프로세스가 어떤 자원을 사용하는지 지켜보고 교착상태가 발생했다면 해결함오버헤드가 발생하지만 가벼운 교착상태 검출에서 발생할 수 있는 억울하게 종료되는 프로세스는 발생하지 않는다.컴파일과 프로세스컴파일 언어개발자가 코드를 작성하고 컴파일을 거쳐 0과 1로 된 기계어로 실행 파일을 만듦컴파일 과정에서 문법 오류 검사하고 CPU에서 처리 가능한 기계어로 실행 파일을 만들어 놓기 때문에 속도가 빠름인터프리터 언어개발자가 작성한 코드를 미리 기계어로 만들지 않고 실행 시 코드를 한 줄씩 해석해 실행하는 언어실행할 때 오류가 날 수도 있고 컴파일 속도가 느림메모리레지스터가장 빠른 기억저장소CPU 내에 존재컴퓨터의 전원이 꺼지면 데이터가 사라져 휘발성 메모리라고 함캐시필요할 것 같은 데이터를 미리 가져와 저장하는 곳성능의 이유로 여러 개를 둔다메인 메모리실제 운영체제와 다른 프로세스들이 올라가는 공간전원이 공급되지 않으면 데이터가 지워지기 때문에 휘발성 메모리하드디스크나 SSD보다 속도는 빠르지만 가격이 비싸기 때문에 데이터를 저장하기 보다 실행 중인 프로그램만 올림보조 저장 장치비휘발성 메모리속도가 느리고 가격이 쌈메모리와 구조운영체제는 메모리를 관리하기 위해 1바이트 크기로 구역을 나누고 숫자로 매긴다. → 주소라고 부름물리 주소메모리를 컴퓨터에 연결하면 0번지부터 시작하는 주소 공간논리 주소사용자 관점에서 바라본 주소 공간물리 주소를 몰라도 논리 주소로 접근할 수 있음메모리 할당 방식메모리 오버레이: 당장 실행해야 될 부분부터 메모리에 올리고 나머지는 하드디스크(스왑 영역)에 저장하는 방식가변 분할 방식(세그멘테이션)프로세스 크기에 따라 메모리를 할당하는 방식장점 단점 메모리의 연속된 공간에 할당되기 때문에 낭비되는 공간인 내부 단편화가 없음 외부 단편화 발생고정 분할 방식(페이징)프로세스 크기와 상관없이 정해진 크기의 메모리를 할당하는 방식장점 단점 구현이 간단하고 오버헤드가 적음 작은 프로세스도 큰 영역에 할당되어 낭비되는 내부 단편화 발생외부 단편화남아있는 메모리의 크기가 실행하고자 하는 프로세스보다 크지만, 연속적이지 않은 공간에 존재하여 실행하지 못하는 현상외부 단편화를 해결하는 방법은 공간을 합쳐주는 조각모음을 하면 된다.내부 단편화Partition의 크기가 프로세스의 크기보다 커서 메모리가 남지만, 다른 프로세스가 사용할 수 없는 상태 알고리즘재귀어떠한 것을 정의할 때 자기 자신을 참조하는 것재귀 함수: 재귀적으로 정의된 함수function myFunction(number) { console.log(number); myFunction(number + 1); } 콜스택이라는 메모리 공간이 가득차면 자동으로 종료됨위 코드는 종료 조건이 없음재귀 함수는 탈출 조건 즉, 기조 조건이 반드시 있어야 함function myFunction(number) { if (number > 10) return; console.log(number); myFunction(number + 1); } 콜스택함수가 호출되면서 올라가는 메모리 영역으로 스택이라고도 부름팩토리얼function factorial(number) { if (number == 1 || number == 0) { return 1; } else { return number * factorial(number - 1); } } 하노이탑한 번에 한개의 원판만 옮길 수 있다.가장 위에 있는 원판만 이동할 수 있다.큰 원판이 작은 원판 위에 있어서는 안 된다.정렬버블 정렬서로 인접한 두 원소를 비교하여 정렬하는 알고리즘O(n^2)장점: 이해와 구현이 간단함단점: 성능이 좋지 않음 선택 정렬정렬되지 않은 영역의 최솟값을 찾아 맨 앞의 위치한 값과 교체하여 정렬하는 알고리즘O(n^2)장점과 단점은 버블 정렬과 동일References그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)그림으로 쉽게 배우는 운영체제
2025. 03. 16.
0
[인프런 워밍업 클럽 3기 CS] 자료구조 및 알고리즘 2주 차 미션
1. 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?기저 조건이 없거나 잘못 설정되면 재귀 호출이 끝나지 않고 무한히 호출되면서 스택 메모리를 초과하여 Stack Overflow 오류가 발생할 수 있다.기저 조건이 정확하지 않으면, 재귀 호출이 정상적으로 종료되지 않거나 의도한 값과 다른 결과를 반환할 수 있다 2. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n){ if ( n == 0 ) { return 0; } if (n % 2 == 0) { return sumOdd(n - 1); } else { return n + sumOdd(n - 2); } } console.log(sumOdd(10)) // 253. 다음 코드는 매개변수로 주어진 파일 경로(.는 현재 디렉토리)에 있는 하위 모든 파일과 디렉토리를 출력하는 코드입니다. 다음 코드를 재귀 함수를 이용하는 코드로 변경해보세요.const fs = require("fs"); const path = require("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()) { console.log("디렉토리:", filePath); traverseDirectory(filePath); } else { console.log("파일:", filePath); } } } traverseDirectory1("."); // 현재 경로의 모든 하위 경로의 파일, 디렉토리 출력
2025. 03. 16.
0
[인프런 워밍업 클럽 3기 CS] 운영체제 2주 차 과제
1. FIFO 스케줄링의 장단점이 뭔가요?장점프로세스를 요청 순서대로 처리하므로 구현이 간단하다. 먼저 도착한 프로세스가 먼저 실행되므로 기아 상태(Starvation)가 발생하지 않는다.단점실행 시간이 긴 프로세스가 먼저 도착하면 뒤의 짧은 프로세스들이 오래 기다려야 하는 문제가 발생할 수 있다. CPU 사용률이 떨어진다. 2. SJF를 사용하기 여러운 이유가 뭔가요?프로세스의 종료 시간을 예측하기 어렵다.Burst Time이 긴 프로세스는 영원히 실행되지 않을 수 있다. 3. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?타임 슬라이스가 너무 작으면 컨택스트 스위칭이 자주 발생하여 오버헤드가 커진다. 실제로 작업 처리보다 스케줄링 오버헤드가 커서 전체적인 성능이 저하된다. 4. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU 점유 시간을 기반으로 레벨을 조정해 CPU를 많이 사용하는 프로세스는 낮은 우선순위 큐로 이동하고, I/O 중심 프로세스는 높은 우선순위 큐에 머무르는 방식으로 동작한다.I/O 요청을 자주 발생시키는 프로세스는 CPU 사용 시간이 짧고, 반대로 CPU Bound Process는 긴 CPU 실행 시간을 가진다. 5. 공유자원이란무엇인가요?프로세스 간 통신을 할 때 공동으로 이용하는 변수나 파일 등공유자원은 여러 프로세스가 공유하기 때문에 각 프로세스의 접근 순서에 따라 결과가 달라질 수 있다.컨텍스트 스위칭으로 시분할 처리를 하기 때문에 어떤 프로세스가 먼저 실행되고 나중에 실행되는지 예측하기 어렵다. 6. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?상호배제: 어떤 프로세스가 한 리소스를 점유했다면 그 리소스는 다른 리소스에게 공유되면 안 된다.비선점: 프로세스 A가 리소스를 점유하고 있는데 프로세스 B가 빼앗을 수 없어야 한다.점유와 대기: 어떤 프로세스가 리소스 A를 가지고 있는 상태에서 리소스 B를 원하는 상태여야 한다.원형 대기: 점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있는 것
2025. 03. 09.
0
[인프런 워밍업 클럽 3기 CS] 1주 차 발자국
자료구조와 알고리즘자료구조란?데이터가 어떻게 저장되고, 처리되는지에 대한 구조와 방법가장 기본적인 자료구조는 변수이다.자료구조에 따라 데이터를 처리하는 방법이 달라지며, 코드가 더 효율적이고 간단해질 수 있다. 알고리즘이란?문제를 해결하기 위한 확실한 절차나 방법자료구조를 선택하여 데이터를 저장하고, 이에 맞는 알고리즘을 사용해 데이터를 처리하여 원하는 결과를 얻는다. 시간 복잡도알고리즘이 문제를 해결하는 데 걸리는 시간사용자마다 컴퓨터 사양이 다르므로, 직접적인 시간 측정은 어려운 경우가 많다. 따라서 알고리즘의 성능을 예측하기 위해 시간 복잡도를 사용반복문, 재귀 등에서 성능을 분석 빅오 표기법의 특징입력 크기가 증가할 때 계산량이 어떻게 변화하는지를 나타내는 척도n² + 2n + 100 → O(n²) 배열 (Array)장점읽기/쓰기: O(1) 시간 복잡도단점크기 예측 어려움: 메모리 낭비 발생 가능삽입/삭제: 중간에 삽입/삭제되기 때문에 비효율적 (O(n)) 연결 리스트 (Linked List)특징동적 크기 조정 가능삽입/삭제는 효율적 (O(1)), 그러나 특정 노드 검색 시 O(n)배열과의 비교 크기: 배열은 고정 크기, 연결 리스트는 동적 크기주소: 배열은 연속적인 메모리, 연결 리스트는 불연속적참조 시간: 배열은 O(1), 연결 리스트는 O(n)삽입/삭제 시간: 배열은 O(n), 연결 리스트는 O(1) (노드 변경 시) 큐 (Queue)FIFO(First In First Out), 먼저 들어온 데이터가 먼저 나오는 구조운영체제의 스케줄링에서 사용되는 방식으로, 데이터를 순차적으로 처리한다. 덱 (Deque)양쪽 끝에서 데이터를 삽입하거나 제거할 수 있는 자료구조데이터를 양쪽 끝에서 자유롭게 처리할 수 있다. 해시 테이블 (Hash Table)해시와 테이블을 결합한 자료구조키와 값을 한 쌍으로 저장읽기/삽입/수정/삭제 시 평균적으로 O(1)의 시간 복잡도를 가진다.동일한 인덱스에 여러 데이터를 저장할 때 해시 충돌이 발생할 수 있다. -> 연결 리스트를 사용하여 같은 인덱스에 여러 데이터를 저장 장점: 빠른 검색, 삽입, 삭제단점: 공간 효율이 좋지 않으며, 좋은 해시 함수 구현이 필수적이다. 셋 (Set)중복된 데이터를 허용하지 않는 자료구조데이터 중복을 자동으로 제거하며, 빠른 검색이 가능운영체제CPU(Central Processing Unit) 구조중앙 처리 장치산술논리 연산 장치: 데이터 연산 담당제어 장치: 모든 장치들의 동작을 제어하고 지시 담당레지스터: CPU 내에서 계산을 위해 임시로 보관하는 장치(변수라고 생각하면 쉬움) 메모리 종류RAM(Random Access Memory)랜덤으로 데이터를 읽어도 저장된 위치와 상관 없이 읽는 속도가 같음전력이 끊기면 데이터를 잃어버리기 때문에 메인 메모리로 사용 ROM(Read Only Memory)전력이 끊겨도 데이터 계속 보관 가능 한 번 쓰면 수정 불가능컴퓨터 부팅과 관련된 바이오스를 저장하는 데 주로 쓰임 인터럽트폴링 방식 주기적으로 CPU를 확인해줘야 해서 성능이 좋지 않음폴링 방식을 해결하는 것이 인터럽트CPU가 입출력 관리자에게 명령을 내리고 다른 작업을 수행 입출력 관리자는 완료되었을 때 CPU에게 신호를 주고 CPU는 인터럽트 서비스 루틴(ISR)을 실행시켜 작업을 완료인터럽트 서비스 루틴은 특정 인터럽트가 들어오면 그 인터럽트를 처리하는 함수인터럽트는 비동기적으로 수행하드웨어 인터럽트: 입출력 등과 같은 인터럽트소프트웨어 인터럽트: 사용자 프로그램에서 발생하는 인터럽트 프로그램과 프로세스프로그램하드디스크와 같은 저장 장치에 저장된 명령문의 집합체애플리케이션이나 앱이라고도 불림 프로세스실행 중인 프로그램하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 프로세스라고 불림운영체제가 작업을 처리하는 단위 구조코드: 자신을 실행하는 코드데이터: 전역 변수와 static 변수스택: 지역 변수와 함수 호출을 했을 때 필요한 정보힙: 프로그래머가 런타임 시 할당할 수 있는 메모리 공간 컴파일 과정전처리기를 거쳐서 매크로로 정의한 숫자를 치환하고 필요한 파일을 불러옴 -> 파일은 .i가 됨컴파일을 마치면 고수준인 C 언어를 저수준인 어셈블리어로 바꿔준다. -> 파일은 .s가 됨어셈블러가 어셈블리어를 기계어로 바꿔준다. -> 파일은 .o가 된다.링커가 링킹(여러가지 라이브러라나 소스코드 연결)을 한다. -> 파일은 .exe가 된다. 멀티 프로그래밍과 멀티 프로세싱유니 프로그래밍메모리에 오직 하나의 프로세스만 올라온 것I/O 작업은 기다림 → CPU가 쉬는 시간이 발생함하나의 프로세스를 다 끝내야 다른 프로세스를 실행할 수 있음 멀티 프로그래밍메모리에 여러 개의 프로세스가 올라온 것I/O 작업을 만나면 해당 프로세스에서 발생한 I/O 작업은 기다리면서 다른 프로세스 실행 → CPU가 쉬는 시간이 없음모든 프로세스를 짧게 실행해 반복해서 동시에 실행되는 것처럼 보임CPU가 여러 개 있다면 멀티 프로세서멀티 프로세서로 작업을 처리하는 것을 멀티 프로그래밍 멀티 프로세싱위 두 가지는 메모리 관점으로 정의했다면, 멀티 프로세싱은 CPU 관점으로 정의여러 개의 CPU가 여러 개의 프로세스를 처리하는 것 PCB(Process Control Block)프로세스가 만들어지면 해당 프로세스의 정보를 가진 PCB를 만들고 저장함PCB는 연결 리스트로 저장됨 구조포인터: 부모와 자식 프로세스에 대한 포인터와 할당된 자원에 대한 포인터 등, 프로세스의 한 상태에서 다른 상태로 전환될 때 전환하는 포인터프로세스 상태: 현재 프로세스의 상태(생성, 준비, 실행, 대기, 완료) 프로세스 ID: 프로세스를 식별하기 위한 숫자프로그램 카운터: 다음에 실행될 명령어의 주소를 포함하는 프로그램 카운터를 저장레지스터 정보: 프로세스가 실행될 때 사용했던 레지스터 값들이 저장메모리 관련 정보: 프로세스가 메모리에 있는 위치 정보, 메모리 침범을 막기 위한 경계 레지스터 값 등이 저장CPU 스케줄링 정보: CPU 스케줄링에 필요한 우선순위, 최종 실행 시간, CPU 점유 시간 등이 저장 프로세스 상태CPU는 한 순간에 하나의 프로세스만 처리생성: PCB를 생성하고 메모리에 프로그램 적재를 요청, 승인 받으면 준비 상태로 넘어감준비: CPU를 사용하기 위해 기다리고 있는 상태(CPU 스케줄러에 의해 할당)대기: 프로세스가 입출력 요청을 하면 입출력이 완료될 때까지 기다리는 상태특정 프로세스가 입출력 요청을 하면 입출력이 완료될 때까지 CPU를 기다리게 하는건 비효율적해당 프로세스를 대기 상태로 두고 다른 프로세스에게 CPU 할당입출력이 완료되면 CPU 할당 기회를 준다.(준비상태로)실행: 준비 상태에 있는 프로세스가 CPU 스케줄러에 의해 CPU를 할당받아 실행되는 상태,실행 상태에 있는 프로세스의 수는 CPU의 개수만큼부여된 시간만큼 사용준비된 시간이 지나면 준비 상태로 돌아감완료: 프로세스가 종료된 상태프로세스가 사용했던 데이터를 제거PCB도 제거 컨텍스트 스위칭프로세스가 실행하는 중에 다른 프로세스를 실행하기 위해 실행 중인 프로세스를 저장하고 다른 프로세스의 상태 값으로 교체하는 작업컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경프로세스 상태프로그램 카운터레지스터 정보메모리 관련 정보CPU 점유 시간이 다 되거나 I/O 요청이 있거나 다른 종류의 인터럽트가 있을 때 발생 프로세스 생성과 종료프로세스 생성운영체제는 프로그램의 코드 영역과 데이터 영역을 메모리에 로드하고 빈 스택과 빈 힙을 만듦프로세스를 관리하기 위한 PCB(Process Control Block)를 만들어서 값을 초기화운영체제가 부팅되고 0번 프로세스가 생성될 때 딱 1번만 실행됨나머지는 0번 프로세스를 복사해서 생성 (복사는 fork() 함수 사용).생성하는 것보다 복사하는 것이 더 빠름복사한 프로세스는 자식 프로세스라고 함자식 프로세스는 부모 프로세스의 코드 영역, 데이터 영역, 스택 영역 및 PCB의 내용을 전부 복사자식 프로세스는 부모와 똑같이 실행되지만, exec() 함수를 통해 원하는 프로그램을 실행하면서 부모의 코드를 덮어씀프로세스 종료부모 프로세스는 자식 프로세스의 종료 상태(exit status)를 확인하고 종료 부모 프로세스가 먼저 종료되거나 자식 프로세스가 비정상적으로 종료된 경우, 메모리 상에 남아 있는 자식 프로세스를 좀비 프로세스라고 함 쓰레드프로세스 내에 존재하는 작업 단위로 1개 이상의 쓰레드를 가질 수 있음쓰레드는 동일한 프로세스 내에서 코드, 데이터, 힙 영역을 공유하며, 각 쓰레드는 자신만의 스택을 가짐운영체제는 작업을 처리하는 단위로 프로세스 내 쓰레드를 사용TCB (Thread Control Block)쓰레드를 관리하는 구조체로, 쓰레드의 상태 및 필요한 정보를 담고 있음 CPU 스케줄링 개요프로그램이 실행되면 메모리에서 프로세스가 생성되고, 각 프로세스에는 1개 이상의 쓰레드가 존재프로세스는 CPU를 차지하기 위해 운영체제의 명령을 기다리고 있음운영체제는 CPU를 각 프로세스에 할당/해제하는 작업을 수행하는데, 이를 CPU 스케줄링이라고 함1. 어떤 프로세스에게 CPU 리소스를 할당할 것인가?2. CPU를 할당받은 프로세스가 얼마 동안 CPU를 사용할 것인가? 다중큐준비 상태 및 대기 상태는 큐를 사용하여 관리큐에 들어온 프로세스들은 스케줄링에 따라 CPU를 할당받음 스케줄링 목표리소스 사용률 최적화오버헤드 최소화공평성 보장처리량 향상대기 시간 최소화응답 시간 단축 스케줄링 알고리즘FIFO (First In First Out)큐에 들어온 순서대로 CPU를 할당받는 방식먼저 들어온 프로세스가 완료될 때까지 다른 프로세스는 실행되지 않음CPU 사용률이 낮아질 수 있음 I/O 작업이 있는 경우 대기 시간이 길어질 수 있음 SJF (Shortest Job First)가장 짧은 작업(버스트 타임)을 먼저 실행하는 방식프로세스의 종료 시간을 예측하기 어려워서 실제로 구현이 어렵고 비효율적일 수 있음길이가 긴 프로세스는 대기 시간이 길어져 실행되지 않을 수 있음 RR (Round Robin)각 프로세스에 일정 시간(타임 슬라이스)만큼 CPU를 할당하고, 그 후 다른 프로세스로 전환타임 슬라이스를 사용하여 공평하게 CPU를 나눔타임 슬라이스의 크기에 따라 성능이 달라짐크면 FIFO처럼 동작하고, 짧으면 여러 프로세스가 동시에 실행되는 것처럼 느껴짐너무 짧으면 컨텍스트 스위칭이 너무 자주 발생하여 성능 저하가 있을 수 있음 MLFQ (Multi-Level Feedback Queue)가장 일반적으로 사용되는 알고리즘여러 개의 큐를 사용하여 각 큐에 프로세스를 우선순위별로 배치하고, 프로세스가 CPU를 일정 시간 사용하면 우선순위가 낮은 큐로 이동RR 알고리즘을 개선하여 I/O 작업이 많은 프로세스와 CPU 사용 시간이 많은 프로세스를 구분할 수 있음적절한 타임 슬라이스를 설정하여 CPU 사용률과 I/O 사용률을 최적화 Reference그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)그림으로 쉽게 배우는 운영체제
2025. 03. 08.
0
[인프런 워밍업 클럽 3기 CS] 자료구조와 알고리즘 1주 차 미션
여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.배열이나 리스트를 사용한다. 학생 정보는 보통 순차적으로 저장되고, 학생이 추가될 때마다 새로 입력되는 정보가 많지 않다. 배열이나 리스트를 사용하면 학생 정보를 인덱스로 쉽게 접근할 수 있으며, 추가나 삭제가 비교적 용이하다. 배열을 사용하면 데이터에 빠르게 접근할 수 있고, 리스트는 동적으로 크기를 조정할 수 있어 유연성이 높다. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.큐를 사용한다. 큐는 선입선출(FIFO, First In First Out) 방식으로 데이터를 처리하기 때문이다. 즉, 주문이 들어온 순서대로 처리되어야 하므로 큐 자료구조가 가장 적합하다. 큐는 첫 번째로 들어온 주문이 가장 먼저 처리되도록 하여, 고객의 요구 사항을 충족시킬 수 있다. 우리가 구현한 스택은 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 hash = 0; for (let i = 0; i
2025. 03. 08.
0
[인프런 워밍업 클럽 3기 CS] 운영체제 1주 차 미션
while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }1. 위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?인터럽트를 이용하면 폴링 방식의 성능 문제를 해결할 수 있다. 폴링 방식은 일정 시간 간격으로 상태를 반복적으로 확인하는 방식인데, 이 방식은 CPU 자원을 낭비할 수 있다. 반면, 인터럽트를 사용하면 이벤트가 발생했을 때만 CPU가 작업을 처리하게 되어 효율적으로 자원을 사용할 수 있다.인터럽트는 CPU가 다른 작업을 수행하던 중에도 중요한 이벤트를 즉시 처리할 수 있도록 한다. 예를 들어, 입출력 작업이 완료되면 입출력 장치가 CPU에 신호를 보내고, 이 신호를 받은 CPU는 해당 작업을 처리하는 인터럽트 서비스 루틴(ISR)을 실행한다. 이처럼 인터럽트는 비동기적으로 발생하며, CPU는 인터럽트가 발생할 때만 해당 작업을 처리한다.인터럽트는 크게 두 가지 종류로 나눌 수 있다.하드웨어 인터럽트: 입출력 등과 같은 인터럽트소프트웨어 인터럽트: 사용자 프로그램에서 발생하는 인터럽트 2. 프로그램과 프로세스가 어떻게 다른가요?프로그램: 하드디스크와 같은 저장 장치에 저장된 명령문의 집합체프로세스: 실행 중인 프로그램으로 하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 프로세스라고 부른다. 3. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍하나의 CPU에서 여러 개의 프로세스를 실행하는 것I/O 작업을 만나면 해당 프로세스에서 발생한 I/O 작업은 기다리면서 다른 프로세스 실행 → CPU가 쉬는 시간이 없음멀티프로세싱: 여러 개의 CPU가 여러 개의 프로세스를 동시에 실행하는 것 4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?운영체제는 프로세스를 효율적으로 관리하기 위해 PCB(Process Control Block)를 사용한다. PCB는 다음과 같은 구조를 가진다. 포인터: 부모와 자식 프로세스에 대한 포인터와 할당된 자원에 대한 포인터 등, 프로세스의 한 상태에서 다른 상태로 전환될 때 전환하는 포인터프로세스 상태: 현재 프로세스의 상태(생성, 준비, 실행, 대기, 완료)프로세스 ID: 프로세스를 식별하기 위한 숫자프로그램 카운터: 다음에 실행될 명령어의 주소를 포함하는 프로그램 카운터를 저장레지스터 정보: 프로세스가 실행될 때 사용했던 레지스터 값들이 저장메모리 관련 정보: 프로세스가 메모리에 있는 위치 정보, 메모리 침범을 막기 위한 경계 레지스터 값 등이 저장CPU 스케줄링 정보: CPU 스케줄링에 필요한 우선순위, 최종 실행 시간, CPU 점유 시간 등이 저장 5. 컨텍스트 스위칭이란 뭔가요?프로세스가 실행하는 중에 다른 프로세스를 실행하기 위해 실행 중인 프로세스를 저장하고 다른 프로세스의 상태 값으로 교체하는 작업을 말한다. CPU 점유 시간이 다 되거나 I/O 요청이 있거나 다른 종류의 인터럽트가 있을 때 발생한다. 이때 운영체제는 PCB의 내용을 변경한다.