블로그
전체 7#태그
- 인프런
- 인프런워밍업클럽
- 스터디2기
2024. 11. 02.
2
[인프런 워밍업 클럽 2기 - CS] 완주 후기
인프런 워밍업 클럽 2기가 끝났습니다. 사실 참여하기 전에는 '내가 이걸 완주할 수 있을까?' 싶은 마음이 있었지만, 워밍업 클럽에 참가하신 다른 참가자분들의 격려와 적절하게 짜인 스케줄에 힘입어서 완주할 수 있었던 것 같습니다. 감사합니다. 😊워밍업 클럽을 통해서 많은 것을 얻은 것 같습니다. 정보처리기사를 취득하긴 했으나 자료구조와 알고리즘... 뿐만 아니라 사실 모든 CS 분야에서 취약한 상태였습니다. 단편적인 지식만 안고 있고 이것을 활용할 방법이나 쓰임새는 알지 못하는 상태였습니다. 그런데 워밍업 클럽에서 주차별 미션을 해결하는 과정에서 '아 이 지식은 이런 상황에서 쓰일 수 있겠구나.'하는 감을 잡게 되었습니다. 이것 때문에 가장 많은 도움을 받았던 활동을 꼽아보라고 말씀하신다면 미션과 Q&A 세션을 선택하고 싶습니다.쓰다 보니 길어지게 되었는데, 저는 이 글을 보시고 '인프런 워밍업 클럽 한 번 해볼까?' 하는 마음이 드셨다면 한 번은 꼭 참여해 보시길 권해드리고 싶습니다. 새로운 지식을 얻고 그것을 활용하는 방법을 아는 것도 정말 도움이 되는 일이지만, 그것을 넘어서 나와 같은 길을 달리고 있는 누군가가 있다는 사실을 아는 건 꽤나 많은 도움이 되는 것 같아서요. 저는 꽤 많은 도움이 되었습니다.아마 저는 다음 인프런 워밍업 클럽도 참여할 것 같습니다. ㅎㅎ 워밍업 클럽에 참가하셨던 분들 모두 고생 많으셨고, 코치분들과 운영진분들께도 정말 감사하다는 말씀을 드리고 싶습니다. 모두 행복하세요. 감사합니다!
인프런
・
인프런워밍업클럽
・
스터디2기
2024. 10. 20.
1
[인프런 워밍업 클럽 2기 - CS] 3주차 발자국
학습 내용자료구조와 알고리즘 면에서는 삽입/병합/퀵 정렬과 메모이제이션, 타뷸레이션을 배웠습니다.운영체제 면에서는 메모리와 가상메모리, 입출력장치와 파일시스템에 대해서 학습했습니다. 회고 (피드백 및 목표)생각보다 새로운 일정이 많이 생겨서 시간을 오래 내기 힘들었습니다. 그래서 모든 자료구조를 구현해보지는 못했는데, 이제 오늘 새벽에.. ^^ 해보려고 합니다. 화이팅!앞으로는 일정을 좀 더 여유롭게 잡아야겠습니다... 미션운영체제 미션은 강의를 통해서 학습한 부분을 다시 떠올려 보고, 떠오르지 않는 부분은 강의를 다시 보면서 해결했습니다. 자료구조 미션은 제약조건 속에서 최적의 해결방안이 무엇일지 고민하면서 풀었습니다. 회고 (피드백 및 목표)메모이제이션과 타뷸레이션 중에서 무엇을 선택할지 고민하는 것은 언젠가 저도 해볼 수 있는 고민일 것 같다고 생각했습니다. 앞으로 데이터를 처리할 때 어떤 방식으로, 어떤 자료구조를 이용해야 좋을지 고민해보면서 하면 좋을 것 같습니다.
2024. 10. 20.
1
[인프런 워밍업 클럽 2기 - CS] 3주차 미션
운영체제 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.메모리는 레지스터, 캐시, 메인메모리(RAM), 보조저장장치(HDD, SSD)가 있습니다. 레지스터는 CPU의 내부에 존재하는 가장 빠른 메모리로, 휘발성 메모리입니다. CPU가 RAM에서 데이터를 가져왔을 때, 계산하는 역할을 합니다. 캐시는 레지스터와 RAM 사이에 존재하는 휘발성 메모리로, 레지스터와 RAM 사이의 속도 차이를 극복하기 위해서 RAM에서 데이터를 미리 가져와서 저장해두는 역할을 합니다. RAM은 휘발성 메모리로, 운영체제와 실행중인 프로세스들이 올라가는 곳입니다. 보조저장장치는 비휘발성 메모리로, 데이터를 저장하는 역할을 합니다.사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터입니다. 경계 레지스터는 CPU 내부에 존재하는 레지스터로, 메모리 관리자가 경계 레지스터 값을 벗어난 사용자 프로세스를 강제 종료시킬 수 있도록 만들어 줍니다.메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식은 메모리를 가변적으로 분할할 수 있어서 코드/힙/스택 등 각 영역을 모듈로 처리할 수 있기 때문에 메모리 접근 보호가 편리하지만, 외부 단편화가 발생할 수 있습니다. 고정 분할 방식은 외부단편화가 발생하지 않으나, 페이지 크기가 고정적이기 때문에 각 영역을 논리적인 영역으로 나눌 수 없으므로 특정 영역만 공유하거나 권한을 부여하는 것이 어렵습니다.CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱이라고 합니다. 물리 메모리 공간이 한정되어 있기 때문에 일어나는 현상입니다. 하드웨어적인 방법으로는 물리 메모리 크기를 늘려서 해결할 수 있고, 소프트웨어적인 방법으로는 프로세스 실행시간 내에 page fault의 발생빈도에 따라 페이지 크기를 조정하거나 워킹셋을 활용하여 해결할 수 있습니다.HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.다양한 파일이나 프로그램의 코드들은 비휘발성 메모리에 저장되어야 하므로 컴퓨터를 실행시키는데 꼭 필요한 장치라고 생각합니다.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일 시스템은 사용자가 파일 삭제 요청을 했을 때, 파일의 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 삭제합니다. 따라서 데이터는 그대로 남아있으므로 포렌식으로 파일을 복구할 수 있습니다.자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블/선택/삽입 정렬은 이해와 구현이 쉬우나 시간 복잡도가 O(n²)으로 성능이 좋지 않습니다. 병합/퀵 정렬은 재귀의 개념을 이용하기 때문에 이해와 구현이 비교적 어려우나 시간 복잡도가 O(nlogn)으로 성능이 좋습니다. 다만, 퀵 정렬은 최악의 경우 시간 복잡도가 O(n²)이 될 수 있습니다.메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.저는 타뷸레이션을 사용할 것 같습니다. 재귀함수가 더 직관적인 해결법이라면 메모이제이션을 선택하는 게 맞을 수 있겠지만, 메모이제이션은 타뷸레이션에 비해서 메모리 공간을 더 많이 차지하기 때문에 메모리가 부족한 시스템에서는 타뷸레이션이 더 맞는 방법이라고 생각됩니다.
2024. 10. 13.
1
[인프런 워밍업 클럽 2기 - CS] 2주차 발자국
학습 내용자료구조와 알고리즘 면에서는 재귀의 기본과 하노이 탑, 버블/선택 정렬을 배웠습니다.운영체제 면에서는 FIFO, SJF 등 CPU 스케줄링 알고리즘과 프로세스 동기화, 데드락, 메모리에 관해 학습했습니다. 회고 (피드백 및 목표)강의를 먼저 몰아서 들었더니 미션을 해결할 때 잊은 부분이 꽤 있다는 걸 깨달아서 당황했습니다. 저번 주차에는 강의를 듣고 바로 미션을 해결해서 기억에 오래 남았었는데, 이번에는 강의만 듣고 끝내서 그런 것 같습니다. 다음 주차에는 미션이 나오는 날에 강의를 몰아서 듣고 바로 미션을 해결하면서 배운 내용을 정리하는 시간을 가져보려고 합니다. 미션운영체제 미션은 강의를 통해서 학습한 부분을 다시 떠올려 보고, 작성한 내용에 의구심이 생기면 검색을 통해 검증해 보는 시간을 가지면서 해결했습니다. 자료구조 미션은 제약조건을 정리한 뒤, 가장 효율적인 풀이 방법을 찾으려고 노력하면서 풀었습니다. 회고 (피드백 및 목표)재귀함수를 구현하는 부분에서 n 값으로 음수가 들어올 경우는 처리해주지 않았습니다. 사실 음수를 더할 일이 있을까 싶어서 보류하고 미션을 제출하긴 했습니다만... 다음에는 이런 부분도 고려해서 미션을 해결하면 더 재밌게 미션을 즐길 수 있을 것 같다는 생각이 듭니다.
2024. 10. 12.
1
[인프런 워밍업 클럽 2기 - CS] 2주차 미션
운영체제 FIFO 스케줄링의 장단점이 뭔가요?FIFO 스케줄링의 장점은 프로세스가 들어온 순서대로 처리되기에 실행순서가 중요한 프로세스를 처리할 때 유용할 수 있으며 프로세스의 대기시간을 비교적 예측하기 쉽다는 것입니다. 단점은 실행시간이 긴 프로세스가 먼저 들어온다면, 이어서 들어온 프로세스들의 실행시간이 더 짧더라도 대기시간이 길어진다는 것입니다.SJF를 사용하기 어려운 이유가 뭔가요?SJF를 사용하기 위해서는 각 프로세스의 실행시간을 정확히 예측해야 합니다. 하지만 운영체제가 각 프로세스의 실행시간을 정확하게 예측하는 것은 매우 어려운 일이기 때문에 실제로 사용하기는 어렵습니다.RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?타임 슬라이스가 아주 작으면 프로세스가 자주 교체되게 되고, 이에따라 컨텍스트 스위칭도 매우 빈번하게 일어나게 됩니다. 따라서 CPU가 프로세스를 처리하는 시간보다 컨텍스트 스위칭에 소모하는 시간이 더 길어지게 되어서 CPU의 프로세스 처리 효율이 매우 떨어질 수 있습니다.운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요?CPU 할당시간을 다 사용하지 않았음에도 CPU 자원을 반환하는 프로세스는 I/O Bound Process, CPU 할당시간을 다 사용하거나 다 사용했음에도 끝나지 않은 프로세스를 CPU Bound Process로 구분합니다.공유자원이란무엇인가요?여러 프로세스들이 공통적으로 사용하고자 하는 자원을 말합니다.교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요?1) 한 프로세스가 이미 사용중인 자원은 다른 프로세스가 동시에 사용할 수 없다는 상호배제, 2) 다른 프로세스가 이미 사용중인 자원은 뺏어올 수 없다는 비선점, 3) 프로세스가 공유자원을 이미 가진 상태로 다른 프로세스가 가진 공유자원이 사용 가능해질 때까지 기다리고 있는 점유와 대기, 4) 점유와 대기가 원형으로 이루어져서 예를 들어 A → B → C → A 이런 식으로 프로세스들이 서로 꼬리를 물고 원형으로 대기하고 있는 원형 대기 이 모든 조건을 충족해야 교착상태에 빠지게 됩니다.자료구조와 알고리즘재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?재귀함수가 종료되지 않고 계속 호출되어서 콜스택에 재귀함수가 계속 쌓이게 됩니다. 그러다 메모리 공간이 부족하여 콜스택이 넘치게 되면 프로그램이 강제로 종료됩니다.0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요. 자바스크립트 코드입니다.function sumOdd(n) { if (n === 0) return 0; return n % 2 !== 0 ? n + sumOdd(n - 1) : sumOdd(n - 1); } console.log(sumOdd(10)) // 25
2024. 10. 04.
1
[인프런 워밍업 클럽 2기 - CS] 1주차 발자국
학습 내용자료구조와 알고리즘 면에서는 스택, 연결리스트, 큐 등 기본적인 자료구조에 대한 내용을 학습했습니다.운영체제 면에서는 운영체제의 전체적인 개요와 프로세스, CPU 스케줄링에 관해서 배웠습니다. 회고 (피드백 및 목표)여러 일정이 겹쳐서 강의 수강 속도가 느려졌던 점이 조금 아쉬웠습니다. 그러나 정해진 기간 내에 목표치를 달성했다는 점은 스스로 칭찬해 주고 싶습니다.강의를 몰아 듣는 과정에서 깨달은 것이라서 조금.. 그렇지만 ^^; 저는 역시 작은 단위를 나눠서 들을 때보다 많은 양을 몰아서 볼 때 더 몰입되고, 이해가 깊어지는 것 같습니다. 다음 주부터는 시간을 정해두고 자료구조 및 알고리즘, 운영체제를 몰입해서 공부해 봐야겠습니다. 미션미션은 운영체제 미션과 자료구조 미션을 다르게 접근해서 해결했습니다. 운영체제 미션은 개념에 대한 문제라서 강의를 통해 학습한 내용을 바탕으로 최대한 자세히 풀어쓰려고 노력했습니다. 자료구조 미션은 문제 해결에 관한 것이었기 때문에 문제의 제약조건을 파악하고, 해당 제약조건을 지키면서 문제를 해결할 수 있는 최적의 대안을 찾으려고 노력했습니다. 회고 (피드백 및 목표)운영체제 미션을 해결하면서 강의를 다시 돌려보게 되는 부분이 있었습니다. 물론 그 과정을 통해서 해당 개념에 대해서 더 깊게 이해하게 된 부분도 분명 있지만, 다음부터는 그 빈도를 줄여나가기 위해서 강의를 볼 때 더 몰입해서 볼 수 있는 환경을 조성하려고 합니다.
2024. 10. 04.
1
[인프런 워밍업 클럽 2기 - CS] 1주차 미션
운영체제 while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?폴링방식을 사용하면 스킬 사용 여부를 체크하는 동안 다른 일을 수행할 수 없기 때문에 폴링방식 보다는 인터럽트 방식을 사용하여 비동기적으로 스킬 사용 여부를 체크하면 더 효율적으로 체크할 수 있을 것 같습니다.let isActivated = false; setTimeout(() => { isActivated = checkSkillActivated(); }, 1000);자바스크립트 코드로 작성해보았습니다.프로그램과 프로세스가 어떻게 다른가요?프로그램은 컴퓨터의 저장장치 저장된 코드의 집합이고, 해당 프로그램이 실행되기 위해서 메모리에 올라왔을 때 프로세스라고 불립니다.멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?멀티프로그래밍은 메모리의 관점에서 말한 것으로, 메모리 위에 여러 개의 프로세스가 올라와 있는 걸 말합니다. 멀티프로세싱은 CPU 관점에서 말한 것으로, CPU가 메모리 위에 올라와있는 여러 개의 프로세스를 스케줄링 알고리즘에 따라서 처리해주는 것을 말합니다.운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?운영체제는 프로세스를 관리해주기 위해서 해당 프로세스에 대한 정보가 담겨있는 PCB를 만들고, CPU 스케줄링 알고리즘을 이용하여 메모리에 올라와있는 여러 개의 프로세스들이 공평하게 실행될 수 있도록 해줍니다.컨텍스트 스위칭이란 뭔가요?운영체제는 CPU 스케줄링 알고리즘을 통해서 메모리에 올라와있는 여러 개의 프로세스들이 공평하게 실행될 수 있도록 해줍니다. 이 과정에서 CPU 자원을 사용하는 프로세스가 계속 변경되게 되는데, 그 때 CPU가 이전에 작업하던 부분부터 계속 이어서 작업을 처리해 줄 수 있도록 프로세스에 대한 정보가 담긴 PCB도 교체해줘야 합니다. 이렇게 PCB를 각 프로세스에 맞는 PCB로 교체해주는 과정을 컨텍스트 스위칭이라고 합니다.자료구조와 알고리즘여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.학생이 전학하거나 전학오면 학생을 추가하거나 제거할 수 있어야 함 (드뭄)원하는 학생을 선택하면 해당 학생에 대한 정보를 가져올 수 있어야 함 (추가/제거 보다는 자주)저라면 배열을 선택할 것 같습니다. 교실이 학교의 교실이라고 가정했을 때, 한 학급에서 구성원의 변화는 잘 일어나지 않습니다. 따라서 위와 같이 학생 정보는 수정될 수 있어야 하나 그 빈도가 정보 조회보다는 적기때문에, 정보 수정 과정에서 겪을 패널티보다 (O(n)) 정보 조회로 얻을 이점(O(1))이 더 크다고 판단되기 때문입니다.배열의 인덱스가 학생의 출석번호가 되도록 하면 정보 검색시 O(1)의 효율이 나올 것 같습니다.여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.저라면 큐를 선택할 것 같습니다. 주문이 들어온 순서대로 처리되어야 한다면 선입선출 방식의 자료구조가 채택되어야 효율적일텐데, 큐가 선입선출 방식의 자료구조이기 때문입니다.