블로그
전체 62024. 10. 19.
1
[인프런 워밍업 클럽 2기 - CS] 발자국 - 3주차
회고이번주는 진도를 잘 따라가다가 이상하게 가상메모리 부분에서 집중/이해가 안되어서 운영체제는 미루다가 금,토에 몰아서 보고 정리했다.운영체제의 나중 부분은 집중이 잘 안되어서 일단 간단하게 정리해두었는데, 나중에 필요해지면 강의를 다시 봐야할듯 싶다. 어느덧 마지막주이다. 3주, 길다면 길고, 짧다면 짧은 기간이었는데 어느덧 지나갔다.그냥 그렇다고 알고 있던 부분들을 자세히 알 수 있어서 좋은 부분들도 있었지만, 내가 지금 하고 있는 코딩에 있어 어떤 도움/필요가 있는지 와닿지 않다보니 집중력이 떨어지는 느낌이었다. 그래도 일정에 따라 잘 마무리한 나를 칭찬하며, 교류를 하지는 않았지만 같이 2기 CS를 완료한 분들께도 축하를 전하고, 강의를 제작하고 이끌어주신 감자 님에게도 감사의 인사를 전합니다.나중에 감자 님의 남은 2강의도 수강할 기회가 생긴다면 수강할 계획이다. 운영체제회고에 적었듯이 가상메모리 부분부터 집중/이해가 너무 안되었다.무슨 의미인지는 이해가 가지만, 이걸 세부적인 내용을 정리하고 기억하는게 안되었다고 할까..그래서 두어번 돌려본 후, 간단하게 정리만 하고 넘어갔다.그래도 미션의 답을 달기 위해 해당 부분은 집중해서 정리하여 그나마 잘 수강을 마무리 할 수 있었던 것 같다. 자료구조와 알고리즘5개의 정렬 알고리즘을 설명해주셨는데, 앞의 3개는 같은 성능을 보이며 개인적으로 그 중 첫번째가 3개 중 구현하기 쉽다고 생각된다.그럼 제일 성능이 좋은 퀵정렬과 구현이 쉬운 버블정렬 이렇게 두가지를 사용하게 될것 같은데. 정작 이 알고리즘들을 내가 사용할지가 의문이다.이런게 있구나, 이렇게 해서 이런 성능이구나 정로도 이해를 하고 넘어가야 하는 부분일까 하는 생각이 들었다. 메모이제이션과 타뷸레이션을 배우고나니, 재귀로 구현가능하더라도 효율적인 측면으로 보자면 for문이 가능하면 for문으로 구현하는게 더 좋을 것 같다는 생각이 들었다. 3주차 미션: https://www.inflearn.com/blogs/88942주차 발자국: https://www.inflearn.com/blogs/8687
2024. 10. 18.
1
[인프런 워밍업 클럽 2기 - CS] 미션 - 3주차
운영체제1) 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터: CPU 안에 있는 메모리로 매우 빠름, 캐시를 먼저 확인해보고 없으면 메모리에서 가져옴.캐시: 레지스터에서 사용할 데이터를 미리 저장해 놓는 장치메인메모리: 실제 운영체제와 프로세스들이 올라가는 공간, 보조장치보다 비싸기 때문에 실행중인 프로그램만 올림보조저장장치: 상대적으로 저렴한 가격을 이용해 저장공간으로서 사용됨.순서대로 속도가 빠르며 용량이 작고 가격이 비쌈. => 비싼 메모리로 전부 만들 수 없으니, 가격별로 역할에 맞게 만들어서 역할 분담하여 사용됨 => 일반 가정에서도 사용 가능한 가격의 컴퓨터보조저장장치를 제외한 나머지는 모두 휘발성 메모리 2) 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터 3) 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식장점: 더 크게 할당돼서 낭비되는 공간인 "내부 단편화"가 없음.단점: "외부 단편화" 발생 외부 단편화: 할당된 메모리 작업이 끝난 공간이 연속적이지 못해, 이후에 배정되어야 하는 프로세스가 빈 공간 영역보다 커서 할당되지 못하는 문제 고정 분할 방식장점: 구현이 간단함, 오버헤드가 적음.단점: 작은 프로세스도 큰 영역에 할당돼서 공간이 낭비되는 "내부 단편화"가 발생 4) CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱 5) HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.꼭 필요하냐고 한다면 그렇지는 않습니다.일반적인 경우는 저장장치에 운영체제를 설치하고 이를 컴퓨터 부팅할때 메모리로 불러와 동작을 합니다.그런데 저장장치는 HDD나 SSD만 있는것이 아닙니다. 대표적인 예시로 USB에 운영체제를 설치하고 이를 불러와 컴퓨터를 가동하는 방식도 존재합니다.따라서 HDD나 SSD가 꼭 필요하냐고 한다면 그렇지는 않습니다. 6) 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제했을 때, 실제로는 파일 테이블의 헤더를 삭제하고 free block list에 추가하는 방식이라 블록의 데이터는 그대로 남아있게 되며, 이를 포렌식으로 복구하는것입니다.만약 복구가 되는걸 원치 않는다면 여러번 데이터를 씌워서 해당 블록에 새로운 데이터가 덮어 씌워지도록 해야합니다. 자료구조와 알고리즘1) 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬 (Bubble Sort)장점: 이해와 구현이 간단함단점: 성능이 좋지 않음성능: O(n^2) 선택 정렬 (Selection Sort)장점: 이해와 구현이 간단함단점: 성능이 좋지 않음성능: O(n^2) 삽입 정렬 (Insertion Sort)장점: 이해와 구현이 간단함단점: 성능이 좋지 않음성능: O(n^2) 병합 정렬 (Merge Sort)장점: 성능이 좋음단점: 재귀적인 기법으로 이해와 구현이 어려움성능: O(nlogn) 퀵 정렬 (Quick Sort)장점: O(nlogn)의 성능을 낼 수 있음.단점: 피벗이 한쪽으로 치우치면 O(n^2)의 성능이 나올 수도 있음. 재귀적인 기법으로 이해와 구현이 어려움.성능: O(nlogn) or O(n^2)이론적인 성능만 보자면 병합정렬이 더 좋다고 판단될 수 있지만, 피벗을 보통 중간값으로 설정하여 O(n^2)의 성능이 나올 경우가 드물기 때문에 일반적으로 O(nlogn)의 성능을 가짐. 게다가 퀵 정렬이 더 적은 비교와 더 적은 메모리 공간을 차지하기 때문에 더 좋은 알고리즘으로 평가됨. 2) 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.우선은 메모이제이션으로 구현을 합니다.그리고 메모리가 많이 부족한지를 따져보고, 많이 부족하다면 빠르게 타뷸레이션으로 변경하고, 아니라면 천천히 타뷸레이션으로 변경할 것이지만, 결론적으로는 타뷸레이션으로 변경할 것입니다. 이유는 재귀로 쉽게 구현이 가능할 것 같다는 내용으로 미루어보아 빠르게 메모이제션으로 구현을 한 후, 이게 잘 동작하는지 체크하고, 이 내용을 바탕으로 타뷸레이션을 구현하면, 빠르게 문제를 해결함과 동시에 타뷸레이션을 구현하는 바탕이 되어 줄 수 있기 때문입니다.그리고 타뷸레이션으로 변경함으로서 차후 문제였던 메모리 부족 현상도 줄일 수 있습니다.
2024. 10. 11.
1
[인프런 워밍업 클럽 2기 - CS] 발자국 - 2주차
회고저번주 회고에 적었던 대로 이번주는 일정에 맞게 수강을 진행했다. 게다가 휴일도 1일 있었기 때문에 일정을 따라가기 더욱 쉬웠다.덕분에 저번주는 강의를 들으면서 미션을 풀었는데, 이번주는 미션의 답을 생각해보고 내가 정리했던 강의 노트를 보면서 미션을 풀었다. 저번주는 미션을 풀기 위해 강의를 보았던 느낌이라면 이번주는 미션을 풀기위해 복습한 느낌.그리고 여유가 생겨 미션의 코드를 디벨롭하기도 했다.function sumOdd(n) { // 재귀 로직 if (n === 0) return 0; return sumOdd(n - 1) + (n % 2 === 0 ? 0 : n); } console.log(sumOdd(10)); // 25 원래 코드는 위처럼 모든 수를 재귀 호출하는 방식이었는데,아래 코드처럼 홀수만 재귀 하도록 코드를 변경했다.function sumOdd(n) { // 재귀 로직 if (n ++ 변수 선언을 삭제하고 리턴을 두가지 방법으로 나눠서 조금 더 효율적이게 바꿔보았다.function sumOdd(n) { // 재귀 로직 if (n 일정을 보니 벌써 다음주가 마지막 주이다.이번주의 여유가 마음에 들었던 만큼 다음 마지막주도 여유롭게 끝내야겠다. 운영체제확실히 그림으로 비유를 해줘서 데드락의 이해가 쉬웠다.사실 지금까지 메모리는 그냥 크면 좋다고 생각했었는데, 운영체제를 공부하면서 저장장치에 있는 프로그램이 메모리에 올라가 프로세스로 동작하는걸 보니 메모리가 왜 커야 좋은지 알게 되었다. 자료구조와 알고리즘앞의 문제가 해결되었다고 가정하고 끝의 부분만 계산하는 재밌는 함수인 재귀함수를 알게 되었다.처음에는 이를 구현하는 방법이 어려웠는데, 미션을 한 번 하고나니 조금은 더 이해 되었다. 아쉬운 점이라면, 미션의 내용이 for문을 돌리는게 더 효율적일 듯 싶다는 점이다. 즉, 진짜 재귀함수가 필요한(유리한) 문제도 있었으면 좋았을 것 같다. 미션 - 2주https://www.inflearn.com/blogs/8682발자국 - 1주https://www.inflearn.com/blogs/8562
2024. 10. 11.
1
[인프런 워밍업 클럽 2기 - CS] 미션 - 2주차
운영체제1) FIFO 스케줄링의 장단점이 뭔가요?First In First Out으로 일괄처리 시스템에는 장점이 있으나,Burst Time에 따라 성능차이가 심하게 나는 단점이 있음. 2) SJF를 사용하기 여러운 이유가 뭔가요?Burst Time이 짧은 작업을 우선하다보니, Burst Time이 긴 작업이 계속 밀릴 수 있으며, 프로세스의 종료 시간이 예측 불가 하기 때문에 사실상 우선순위를 주기도 힘듬. 3) RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?타임 슬라이스가 아주 작으면 그만큼 컨텍스트 스위칭이 자주 일어나 부하가 커짐. 4) 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?I/O Bound Process의 경우 CPU 사용량이 적다 보니 타임 슬라이스 내에 CPU를 반납하하고,반대로 CPU Bound Process의 경우 CPU 사용량이 많다 보니 타임 슬라이스를 넘어 CPU가 뺏기게 되는 걸로 구분함.즉, 타임 슬라이스 내에 CPU를 반납하는가, CPU를 강제로 뺏기게 되는가로 구분함. 5) 공유자원이란무엇인가요?프로세스간 통신을 할 때 공동으로 이용하는 변수나 파일들을 공유자원이라고 하며, 교착 상태의 발생원인 이기도 함. 6) 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?상호배제: 점유한 리소스는 공유 불가 = 포크비선점: 점유한 리소스 빼앗을 수 없음 = A의 포크를 B가 뺏을 수 없음점유와 대기: 리소스를 가지고 있는 상태에서 다른 리소스를 필요로함 = 오른쪽 포크를 손에 쥔 채로 왼쪽 포크를 기다리는 상태원형 대기: 점유와 대기를 하는 프로세스가 원형을 이루고 있음 = 서로가 서로의 포크를 원하는 상황 자료구조와 알고리즘1) 재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?재귀함수는 자신을 가져다 쓰는 함수이므로, 빠져나오는 기저조건을 만들지 않거나 잘못 설정하면 무한 루프에 빠질 수 있음. 2) 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n) { // 재귀 로직 if (n
2024. 10. 06.
1
[인프런 워밍업 클럽 2기 - CS] 발자국 - 1주차
회고 개인적인 일정으로 주말에 몰아서 강의를 보고, 미션도 완료했다.그러다보니 뭔가 숙제를 하는 기분이었다.미션의 답을 생각하다보니 코드를 짜보는것도 재밌을 것 같다는 생각을 했지만, 시간적인 여유로 인해 생각했던 코드 중 1개만을 작성했다.내일부터는 여유있게 작업해야겠다.++ 발자국에 공부한 내용을 담아야 된다는 내용을 보고, 개인 블로그에 비밀글로 작성했던 내용을 발자국에도 작성했었다.그런데 발자국 가이드를 다시 읽어보니 너무 자세한 강의 내용 작성은 피해달라는 말을 보고 급하게 내용을 수정하게 되었다. 작성하느라 고생했던 부분이 아쉽긴 하지만 실수를 하지 않았다는 점에서 만족해야겠다. 운영체제운영체제는 아는 부분도 있었지만 세부적으로는 모르는 부분들이 대부분이었다.몇번 돌려보니 기본적인 내용은 이해했으나, 세부적인 내용은 반복학습을 통해 암기할 필요가 있어보인다.PCB의 구조 같은것 말이다. 자료구조와 알고리즘이론적인 내용은 아직 쉽게 이해 가능하나, 구현하는 부분에 있어서는 시간적 여유로 인해 해보지 않고 시청만 했다보니 완벽하게 이해하지는 못했다. 시간을 내서 직접 코드를 작성해보고 테스트 해볼 필요가 있다.시간 복잡도에서 알고리즘의 반복문을 보고 성능 평가를 한다는 점과 Big-O 표기법에 대한 내용은 흥미로웠다.
2024. 10. 06.
1
[인프런 워밍업 클럽 2기 - CS] 미션 - 1주차
운영체제1) 아래 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 방식을 해결하기 위해서는 인터럽트 방식을 사용하는게 좋습니다.문제가 코드로 주어졌기 때문에 인터럽트와 비슷한 동작을 하는 코드를 만들어 보았습니다.// 1~4 중 랜덤한 초 후에 "skillActivated" 라는 log 출력과 true를 반환하는 함수 const skillActivate = () => { return new Promise((resolve) => { const randomTime = Math.floor(Math.random() * 4) + 1; console.log(`${randomTime}초`); setTimeout(() => { console.log("skillActivated"); resolve(true); }, randomTime * 1000); }); }; // 1초마다 "working" 이라는 log를 출력하며, // skillActivate 의 true 반환을 기다렸다가 isActivated가 true가 되면 log 메시지를 출력하고 종료 const work = async () => { let isActivated = false; const workingInterver = setInterval(() => { console.log("working"); }, 1000); isActivated = await skillActivate(); if (isActivated) { console.log("isActivated"); clearInterval(workingInterver); } }; work(); 2) 프로그램과 프로세스가 어떻게 다른가요? - 프로그램: 저장장치에 저장되어있는 상태 = HDD/SDD에 저장된 상태 = 수동적- 프로세스: 실행중인 프로그램 = RAM에서 실행중인 상태 = 능동적3) 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?- 멀티프로그래밍: 메모리 관점- 멀티프로세싱: CPU 관점메모리에 여러개의 프로세스가 있으면(멀티프로그래밍), 그걸 CPU가 돌아가면서 돌림(멀티프로세싱). 4) 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?프로세스의 정보를 가지고 있는 PCB라는 것을 만들고, 프로세스가 종료되면 해당 PCB를 연결리스트에서 제거합니다.5) 컨텍스트 스위칭이란 뭔가요?CPU는 시분할로 작동하기 때문에 A라는 작업을 하다가 B라는 작업을 해야되는 경우 같이 일을 스위칭 하는 것을 말합니다.스위칭 하는 과정에서 나중에 다시 해당 작업을 하기 위해 레지스터를 PCB에 저장하고 불러오는 방식으로 작업을 이어서 할 수 있습니다.자료구조와 알고리즘1) 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다.이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요. 저라면 배열을 사용하겠습니다.일반적으로 학교는 번호를 순서대로 매겨 학생의 정보를 입력합니다.때문에 index +1 이 학생의 번호가 될 수 있습니다.중간에 학생이 전학을 가더라도, 학생의 번호를 당겨올 필요가 없으며, 전학간 학생의 정보만을 전학으로 수정하면 됩니다.반대로 전학을 오는 학생이 있을 수 있으나 보통 2명이 넘지는 않기 때문에 교실의 학생 수 보다 +2 크기의 배열을 처음에 할당하면 된다고 생각합니다.이렇게 하면 배열의 장점인 빠른 읽기/쓰기를 사용하면서, 배열의 단점인 데이터 삽입에 대한 대비를 할 수 있습니다.2) 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.주문이 들어온 순서대로 처리 하려면, 들어온 순서대로 나가는 큐 구조를 사용할 것 입니다.이와는 좀 별개의 내용으로, 최근 흑백요리사를 보면서 분담 작업하는 것을 보았습니다.때문에 만약 주문처리 프로그램이 음식점이고, 메뉴별로 분담이 되어있는 상태라면, 주문이 순서대로 처리 되면서, 전체 주문음식 수가 표시되는 기능을 추가하는게 좋다고 생각합니다.만약 스택 구조로 지금 나가야되는 주문만 보고 해당되는 작업만을 하는 것은 비효율 적이기 때문에, 현재 주문 된 음식이 종류별로 몇개씩 있는지 확인 후, 한번에 여러개를 만든다든지, 자신에게 해당되는 음식이 없다면 많이 주문된 음식의 준비를 돕는등의 방식으로 처리하는게 더 효율적 이지 않을까 라는 생각을 해당 문제를 생각하면서 했습니다.