블로그

Taeho

인프런 워밍업 클럽 - CS 3주차 과제

운영체제1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터가장 빠른 기억장소CPU 내에 존재휘발성 메모리CPU를 나타내는 값에서 32bit, 64bit가 레지스터의 크기를 의미한다.CPU는 계산을 수행할 때 메인 메모리에 있는 값을 레지스터로 가져와서 계산한다.캐시휘발성 메모리레지스터와 메인 메모리 사이의 속도 간극을 메우기 위한 저장소필요한 데이터를 미리 가져와 저장하는 저장소성능의 이유로 여러 개가 존재한다.ex) L1, L2, L3CPU가 값을 요청해 레지스터로 값을 옮겨야 하는 경우 빠른 캐시를 순차적으로 확인하고, 캐시에 데이터가 없으면 메인 메모리를 조회한다.메인메모리휘발성 메모리OS와 다른 프로세스들이 올라가는 공간데이터를 저장하기 보다는 실행중인 프로그램만 저장한다.2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터H/W적으로 OS 공간과 사용자 공간을 나누는 레지스터CPU 내에 존재한다.메모리 관리자가 사용자 프로세스가 경계 레지스터의 값을 벗어났다면 검사하고, 벗어났다면 해당 프로세스를 종료시킨다.3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식 장점메모리를 가변적으로 분할할 수 있다.코드 영역, 데이터 영역, 스택 영역, 힙 영역을 모듈로 처리할 수 있어 공유와 각 영역에 대한 메모리 접근보호가 편리하다.가변 분할 방식 단점외부 단편화가 발생한다.고정 분할 방식 장점메모리를 효율적으로 관리할 수 있다.고정 분할 방식 단점내부 단편화가 발생한다.But. 가변 분할 방식의 단점인 외부 단편화에 비해 많은 공간을 차지하지 않는다.4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?쓰레싱5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?필요하다고 생각한다.컴퓨터가 부팅될 때 ROM에 저장된 바이오스가 실행되고, 바이오스는 주요 하드웨어에 이상이 없는지 체크한다. 이 때 저장장치에 문제가 있다면 부팅이 정상적으로 이뤄지지 않는다.OS는 주로 HDD나 SSD에 설치되고 저장되고, 부팅시에 주요 장치에 이상이 없다면 HDD나 SSD의 마스터 부트 레코드에 저장된 부트로더를 메모리로 가져와서 실행시킨다.위의 2가지 이유 때문에 HDD와 SSD가 없어서는 안된다고 생각한다.6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일시스템은 효율적인 공간 관리를 위해 Free Block List라는 목록을 관리한다.파일이 지워질 때 파일 시스템이 파일의 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 삭제하고 Free Block List에 추가한다.→ 실제로 파일의 데이터를 지우는 것이 아니다.이러한 특성으로 인하여 포렌식으로 파일을 복구할 수 있는 것이다.자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬장점이해와 구현이 간단하다.단점성능이 좋지 않다.시간 복잡도O(n^2)선택 정렬장점이해와 구현이 간단하다.단점성능이 좋지 않다.시간 복잡도최악 : O(n^2) - 배열이 역순으로 정렬되어 있는 경우삽입 정렬장점구현이 간단하고 이해하기 쉽다.추가적인 메모리 소비가 적다.단점성능이 좋지 않다.데이터의 상태에 따라 성능 편차가 크다.최선 : O(n)최악 : O(n^2)시간 복잡도O(n^2)병합 정렬장점속도가 빠르다.단점병합 과정에서 임시 배열이 필요하기 때무넹 추가적인 메모리 공간을 사용한다.이해와 구현이 복잡하다.시간 복잡도O(n log n)퀵 정렬장점공간 효율성: 추가 메모리 공간을 거의 필요로 하지 않는 제자리 정렬 알고리즘캐시 친화적: 지역성이 좋아 캐시 성능이 우수병렬화 가능: 분할 정복 접근 방식으로 인해 병렬 처리에 적합단점불안정 정렬: 동일한 키 값을 가진 요소들의 상대적 순서가 보존되지 않을 수 있다.최악의 경우 성능: 피벗 선택이 잘못되면 O(n^2)의 시간 복잡도를 가질 수 있다.재귀적 특성: 재귀 호출로 인해 스택 오버플로우가 발생할 수 있다.시간 복잡도평균 케이스: O(n log n)최악의 케이스: O(n^2)최선의 케이스: O(n log n)2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션을 사용할 것 같다.메모이제이션의 경우 재귀호출이기 때문에 메모리를 많이 사용하기 때문에 메모리가 부족한 시스템에서 사용하는 것은 적합하지 않다.

알고리즘 · 자료구조워밍업클럽CS전공지식3주차미션

춘몽

[인프런 워밍업 클럽 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) 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.우선은 메모이제이션으로 구현을 합니다.그리고 메모리가 많이 부족한지를 따져보고, 많이 부족하다면 빠르게 타뷸레이션으로 변경하고, 아니라면 천천히 타뷸레이션으로 변경할 것이지만, 결론적으로는 타뷸레이션으로 변경할 것입니다. 이유는 재귀로 쉽게 구현이 가능할 것 같다는 내용으로 미루어보아 빠르게 메모이제션으로 구현을 한 후, 이게 잘 동작하는지 체크하고, 이 내용을 바탕으로 타뷸레이션을 구현하면, 빠르게 문제를 해결함과 동시에 타뷸레이션을 구현하는 바탕이 되어 줄 수 있기 때문입니다.그리고 타뷸레이션으로 변경함으로서 차후 문제였던 메모리 부족 현상도 줄일 수 있습니다.

춘몽

[인프런 워밍업 클럽 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

유선아

[미션] 인프런 워밍업클럽 CS 2기 3주차 미션

운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요. 레지스터, 캐시 , 메인 메모리(RAM), 보조저장장치 하드디스크 가 있습니다.레지스터는 가장 빠른 기억 저장소로, CPU내에 존재하고, 휘발성 메모리입니다.캐시는 레지스터와 메인 메모리, 사이에 존재하고, 휘발성 메모리입니다. 캐시는 메인 메모리에 있는 값을 레지스터로 옮기는 시간을 단축하기 위해 미리 데이터를 가져와 저장하는 곳 입니다. 메인 메모리는 실제 운영체제와 프로세스가 올라가는 곳으로, 휘발성 메모리입니다. 하드 디스크나 SSD보다는 속도가 빠르지만, 가격이 비싸기 때문에 실행중인 프로그램만 올립니다.  보조 저장장치 (HDD, SSD) 는 비휘발성 메모리로 가격이 저렴해, 작업한 파일들을 저장한다.  사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터 CPU내에 존재하며 메모리 관리자가 사용자 프로세스가 경계 레지스터의 값을 벗어나는지 감시하고, 벗어날 경우 프로세스를 종료시킨다.  메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식 장점) 프로세스의 크기에 따라 메모리를 할당하는 방식으로, 메모리의 연속된 공간에 할당되기 때문에, 낭비되는 공간인 내부 단편화가 없다 . 단점) 외부단편화가 발생한다. 고정 분할 방식장점) 프로세스의 크기 상관 없이 메모리를 할당하는 방식으로, 비연속 메모리 할당으로 구현이 간단하고 오버헤드가 적다. 단점) 작은 프로세스도 큰 영역에 할당되어서 공간이 낭비되는 내부 단편화가 발생한다.  CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱 CPU 사용률을 높이려하지만 오히려 더 떨어지는 상황이 나오는 것으로 ,CPU 사용률을 높이기 위해 멀티 프로그래밍 정도를 올리는데, 물리 메모리의 프레임을 할당하는데 한계가 있어 일부는 스왑영역에 저장하고, 이로 인해 Page Fault가 많이 발생하고, 그러면 CPU 작업 시간 보다 스왑 작업 시간이 더 길어 지고 CPU사용률이 떨어진다. 그럼 CPU 스케줄러는 CPU 사용률이 낮아져 더 많은 프로세스를 메모리에 올리게 되고 이 과정을 반복하다 보면 CPU 사용률이 0%에 가깝게 된다.  HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.HDD나 SSD는 컴퓨터를 실행시키는 데 꼭 필요한 것은 아니지만, 현실적으로 대부분의 컴퓨터 환경에서 운영체제와 데이터를 저장하는 데 매우 중요한 역할을 하기 때문에 필수적이다.HDD나 SSD가 아닌 다른 메모리는 속도가 빠르지만 가격이 너무 비싸고 휘발성이기 때문에, 비휘발성인 HDD나 SSD 같은 보조 기억장치에 운영체제를 저장하고 필요한 데이터와 소프트웨어를 로드하는 것이 저렴하면서도 효율적으로 컴퓨터를 이용할 수 있는 방법이다. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?free block list 덕분이다. 만약 특정 파일을 삭제한다면, 파일 시스템은 파일의 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 삭제하고 free block list에 추가한다. 이렇게 처리하면 사용자는 파일이 삭제된 것처럼 느끼지만, 사용했던 블록의 데이터는 그대로 남아있기 때문에 포렌식을 통해 데이터를 복구할 수 있다. 자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블정렬장점 : 이해와 구현이 간단하다. 단점 : 성능이 좋지 않다. 시간 복잡도 : O(n²)선택 정렬장점 : 이해와 구현이 간단하다.단점 : 성능이 좋지 않다. 시간 복잡도 : O(n²)삽입 정렬장점 : 이해와 구현이 간단하다.단점 : 성능이 좋지 않다. 시간 복잡도 : O(n²)병합 정렬장점 : O(nlog n) 성능으로 버블, 선택 , 삽입 정렬보다 성능이 훨씬 좋다. 단점 : 재귀적인 기법으로 이해하기 어렵고, 구현하기 어렵다. 시간 복잡도 : O(n logn)퀵 정렬장점 : 성능이 좋고, 병합 정렬보다도 적은 메모리 공간을 차지해 더 좋은 알고리즘으로 평가 받는다. 단점 : 재귀적인 기법으로 이해하기 어렵고, 구현하기 어렵다. 시간복잡도 : O(n logn)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션  메모이제이션은 재귀 호출을 사용하기 때문에 함수 호출에 따른 오버헤드와 메모리 비용이 큽니다. 반면, 타뷸레이션은 반복문을 사용하여 오버헤드가 적고, 메모리 사용량도 예측 가능하기 때문에 더 효율적입니다

알고리즘 · 자료구조워밍업클럽운영체제자료구조알고리즘CS미션

하얀종이개발자

인프런 워밍업 클럽 2기 - CS전공지식 스터디 미션 03 입니다.

CS전공지식 미션 2운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터CPU 내부에 있는 가장 빠른 메모리로 CPU가 계산하기위해 데이터를 임시로 저장CPU가 직접 접근할 수 있으며, 64bit 32bit CPU라는 말도 CPU의 연산단위이면서 레지스터의 크기를 나타냄캐시L1, L2, L3 캐시등이 있으면 CPU와 메모리 사이의 속도차이를 줄이기 위해 임시로 데이터를 저장하는 공간메인 메모리일반적으로 RAM을 의미하며 포노이만 구조의 CPU가 연산하기위해 프로세스를 올리는 공간전원이 꺼지면 데이터도 사라지는 휘발성 메모리임보조저장장치SSD, HDD 등으로 데이터를 영구적으로 저장할 수 있음, 메모리보다 속도가 느림전원이 꺼져도 데이터가 남아있는 비휘발성 메모리임 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계레지스터 : CPU내부에 존재해서 맨 앞에 저장하고 있는 운영체제 영역의 최대 범위를 기록하고 있어, 침범하지 못하게 함, 만약 경계 레지스터의 값을 넘긴 프로세스가 있으면 해당 프로세스를 종료시킴메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변분할방식은 프로세스의 크기에 맞춰 메모리를 분할하는 방식으로 프로세스의 영역별로 메모리를 분할 할 수 있어, 메모리 접근권한이나 메모리 공유를 할 수 있음, 그러나 외부단편화가 발생하여 메모리낭비가 생길 수 있음 고정분할방식은 고정된 크기로 메모리를 분할 하는 방식으로 가변분할방식의 외부단편화를 제거할 수 있음, 그러나 고정된 크기에 프로세스를 나눠서 할당하기 때문에 내부 단편화가 발생할 수 있고, 프로세스 영역별로 나눌수 없어 메모리 접근권한이나 공유하는데 어려움이 있음CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱많은 프로그램을 메모리에 올리면 스왑이 빈번하게 일어날 수 있음이때 CPU가 실제 작업을 처리하지 못하고 스왑 작업에만 몰두하게 되어 CPU를 사용하지 못하는 현상을 말함HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?꼭 필요하지는 않음컴퓨터가 실행되기 위해서는 RAM이 필요하지만, HDD나 SSD는 데이터의 영구적 저장을 위한 보조 장치임만약 시스템이 네트워크 기반 부팅을 사용하거나 RAM 디스크를 활용하는 경우, HDD나 SSD 없이도 컴퓨터를 실행할 수 있음. 다만 RAM은 전원이 꺼지면 데이터가 모두 사라지기 때문에 일반적으로는 운영체제를 포함한 데이터를 저장하기 위해 HDD나 SSD가 필요파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제하더라도 실제로 데이터는 즉시 삭제되지 않고, 파일 시스템에서 해당 파일의 참조만 제거됨실제 데이터는 디스크에 그대로 남아 있기 때문에 포렌식 도구를 이용해 복구할 수 있음.완전한 삭제를 위해서는 데이터를 덮어쓰는 과정을 거쳐야 함자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬 (Bubble Sort)O(n²)장점 : 단순한 구조로 이해 & 구현이 쉬움, 거의 정렬된 배열에서는 빠르게 종료될 수 있음단점 : 속도가 느리고, 다른 효율적인 정렬 알고리즘에 비해 많이 사용되지 않음선택 정렬 (Selection Sort)O(n²)장점 : 메모리 사용이 적고, 단순한 구조로 이해 & 구현이 쉬움단점 : 속도가 느리고, 다른 효율적인 정렬 알고리즘에 비해 많이 사용되지 않음삽입 정렬 (Insertion Sort)O(n²)장점 : 작은 데이터나 거의 정렬된 데이터에 대해 매우 효율적단점 : 속도가 느려서 대규모 데이터에 비효율적병합 정렬 (Merge Sort)O(n log n)장점 : 속도가 빠르며 대규모 데이터에서도 일정한 성능을 보임단점 : 추가 메모리 공간이 필요하며, 메모리 효율이 떨어질 수 있음퀵 정렬 (Quick Sort)평균 O(n log n), 최악 O(n²)장점 : 평균적으로 매우 빠르고, 메모리 사용이 적음단점 : 피벗 선택에 따라 성능이 달라지며, 최악의 경우 속도가 느려질 수 있음 (그러나 최악이 되는 경우는 거의 없음)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.메모이제이션(Memoization)재귀를 사용하면서 이미 계산된 값을 기억하고 활용하는 방식으로, 필요할 때 계산된 값을 바로 반환해서 사용재귀 구조를 그대로 유지하면서도 중복 계산을 피할 수 있음타뷸레이션(Tabulation)문제를 하위 문제부터 점진적으로 해결하는 방식으로, 반복문을 사용해 값을 채워나가는 방식메모리 부족한 상황이라면 타뷸레이션을 사용할 것 같습니다.타뷸레이션은 스택 오버플로우 위험이 없고, 재귀 호출에 따른 추가적인 메모리 오버헤드가 발생하지 않기 때문에 메모리를 더 효율적으로 사용할 수 있습니다. 

백엔드CS전공지식그림으로쉽게배우는자료구조와알고리즘그림으로쉽게배우는운영체제인프런워밍업클럽2기감자

인프런 워밍업 클럽 스터디 2기 CS 3주차 미션

# 운영체제1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터: 가장 빠른 메모리로 CPU 내부에 있다. 잦은 메모리 접근으로 인한 성능 감소를 줄이기 위해 사용한다.캐시: 레지스터 다음으로 빠른 메모리로 마찬가지로 잦은 메모리 접근으로 인한 성능 감소를 줄이기 위해 있다.메모리: 프로세스들이 올라가 있는 메모리이다. 레지스터, 캐시, 메모리는 모두 휘발성 메모리이다.보조기억장치: 비휘발성 메모리로, 이곳에 파일과 프로그램 등이 저장된다.레지스터 -> 캐시 -> 메모리 -> 보조기억장치이 순서에서 레지스터 쪽으로 갈 수록 가격이 비싸고 용량이 작으나 속도가 빠르다.2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터 입니다.경계 레지스터는 프로세스가 허락되지 않은 메모리 주소에 접근을 시도할 시에 프로세스를 강제 종료 시킵니다.3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식프로세스에 크기에 맞는 메모리 공간을 할당하는 방식장점: 프로세스를 메모리에 연속된 공간에 할당하여 내부 단편화가 발생하지 않는다.단점: 외부 단편화 문제가 발생한다. 고정 분할 방식프로세스 크기에 상관없이 운영체제에서 정한 크기만큼 프로세스에 공간을 할당하는 방식장점: 프로세스를 관리하기 간단해진다.단점: 내부 단편화 문제가 발생한다.4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱메모리 부족으로 페이지 폴트가 너무 빈번하게 발생하여 대부분의 시간을 스왑을 하는데 보내는 것입니다.5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?이유를 함께 적어주세요.꼭 필요하지는 않은 거 같습니다. HDD나 SSD는 보조 기억 장치이기 때문에 있으면 좋은 것이지, 컴퓨터를 실행할 때 필수적인 부품은 아닙니다. 컴퓨터를 실행할 때에는 CPU와 메모리만 있어도 실행이 될 거 같습니다.6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제할 때 그 파일의 정보를 정말 삭제하는 것이 아니라, 파일의 헤더만 삭제하고 그 파일 위치를 free block list에 추가한다. 이렇게 실제론 삭제를 하지 않고 free block list에만 추가하는 것이기에, 새로운 데이터가 덮어쓰여지지 않았으면 복구가 가능합니다.# 자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블정렬, 선택정렬, 삽입정렬세 정렬의 시간 복잡도: O(n^2)장점: 구현이 쉽고 직관적이다.단점: 성능이 그닥 좋지는 않다.병합정렬시간 복잡도: O(nlogn)장점: 큰 문제를 작은 문제로 쪼개어 해결(정렬)하는 것으로 위 세 정렬 알고리즘보다 성능이 우수합니다.단점: 정렬할 배열을 저장할 메모리가 추가로 필요합니다.퀵정렬시간 복잡도: worst-case일시 O(n^2)이지만 거의 모든 상황에서 O(nlogn)에 근접한 성능을 보이고 메모리를 더 사용하는 병합정렬보다 일반적으로 우수한 성능을 보입니다.장점: 정렬 알고리즘 중 거의 가장 우수한 성능입니다.단점: 피벗을 잘못 선택할 시 성능이 저하될 수 있습니다.2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션을 사용할 거 같습니다. 메모이제이션은 문제를 메모리를 많이 사용하나 직관적으로 재귀를 사용할 때 사용할 거 같고 타뷸레이션은 직관적이지 않은 문제를 메모리를 적게 사용하여 해결할 때 사용하는 게 좋으니 타뷸레이션을 사용하겠습니다.

 집사

마지막 미션

운영체제1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터휘발성 메모리CPU 내부에 있는 메모리로 ALU의 계산을 위한 값들을 저장하는 용도. 캐시 메모리휘발성 메모리레지스터와 RAM사이의 데이터 이동 작업으로 인한 병목 현상을 줄이기 위한 메모리RAM휘발성 메모리프로그램을 실행시키면 해당 메모리에 올라가서 프로세스가 된다. 보조저장장치비휘발성 메모리HDD, SSD파일 저장 공간으로 사용된다.메모리 크기가 작은 메모리일수록 비싸고 데이터 전송이 빠르다 2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터 / CPU내에 존재하는 레지스터로 메모리 관리자가 사용자 프로세스가 경계 레지스터의 값을 벗어났는지 검사하고 만약 벗어났다면 해당 프로세스를 종료시킨다.3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식장점메모리 영역을 모듈로 처리할 수 있기에 공유와 각 영역에 대한 메모리 접근 보호가 편리하다.영역별로 분할돼서 관리가 쉽다.단점외부 단편화가 발생한다.고정 분할 방식장점외부 단편화를 해결효율적인 메모리 관리단점내부 단편화특정 영역에 대한 공유, 권한 부여가 어렵다.페이지 테이블의 메모리 오버헤드페이지 폴트로 인한 오버헤드 4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱 / 제한된 물리 메모리에 의해 스왑 영역에 데이터가 많이 저장되고 Page Fault가 많이 발생하게 되면 스왑을 하는데 이 작업에 의한 오버헤드로 CPU 사용률이 떨어지며, 이를 통해 CPU 스케줄러에 의해 CPU 사용률을 올리기 위해 메모리에 더 많은 프로세스를 올리며 CPU 사용률이 0%에 가깝게 떨어지게 된다.5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?이유를 함께 적어주세요.CPU를 동작하는데에는 운영체제가 필요한데, 메모리에서 비휘발성의 특성을 가진 메모리는 HDD나 SSD같은 보조저장장치 밖에 없기에 컴퓨터를 실행하기 위한 운영체제를 저장할 공간이 필요하다. 6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일 시스템은 효율적인 관리를 위해 빈 공간을 모아둔 free block list를 가지고 있고,특정 파일을 삭제할 경우 파일의 모든 정보를 지우는 게 아닌 파일 테이블의 헤더를 삭제하고 free block list에 추가한다.데이터는 지워진 게 아니라 복구가 가능한 상태이다.자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬 : O(n²)선택 정렬 : O(n²)삽입 정렬 : O(n²)병합 정렬 : O(nlogn)퀵 정렬 : 평균 O(nlogn) / 최악 O(n²)2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션메모이제이션을 통한 방식은 재귀를 통해서 하기에 함수 호출에 대한 메모리 비용 또한 발생하기에타뷸레이션이 더 좋을 것 같습니다. 또한 반복문을 사용하기에 메모리의 크기가 어느 정도 예측 가능하다. 

 집사

마지막 발자국

알고리즘삽입정렬졍렬된 영역과 정렬되지 않은 영역으로 구분한다.정렬되지 않은 영역에서 데이터를 하나씩 꺼내 정렬된 영역 내 적절한 위치에 삽입하는 알고리즘성능O(n²)장점이해와 구현이 간단단점성능이 좋지 않다void SelectionSort(int* arr, int size) { for(int i = 1; i < size; i++) { int insertingData = arr[i]; int j; for(j = i - 1; j >= 0; j--) { if(arr[j] > insertingData) { arr[j + 1] = arr[j]; } else { break; } } arr[j + 1] = insertingData; } } 병합 정렬 ( Merge Sort)분할정복하는 방법의 정렬 방식 : 해결하기 힘든 문제가 발생하면 한번에 해결하지 않고 해결하기 쉬울 정도로 쪼갠 다음 하나씩 해결병합 정렬은 재귀로 정렬하는 알고리즘병합 정렬 성능 : O(nlogn);장점성능이 좋음단점이해와 구현이 어려움void MergeSort(int* arr, int leftIndex, int rightIndex) { if(leftIndex < rightIndex) { int midIndex = (int)((leftIndex + rightIndex) / 2); MergeSort(arr,leftIndex, midIndex); MergeSort(arr, midIndex + 1, rightIndex); Merge(arr, leftIndex, midIndex, rightIndex); } } void Merge(int* arr, int leftIndex, int midIndex, int rightIndex) { const int tempSize = rightIndex + 1 - leftIndex; int tempArr[tempSize] = {0}; int leftAreaIndex = leftIndex; int rightAreaIndex = midIndex + 1; int tempArrIndex = leftIndex; while(leftAreaIndex <= midIndex && rightAreaIndex <= rightIndex) { if(arr[leftAreaIndex] <= arr[rightAreaIndex]) { tempArr[tempArrIndex++] = arr[leftAreaIndex++]; } else { tempArr[tempArrIndex++] = arr[rightAreaIndex++]; } } if(leftAreaIndex > midIndex) { for(int i = rightAreaIndex; i <= rightIndex; i++) { tempArr[tempArrIndex++] = arr[i]; } } else { for(int i = leftAreaIndex ; i <= midIndex; i++) { tempArr[tempArrIndex++] = arr[i]; } } for(int i = leftIndex; i <= rightIndex; i++) { arr[i] = tempArr[i]; } }  퀵 정렬(Quick Sort)분할 정복 알고리즘퀵 정렬의 성능 : O(nlogn) / 최악의 경우 O(n²) : 피벗이 배열을 반으로 가르지 않고 한쪽에 쏠리는 경우성능만 보면 병합 정렬이 더 좋다고 볼 수 있지만 퀵 정렬이 더 적은 비교와 더 적은 메모리 공간을 차지하기 때문에 더 좋은 알고리즘으로 평가받음void QuickSort(int* arr, int left, int right) { if(left <= right) { int pivot = Divide(arr, left, right); quickSort(arr, left, pivot - 1); quickSort(arr, pivot + 1, right); } } int Divide(int* arr, int left, int right) { int pivot = arr[left]; int leftStartIndex = left + 1; int rightStartIndex = right; while(leftStartIndex <= rightStartIndex) { while(leftStartIndex <= right && pivot >= arr[leftStartIndex]) { leftStartIndex++; } while(rightStartIndex >= (left + 1) && pivot <= arr[rightStartIndex]) { rightStartIndex++; } if(leftStartIndex <= rightStartIndex) { swap(arr ,leftStartInex, rightStartIndex); } } swap(arr, left, rightStartIndex); return rightStartIndex; } void Swap(int* arr, int index1, int index2) { int temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; } 동적 프로그래밍메모이제이션(memoization)계산 결과를 저장해서 여러 번 계산하지 않도록 하는 기법피노나치 수열을 재귀함수로만 구현하면 중복된 계산이 많기에 성능이 좋지 않다.int Fibonacci(int n) { if(n == 0 || n == 1) return n; return Fibonacci(n - 2) + Fibonacci(n - 1); } 계산하려는 데이터가 있는지 검색하고 없다면 함수를 호출해 계산을 하고 그 결과를 저장한다.빠른 데이터 탐색, 삽입, 삭제가 빠른 해시 테이블을 이용.Key에 계산하려는 값을 Value에 계산 결과를 저장하여 계산하려는 값의 검색.#include<unordered_map> using namespace std; unordered_map<int, int> um_memo; int Fibonacci(int n) { if(n == 0 || n == 1) return n; if(um_memo.count(n) > 0) { return um_memo[n]; } else { um_memo[n] = Fibonacci(n - 2) + Fibonacci(n - 1); return um_memo[n]; } } 재귀를 통한 피보나치 수열 시간 복잡도 : O(2^n)메모이제이션을 통한 피보나치 수열 시간 복잡도 : O(n)메모이제이션은 속도가 향상되지만, 메모리를 그만큼 사용한다.타뷸레이션(Tabulation)계산에 필요한 모든 값을 전부 계산 후 테이블에 저장하는 기법 / 상향식 계산 방식에 사용된다.메모이제이션은 재귀를 통해 함수를 호출하기에 콜스택에 함수 호출이 쌓이는 메모리적인 비용이 더 든다.#include<unordered_map> using namespace std; unordered_map<int, int> um_tb; int Fibonacci(int n) { if(n <= 1) return n; um_tb[0] = 0; um_tb[1] = 1; for(int i = 2; i <= n; i++) { um_tb[i] = um_tb[i - 2] + um_tb[i - 1]; } return um_tb[n]; } 가상메모리가상메모리 개요프로세스는 가상 메모리를 통해 실행된다. (0X0번지)물리 메모리의 주소를 몰라도 메모리 관리자를 통해 가상 메모리를 통해 물리 메모리로 연결된다.동적 주소 변환 (Dynamic Address Translation) : 메모리 관리자는 메모리와 하드디스크 내 스왑 영역을 합쳐서 프로세스사 사용하는 가상 주소를 물리주소로 변환한다.메모리 관리자의 역할물리 메모리를 어떻게 나눌지프로세스를 어디다 배치할지부족한 물리 메모리는 어떻게 처리할지등의 문제를 처리해야 하기에 복잡한 과정을 거친다.메모리 관리자는 가상 주소와 물리 주소를 일대일 매핑 테이블로 관리한다.세그멘테이션(배치정책)가변분할 방식세그멘테이션에서 프로그램은 함수나 모듈등으로 세그먼트를 구성한다.코드 영역 : 메인 코드가 있는 세그먼트데이터 영역 : 전역 변수들이 있는 세그먼트힙 영역 : 힙 영역이 있는 세그먼트스택 영역 : 스택 영역이 있는 세그먼트각 세그먼트들은 서로 인접할 필요가 없다.사용자와 프로세스, CPU가 바라보는 주소는 논리주소라고 한다.실제 물리 주소로의 변환은 중간에서 메모리 관리자(MMU)가 해준다.메모리 관리자가 논리주소를 물리주소로 변환해주는 방법메모리 관리자는 세그멘테이션 테이블이라는 것을 가지고 있다.세그멘테이션 테이블에는 Base Address와 Bound Address정보가 저장되고 이걸 이용해 물리 메모리 주소를 계산한다.CPU에서 메모리를 전달해주면 메모리 관리자는 이 논리 주소가 몇번 세그먼트인지 알아낸다.메모리 관리자 내에 Segment Table Base Register를 이용해서 물리 메모리 내에 있는 세그멘테이션 테이블을 찾고세그먼트 번호를 인덱스로 Base Address와 Bound Address를 찾는다.운영체제는 컨텍스트 스위칭을 할 때마다 메모리 관리자 내에 Segment Table Base Register를 해당 프로세스의 것으로 값을 바꿔줘야 한다.컨텍스트 스위칭은 이런 작업까지 하기에 굉장히 무거운 동작이다.Bound Address는 세그먼트의 크기를 나타낸다.메모리 관리자는 CPU에서 받은 논리주소와 이 Bound Address의 크기를 비교한다.만약 논리 주소가 Bound Address보다 작다면 논리 주소와 Base Address를 더해 물리 주소를 구하고논리 주소가 Bound Address보다 크다면 메모리를 침범했다고 생각하고 에러를 발생시킨다.장점메모리를 가변적으로 분할할 수 있다코드 영역, 데이터 영역, 스택 영역, 힙 영역등을 모듈로 처리할 수 있기에 공유와 각 영역에 대한 메모리 접근 보호가 편리하다. / 영역별로 분할돼서 관리가 쉬움단점가변 분할 방식의 단점인 외부 단편화가 발생한다.페이징(배치정책)세그멘테이션의 외부단편화를 해결하기 위해 고안되었다.페이징은 메모리를 할당할 때 정해진 크기의 페이지로 나눈다. / 내부단편화가 발생페이지 : 논리 주소 공간에서 일정한 크기로 균일하게 나뉜 것.프레임 : 물리 주소 공간에서 일정한 크기로 균일하게 나뉜 것.메모리 관리자는 페이지 테이블을 가진다.메모리 관리자는 CPU에서 전해주는 논리 주소가 몇 번 페이지인지, 오프셋은 얼마인지 알아낸다.메모리 관리자 내에 있는 PTBR(Page Table Base Register)를 이용해서 물리 메모리에 있는 페이지 테이블을 찾고 페이지 번호를 인덱스로 프레임 번호를 알아내고 오프셋을 이용해 물리주소로 변환을 한다.오프셋은 계산을 통해 쉽게 구할 수 있다.페이지 테이블에 Invalid로 표기되어 있으면 스왑 영역에 저장되어 있다는 의미이다.컨텍스으 스위칭이 발생할 때마다 PTBR을 헤딩 프로세스의 것으로 업데이트 해준다.페이지 넘버 = 논리 주소 / 페이지 크기페이지 넘버는 논리주소를 페이지 크기로 나눈 몫으로 구할 수 있다.오프셋 = 논리주소 % 페이지 크기오프셋은 논리 주소를 페이지 크기로 나눈 나머지이다.페이지 넘버를 페이지 테이블의 인덱스로 사용하여 프레임을 구한 후 해당 프레임 위치에서 오프셋을 더해주면 물리주소로 변환이 완료된다.세그멘테이션과 페이징의 차이프로세스마다 크기가 달라 Bound Address를 가지고 있지만, 페이징은 모든 페이지의 크기가 동일해서 크기를 표현하는 Bound Address는 필요하지 않다.세그멘테이션은 외부단편화가 발생하고 페이징은 내부단편화가 발생한다.외부단편화가 더 많은 공간이 낭비되기에 내부단편화는 심각하게 생각하지는 않는다.세그멘테이션은 논리적인 영역별로 세그먼트를 나눈다. / 코드, 데이터, 힙, 스택페이징은 페이지의 크기가 고정되어 있기에 논리적인 영역을 나눌 수 없다. 그래서 특정 영역만 떼어내서 공유하거나 권한을 부여하는게 더 어렵다. 페이징에서 가장 신경써야 하는 것은 페이지 테이블 크기이다.각 프로세스마다 페이지 테이블을 가지고 있는데 프로세스가 많아질수록 페이지 테이블도 많아지기에 프로세스가 실제로 사용할 수 있는 메모리 영역이 줄어든다.메모리 관리자가 참조하는 페이지 테이블도 물리 메모리의 운영체제 영역에 저장되어 있기에 페이지 테이블 크기가 너무 크면 사용자 영역이 부족해진다. 그렇기에 페이지 테이블의 크기를 적절하게 유지하는 것이 중요하다.페이지드 세그멘테이션(배치정책)세그멘테이션과 페이징을 혼합해 장점을 취한 방식이다. 새로운 단점도 생기긴 했다.메모리 접근 권한메모리의 특정 번지에 부여된 권한으로 읽기, 쓰기, 실행 세 가지가 있다.프로세스는 데이터 영역별로 접근 권한이 있다.코드 : 프로그램 그 자체이므로 수정하면 안됨 | 읽기 / 실행 권한데이터 : 일반변수, 전역변수, 상수로 선언한 변수가 저장된다 | 읽기 / (쓰기) 권한스택, 힙 : 읽기 / 쓰기 권한메모리 접근 권한에 대한 검사는 가상주소에서 물리주소로의 변환이 있을 때마다 일어나는데만약 권한을 위반하면 에러를 발생시킨다.페이지드 세그멘테이션의 세그멘티테이션 테이블은 권한비트, 페이지 넘버, 페이재 개수루 구성된다.가상주소가 들어오면 몇 번 세그먼트인지 알아낸다.그 이후 가상주소의 요청 권한을 확인한 후 위반된 경우 프로세스를 종료시킨다.위반되지 않으면 페이지 넘부와 페이지 개수를 가져온 후 페이지 넘버로 페이지 테이블에 접근해서프레임 번호를 가져오고 물리 메모리 내에 해당 프레임에 접근해 그 위치에서 페이지 개수를 더해 물리주소를 구한다.만약 물리 메모리에 해당 프레임이 없다면 스왑 영역에서 물리 메모리로 가져온다.페이지드 세그멘테이션의 단점은 물리메모리에 접근하기 위해서 메모리에 접근을 두 번해야 된다는 것이다.첫번째는 세그멘테이션 테이블을 참조할 때 두번째는 페이지 테이블에 참조할 때이다.현대 운영체제는 페이징과 페이지드 세그멘테이션 기법을 적절히 혼용한다.디맨드 페이징(가져오기 정책)코드, 데이터, 힙, 스택 영역의 모든 데이터들이 메모리에 올라오는 것이 아니다.필요한 메모리 일부만 올라와서 실행된다.컴퓨터 과학자 도널드 커누스가 발견한 90:10 법칙⇒ 90%의 시간이 10%의 코드에서 보내는 것을 의미이것을 지역성 이론이다.공간의 지역성현재 위치와 가까운 데이터에 접근할 확률이 높음시간의 지역성최근 접근했던 데이터가 오래 전에 접근했던 데이터보다 접근할 확률이 높음goto문 지향의 이유는 코드의 구조파악이 어려운 것도 있지만지역성 이론에 따라 성능에 좋지 않기 때문. / 지역성 이론을 위배지역성 이론은 조만간 사용될 것 같은 데이터만 메모리에 올리고 당분간 필요하지 않을 것 같은 데이터는 스왑영역으로 보내 성능을 향상시킨다.디맨드 페이징 : 조만간 필요할 것 같은 데이터를 메모리로 가져오고 쓰이지 않을 것 같은 데이터는 스왑영역으로 이동시키는 정책이다. / 지역성 이론을 구현한 정책디맨드 페이징은 스왑영역을 보조저장장치에 저장하는데 성능 향상을 위해서는 스왑 영역으로 데이터를 이동시키는 것을 최소화 시켜야한다.가상 메모리 = 메인 메모리 + 하드디스크 내 스왑영역스왑영역에서 물리 메모리로 데이터를 가져오는 것을 스왑인이라 부른다.반대는 스왑아웃이라 부른다.페이지 테이블의 한 행을 페이지 테이블 엔트리(PTE)라고 부른다.페이지 테이블 엔트리에는 프레임 뿐 아니라 여러 정보를 담은 비트로 이루어져 있다.접근 비트 | 변경 비트 | 유효 비트 | 읽기 / 쓰기 / 실행 비트 | 프레임접근 비트 : 페이지가 메모리에 올라온 후 데이터에 접근이 있었는지 알려주는 비트. 메모리에 읽기나 실행 작업을 했다면 1로 바뀐다.변경 비트 : 페이지가 메모리에 올라온 후 데이터의 변경 있었는지 알려주는 비트. 메모리에 쓰기 작업을 했다면 1로 바뀐다.유효 비트 : 페이지가 물리 메모리에 있는지 알려주는 비트. 만약 유효비트가 1이라면 페이지가 스왑영역에 있고 0이라면 물리 메모리에 있다는 의미.읽기 / 쓰기 / 실행 비트 : 권한비트로 해당 메모리에 접근 권한이 있는지 검사하는 비트.프로세스가 가상 메모리에 접근 요청을 했을 때 메모리 관리자는 페이지 테이블을 보고 물리 메모리의 프레임을 찾는데 만약 물리 메모리에 없다면 Page Fault라는 인터럽트를 발생시킨다. Page Fault가 발생하면 보조저장장치의 스왑 영역에 접근하게 되고 해당 프로세스는 대기상태가 된다. 스왑영역에 있는 데이터가 메모리로 올라가는 작업을 시작하고 메모리로 올라갔다면 대기상태에 있던 프로세스는 다시 실행된다.페이지 교체정책페이지 교체정책프로세스가 데이터 참조를 요청했는데 Page Fault가 발생하는 경우 스왑 영역으로 옮길 페이지를 결정하는 정책무작위로 선택하는 방법 : 지역성을 고려하지 않기에 자주 사용되는 페이지가 선택될 수 있어 성능이 좋지 않다. / 거의 사용되지 않음FIFO : 가장 오래된 페이지 선택 / 자주 쓰이는 페이지가 교체되면 공평하지 않을 수 있음 구현이 간단하고 성능도 꽤 괜찮아서 변형해서 많이 사용된다.Optimum : 앞으로 가장 오랫동안 쓰이지 않을 페이지를 선택하는 방법. 사실상 구현이 불가능한 이론적인 선택 방법이다. / 뭐가 가장 사용되지 않을지 알 방법이 없음. / 다른 알고리즘과 성능 비교를 할 때 참조용으로 쓰인다.LRU (Least Recently Used) : 최근에 가장 사용이 적은 페이지를 선택하는 방법. 접근 비트를 통해 LRU에 근접하게 접근한다. / Optimum에 가장 근접한 성능을 보임 최근에 들어온 페이지의 참조 수를 계산해서 판별Clock Algorithm : 접근 비트를 원형으로 연결하고 클락 핸드를 통해 페이지들의 접근 비트를 순회하면서 접근 비트가 0인 경우(데이터 접근 X) 해당 페이지를 스왑 영역으로 보낸다.Enhanced Clock Algorithm : 접근 비트, 변경 비트를 이용 두 비트를 통해 스왑 영역으로 보내질 우선순위 결정하드웨어적으로 접근비트를 지원하지 않는 시스템에선 FIFO를 이용할 수 밖에 없기에 FIFO의 성능을 높이기 위한 방법을 고안함FIFO의 자주 사용하는 페이지가 교체될 수 있다는 단점을 해결하기 위헤 2차 기회 페이지 교체 알고리즘을 고안 / 자주 사용하는 페이지에게 또 한번의 기회를 제공 Page Fault없이 페이지 접근에 성공했다면 해당 페이지를 큐의 맨 뒤로 이동시켜 수명을 연장시키는 방법LRU > 2차 기회 페이지 교체 알고리즘 > FIFO스레싱과 워킹셋스레싱제한된 물리 메모리에 의해 스왑 영역에 데이터가 많이 저장되고 Page Fault가 많이 발생하게 되면 CPU 사용률이 떨어진다. CPU 스케줄러에 의해 CPU 사용률을 올리기 위해 더 많은 프로세스를 메모리에 올리게 되고 이를 반복하게 되면 CPU 사용률이 0에 가깝게 떨어지는데 이를 스레싱이라고 한다.근본적인 원인은 물리 메모리의 크기가 작은것이다.하드웨어적인 해결 방법메모리 크기를 늘린다. 스레싱 발생 지점이 늦춰진다.스레싱이 발생하지 않는다면 메모리 크기를 늘려도 성능에 별 차이 없다.워킹셋소프트웨어적인 해결 방법프로세스가 실행되면 일정량의 페이지를 할당하고 만약 Page Fault가 발생하면 더 많은 페이지를 할당한다. Page Fault가 너무 적게 발생하면 메모리가 낭비되는 것이라 판단하고 페이지를 회수한다. 이렇게 프로세스가 실행되는 동안 해당 프로세스에게 맞는 적절한 페이지 수가 결정된다. 지역성 이론에 따라서 어떤 페이지들을 유지할 것인가가 결정된다. 현재 메모리에 올라온 페이지는 다시 사용할 확률이 높기에 하나의 세트로 묶어서 메모리에 올리는데 이를 워킹셋이라 부르고 워킹셋은 프로세스가 준비상태에서 실행상태가 되는 컨텍스트 스위칭을 할 때 사용된다.입출력 장치주변장치(I/O 디바이스, 저장장치)주변 장치들은 메인보드에 있는 버스로 연결된다.하나의 버스는 Address 버스, Data 버스, Control 버스를 따로 받을 수 있다.각 하드웨어에 맞게 외부 인터페이스가 존재한다.장치의 상태와 데이터를 보관할 수 있는 각종 레지스터들이 존재.이 레지스터들은 입출력 작업을 할 때 데이터를 저장하는 역할.이 값들은 CPU가 사용하기 위해 메모리로 이동되기도 한다.데이터의 전송단위가 캐릭터(글자)냐 블록이냐로 나뉜다.캐릭터 디바이스마우스, 키보드, 사운드 카드, 직렬/병렬 포트등데이터 전송 단위가 캐릭터(글자)로 상대적으로 크기가 작음블록 디바이스하드디스크, SSD, 그래픽 카드 등데이터 전송 단위가 블록(범위)로 상대적으로 크기가 큼예전에는 주변장치들을 하나의 버스로 연결해서 사용했다. CPU 가 작업을 하다 I/O명령을 만나면 직접 입출력 장치에서 데이터를 가져왔는데 입출력중에는 다른 작업을 하지 못하기에 CPU 사용률이 떨어졌다.이를 해결하기 위해 입출력 제어기(I/O Controller)와 여러 개의 버스가 추가됐다.CPU 는 I/O 명령을 만나면 입출력 제어기에게 입출력 작업을 맡기고 다른 작업을 실행한다.입출력 제어기는 두 개의 채널, 시스템 버스와 입출력 버스로 구분한다.시스템 버스는 고속으로 작동하는 CPU와 메모리가 사용하고입출력 버스는 주변장치가 사용.입출력 버스는 세부적으로 느린 장치와 빠른장치를 구분하기 위해 고속 입출력 버스와 저속 입출력 버스로 나눈다. 느린 장치와 빠른 장치를 구분해 속도 차이로 인한 병목 현상을 해결했습니다.그래픽 카드가 다루는 데이터는 매우 대용량이라 고속 입출력 버스로도 감당이 안된다. 그래픽 카드는 입출력 버스에 있지 않고 시스템 버스에 바로 연결해 사용한다.기존에는 입출력 제어기가 여러 주변 장치를 처리하는데 입출력 버스에서 온 데이터를 메모리로 옮긴다. 근데 메모리는 CPU의 명령으로 움직이기 때문에 입출력 제어기가 메모리에 접근하기 위해서는 CPU가 필요하다. 입출력 제어기가 CPU의 도움이 필요 없도록 DMA 제어기가 추가되었습니다.DMA (Direct Memory Access)의 약자로 직접 메모리 접근이라는 뜻.입출력 제어기는 DMA로 데이터를 직접 메모리에 저장하거나 가져올 수 있습니다.CPU와 DMA가 사용하는 메모리가 겹치지 않도록 CPU가 사용하는 메모리 영역과 DMA가 사용하는 메모리 영역을 나누는데 이를 Memory Mapped I/O 라고 부른다. 마우스/키보드광학 마우스는 아래쪽에 작은 카메라가 달려있고, 표면으로 초당 1500회가 넘는 사진을 찍어 마우스의 디바이스 컨트롤내 DSP (Digital Signal Processor)로 보낸다. DSP는 이 사진을 분석해 마우스의 X축 좌표와 Y축 좌표 움직임을 캐치한다. DSP가 마우스의 움직임과 클릭같은 데이터를 감지하면 디바이스 컨트롤러는 CPU에게 인터럽트를 보내고 마우스 드라이버가 동작해서 데이터를 읽어간다. 마우스 드라이버는 운영체제에게 이벤트 신호를 주는데 운영체제는 이 이벤트를 Foreground 애플리케이션으로 전달해주고 해당 애플리케이션은 받은 마우스 이벤트를 처리한다.키보드의 디바이스 컨트롤러가 어떤 키를 입력 받았는지 알아낸다. CPU에게 인터럽트를 보내고 키보드 드라이버는 운영체제에게 이벤트를 보낸다. 그럼 운영체제는 Foreground 애플리케이션으로 이 이벤트를 전달해주고 애플리케이션에서 해당 키에 맞는 동작을 수행한다. 하드디스크/Flash Memory(SSD)주변장치 중 블록 디바이스의 한 종류하드디스크 구조스핀들(spindle)이라는 막대가 있다.스핀들에는 플래터(platter)라는 원판들이 붙어있다.플래터는 자기화된 원판으로 이루어져 있는데 디스크암이 읽기/쓰기 헤드로 플래터의 표면을 읽는다.플래터는 여러 개의 트랙으로 구성되어 있고 표면에 자성이 있기에 표면이 N극을 띄면 0, S극을 띄면 1로 인식한다. 보통 하드디스크의 플래터 수는 2개 이상이다. 헤드는 디스크암에 고정되어 있기에 모든 헤드는 항상 같이 움직인다. 헤드가 움직이면 이 헤드들은 여러 개의 플래터들을 가리키게 되는데 이때 여러 개의 플래터에 있는 같은 트랙의 집합을 실린더라고 부른다. 트랙은 다시 여러 개의 섹터로 나뉘는데 이 섹터가 하드디스크의 가장 작은 단위이다.하드디스크에서 데이터를 읽어오는 예시유저 프로세스가 하드디스크의 특정 섹터에 접근하고 싶어서 이러한 요청을 보낸다.하드디스크의 섹터를 읽어라는 명령을 내리면 디스크암은 헤드를 실린더로 이동시키는데 이를 ‘Seek’라고 부르며 헤드를 실린더로 이동시키는데 걸리는 시간을 Seek Time이라고 부르는데 이것 때문에 하드디스크가 굉장히 느린것이다. 헤드를 목표 지점까지 움직이는 시간은 수 ms인데 다른 전자장비들은 ns단위로 움직이니 상대적으로 굉장히 느리게 느껴짐. 디스크암을 움직여 헤드를 실린더까지 보냈으면 트랙의 섹터가 헤드에 닿을때까지 스핀들을 회전시킨다. 그러다가 헤드에 섹터가 읽히면 작업이 끝난다.Flash Memory(SSD)하드 디스크는 기계적으로 헤드를 움직여 속도가 많이 느리고 소음도 났지만 Flash Memeory는 전기적으로 읽기 때문에 굉장히 빠르고 조용하다. 또한 자기적으로 처리하는 하드디스크는 자석을 갖다 대면 데이터가 손상되지만 Flash Memory는 안전하다.하드디스크는 스핀들처럼 회전축 같은 것들이 있어서 충격에 매우 약하지만 Flash Memory는 그렇지 않다. Flash Memory의 가장 큰 단점은 특정한 지점에 데이터를 썼다면 덮어쓰기가 불가능 하다는 것. 똑같은 지점에 데이터를 쓰려면 기존에 있던 데이터를 지우고 새로 써야 하는데 Flash Memory는 지우기 가능한 횟수가 정해져있다. 그래서 똑같은 지점에 지우기/쓰기를 계속하면 망가진다.파일과 파일 시스템파일은 사용자 요청에 따라 운영체제에 의해 안전하게 저장된다. / 악의적인 사용자에 의한 훼손 가능성 때문에파일 시스템운영체제가 파일을 관리하기 위한 파일 관리자.파일 시스템은 파일 테이블을 이용해서 파일을 관리한다.파일 시스템의 기능파일과 디렉토리 생성파일과 디렉토리 수정/삭제파일 권환 관리 : 다른 사용자로부터 파일을 보호하기 위함 / 요즘 운영체제는 다중 사용자 기능을 지원하기 때문에 파일 보호를 위해 필요한 기능무결성 보장 : 파일의 내용이 손상되지 않도록.백업과 복구 : 예기치 못한 사고로부터 백업과 복구를 한다.암호화파일 접근 방법파일을 관리하는 하드디스크나 Flash Memory(SSD)는 블록 디바이스입니다. 파일 시스템은 전송 단위는 블록이지만, 사용자는 바이트 단위로 파일에 접근이 가능해야 한다. 파일 관리자가 이를 중간에서 관리해준다.파일 구조파일은 헤더와 데이터로 이루어져 있다. 헤더 : 파일의 속성들이 담겨져 있다.파일 이름파일 식별자파일 유형파일 크기시간저장 위치접근 권한소유자파일제어블록(File Control Block, FCB) | (File Descriptor)운영체제는 파일을 관리하기 위해 정보를 보관한다.파일 디스크립터(File Descriptor)라고도 부른다.파일마다 독립적으로 존재하고 저장장치에 존재하다가 파일이 오픈되면 메모리로 이동한다. 파일 디스크립터는 파일 시스템(운영체제)이 관리하고 사용자가 직접 참조할 수는 없다. 사용자는 파일 시스템이 건내준 파일 디스크립터로 파일에 접근할 수 있다.파일의 종류파일의 데이터 집합을 어떻게 구성하느냐에 따라 종류가 구분된다.순차파일구조파일의 내용이 연속적으로 이어진 형태장점 : 모든 데이터가 순서대로 기록되기에 공간의 낭비가 없고 구조가 단순하다.단점 : 특정 지점에 바로 이동이 어려워 데이터를 삽입하거나 삭제하려면 탐색하는데 시간이 많이 걸린다는 것.직접파일구조저장하려는 데이터를 해시함수를 통해 저장 위치를 결정하는 파일구조.해시테이블 방식이며 요즘 많이 쓰이는 데이터 포맷인 json도 이 방식이다.장점 : 해시함수를 이용하기에 데이터 접근이 굉장히 빠르다.단점 : 해시함수의 선정이 굉장히 중요하기에 해시함수를 잘 골라야 한다. / 저장 공간이 낭비될 수 있다.인덱스파일구조순차접근과 직접접근 방식의 장점을 취한 것.두 가지 방식 모두 가능하다.인덱스 테이블을 통해 원하는 순차 데이터의 블록 번호로 접근할 수 있다. 디렉토리파일을 한 공간에 보관하면 파일이 많아지며 관리가 복잡해진다. 그래서 관련있는 파일을 모아둘 수 있도록 디렉토리가 생겼다.디렉토리는 1개 이상의 파일을 가질 수 있고 자식 디렉토리도 가질 수 있다. 최상위에 있는 디렉토리를 루트 디렉토리라 부르며, 그 하위 디렉토리는 자식 디렉토리라고 부른다.윈도우에서는 루트 디렉토리는 파티션 이름으로 사용한다. 보통 C:으로 표시한다. 디렉토리와 디렉토리 구분은 \로 한다.디렉토리도 파일이다. 일반 파일에는 데이터가 저장, 디렉토리에는 파일 정보가 저장되어 있다.디렉토리에서 헤더는 디렉토리 정보가 시작하는 위치를 가리킨다..는 현재 디렉토리를 의미하며..는 상위 디렉토리를 가리킨다.디렉토리는 순환이 있는(바로 이동하기) 트리 구조이다.파일과 디스크파일 시스템은 메모리와 비슷하다.전체 디스크 공간을 일정한 크기를 나누고 그 공간에 주소를 할당해 관리한다.일정한 크기로 나눈 것을 블록이라고 부른다. 한 블록의 크기는 1~8KB정도이다.파일 시스템은 파일 정보를 파일 테이블로 관리하는데 파일이 시작하는 위치 정보도 담겨있다.하나의 파일은 여러 개의 블록으로 이루어져 있는데 이 블록들을 연결한 방식에 따라 연속할당과 불연속할당으로 나눠진다.연속할당파일을 구성하는 블록들을 디스크에 연속적으로 저장하는 방식이다. 파일의 시작 블록만 알면 파일의 전체를 찾을 수 있다.세그멘테이션처럼 외부단편화가 발생하기에 사용되지 않는다.불연속할당디스크에 비어있는 공간에 데이터를 분산해 저장하는 방식이다. 이 분산된 블록은 파일시스템이 관리한다.연결 할당파일에 속한 데이터를 연결리스트로 관리한다.파일 테이블에는 시작 블록에 대한 정보만 저장하고 나머지는 연결리스트를 이용해 다른 블록에 접근하는 방식인덱스 할당테이블의 블록 포인터가 데이터 블록에 직접 연결하는 것이 아닌 데이터들의 인덱스를 가지고 있는 인덱스 블록을 연결한다.인덱스 할당은 데이터가 많아서 테이블이 꽉 찬 경우 인덱스 블록을 더 만들어 연결하기에 테이블을 확장할 수 있다.파일 시스템 저장/삭제 방식디스크에 파일을 저장할 때 빈 공간을 찾으려고 모든 공간을 뒤지는 방식은 비효율적이다.파일 시스템은 효율적인 관리를 위해 빈 공간을 모아둔 free block list를 가지고 있다. 특정 파일을 삭제할 경우 파일의 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 삭제하고 free block list에 추가한다. 데이터는 지워진 게 아니라 복구가 가능한 형태이다. 

빠타박스

[인프런 워밍업클럽 2기] CS전공지식_발자국_3주차 (Final)

1. 개요이름: 인프런 워밍업 클럽 2기 - CS 전공지식 빠타박스 [신충식]기간: 2024.10.14 - 2024.10.182. 목표 및 성과설정한 목표: 가벼운 학습 CS 지식 습득 및 중요한 부분에 대한 습득달성한 성과: 마무리 지점에 여러가지 중요한 내용이 운영체제를 통해 습득하게 되었다. 3. 잘된 점 (Keep)성공적인 요소:4. 개선할 점 (Problem)문제점 : 이번 과정이 끝나더라도 한번더 복습해야 한다. (정리하지 못한 부분도 존재한다)   5. 다음 단계 (Try)향후 계획: 정보처리기사 실기 시험이 끝나고 해당 내용을 복습하고자 한다. 무제한 강의 특성상 좋다. 휴.. 인생실기 시험 끝나면 심화도 봐서 코딩테스트 문제를 풀기에 적합할 수 있도록 되어야 겠지..그리고 아직 적지 못한 C++코드를 분석할 예정이다.  6. 기타 의견일주일 동안 학습하며3주차 과정은 조금 힘든 과정이다 지금 이걸 작성하고 내일 모래면 정처기 실기시험이 있다.최선을 다하자... 이 실기가 끝나면 꼭 1트만에 합격해서 끝내고 알고리즘 자료구조를 학습하고 면접 내용을 정리하며,프로젝트를 진행하면서 게임 출시까지도 보고 앞으로 나아가자...3주차 미션에 대해휴.. 3주차 미션은 좀 더 운영체제 같은 것 들을 중요시 했고 간단하면서도 어려웠다.이 이유는 내가 정처기에 빠져있고, 현재로써 제대로된 집중을 하지 못했기 때문이다.즐거웠다. 이 과정을 지나면서 하지만. 스터디 클럽이라기 보다. 자기주도 학습 유도 와 보상심리를 이용한 나아감이였다. 꼭 완주 하고 싶다. 하지만 배워야한다. 라는 느낌? 그래도 이 과정이 있어서 정말 다행이다. 저렴하게 강의 시청을 할 수 있었다는 점과. 이 과정의 커리큘럼대로 시간표대로 진행함에 있어서 어려움을 좀 덜 느꼈던거 같다. 다양한 사람들의 학습 방법에 대해 한번 눈여겨 보기도 한다.  요즘 젊은이들은 어떻게 공부하는가... 흠... 나에게 적용할 부분이 무엇인가. 미션을 좀 이렇게 해볼걸...이번 풀이는 좀 구글링 한 부분도 있었다. 아무래도 제대로된 이해를 하기 힘든 부분이 있었다. 이번 학습에 대해서 아직 제대로 정리도 못한 상황이다. 실기가 끝나면 바로 적용해야지  빠타박스노션 https://gibeonsoftwork.notion.site/2-CS-10e530ec4ad680ff802cf36606049182?pvs=4 소감내 군대시절 우연히~들었던 믿지 못할 한마디~게임 개발 할 수 있다는 매혹적인 얘기내게 꿈을 심어주었어~ 말도 안돼 고갤 저어도~내안에 나 나를보고 속삭여~코테 공부하는 자는 CS 필수라고~용기를 내 넌 할 수 있어!쉼 없이 흘러가는 3주~ (정처기는 6주째)이대로 !!! 유튜브 볼순 없잖아~~!!!인프런과 도전하는거야!!!인프런 감자 손을잡고!정처기 CS 모두의 꿈을 모아서!!!!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~ 감자의 거센 속도~!!! javascript!~~!!!!빠타 앞길 막아서도 결코 두렵지 않아(chatgpt~~!)끝없이 펼쳐진 수많은 코드들~~~밝은 미래 위한 거야~~~~ 인프런!~ 

알고리즘 · 자료구조cs-미션-발자국cs-발자국인프런워밍업클럽2기워밍업CS지식자료구조알고리즘감자타이틀곡

빠타박스

[인프런 워밍업클럽 2기] CS전공지식_Mission03

운영체제1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.CPU와 메인 메모리 간의 속도차를 해결하기 위해 CPU에는 데이터를 임시로 저장하고 계산처리하는 곳을 만들어두었다. CPU레지스터 : 가장 빠른 저장소로 CPU내에 존재하며, 컴퓨터 전원이 꺼지면 데이터가 사라지는 휘발성을 뛴 메모리이다. 보통 32bit와 64bit 형태로 존재하며 이것은 CPU레지스터의 크기를 알려준다. 레지스터는 CPU가 계산할 때 메인 메모리의 값을 레지스터로 가져와서 계산하고 그 결과를 다시 메인메모리에 저장한다. 캐시 : 데이터를 미리 복사해 놓는 임시 장소 같은 곳 캐시는 메인메모리와 레지스터 간의 데이터를 불러올 것을 예측해서 복사해놓고 임시로 저장해두면 거의 접근시간 없이 더 빠른 속도로 데이터에 접근할 수 있다. 메인메모리(RAM) 메인 메모리는 주기억장치라고도 불리며 CPU가 처리중인 데이터나 명령만을 일시적으로 저장하는 휘발성을 가진 장치이다. 내부에는 일종의 주소 공간을 가졌으며, 각 실행파일등이 운영체제에 의해 올라가 처리되는 곳이기도하다. 저장장치에 있는 것등을 불러와 주는 CPU와 중개역할을 해주기도 한다. 2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?레지스터에는 (Base, Fence, Boundary) 이렇게 3가지 레지스터가 존재한다.  리눅스에서도 보면 0~999번까지 시스템사용자가 접근하지 못하도록 지정한 리눅스의 중요한 정보를 담고 있는 위치인 것 마냥 접근을 못하게 막는데 운영체제가 돌아가기 위한 영역인 부분에 접근하지 못하도록 하는 것이 경계 레지스터(Boundary register) 라고 불린다. 경계 레지스터 ( Boundary Register ) : 주기억 장치(RAM)내에 존재하는 프로그램은 크게 운영체제와 사용자 영역으로 나뉘는데, 사용자가 영역에 존재하는 OS영역에 침범하지 못하도록 한다.   3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변분할방식(동적)프로그램 크기에 따라 주기억 장치의 분할 크기및 개수를 다르게(동적) 분할하는 방식 그래서  필요할 때 마다 분할한다. (편리) 메모리의 연속된 공간에 할당 되어서 낭비되는 공간인 내부 단편화를 보완했다.메모리 공간이 충분하지 않을 경우 외부 단편화가 발생할 수 있다.  고정분할방식(정적)프로세스 크기와 상관없이 메모리를 할당한다. (물리적 메모리를 정해진 개수만큼 영구적인 분할로 나누어 각 분할에 하나의 프로세스를 적재)한 프로세스가 메모리에 분산되어 할당 - 비연속 메모리 할당이라고도 불림 동시에 메모리에 올릴 수 있다는 간단하면서 구현이 간단하고 오버헤드 발생이 적다 작은 프로세스도 큰 영역에 할당되어 공간이 낭비되는 내부 단편화 발생이 크다. 또 맞는 메모리 공간이 없어서 외부 단편화 까지도 발생할 확률이 크다.  4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱(Thrashing) 😀 메모리 영역에 접근하게 될 때 메모리에 페이지 부재(page fault)율이 높은 것성능저하초래과도한 페이징 작업을 의미   5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? (이유를 함께 적어주세요.)기본적으로 하드나 플래쉬 메모리 같은 경우 프로그램이나 파일 운영체제의 데이터를 저장하고 중요한 보안적인 처리를 위해서 필요하기도 하다. 우리가 메인보드의 각 시스템을 사용하기 위해서는 일종의 처리방식이 필요하고 중계해주는 역할이 필요하다.그래서 이것들을 저장하고 전원이 켜질때 마다 불러올 곳이 필요한데 그 위치가 저장장치이다.  어찌 되었든 메모리도 CPU도 저장하는 능력을 가졌지만. 가격이 비싸고, 휘발성이기에 데이터를 저장하기에는 별로 효율적이지 못하다. 그래서 이 데이터를 저장하고 장기기억을 위해서 보조기억장치인HDD와 SSD를 사용한다.  우리가 운영체제를 설치할 때 일부 공간을 저장장치에 저장하게 된다. 그 공간을 우리가 접근하여 지울수도 있지만. 보통 일반 사용자가 잘 알수는 없다. 그곳에 운영체제에 대한 보안적인 부분이나. 시스템 처리 등 각종 프로그램들이 들어가 있다.  가격이 저렴하다.장기기억이 가능하다전원이 꺼져도 남아있다. 6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일 시스템을 효율적인 관리를 위해서 빈 공간에 모아둔 free block List라는 것을 가지고 있다. 우리가 특정 파일을 삭제하면 파일 시스템은 파일 테이블의 헤더를 삭제하고 free block list를 추가하게 되는데.이렇게 삭제된 위치는 사용자로 하여금 삭제 된 것처럼 보여진다.  ps : 참고로 핸드폰 또한 내부 기억장치에 삭제된 것 처럼 보여도 데이터 복구가 일부가능하다. 완전한 복구는 아니지만.비슷하게 포렌식 복구가 가능하다 (그래서 초기화 공장초기화 여러번 하라는 이유가 그때문일 것이다) 물론 포렌식 복구가 불가능한 경우도 있다. 보안 FBE(파일기반암호화)기술 로 인해서 암호화키가 통째로 날아가 기존 데이터를 사용할 수 없게 만드는 기술  점차 나날히 발전하는 현대의 기술들이 이런 개선을 통해 파일의 보안성을 강조하고 있는 상태이다. 이렇게 복구가 가능하다면. 산업스파이나, 어떤 문제로 인해 발생할 것에 대해 취약해질 수 있기에. 이런 것들을 소프트웨어적으로 개선하게 될 것으로 보인다.  자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.| 버블정렬 | 선택정렬 | 삽입정렬 | 병합정렬 | 퀵정렬 | | O(n²) | O(n²) | O(n²) | O(n log n) | O(n log n) | 전체 정리O(1): Operation push and pop on Stack O(log n): Binary TreeO(n): for loopO(n log n): Quick Sort, Merge Sort, Heap SortO(n²): Double for loop, Insert Sort, Bubble Sort, Selection SortO(2n): Fibonacci Sequence | Better | <= O(1) < O(log n) < O(n) < O(n×log n) < O(n2) < O(2n) < O(n!) => | Worse | 상수 함수 < 로그 함수 < 선형 함수 < 다항 함수 < 지수 함수 < 재귀 함수2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.  메모이 제이션저장 : 결과를 특정 자료 구조에 저장확인 : 호출하기 전에 해당 입력에 대한 결과가 이미 저장되었는지 확인활용 : 저장된 결과가 있다면 다시 계산하지 않고 저장된 값을 반환 하향식 설계 함수를 결국 여러번 호출해야 하고 함수 하나를 호출하는 것보다 오버헤드가 더 크다.    타뷸레이션문제를 분할해서 작은 문제부터 차례대로 결과를 테이블에 저장하는 방식저장된 테이블을 기반으로 큰 문제의 해결을 단계적으로 구축상향식 계산 방식 미리 계산해 값도 미리 테이블에 저장한다. 저장 된 것을 불러와 사용한다.   둘다 장단점이 있다. 메모이제이션을 활용해서 계산 결과를 저장하는 방식인 직관적인 상태라면 메모이제이션이 유리직관적이지 않으면 타뷸레이션을 사용해서 메모리도 절약하고 속도도 빠르게 할 수 있다. 위 질문대로라면 재귀로 쉽게 구현할 수 있다고 말하고 있다. 그렇다면 메모이제이션을 사용하는편이 좋을 것 같다.    

알고리즘 · 자료구조cs-미션cs-미션-발자국cs전공지식자료구조알고리즘워밍업클럽

지민철

인프런 워밍업 클럽 스터디 2기 CS 3주차 과제

운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터휘발성 메모리컴퓨터의 bit는 레지스터의 크기를 말한다메인메모리의 값을 가져와서 레지스터에서 연산 후 다시 메인메모리로 저장캐시레지스터와 메인메모리 속도 차이 때문에 미리 데이터를 가져오는 곳여러개이다메인메모리(RAM)실제 운영체제와 다른 프로세스들이 올라오는 공간휘발성 메모리가격이 비싸다보조저장장치(HDD, SSD)파일 저장 공간비휘발성 메모리사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?  경계 레지스터주소 처음에는 운영체제를 두는 공간이 있는데 만약 사용자가 악의적은 프로세스를 넣어서 침범한다면 위험하다이런 이유로 물리적으로 분리하는 경계 레지스터를 만들었다.경계 레지스터는 프로세스가 할당받지 않은 주소를 침범했다면 종료시킨다.메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식메모리에 연속해서 프로세스를 집어넣는 것연속 메모리 할당장점낭비되는 공간 없음단점외부 단편화만약 프로세스가 끝나면 빈 공간이 생긴다빈 공간이 여러개일 때 합치면 프로세스에게 줄 크기더라도 연속돼있지 않으면 사용이 불가능하다합칠 수는 있지만 다른 프로세스들을 정지키시고 해야 하기 때문에 힘들다고정 분할 방식프로세스의 크기에 상관없이 메모리를 정해진 크기로 나눈다.프로세스도 그 크기에 맞춰서 넣는다비연속 메모리 할당장점구현이 간단하다오버헤드가 적다단점공간이 남는 상황이 있다 CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?컴퓨터가 부팅되려면 HDD나 SSD와 같은 저장장치가 필수적입니다.허나 둘 중에 하나만 있어도 작동은 가능합니다.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?삭제된 파일의 데이터가 실제로는 물리적 디스크에 그대로 남아 있기 때문입니다.자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.- 버블정렬가장 쉬운 정렬이지만 성능이 좋지 않다바로 옆의 숫자와 비교해서 정렬하는 방식걸리는 시간은 O(n^2)이다.장점이해와 구현이 간단하다단점O(n^2)로 성능이 그리 좋지 않다- 선택 정렬이해와 구현이 간단하지만 역시 성능이 아쉽다배열의 모드 값을 비교 후 가장 작은 값을 첫번째 원소로 가져온다그 이후 정렬된 영역 뒤부터 다시 가장 작은 원소를 첫번째로 가져온다걸리는 시간 또한 O(n^2)이다.버블정렬과 같이 시간이 오래 걸린다.장점이해와 구현이 간단하다단점O(n^2)로 성능이 그리 좋지 않다- 삽입정렬삽입 정렬은 두 영역으로 나눠서 진행된다.시간복잡도 : O(n^2)장점 : 구현하기 쉽다단점 : 시간이 오래 걸린다- 병합정렬정렬해야 할 것을 아주 잘게 나눈 다음 정렬하고 병합하고를 반복하는 정렬방법이다.시간복잡도 : O(nlogn)장점 : 성능이 훨씬 좋다단점 : 이해와 구현이 어려움- 퀵 정렬배열의 값 중 한가지를 피벗으로 설정(설정방법은 여러가지)맨 왼쪽, 맨 오른쪽, 양쪽 이동값 만들기왼쪽 이동값이 피벗보다 크면 정지 -> 오른쪽 이동값이 피벗보다 작으면 정지 -> 둘다 정지하면 교환 -> 둘이 만나면 오른쪽 이동값 위치에 피벗값 변경-> 이후 피벗값 기준 좌우 따로 정렬시간복잡도 : O(nlogn), O(n^2)장점 : 성능이 훨씬 좋다단점 : 이해와 구현이 어려움메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션메모리제이션은 호출 스택이 깊어질 경우 스택 오버플로우가 발생할 위험이 있다.타뷸레이션은 반복문을 사용해 순차적으로 계산하기 때문에 오버헤드가 적고 더 빠르게 동작한다.타뷸레이션은 메모리 사용량이 명확히 정해져 있고, 일반적으로 문제 크기에 따라 고정된 크기의 테이블을 사용하기 때문이다.

강지원

[인프런 워밍업 스터디 클럽 2기 FE] 강지원 3주차 발자국

따라하며 배우는 리액트 A-Z (7~13강) Day 11 (리액트 테스트 경험하기) TDD (Test Driven Development)개발 전 테스트 코드를 먼저 작성하는 방법론 순서테스트 코드를 작성 → 실행 (당연히 실패) → 딱 이 테스트 코드를 통과할 만큼의 코드만 작성 → 성공 → 다른 테스트 코드 작성으로 이동전부를 다 한 다음에 리팩토링 작업을 실행여기서 문제가 된다면 다시 테스트 코드를 확인하고 수정함 TDD의 장점소스 코드에 안정감을 줌디버깅 시간과 개발 시간이 줄어듦시스템 전반적인 설계 향상 (클린 코드가 나올 확률이 높아짐)개발 집중력 향상 (테스트를 하나씩 깨나가면서 개발할 수 있기 때문)  Day 12 (NextJS, 타입스크립트)내용을 복습하면서 원래 알고 있던 것 + 새로 알게 된 내용을 공부하는 방식으로 공부했다.특히 TS의 타입 들을 코드로 정리하면서 어떤 타입이 있었는지 다시 새길 수 있었다. Next.jsReact의 SSR을 쉽게 구현할 수 있게 도와주는 간단한 프레임 워크 특징 Full-StackFile-based RoutingSEO, Image, Font OptimizationServer Side RenderingHybrid Rendering CSR (Client Side Rendering)리액트만으로 프로젝트를 만들면 발생 → 렌더링 하는 주체가 클라이언트 (브라우저) 장점한번 로딩 되면, 빠른 UX 제공서버의 부하가 작음 단점페이지 로딩 시간(TTV)이 김 (FCP가 오래 걸린다고도 함)자바스크립트 활성화가 필수임SEO가 힘듦보안에 취약 (모든 react 라이브러리, js 소스 코드를 다 다운 받아야 하기 때문에)CDN(Content Delivery Network)에 캐시가 안됨 → 이러한 많은 단점들을 해결하기 위해서 나온 것이 SSR SSR (Server Side Rendering렌더링 하는 주체가 서버렌더링 되는 순간 : 요청 시 렌더링 (미리 해두지 않음) 장점페이지 로딩 시간(TTV)이 빠름자바스크립트 활성화 여부가 필요 없음SEO 최적화가 좋음보안이 뛰어남CDN에 캐시가 됨실시간 데이터를 사용!사용자 별 필요한 데이터를 사용함 (요청 시 렌더링 하기 때문에 요청하는 사람에 맞게 데이터 제공이 가능) 단점비교적 느릴 수 있음서버에 과부하가 걸릴 수 있음 (몇 천명의 페이지를 요청 시 마다 계속 만들어야 하기 때문에)CDN에 캐시가 안됨 (요청마다 새로운 페이지를 만들기 때문에) Typescript 타입 : value가 가지고 있는 프로퍼티나 함수를 추론할 수 있는 방법JS의 dynamically type이 야기할 수 있는 runtime error를 해결하기 위해 statically type을 적용 시킨 언어 사용하는 이유Typescript는 JS코드를 단순화하여 더 쉽게 읽고 디버그할 수 있도록 함Typescript는 코드 유형 검사를 통해 JS를 작성할 때 고통스러운 버그를 피할 수 있도록 도와줌  Day 13 (리덕스 학습하기 및 리액트 19) ReduxJS 어플리케이션을 위한 상태 관리 라이브러리 data flowAction간단한 JavaScript 객체수행하는 작업의 유형을 지정하는 'type' 속성이 있으며 선택적으로 redux 저장소에 일부 데이터를 보내는 데 사용되는 'payload' 속성을 가질 수도 있음 Reducer어플리케이션 상태의 변경 사항을 결정하고 업데이트 된 상태를 반환하는 함수store 내부의 상태를 업데이트함 Redux Store어플리케이션의 전체 상태 가지고 있는 객체내부 상태를 변경하는 유일한 방법은 해당 상태에 대한 Action을 전달하는 것 Redux 미들웨어action을 dispatch하고 reducer에 도달하는 순간 사이에서 사전에 지정된 작업을 실행할 수 있게 해주는 중간자 Redux Thunk비동기 작업을 할 때 많이 사용하는 방법Redux Thunk도 리덕스 미들웨어액션 내부에서 다양한 작업을 할 수 있게 해줌 Redux ToolkitRedux 로직을 작성하기 위한 공식 권장 접근 방식Redux 코어를 둘러싸고 있고, Redux 앱을 빌드하는 데 필수적인 패키지와 기능이 포함되어 있음Redux 작업을 단순화하고 일반적인 실수를 방지하며, Redux 앱을 더 쉽게 작성할 수 있도록 도와줌 느낀 점 redux의 기본 사용 법을 처음으로 배우는 것이라 신기하고 어렵게 느껴졌다. 강의를 따라가면서 기초에 집중하려고 노력했는데, 처음 배운 개념을 이용해서 앱을 만드려니 꽤나 막막해서 시간이 많이 걸렸다. 앞으로 더 능숙해지고 싶다. 일주일 회고스터디 중간에 몸이 3일 동안 아팠어서 시간이 많이 없었지만 열심히 달려서 겨우 완주 조건까지 달성했다.매일 새벽까지 과제를 개발한 덕에 JS 과제 5개와 React 과제 3개를 해냈다. 모든 과제를 해내면 신입 역량 이상이라고 하셨었는데 나는 아직 신입 역량 정도였나 보다. 아쉽다.그동안 머릿속에 스터디만 가득한 채로 3주를 보냈는데 막상 끝나려고 하니까 아쉽지만 3주전의 나와 지금의 나를 비교했을 때 많은 성장을 이뤄낸 것 같아서 뿌듯하다.이번에 알게 된 부족한 점들을 바탕으로 앞으로의 공부 계획을 세워나갈 예정이다.정말 의미 있는 시간이었고, 꼭 필요했던 시간이라고 생각한다. 강의 출처강의 주소(React) : https://www.inflearn.com/course/따라하는-리액트/코치님 성함 : John Ahn

ReactNextJSTypescriptRedux프론트엔드인프런스터디3주차

강지원

[인프런 워밍업 스터디 클럽 2기 FE] 강지원 2주차 발자국

따라하며 배우는 자바스크립트 A~Z (8~10강)따라하며 배우는 리액트 A-Z (1~6강) Day 6 (Iterator, Generator, Design Pattern)디자인 패턴* 프로그래머가 응용 프로그램이나 시스템을 디자인할 때 일반적인 문제를 해결하는데 사용할 수 있는 공식화된 모범 사례 * 최고의 솔루션 * 재사용성 * 풍부한 표현력 * 향상된 의사소통 * 코드 리팩토링 필요x * 코드 베이스 크기 감소Singleton* 클래스의 인스턴스화를 하나의 객체로 제한하는 디자인 패턴 * 시스템 전체에서 작업을 조정할 때 정확히 하나의 객체만 필요한 경우 유용Factory* 특수 함수인 팩토리 함수를 사용하여 비슷한 객체를 많이 만들 수 있는 패턴 * 비슷한 객체를 반복적으로 생성해야 하는 경우 사용 * 동일한 코드를 반복할 필요 없게 해줌Mediator* 객체 그룹에 대한 중앙 권한을 제공하는 패턴 * 대표 예시 : 채팅방 * 중재자한테 먼저 채팅을 보내고 원래 보내려던 사람에게 중재자가 전달 * 정크 메세지 등을 거를 수 있음 Observer* event-driven 시스템을 이용하는 패턴 * 특정 subject를 관찰하는 많은 observer가 있고, 해당 subject에 변경 사항이 있을 떄, 알림 받기를 원하기 때문에 스스로를 등록(Register)함 * 관심을 잃게 되면 등록을 취소 * 예시 : 유명 연예인을 팔로워한 대중들 Module* 코드를 더 작고 재사용 가능한 조각으로 분할하는 패턴 * <script type="module"></script> 로 표현 가능 * 특징 * 1. 항상 strict 모드로 실행됨 * 2. 지연 실행됨 (defer) * 3. 인라인 모듈 스크립트도 비동기 처리할 수 있음 * 4. 외부 origin에서 스크립트를 불러오려면 Cors 헤더가 있어야 함 * 5. 증복된 스크립트는 무시됨 * 모듈 레벨의 스코프 * 모듈 안에 자신만의 스코프가 만들어져서 모듈 내부에 정의된 변수나 함수는 * 다른 스크립트에서 접근할 수 없게 됨 * 모듈은 최초 호출시 한번만 실행됨 * 스크립트 안에서 정보를 가져오기 위해서는 * import.meta를 사용해야 함 * async * 일반 스크립트에서 async -> 외부 스크립트에만 해당 * 모듈 스크립트에서 async -> 외부, 인라인 스크립트 둘 다 해당 Day 7 (프로젝트 만들기)StopWatch App// 지정된 timeout ms가 지날 때마다 handler를 실행해주는 함수 setInterval(handler, timeout) // setInterval에서 실행한 내용을 reset시키는 함수 clearInterval()Todo App// child 요소를 맨 앞으로 넣어주는 함수 prepend() Spreadsheet App // csv 파일을 다운로드할 수 있는 버튼을 만드는 방법 const csvObj = new Blob([csv]); const csvUrl = URL.createObjectURL(csvObj); const a = document.createElement("a"); a.href = csvUrl; a.download = "Spreadsheet File Name.csv"; a.click();백한테 파일 형태로 요청을 보낼 때만 써봤던 Blob을 이용해서 파일 다운로드 버튼을 만들어보다니 신기했다. Day 8 (중간 점검)라이브러리를 잘 활용하는 것도 실력이라고 하신 점이 기억에 남았습니다.너무 어려운 기능이 있으면 막막해서 라이브러리를 써볼까 하다가도 과연 개발자로써 직접 만들지 않고 이미 있는 것을 가져다 사용하는 것이 옳은 걸까라는 생각을 많이 했었는데, 이 부분을 확실하게 꼬집어주시면서 해결책을 주셔서 좋았습니다.코치 님의 말씀을 들으면서 라이브러리 사용을 두려워하지 말고 적극적으로 활용하는 개발자가 되어야겠다고 생각했습니다.그리고 third party api라는 단어를 잘 모르겠어서 찾아봤는데, 기업들이 이윤 창출을 목적으로 개발한 API라는 것을 알게 되었습니다. 예를 들어 구글을 통해 로그인, 구글맵 등이 third party api에 해당합니다. 예시로 든 두 기능은 프로젝트를 개발할 때 사용해봤던 api였는데도 불구하고 정확한 용어를 몰랐다는 점이 부끄러웠습니다. 앞으로 잘 기억해둬야겠습니다. Day 9 (리액트 기본 및 Todo 앱 만들기)React는 UI를 만들기 위한 JS 라이브러리 즉, Renders UI and responds/reacts to eventsSPASPA : Single Page Application 사용자가 버튼을 클릭했을 때 다른 페이지를 보여주는 것이 아니라 한 페이지 내에서 어떤 건 숨기고 어떤 건 보여주면서 동작하는 방식 성능 개선 부분이 너무 어려워서 코드를 따라치는 수준으로 겨우 들었다.. 추가로 공부를 더 하면서 완전히 내 것으로 만들어야겠다. Day 10 (리액트로 Netflix 만들기)강의를 보면서 더 공부하고 싶었던 내용들* Styled Component * Modal * ReactRouter * useLocation * useDebounce * useParamsTMDB api는 처음 사용해봤는데 넷플릭스, 디즈니 플러스 등 영화 정보가 필요한 앱을 만들때 굉장히 유용할 것 같다.여러 훅을 사용해 볼 수 있어서 좋았지만 한번에 이해하기는 힘든 부분이라 더 공부가 필요할 것 같다. Styled Component 내용 정리 및 개인적인 장단점 정리* CSS-in-JS JS 코드 내에서 잘 스타일링 된 컴포넌트를 직접 만들어서 가져다가 쓰는 방식 * 장점 - css 파일을 왔다 갔다 하지 않고 사용할 수 있다. * 단점 - JS파일 내에서 동작하기 때문에 수정하고 빌드할 때마다 재 컴파일 되어서 성능이 안좋음 - 스타일링과 컴포넌트를 오가며 작성해야 하는 불편함이 있음 - 컴포넌트만 봤을 때 이게 stlyed된 컴포넌트 인지 그냥 컴포넌트인지 구분할 방법이 없음 일주일 회고저번 주는 약과다 싶을 정도로 많이 바쁜 일주일이었다. 그래도 이렇게 무엇인가에 열중하는 경험은 몸이 피곤하더라도 기분은 좋다. 다음 주가 벌써 마지막 주라니.. 시간이 정말 빠르다. 마지막 주까지 힘내서 강의도 완주하고 과제도 잘 만들어야겠다.저번 주 회고 때 너무 많은 내용을 담은 것 같아서 아쉽다고 했었는데 확실히 저번 주 보다는 꼭 기억하고 싶은 내용들만 적어서 그런지 간략하고 가독성 있게 쓴 것 같아서 만족한다. 강의 출처강의 주소(JS) : https://www.inflearn.com/course/따라하며-배우는-자바스크립트/강의 주소(React) : https://www.inflearn.com/course/따라하는-리액트/코치님 성함 : John Ahn

JSReact인프런스터디프론트엔드2주차

양성빈

인프런 워밍업 스터디 클럽 2기 백엔드(클린코드, 테스트코드) 3주차 발자국

이 블로그 글은 박우빈님의 강의를 참조하여 작성한 글입니다.어느덧 벌써 워밍업 클럽이 막바지로 가고 있는 것 같다. 워밍업 클럽을 참여 전의 나보다 많이 성장했는가를 항상 발자국 쓸때 돌이켜 물어보는 것 같다. 과연 성장을 했을끼? 나는 당당히 성장을 하였다고 생각을 한다. 해당 스터디를 통해 나의 생활도 지식도 성장이 되었다 생각하며 해당에 대한 물음은 워밍업 클럽 수료 후에 다시 되물음을 해보겠다.이번 주차에서는 이제 Readable Code 강좌가 완강이 되고 Practical Testing 강좌를 시작하는 주차다. 이번주도 열심히 달려본 내역들을 작성해보겠다. 강의소개이 강좌는 테스트가 처음이거나 테스트 코드는 들어봤거나 작성하려고 시도를 해본 경험이 있는등 테스트가 궁금한 모든 분들을 위해 나온 강의이다. 나도 해당 테스트를 어떻게 하면 잘 작성할지가 궁금하여 이 강좌를 듣게 되고 해당 워밍업 클럽을 참여하게 된 이유이기도 하다.테스트를 작성하는 역량은 채용시장에서 주니어 개발자에게 기대하는 요소 중 하나다. 채용시 구현과제 등에서 테스트 작성여부, 테스트 코드 구현방식을 확인한다. 또한 소프트웨어의 품질을 보장하는 방법으로 그 중요성을 알고 있는지도 확인을 하기도 한다고 한다.이번 강좌에서는 다음과 같은 목표를 두고 학습을 진행한다고 한다.📚 목표1. 테스트 코드가 필요한 이유2. 좋은 테스트 코드란 무엇일까?3. 실제 실무에서 진행하는 방식 그대로 테스트를 작성해가면서 API를 설계하고 개발하는 방법4. 정답은 없지만 오답은 존재한다. 구체적인 이유에 근거한 상세한 테스트 작성 팁벌써부터 많은 기대를 품으며 다음 강의로 바로 가봐야 겠다. 어떻게 학습하면 좋을까?효과적인 학습을 하기 위해 가장 먼저 선행되어야 하는 것은 바로 무엇을 모르는지 아는 것이다. 무엇을 모르는 지 아는것은 찾아볼 수 있게 된다는 것이다.우리는 학습을 하면서 이 부분은 완벽히 아는 부분, 이 부분은 반만 아는 부분, 이 부분은 처음 들어보는 부분으로 구분된다. 그래서 강좌에서 함계 학습한 키워드와 추가 학습을 위한 키워드를 분리하여 키워드 기반으로 정리를 해주신다고 하니 많은 기대를 가지며 다음 강의부터 본격적으로 달려 볼 예정이다. 테스트는 왜 필요할까?기술 학습에 있어서 '왜?'가 중요하다. 테스트하면 생각나는게 무엇일까? 나는 처음 테스트코드를 볼때 굳이 해야하나? 개발시간만 더 늘릴뿐일텐데라는 생각을 하였다.그런데 만약 테스트코드가 없이 실제 인간이 수동으로 테스트를 하면 매우 큰 문제들을 야기할 수 있다. 인간은 실수의 동물이기 때문이다. 또한 만약 기능을 개발할때 기존 기능을 건들게 된다면 기존 기능도 다시 테스트를 하는 시간낭비가 발생한다. ✅ 테스트 작성을 안하면?1. 커버할 수 없는 영역 발생2. 경험과 감에 의존3. 늦은 피드백4. 유지보수 어려움5. 소프트웨어에 대한 신뢰가 떨어딘다. 테스트 코드를 작성하지 않으면?변화가 생기는 매 순간마다 발생할 수 있는 모든 case를 고려해야한다.변화가 생기는 매 순간마다 모든 팀원이 동일한 고민을 해야한다.빠르게 변화하는 소프트웨어의 안정성을 보장할 수 없다.테스트코드가 병목이 된다면?프로덕션 코드의 안정성을 제공하기 힘들어진다.테스트 코드 자체가 유지보수하기 어려운 새로운 짐이 된다.잘못된 검증이 이루어질 가능성이 생긴다.올바른 테스트 코드자동화 테스트로 비교적 빠른 시간 안에 버그를 발견할 수 있고 수동 테스트에 드는 비용을 크게 절약할 수 있다.소프트웨어의 빠른 변화를 지원한다.팀원들의 집단 지성을 팀 차원의 이익으로 승격시킨다.가까이 보면 느리지만 멀리보면 빠르다.샘플 프로젝트 소개 & 개발 환경 안내해당 테스트 섹션에서는 카페 키오스크 시스템을 만들면서 테스트 학습을 할 예정이다.🛠 개발환경- IntelliJ Ultimate- Vim(Plugin) 프로젝트 세팅인텔리제이를 활용하여 스프링부트 프로젝트를 생성하고 build.gradle의 의존성 정리를 하였다. 수동테스트 VS. 자동화된 테스트요구사항주문목록에 음료 추가/삭제 기능주문목록에 전체 지우기주문목록 총 금액 계산하기주문 생성하기 해당 부분을 토대로 콘솔기반 비즈니스 로직을 작성하였고 테스트 강의이니 해당 로직을 테스트 하기 위해 이 중 음료 추가에 대한 로직을 아래와 같이 작성했다.@Test void add() {     CafeKiosk cafeKiosk = new CafeKiosk();     cafeKiosk.add(new Americano());     System.out.println(">>> 담긴 음료 수: " + cafeKiosk.getBeverages().size());     System.out.println(">>> 담긴 음료: " + cafeKiosk.getBeverages().get(0).getName()); }위의 코드를 봤을 때 이렇게 테스트코드를 짜면 안된다고 직감을 했을 것이다. 왜냐하면 일단 최종단계에서 사람이 개입하고 어떤게 맞고 어떤게 틀리는지 모른다는 것이다. 또한 이 테스트는 100% 성공하는 케이스이기 때문에 뭔가 테스트라고 하기에 모호한것 같다. JUnit5로 테스트하기단위테스트작은 코드 단위를 독립적으로 검증하는 테스트검증속도가 빠르고 안정적이다.Junit5단위 테스트를 위한 테스트 프레임워크 AssertJ테스트 코드 작성을 원활하게 돕는 테스트 라이브러리풍부한 API, 메서드 체이닝 지원 해당 지식을 기반으로 우리가 이전 시간에 작성한 아메리카노부분과 카페머신의 대한 단위 테스트를 AssertJ를 이용하여 작성해보는 시간을 가졌다. 테스트 케이스 세분화하기스스로에게 질문해보자. 암묵적이거나 아직 드러나지 않은 요구사항이 있는지를 확인해보자. 그리고 해피케이스와 예외케이스를 둘다 생각하며 항상 경계값 테스트를 해보자.경계 값은 범위(이상, 이하, 초과, 미만), 구간, 날짜등을 일컫는다.그래서 우리는 음료에 여러잔을 담는 기능을 개발하고 해당 부분의 해피케이스에 관한 테스트를 작성했다. 또한 예외 케이스를 생각해 로직을 작성하고 해당 예외케이스에 대한 로직을 작성하게 되었다. 테스트하기 어려운 영역을 분리하기테스트하기 어려운 영역은 다음과 같다.관측할 때마다 다른 값에 의존하는 코드현재 날짜/시간, 랜덤 값, 전역변수/함수, 사용자 입력 등외부세계에 영향을 주는 코드표준출력, 메세지 발송, 데이터베이스 기록 그래서 우리는 실습으로 주문을 생성할때 가게 영업시간이 아닐시, 주문을 못하게 하는 상황의 로직을 작성했고 테스트코드 작성 시 문제가 생겼다. 내가 현재 새벽에 테스트코드를 돌렸고 영업시간 전이기에 테스트코드가 실패한것이다. 결국 이 부분은 날짜를 파라미터로 받게 변경하여 해결하였다.📚 순수함수- 같은 입력에는 같은 결과- 외부세상과 단절된 형태- 테스트하기 쉬운 코드 TDD: Test Driven Development프로덕션 코드보다 테스트 코드를 먼저 작성하여 테스트가 구현과정을 주도하도록 하는 방법론Red: 실패하는 테스트 작성Green: 테스트 통과하기 위한 최소한의 코딩Refactor: 구현코드 개서느 테스트 통과 유지피드백TDD는 빠르게 피드백을 자동으로 받을 수 있다.선 기능 후 테스트 작성테스트 자체의 누락 가능성특정 테스트 케이스(해피 케이스)만 검증할 가능성이 크다.잘못된 구현을 다소 늦게 발견할 가능성이 있다.선 테스트 후 기능 작성복잡도가 낮은 테스트 가능한 코드로 구현할 수 있게 된다.유연하며 유지보수가 쉬운쉽게 발견하기 어려운 엣지 케이스를 놓치지 않게 해준다.구현에 대한 빠른 피드백 가능과감한 리팩토링이 가능클라이언트 관점에서의 피드백을 주는 Test Driven 테스트는 []다.테스트는 무엇일까? 테스트는 문서라고 볼 수 있다.프로덕션 기능을 설명하는 테스트 코드 문서다양한 테스트 케이스를 통해 프로덕션 코드를 이해하는 시각과 관점을 보완어느 한 사람이 과거에 경험했던 고민의 결과물을 팀 차원으로 승격시켜서 모두의 자산으로 공유할 수 있다. DisplayName을 섬세하게@DisplayName을 사용하여 테스트 명을 구체화할때 명사의 나열보단 문장으로 작성하는 것이 좋다. 또한 테스트 행위에 대한 결과를 기술하는데 도메인 용어를 사용하여 매서드 자체의 관점보다 도메인 정책 관점으로 한층 추상화된 내용을 담는것이 좋다. 마지막으로 테스트의 현상을 중점으로 기술하지 말자. 예를 들어 ~실패라기 보단 도메인의 내용을 담는것이 좋을 것 같다. BDD(Behavior Driven Development) 스타일로 작성하기TDD에서 파생된 개발방법함수단위의 테스트에 집중하기보다 시나리오에 기반한 테스트 케이스(TC) 자체에 집중하여 테스트개발자가 아닌 사람이 봐도 이해할 수 있을 정도의 추상화 수준(레벨)을 권장 Given / When / ThenGiven: 시나리오 진행에 필요한 모든 준비 과정(객체, 값, 상태 등)When: 시나리오 행동 진행Then: 시나리오 진행에 대한 결과 명시 및 검증 어떤환경에서(Given) 어떤 행동을 진행했을 때(When) 어떤 상태 변화가 일어난다.(Then)라는것을 토대로 @DisplayName을 상세히 적을 수 있다. 미션이번 미션은 저번에 Readable Code에서 진행했던 마지막 과제 프로젝트인 '지뢰찾가', '스터디카페'중에 1개의 프로젝트를 가지고 테스트 코드를 작성해보는 시간을 가졌다. 조건은 BDD스타일로 3개이상의 클래스 총 7개 이상 테스트를 작성하는 것이었지만 나는 한층 공부한다는 마음으로 테스트 커버리지 툴인 jacoco를 가지고 스터디 카페부터 진행을 하였다. 그 결과 테스트 커버리지 98%라는 결과를 가지게 되었다. 그리고 조금 더 욕심이 나서 지뢰찾기도 일부 클래스를 진행하였다. 이번 미션을 해보면서 어려웠고 힘들었지만 테스트 작성에 많이 익숙해진 경험을 가지게 되었다. 깃허브 주소 레이어드 아키텍쳐(Layered Architecture)와 테스트레이어드 아키텍쳐에서는 아래와 같이 구성되어 있다.- Persentation Layer- Business Layer- Persistence Layer이렇게 레이어를 나눈 이유는 관심사의 분리때문일 것이다. 책임을 나눔으로서 유지보수성을 쉽게 가져가기 위함이다.🙋🏻 테스트 하기 어려워보여요!그렇게 보일 수는 있겠지만 앞선것과 기조는 비슷하다. 즉, 테스트하기 어려운 걸 분리하여 테스트하고자 하는 영역을 집중하며 명시적이고 이해할 수 있는 문서형태로 테스트 작성하는 것은 어떤 아키텍쳐든 동일하다.A와 B라는 모듈이 있다고 하자. 이 두 모듈을 더했을 때 뭐가 나올까? AB? BA? C? 누구도 예측하기 힘들다. 그래서 우리는 통합 테스트의 필요성이 느껴질 것이다.통합 테스트여러 모듈이 협력하는 기능을 통합적으로 검증하는 테스트일반적으로 작은 범위의 단위테스트만으로는 기능 전체의 신뢰성 보장X풍부한 단위 테스트 & 큰 기능 단위를 검증하는 통합 테스트의 조화가 필요. Spring / JPA 훑어보기 & 기본 엔티티 설계Spring스프링을 애기하면 먼저 라이브러리와 프레임워크의 차이를 묻는다. 라이브러리 같은 경우는 내 코드가 주최가 된다. 즉, 필요한 기능이 있다면 외부에 끌어와서 사용을 하는데 이게 라이브러리다. 반면 프레임워크는 이미 프레임(동작환경)이 있고 내 코드가 주최가 아니고 내 코드는 수동적으로 이 안에 들어가서 역할을 하는데 이게 프레임워크다.스프링을 애기하면 나오는 주요 3가지가 존재한다. IoC, DI, AOP다.- IoC(Inversion of Control): 객체의 생성과 의존성 관리를 프레임워크에 위임하는 개념.- DI(Dependency Injection): 의존성 주입을 통해 객체 간 결합도를 낮추고 확장성과 테스트 용이성을 향상시킴.- AOP(Aspect-Oriented Programming): 횡단 관심사(공통 기능)를 분리하여 코드 중복을 줄이고 모듈성을 개선.ORM객체지향과 RDB 페러다임이 다름.이전에는 개발자가 객체의 데이터를 한땀한땀 매핑하여 DB에 저장 및 조회ORM을 사용함으로써 개발자는 단순 작업을 줄이고 비즈니스 로직에 집중. JPAJava진영의 ORM 기술 표준인터페이스이고 여러 구현체가 있지만 보통 Hibernate를 많이 사용반복적인 CRUD SQL을 생성 및 실행해주고 여러 부가 기능들을 제공편리하지만 쿼리를 직접 작성하지 않기 때문에 어떤식으로 쿼리가 만들어지고 실행되는지 명확하게 이해하고 있어야 함Spring 진영에서는 JPA를 한번 더 추상화한 Spring Data JPA제공QueryDSL과 조합하여 많이 사용 Persistence Layer 테스트요구사항이 다음과 같다고 하자.키오스크 주문을 위한 상품 후보 리스트 조회하기상품의 판매 상태: 판매중, 판매보류, 판매금지판매중, 판매보류인 상태의 상품을 화면에 보여준다.id, 상품번호, 상품타입, 판매상태, 상품이름, 가격 이 요구사항을 바탕으로 우리는 엔티티설계부터해서 컨트롤러까지 즉, Presentation Layer, Business Layer, Persistence Layer까지 전반적으로 한 사이클을 돌면서 코드를 작성해보고 확인까지 진행해보았다. 그럼 이제 repository부분부터 테스트를 해보자.우리는 given-when-then 패턴으로 테스트 코드를 작성했다. 여기서 살펴볼 것은 @SpringBootTest와 @DataJpaTest이다. 이 둘의 비슷하지만 차이점을 살펴보면 @SpringBootTest는 모든 부분의 의존성들을 주입시켜주지만 @DataJpaTest는 JPA관련된 부분만 주입을 시켜준다. 따라서 @DataJpaTest가 더 가볍다. 하지만 우빈님께서는 @SpringBootTest를 선호하신다고 하신다. 그 이유에 대해서는 추후에 말씀주신다고 하셨다.그럼 Persistence Layer 역할에 대해 정리하면 아래와 같다.Data Access 역할비즈니스 가공로직이 포함되어서는 안된다. Data에 대한 CRUD에만 집중한 레이어여야 한다.ex) QueryDSL이나 별도 DAO를 사용하면서 비즈니스 로직이 침투할 가능성이 있을 수 있으니 이 점을 생각하면서 작성해야 할 것 같다. Business Layer 테스트비즈니스 레이어에 대한 역할을 살펴보면 아래와 같다.비즈니스 로직을 구현하는 역할persistence layer와의 상호작용(Data를 읽고 쓰는 행위)을 통해 비즈니스 로직을 전개시킨다.트랜잭션을 보장해야한다. 그래서 우리는 새로운 요구사항을 통해 해당 비즈니스 레이어에 대한 테스트 코드를 작성해보는 시간을 가졌다. 새로운 요구사항은 아래와 같다.요구사항(1)상품번호 리스트를 받아 주문 생성하기주문은 주문상태 주문등록시간을 가진다.주문의 총 금액을 계산한다. 위의 요구사항으로 우리는 주문 엔티티를 설계하고 연관관계를 기존에 만든 상품 엔티티와 다대다 관계를 맺기 위해 중간 엔티티를 설계하고 각각으로 연관관계를 맺어두었다. 그리고 주문생성 로직과 테스트코드를 작성하는 시간을 가졌다.다음으로 우리가 작성한 테스트들을 동시에 돌려보았다. 하지만 실패되는 테스트를 보게되었다. 우리가 작성한 비즈니스 레이어 테스트가 전부 성공하는게 아니라 일부 실패가 되는 경우가 있다. 하지만 이 전에 Persistence Layer에 작성한 테스트를 동시 실행해보면 그것은 괜찮았다. 차이는 @SpringBootTest와 @DataJpaTest 두 어노테이션 차이였다. 두 어노테이션을 타고 들어가서 확인하면 @Transactional 어노테이션 유무 차이였다. 그래서 실패되는 비즈니스 레이어에 트랜잭션 어노테이션을 붙여주면 될 것 같아 보였지만 우빈님께서는 tearDown 메서드를 만드셔서 데이터를 클리닝하는 작업을 해주셨다. 그 이유는 추후에 말씀주신다고 하셨다. 요구사항(2)주문 생성 시 재고 확인 및 개수 차감 후 생성하기재고는 상품번호를 가진다.재고와 관련 있는 상품타입은 병음료, 베이커리다. 새로운 요구사항으로 재고 개념이 도입되었다. 그래서 해당 엔티티를 설계후 개수 차감 로직을 작성하였다. 여기서 위에서 언급한 수동으로 tearDown 메서드로 삭제를 하나하나 해주냐 아니면 @Transactional 어노테이션을 붙여주냐였다. 처음에 우리는 로직을 작성하고 해당 로직을 테스트할때 @Transactional어노테이션을 붙이지 않고 tearDown 메서드를 만들고 실행하였고 결과는 실패하였다. 정상적으로 재고가 감소가 안 된 것이다. 그래서 해당 로그와 쿼리를 보니 update 쿼리가 안 나간것이다. 원래 @Transactional 어노테이션을 붙이면 커밋종료시점에 더티체킹으로 update 쿼리가 발생한다. 하지만 지금은 우리가 수동으로 감소하는 전략을 하였기에 더티체킹 기능이 활성이 안 된 것이다. 🙋🏻 그러면 왜 insert쿼리는 잘 나간거에요?jpa repository를 타고 들어가보면 crud repository를 확인할 수 있다. 해당 구현체를 보면 save 메서드에 @Transactional 어노테이션이 잘 붙어져 있다. 이것은 delete도 마찬가지다.그래서 우리는 추후 살펴볼 것들이 있어 tearDown 메서드는 두고 @Transactional을 product 코드에 적용하기로 했다. 그리로 우빈님께서 이런 경우를 대비해 테스트에는 @Transactional을 붙이고 실질적으로 본 코드에는 안 붙이고 release하는 경우도 있으니 한번 생각하고 써야한다고 말씀을 주셨다.추가적으로 재고감소 로직은 동시성 이슈가 날 수 있는 대표적엔 케이스다. 지금은 키오스크가 1대밖에 없다 가정했지만 2대 이상이라면 동시성 이슈가 터질 것이다. 그래서 optimistic lock / pessimistic lock등을 고민해서 해결을 해야한다. 이 부분도 나중에 한번 더 스스로 공부해봐야겠다.

백엔드인프런워밍업스터디클럽2기백엔드클린코드테스트코드발자국

유선아

[미션] 인프런 워밍업클럽 CS 2기 2주차 미션

운영체제FIFO 스케줄링의 장단점이 뭔가요?FIFO 스케줄링의 장점은 단순하고 직관적입니다.단점은 한 프로세스가 다 끝나야 다음 프로세스가 시작되기 때문에, 실행시간이 짧은 프로세스라도 늦게 도착할 경우, 먼저 도착한 실행시간이 긴 프로세스가 끝날때까지 기다려야 한다는 단점이 있습니다. SJF를 사용하기 여러운 이유가 뭔가요?SJF는 이론적으로 FIFO 보다 성능이 좋지만, 실제로 어떤 프로세스가 얼마나 걸릴지 예측하기 힘들기 때문입니다.또한 Burst Time이 짧은 프로세스가 먼저 실행되기 때문에, Burst Time이 긴 프로세스는 앞에 모든 프로세스를 기다리며 아주 오랫동안 실행이 안 될수도 있다는 문제 때문에 사용하기 어렵습니다. RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요?타임 슬라이스가 아주 작으면 컨텍스트 스위칭이 자주 발생하기 때문에 타임 슬라이스에서 실행되는 프로세스의 처리량보다 컨텍스트 스위칭을 처리량이 더 커져 오버헤드가 커지게 되는 문제가 발생합니다. 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요? CPU를 사용하는 프로세스가 실행하다가 스스로 CPU를 반납하면 CPU 사용이 적은 것이니 I/O Bound Process 라고 인식하고,반대로 프로세스가 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황이면 CPU 사용이 많은 것이니 CPU Bound Process 라고 인식합니다. 공유자원이란무엇인가요?프로세스간 통신을 할 때 공동으로 사용하는 변수나 파일입니다. 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요? 상호배제 : 한 프로세스가 한 자원을 점유하면, 다른 프로세스에게 공유되면 안됩니다.비선점 : 한 프로세스가 한 자원을 점유하는동안, 다른 프로세스가 이를 뺏을 수 없어야 합니다.점유와 대기 : 한 프로세스가 한 자원을 점유할때, 다른 프로세스도 같은 자원을 원해야 합니다.원형 대기 : 점유와 대기를 하는 프로세스의 관계가 원형이어야 합니다.이 중 한가지 조건도 충족하지 않을 경우, 교착상태가 발생하지 않습니다. 자료구조와 알고리즘재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요?기저조건이 없을 경우, 재귀 함수를 탈출하지 못하고 계속해서 재귀함수가 호출된다. 즉, 콜 스택에 계속해서 함수가 쌓여서 메모리가 부족해져 프로세스가 강제 종료될 수 있습니다. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.function sumOdd(n){ // 재귀 로직 if (n <= 0) { return 0; } return (n % 2 === 1? n : 0) + sumOdd(n - 1); } console.log(sumOdd(10)) // 25v2function sumOdd(n){ // 기저 조건 if(n <= 1) { return n; } // 재귀 로직 if(n % 2 == 0){ return sumOdd(n -1); // n이 짝수일 때, n-1로 재귀호출 } else{ return n + sumOdd(n - 2); // n이 홀수일 때, n을 더하고 n-2로 재귀호출 } } console.log(sumOdd(10)) // 25 v3 (java)public class SumOddClass{ public static int sumOdd(int n){ // 기저 조건 if (n <= 1) { return n; } // 짝수일 때 n-1로 재귀 호출 if (n % 2 == 0){ return sumOdd(n -1); } // 홀수일 때 n을 더하고 n-2로 재귀 호출 return n + sumOdd(n -2); } public static void main(String[] args){ int n = 10; int result = sumOdd(n); System.out.println(result); } } 

워밍업클럽운영체제자료구조알고리즘CS미션

김지유

PySide6 GUI 개발하기 (판매가능한 EXE 파일 만드는법 포함)

PySide6 GUI 개발 강의 안내입니다​​​PySide6 or PyQt5 강의를 찾고 계시다면 집중해주세요​이번 강의는 아래 사진의 로그인 UI, 메인 UI를 개발하는 방법을 담은 강의 입니다​​강의보러가기​​​제가 프로그램 판매를 위해 다양한 강의, 블로그 자료를 찾으면서 정말 궁금했던 질문들 입니다하지만, 수백만원치 개발 강의에 투자해도 아래 질문의 답변 내용은 어디에서도 찾기 어려웠습니다​Udemy 여기 뿐만아니라 Inflearn, Fastcampus등 강의 존 ㅡ 나 사서 찾아봄​​'로그인 UI는 어떻게 만들지?''로그인 로직 + 서버의 동작 방식은 어떻게 해야하지?''로그인 성공하면 어떻게 다음 화면으로 넘어가게 하지?''1, 2대의 PC에서만 프로그램을 사용하게 하려면 어떻게 해야할까?''Main UI에서 로직을 실행시키면 멈추네? Thread 방식으로 어떻게 프로그래밍 하지?'​​​​​​​​​판매 가능한 수준의 GUI 개발 강의가 필요하진 않으신가요?저는 디자인 Lv.1 초심자 수준의 실력입니다. 이런 제가 PySide6 라이브러리를 활용해 예쁜 디자인의 GUI를 만들 수 있었던 노하우를 알려드리겠습니다. 외주 개발을 하던 저의 '디자인 1도 몰라도 전문가처럼 디자인 하는 방법'도 알려드리려고합니다.​​​프로그램을 판매하시려면 PyQt5가 아닌 PySide6을 사용하셔야합니다.​​​​이번 PySide6 강의의 핵심 Point는 '판매 가능한 프로그램 개발법' 입니다.초보자 수준의 대상으로한 강의가 가장 잘 팔립니다. 그래서인지 대부분의 강의가 높은 수준의 지식을 제공하지 않습니다. 기본 파이썬 문법, 자바 문법, 귀여운 토이 프로젝트 수준을 만드는데에서 그치지요. 이번 PySide6 강의는 제가 프로그램을 판매하기 위해 겪었던 개발 과정의 모든 시행착오를 담았습니다. 겨우 1,000줄 짜리 코드 짜는데 몇달씩 공부하며 맨땅에 헤딩할 필요가 있나요? 제 강의 하나로 시간을 아끼셨으면 좋겠습니다.​​​​강의보러가기​​​똑똑하게 강의 활용 하는 방법알려드리겠습니다​만약, 당장 PySide6 GUI를 EXE 파일로 만들어야 하는 상황이라면?강의 맨 마지막에는 항상 강의에 사용된 코드 전문이 포함되는데요. 제 강의를 200% 활용하시는 방법은 최종 작성된 코드를 직접 실행시키시면서 여러분께 필요한 프로그램으로 조금씩 변형하면서 사용하는 것 입니다. 완성된 코드가 제공되는데 굳이 0부터 시작하지 마시고, 제가 만들어놓은 코드 베이스에서 필요한 기능들을 덧붙여 나가신다면 시간을 효율적으로 사용하실 수 있을것 같습니다.​ 강의보러가기  

데스크톱 앱 개발pythonpyside6pysidepyqtpyqt5guiexe

정지형

[인프런 워밍업 스터디 클럽 2기 FE] 정지형 2주차 발자국

💡 2주차 회고중간 정검 라이브에 참가 하지 못했다..ㅠㅠ 아무래도 다음 워밍업 클럽에도 신청을 해야할 듯 싶다. 그래서 그런지 의욕이 떨어져버려서 과제가 밀려버렸지만 그래도 다시 의지를 다져보기로 했다! 다음에 또 참가하면 되지 한번 더 참가하면 복습도 되고 실력도 더 늘겠지? 완전 럭키비키잖아? 🍀생각보다 이번 주차 미션은 더 난이도가 있어서 아직 못했는데 강의듣고 얼른 시작해야겠다!📝 강의 내용 요약자바스크립트섹션 8 Iterator, GeneratorSymbol - ES6에서 새로 추가된 원시 타입, 유니크한 식별자를 만들기 위해 사용.const sym = Symbol('hi'); const sym2 = Symbol('hi'); console.log(sym1 === sym2); //falseIterator(반복기)Iterable - 배열은 반복 가능한 객체, 반복이 가능하다는 것을 Iterable이라 부름.for..of를 이용할 수 있거나 [Symbol.iterator]() 값을 가지면 Iterable한 것.Iterator - 반복자는 next()를 호출해서 {value:,done:}두 개 속성을 가지는 객체를 반환하는 객체Iterator 직접 생성해보기function makeIterator(array) { let index = 0; return { next: function () { if (index < array.length) { return { value: array[index++], done: false }; } else { return { value: undefined, done: true }; } } }; } const it = makeIterator([10, 20, 30]); console.log(it.next()); // { value: 10, done: false } console.log(it.next()); // { value: 20, done: false } console.log(it.next()); // { value: 30, done: false } console.log(it.next()); // { value: undefined, done: true }Generator(생성기)Generator 함수function* 키워드를 사용하여 정의되며, 사용자의 요구에 따라 시간 간격으로 여러 값을 반환할 수 있습니다.일반 함수 => 단 한 번의 실행으로 함수 끝까지 실행됩니다.제너레이터 함수 => 사용자의 요구에 따라 일시적으로 정지될 수 있고, 다시 시작될 수도 있습니다.function* generatorFunction() { yield 1; // yield - 사용한 지점에서 실행을 일시 중지합니다. yield 2; yield 3; } const number = generatorFunction(); console.log(number.next()); // { value: 1, done: false } console.log(number.next()); // { value: 2, done: false } console.log(number.next()); // { value: 3, done: false } console.log(number.next()); // { value: undefined, done: true }React (Seaction 5~6)👩🏻‍💻 미션비밀번호 생성 앱 6타이핑 테스트 앱7예산 계산기 앱 만들기 9디즈니 플러스 앱 만들기(난이도 중) 10 

웹 개발워밍업클럽FE과제

TaeMin Moon

개인 프로젝트 리뷰: Picknic | 쉽게 찾는 맛집

프로젝트 소개Picknic은 검증된 맛집을 지도 기반으로 쉽게 찾을 수 있는 서비스입니다.블루리본 서베이가 검증한 맛집 정보를 지역별로 편리하게 탐색할 수 있는 기능을 제공하며, 저는 사용자들이 더욱 손쉽게 지도 기반으로 주변의 맛집을 찾을 수 있도록 이 서비스를 기획했습니다.최근에는 인기 TV 프로그램인 흑백요리사 : 요리 계급 전쟁 에 등장하는 맛집 정보를 지도 기반으로 쉽게 찾아볼 수 있는 기능도 추가했습니다. 프로젝트를 시작한 이유블루리본 서베이는 검증된 맛집 정보를 제공하지만, 제가 느끼기에 모바일 사용성이 부족했습니다. 이런 훌륭한 정보를 사용자들이 더 편리하게 찾을 수 있으면 좋겠다는 생각에, 블루리본 서베이 데이터를 바탕으로 사용성을 개선한 서비스를 만들게 되었습니다.기술 스택Next.jsZustandNextUINaverMap APIStrapi서비스를 구성하면서 고민했던 부분블루리본 서베이의 맛집 정보를 사람들이 필요로 할까?처음에는 이 데이터가 사용자들에게 정말 필요할지 검증해보고 싶었습니다. 그래서 먼저 서비스를 개발하지 않고 맛집 데이터를 만들어 공유해보았습니다. 맛집 데이터를 네이버 지도에 모아서 제공하는 형태로 시작했습니다.네이버 지도에서 맛집 정보를 만들어보니 네이버 지도에는 두 가지 아쉬운 점이 있었습니다.저장 용량 한계: 네이버 지도는 리스트당 최대 1,000개의 장소만 저장할 수 있으며, 계정당 최대 5,000개의 장소만 저장 가능합니다. 서울 지역만 해도 5,000개 이상의 맛집 데이터가 있는데, 전국 데이터를 모으기에는 이 한도가 너무 적었습니다.마커의 성능: 저는 한 번에 많은 마커를 지도에 표시하고 싶었으나, 네이버 지도에서 권장하는 마커 개수는 200~300개 정도였습니다. 하지만 서울의 특정 지역만 해도 수천 개의 맛집이 존재하기 때문에 이 제한이 매우 답답했습니다. T맵은 1,000여개의 마커를 지원하지만, 역시 사용자들이 익숙한 네이버 지도를 선택하게 되었습니다.네이버 지도를 사용한 이유와 네이버 마커의 한계, 결국 Canvas지도 라이브러리는 여러개의 선택지가 있습니다. 국내 지도만 제공할 예정이기 때문에 네이버, 카카오, T맵 지도등을 사용할 수 있었습니다. 지도 라이브러리의 각기 장단점이 있습니다. 특히 T맵은 마커의 최적화가 우수하기 때문에 이 프로젝트에 사용했다면 가장 좋았을 것 같습니다. 그럼에도 네이버 지도를 사용한 이유는 사용자에게 익숙하기 때문입니다. 그럼에도 네이버 지도는 저를 좌절하게 만든 큰 단점이 있었습니다. 바로 네이버 기본 마커의 서능 한계입니다.네이버에서는 한번에 사용할 마커를 300개 이하도 권장합니다. 서울에만 5천여개의 음식점이 있고, 신사, 압구정, 논현, 강남 지역에만 천개가 넘는 음식점이 모여 있습니다. 이러한 음식점 정보를 보여주는게 핵심이라고 생각을 했습니다.네이버 지도는 동시에 렌더링되는 마커의 한계가 있기 때문에, 마커를 지우거나 클러스터링하는 방법을 제시합니다. 클러스터링은 우선 충분히 보여주고 싶은 상황에서 뭉쳐서 보여줘야 하기때문에 탐색에 불편함이 생긴다는 단점이 있었고, 현재 지도에 보이는 음식점만 보여주고 마커를 지워주기도 했습니다. 문제는 네이버의 마커는 생성할때는 성능 문제가 없지만, 지울때는 굉장한 성능 문제가 있다는 사실입니다. 그래서 초기에는 마커를 display: none으로 핸들링 했었고, 모바일에서 성능 문제를 확인하고는 도저히 이렇게 사용은 어렵다고 판단했습니다.네이버 지도에서 기본적으로 제공하는 마커를 사용하지 않고, Canvas를 통해 직접 그려보기로 했습니다. 마커의 수만큼 element로 dom에 그리는거 자체가 무겁다고 생각하고 있었고, 이러한 성능 문제가 있다면 Canvas로 해결할 수 있을거라 생각했습니다. 그러나 이 과정에서도 삽질이 있었습니다.마커를 직접 그리려면 위도/경도를 네이버 지도 안에 x,y 좌표를 가져와야 했습니다. 네이버 지도는 projection이라는 계층이 있고 현재 위도/경도에 따른 위치 정보를 가져올 수 있었습니다. 그런데 드래그를 통해 위치를 변경시키면 projection이 업데이트가 될거라 생각했는데, naverMap에서 projection를 가져와서 fromPointToCoord 함수를 사용하여 좌표를 꺼내왔는데 이 값이 업데이트가 안되어 있었습니다. 버그인지 모르겠지만, center를 변경했을때 projection에서 충분한 업데이트가 되지 않고 있었습니다. zoom이 변경될때는 업데이트가 정상적으로 되었습니다.그래도 방법은 있었습니다.// place는 음식점의 위치를 가지고 있습니다. const dpr = globalThis.devicePixelRatio || 1; // 디바이스 별로 픽셀 ratio를 가져옵니다. const projection = naverMap.getProjection(); // 투영 정보를 얻어옵니다. const originPoint = (projection as any).__targets.projection.target .containerTopLeft; // 왼쪽 상단이 기준점이 되고 이 좌표를 가져옵니다. const latlng = new naver.maps.LatLng(place.latitude, place.longitude); const offset = projection.fromCoordToOffset(latlng); // 음식점의 좌표를 offset으로 계산합니다. const x = (originPoint.x + offset.x) * dpr; // 음색점이 그려질 캔버스의 x 좌표입니다. const y = (originPoint.y + offset.y) * dpr; // 음색점이 그려질 캔버스의 y 좌표입니다. 이렇게 마커를 표현하니 모바일에서도 3000개 이상의 마커를 그려도 성능 문제가 없이 잘 그려졌습니다.  서버를 간단하게 구성하는 방법 : Strapi저는 복잡한 백엔드 구성을 원하지 않아서 Strapi를 활용해 API를 구성했습니다. Strapi는 오픈 소스 헤드리스 CMS로, 기본적인 관리 인터페이스를 제공해 손쉽게 데이터를 추가, 관리할 수 있었습니다. 특히 이 프로젝트에서는 음식점 데이터를 쉽게 관리하고 검색할 수 있는 기능이 중요했기 때문에 Strapi를 사용했습니다.로컬스토리지에 모든 음식점을 저장하기그 외에도 맛집 데이터를 브라우저에서 저장하는것에도 신경을 썼습니다. 음식점 데이터를 실시간으로 변화 하지도 않고, 지도에 표기할 음식점 정보가 모든 데이터가 있어야 보여줄 수 있어야 하므로 하루에 한번씩 로컬에 업데이트 하는 것으로 했습니다. 로컬스토리지에 음식점 정보를 저장하는데 문제점이 있었습니다. 로컬스토리지에는 음식점 정보를 문자열로 저장하려고 했는데, 5MB의 용량제한이 있습니다. 제가 처음 테스트 할 때는 몇백개의 음식점으로 했기 때문에 문제가 없었지만, 서울지역에만 5천여개의 음식점 정보가 있고, 전국을 따지면 만여개의 음식점 정보가 있습니다. 당연히 5MB를 초과했습니다. 저는 용량 문제를 해결하기 위해 처음에는 IndexedDB를 사용해볼까 했습니다. IndexedDB는 브라우저별로 조금 다르지만 사이트당 1GB를 저장할 수 있습니다. 그러나 제가 사용하는 zustand에서 상태를 브라우저에 동기화하여 저장시키는 라이브러리인 persist사용을 하는게 일반적인 방법이었고 indexedDB를 사용하는 예시를 찾지 못했습니다. 그래서 결국 로컬스토리지에 저장을 하되 문자열 데이터니까 문자열 압축을 해보자 했습니다.그래서 사용한 라이브러리가 lz-string입니다. 사용을 해보니 문자열마다 다르겠지만, 저의 경우는 반으로 압축이 되어서 약 2.9MB 정도가 되었습니다. 현재 서울 지역정보만 있기 때문에 문제가 아니지만, 전국 데이터를 모으면 용량이 커질수 있어서 이 부분은 나중에 개선을 해야할것 같습니다.장소 상세 정보를 iframe으로 해결장소의 정보는 간단히 음식점/카페 이름, 주소, 위도/경도 등의 정보만 저장하여 지도에 표기를 했습니다. 그런데 결국 내가 음식점/카페의 상세 정보를 확인할 필요가 있었습니다. 처음 생각은 음식점 정보를 크롤링해야 겠다고 생각을 했었습니다. 그런데 음식점에 관련된 정보가 종류도 많고 다뤄야 하는 정보도 너무 많았습니다. 기본정보, 운영 시간, 메뉴 정보, 리뷰 정보, 사진 등등 너무 많아서 이 데이터를 가져와서 관리하는것도 무리라고 생각했습니다.그래서 네이버의 페이지를 외부링크로 열어야겠다고 생각했습니다. 이 방법은 서비스에서 다른 서비스로 이동하면서 이탈이 될 가능성이 높은 방법이라서 단점이 매우 컸습니다. 이에 대해 뜻밖의 아이디어를 옆사람이 툭 던졌습니다. 저는 듣고 “에이.. 그게 안될텐데??” 고 생각했습니다. 바로 iframe을 통해 네이버의 음식점/카페 정보를 띄우는 거였습니다. 그런데 웬걸..? localhost에서도 아무 사이트에서도 iframe으로 네이버 페이지를 띄울수 있었던 것입니다. 그래서 지금의 방법처럼 서비스 내에서 iframe으로 자연스럽게 열도록 처리를 해습니다. 지금보면 네이버가 워낙 다른 서비스에서 연동해서 띄우기 때문에 기본적으로 허용을 하는거라고 생각은 됩니다. 흑백요리사 관련 정보 추가하기이 프로젝트의 원래 취지는 블루리본 맛집 정보를 보여주는 것이었습니다. 원래 그렇게만 만들고 끝낼 생각이었습니다. 그래서 주변 사람들에게 만든것만 공유를 했는데, 흑백요리사도 유행을 하고 라는 얘기를 해서,,, 화제성이 있는 내용이니까 내 프로젝트에도 추가해볼까 하는 생각이 들었습니다. 당시에는 흑백요리사를 보기도 전이었지만 어쨋든 요리사들의 정보와 음식점 정보를 모았습니다. 실제로 찾아보니 음식점과 출연자의 정보가 보기좋게 정리된 자료가 없었습니다. 그나마 캐치 테이블에 요리사 정보까지 있긴 했으나 탐색하기 조금 불편하게 느꼈습니다. 그리고 다행히 네이버 지도에서는 흑백요리사 출연진 음식점 리스튼 만들어서 공식적으로 공유했고 저는 이 정보를 사용할 수 있었습니다. 소감이 프로젝트에서 가장 시간을 많이 썼던 부분은 개발이 아닌 데이터를 모으는 일이었습니다. 모든 음식점 정보를 실제 위치를 찾고 직접 네이버 플레이스에서 확인하고 데이터를 쌓는 과정이 정말 오래걸렸습니다. 또 흑백 요리사의 요리사 정보도 꽁꽁 숨겨져 있어서 찾는데 많은 시간이 걸렸습니다.정말 시간을 많이 들여서 공들여 프로젝트를 진행했습니다. 결과물이 무엇보다 괜찮은것 같아서 굉장히 뿌듯합니다. 정말 재밌게 개발했고, 쓸모있는 프로젝트를 만든것 같아서 기분이 매우 좋습니다. 만들면서 아이디어가 계속 떠올라서 프로젝트를 계속해서 개선하는 과정을 정말 재밌게 즐겼습니다. 특히 마커를 정말 많이 고민 했는데, 결과물이 좋아서 너무 만족스러웠습니다.

프론트엔드프로젝트리뷰토이프로젝트

Yeoonnii

[인프런 워밍업 클럽 CS 2기] 2주차 발자국 - 자료구조/알고리즘

[ Section 3. 알고리즘 ]1. 재귀(recursion)재귀(recursion)어떤것을 정의할 때 자기 자신을 참조하는 것재귀함수란함수 내부에서 자기 자신(함수)를 호출하여 실행하는 함수→ 함수를 정의할 때 재귀적으로 정의된 함수를 재귀함수 라고 부른다.기저조건(Base Case)재귀 함수의 탈출 조건, 재귀 호출을 종료하는 조건을 의미한다.기저 조건이 없다면 함수는 계속해서 자기 자신을 호출하게 되므로, 무한 루프에 빠져 스택 오버플로우(Stack Overflow)가 발생한다.콜 스택(Call Stack)메모리 영역에서 Stack의 한 부분을 의미하며, 재귀 함수는 이 콜 스택을 사용해 실행된다.재귀함수를 사용하는 케이스for문에서 재귀함수를 사용하는 것은 비효율적이다.조금 복잡한 로직들을 구현할 때 재귀함수를 사용 한다. ex) 팩토리얼 계산2. 재귀적으로 생각하기재귀함수의 사용패턴 - 1. 반복실행재귀함수를 반복실행하여 for문 처럼 사용할 수 있다.그러나 재귀함수로 반복문을 실행하는것은 성능이 좋지 않다.재귀함수의 사용패턴 - 2. 하위문제의 결과 기반으로 현재 문제 계산재귀함수는 하위문제의 결과를 기반으로 현재 문제를 해결하는 하향식 계산 방식을 사용한다.재귀함수에 상향식 계산 방식을 사용하긴 하지만 재귀함수는 하향식 계산 방식을 사용하는데 주로 쓰인다.상향식 계산현재 문제 결과를 기반으로 상위 문제를 해결하는 방식하향식 계산하위 문제 결과를 기반으로 현재 문제를 해결하는 방식3. 재귀 - 하노이 탑재귀함수를 이용하여 하노이탑을 하향식 계산 방식으로 접근// ch03. 재귀 - 하노이 탑 // ex. 기둥 A 에 있는 원반 3개를 기둥 C 로 이동하려는 경우 // 1) 원반 3이 기둥 C로 옮겨 져야 함 -> [하위 문제] : 원반 1, 2가 기둥 B에 옮겨져야 한다. // 1-1) 원반 1, 2가 기둥 B에 옮겨져야 한다. -> [하위 문제] : 원반 2가 기둥 B에 옮겨져야 한다. // 1-1-1) 원반 2가 기둥 B에 옮겨져야 한다. -> [하위 문제] : 원반 1이 기둥 C에 옮겨져야 한다. function hanoi(count, from, to, temp) { // 3, A, C, c if(count === 0) return; hanoi(count - 1, from, temp, to); // 2, A, B, C console.log(`원반 [ ${count} ]를 [ ${from} ]에서 [ ${to} ]로 이동`); hanoi(count - 1, temp, to, from); // 2, B(temp), C(to), A(from) } // 첫번째 매개변수 : 원반의 개수(count) // 두번째 매개변수 : 원반들이 처음 꽂혀있는 기둥(from) // 세번째 매개변수 : 원반들이 최종적으로 꽂힐 기둥(to) // 네번째 매개변수 : 원반들이 이동을 위해 임시로 사용할 기둥(temp) hanoi(3, "A", "C", "B"); 4. 정렬 - 버블 정렬(Bubble Sort)버블 정렬(Bubble Sort)이란배열의 무작위 순서를 정렬할 때, 앞의 원소와 뒤의 원소를 비교하며 순서를 정렬하는 방식이다.배열의 모든 원소의 앞, 뒤 원소를 비교한다. → 맨 마지막 원소는 가장 큰 원소가 위치한다.정렬된 마지막 원소를 제외하고 나머지 원소의 앞, 뒤 원소를 비교한다.정렬은 배열 길이 - 1 만큼 실행한다.// ch04. 정렬 - 버블정렬(Bubble Sort) function BubbleSort(arr) { console.log(`arr.length ===> [${arr.length}]`); // 자리의 교체는 arr.length -1 만큼 진행 for(let i = 0; i < arr.length - 1; i++) { console.log(`1) [${i}]번째 for문`); // 정렬이 된 원소의 이전 원소보다 하나 이전의 원소까지 순회 for(let j = 0; j < (arr.length - i - 1); j ++){ console.log(`2) [${j}]번째 for문`); // 실제로 값을 비교하며 배열 원소의 값을 바꿔준다. console.log(`3) arr[j] 값 ===> ${arr[j]}`); console.log(`3) arr[j+1] 값 ===> ${arr[j+1]}`); if(arr[j] > arr[j + 1]){ // 앞의 원소값이 뒤의 원소값 보다 큰 경우 console.log(`4) arr[j]값이 arr[j+1] 값 보다 큽니다! ${arr[j]} > ${arr[j+1]}`); let temp = arr[j]; // 1) 앞의 원소 값을 임시로 저장 arr[j] = arr[j + 1] // 2) 뒤의 원소 값을 앞의 원소값으로 변경 arr[j + 1] = temp; // 3) 뒤의 원소 값을 임시로 저장했던 값으로 변경 } console.log(`5) ${arr}`); } } } 버블 정렬의 성능버블정렬의 성능을 수학식으로 풀어쓰면 등차수열의 합과 같다.이때 빅 오는 O(n²)이 된다. 데이터가 증가하면 계산량이 증가하여 성능이 떨어지므로 복잡한 시스템에 적합하지 않은 계산법이다.버블 정렬의 장단점장점단순하고 직관적이라 구현이 쉬운 알고리즘이다.단점계산량이 증가시 성능이 떨어지기 때문에 복잡한 시스템에 적합하지 않다.5. 정렬 - 선택 정렬(Selection Sort)선택 정렬이란?정렬되지 않은 영역의 원소들을 순회하며 제일 작은 값을 찾아 순회 범위의 첫번째 원소에 위치 시키는 정렬 알고리즘선택 정렬의 성능선택 정렬의 빅 오는 O(n²)이 된다. 버블 정렬과 마찬가지로 성능이 떨어지므로 복잡한 시스템에 적합하지 않은 계산법이다.선택 정렬의 장단점장점단순하고 직관적이라 구현이 쉬운 알고리즘이다.단점계산량이 증가시 성능이 떨어지기 때문에 복잡한 시스템에 적합하지 않다.

알고리즘 · 자료구조인프런워밍업클럽알고리즘자료구조CS

[CS 스터디] 2주차 발자국

강의https://www.inflearn.com/course/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B8%B0%EB%B3%B8https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C미션운영체제FIFO 스케줄링의 장단점이 뭔가요? 장점: 단순함, 단점: burst time에 따라 성능이 좌우됨. 운빨.. SJF를 사용하기 여러운 이유가 뭔가요? 종료시간을 예측하기 힘듬. 그리고 시간이 긴애들은 계속해서 기다려야 함 RR 스케줄링에서 타임 슬라이스가 아주 작으면 어떤 문제가 발생할까요? 컨텍스트 스위칭이 자주 발생해서 오버헤드 가능성이 생김 운영체제가 MLFQ에서 CPU Bound Process와 I/O Bound Process를 어떻게 구분할까요? 우선순위 큐를 여러개 두어 구분함 공유자원이란무엇인가요? 프로세스 동기화 시 여러 프로세스가 같이 사용하는 자원 교착상태에 빠질 수 있는 조건은 어떤 것들을 충족해야할까요 상호배제 , 비선점 , 점유와 대기 , 원형 대기자료구조와 알고리즘재귀함수에서 기저조건을 만들지 않거나 잘못 설정했을 때 어떤 문제가 발생할 수 있나요? 콜스택 무한 적재.. OOM! 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수를 만들어보세요.public class OddSum { public static void main(String[] args) { int n = 10; // 예시로 n을 10으로 설정 int sum = sumOddNumbers(n); } public static int sumOddNumbers(int n) { // n이 0보다 작으면 종료 if (n < 1) { return 0; } // n이 홀수일 경우 n을 더하고, 짝수일 경우 n-1을 더함 if (n % 2 == 1) { return n + sumOddNumbers(n - 2); } else { return sumOddNumbers(n - 1); } } }자료구조재귀탈출(종료) 조건이 꼭 있어야 함콜스택? 함수가 호출되면서 올라가는 메모리 영역 (==스택)먼저 들어온 데이터가 먼저 나간다.. FILO다음 함수를 종료조건에 맞지 않으면 계속 콜스택을 쌓아감for문으로 쓸 만한걸 재귀를 쓰면 메모리 손해가 생김, 오히려 성능이 안좋을때가 많음근데 왜 쓰냐? 팩토리얼 같은 문제단순한 반복실행 (성능? 은 별로)하위문제의 결과를 기반으로 상위문제를 해결 (ex 팩토리얼)for문: 상향식재귀: 하향식하노이의 탑 : 재귀적 사고..!!버블정렬쉽지만 그닥 성능은 별로..앞과 옆 숫자를 비교해서 자리를 바꿈4, 2, 3, 12, 4, 3, 12, 3, 4, 12, 3, 1, 4 (다음은 마지막 원소 빼고, 이미 정렬되었기 때문)2, 3, 1, 42, 1, 3, 4 (3, 4 빼고)1, 2, 3, 4성능: O(n^2) 선택정렬4, 2, 1, 3 (가장 작은 값 체크하고==1 이를 1번 자리에 4와 교환)1, 2, 4, 3 (가장 작은 값 2, 이를 교환하지 않아도 됨)1, 2, 3, 4성능: O(n^2) 운영체제cpu 스케줄링 방법 이어서...SJFShortest Job First큐의 특성상 Burst time이 짧은게 먼저 실행되기 때문에 먼저 보내면 평균 대기시간이 짧아짐 -> 짧은거 먼저?!이론상 fifo보다 성능은 좋음근데 프로세스 종료 시간을 예측하기 힘듦... 또 긴 애들은 먼저 와도 계속 밀릴 것.. ㅠㅠ RRRound Robinfifo는 앞이 다 끝나야 다음게 실행 됨 -> 하나의 프로세스를 시간을 주고 그 시간동안만 실행하게 함 -> 시간이 끝나면 프로세스 안끝나도 다른 애한테 줌 -> 원래 프로세스는 큐 맨뒤로...왔다 갔다.. 라운드 로빈!!즉 타임 슬라이스근데 타임 슬라이스가 큰 경우에는 계속 끊기지 않을까? -> 아주 작게 설정하면 동시에 실행하는 것같겠지만 컨텍스트 스위칭이 너무 자주 발생함 -> 오버헤드?MLFQMulti Level Feedback Queue제일 많이 쓰임 .. RR의 상위호환프로세스마다 중요하게 생각하는 애들이 다름IO실행시 인터럽트 발생 -> 짧게 넘김 -> 다음 프로세스 ...손해보는 프로세스가 생김우선순위 큐 여러개 만들어 둠.. 우선순이 낮을 수록 타임 슬라이스 높아지게! 프로세스 동기화통신 종류파일- 파이프 : 하나의 파일쓰레드 : 한 프로세스 내에서 힙 이용네트워크: 소켓통신, RPC 등공유자원, 임계구역공유 자원 동기화 문제 발생-> 여러 프로세스가 동시에 사용하면 안되는 영역:: 임계구역상호 배제 매커니즘 필요세마포어상호 배제 매커니즘 종류 중 하나 

Yeoonnii

[인프런 워밍업 클럽 CS 2기] 2주차 발자국 - 운영체제

5. SJF (Shortest Job First)Burst Time(연산 시간)이 짧은 프로세스를 먼저 실행하여 평균 대기 시간을 줄이는 알고리즘Burst Time이 짧은 프로세스를 우선적으로 실행시, 상대적으로 Burst Time이 긴 작업은 실행될 기회를 얻지 못하고 계속 대기할 수 있게 되며 프로세스의 종료시간을 예측하기 어려울 수도 있다. 이러한 이유로 SJF 알고리즘은 실제로 사용하지 않음 6. RR (Round Robin)한 프로세스에게 일정시간을 할당하고 할당된 시간이 종료되면 강제로 다른 프로세스에게 일정시간만큼 CPU를 할당한다. 강제로 CPU를 뺏긴 프로세스는 큐의 맨 뒷부분으로 밀려난다.FIFO 알고리즘과 RR 알고리즘의 평균 대기시간이 비슷한 경우 오버헤드가 큰 RR 알고리즘이 비효율 적이다.RR 알고리즘은 컨텍스트 스위칭 발생이 있기 때문RR 알고리즘의 성능은 타임 슬라이스의 값에 따라 달라짐타임 슬라이스/타임 퀀텀RR 알고리즘에서 프로세스들에게 부여되는 일정 시간타임슬라이스가 크게 설정된 경우FIFO 알고리즘과 다를바가 없기 때문에 비효율적타임슬라이스가 작게 설정된 경우 오버헤드가 너무 커진다.오버헤드가 커지는 상황→ 컨텍스트 스위칭이 자주 발생하여 타임 슬라이스에서 실행되는 프로세스의 처리량 보다 컨텍스트 스위칭을 처리하는 양이 훨씬 커짐최적의 타임 슬라이스를 결정하는 방법사용자가 느끼기에 타임슬라이스가 너무 크지 않아야 함프로세스가 동시에 실행되는 것처럼 느껴저야 함오버헤드가 너무 크지 않아야 함 7. MLFQ(Multi Level Feedback Queue)오늘날 쓰이는 주류 알고리즘이며, RR의 업그레이드 된 알고리즘CPU 사용률과 I/O 사용률이 좋게 나오는 작은 크기의 타임슬라이스를 선택한다.CPU Bound Process 에게는 타임 슬라이스를 크게 주며 우선 순위가 낮은 큐에 배치한다.I/O Bound Process 에게는 타임 슬라이스를 작게 주며 우선 순위가 높은 큐에 배치한다.CPU를 사용하는 프로세스가 실행하다가 스스로 CPU를 반납하면 CPU 사용이 적은거니 I/O Bound Process 일 확률이 높다.CPU를 사용하는 프로세스가 타임 슬라이스 크기를 오버해서 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황이면 CPU 사용이 많은 것이니 CPU Bound Process일 확률이 높다.큐의 우선순위 중 우선순위가 높으면 타임슬라이스가 적고 우선순위가 낮을수록 타임 슬라이스 크기가 커진다.어떤 프로세스가 타임 슬라이스 크기를 오버해서 강제로 CPU를 뺏긴다면 해당 프로세스는 원래 있던 큐보다 우선순위가 더 낮은 큐로 이동하게 되고 타임 슬라이스가 조금 더 커진다.→ 다음 실행시에도 타임 슬라이스가 부족하면 다음엔 우선순위가 더 낮은 큐로 이동하게 되어 더 큰 타임 슬라이스를 할당받게 된다.우선순위가 낮아질 수록 타임슬라이스를 무한초로 할당 받게 되어 FIFO 처럼 연속적으로 작업을 마칠 수 있게 됩니다.[ Section 4. 프로세스 동기화 ]1. 프로세스 간 통신프로세스간 통신의 종류1) 파일과 파이프를 이용한 통신파일을 이용한 통신하나의 파일을 여러 프로세스가 같이 읽고 쓰는 방식파이프를 이용한 통신운영체제가 구축한 파이프를 이용하여 프로세스가 통신하는 방식2) 하나의 프로세스 내부에서 쓰레드를 이용한 통신하나의 프로세스 내부에 존재하는 여러 쓰레드는 스택을 제외한 코드, 데이터, 힙 영역을 공유하고 스택만 자신의 것을 가지고 있다.데이터 영역의 전역 변수나, 힙 영역을 이용하여 쓰레드 간 통신이 가능하다.3) 네트워크를 이용한 통신운영체제가 제공하는 소켓 통신다른 컴퓨터에 존재하는 함수를 호출하는 RPC(원격 프로시저 호출)를 이용해 통신2. 공유자원과 임계구역공유자원이란?프로세스 통신시 공통으로 이용하는 변수나 파일프로세스의 접근 순서에 따라 결과가 달라질 수 있다.동기화 문제프로세스 통신시 공유자원의 연산 결과를 예측 할 수 없고 어떤 프로세스가 먼저 실행될지 예측 할 수 없는 문제임계구역(Critical Section이란?여러 프로세스가 동시에 사용하면 안되는 영역을 정의한 구역경쟁조건(Race Condition)공유자원을 서로 사용하기 위해 경쟁하는 것상호 배제(Mutual Exclusion)임계구역 문제를 해결하기 위해 필요한 매커니즘상호 배제의 요구 사항임계 영역엔 동시에 하나의 프로세스만 접근한다.여러 요청에도 하나의 프로세스의 접근만 허용한다.임계구역에 들어간 프로세스는 빠르게 나와야 한다.3. 세마포어상호배제의 매커니즘 중 하나이다.세마포어는 실제로 정수형 변수이다.세마포어를 사용하면 공유자원에 여러 프로세스가 동시에 접근하지 못하기 때문에 동기화 문제가 발생하지 않는다.wait() 함수와 signal() 함수 사용세마포어는 공유 자원의 개수만큼 가질 수 있다.세마포어 사용의 단점wait() 함수와 signal() 함수 사용 순서가 꼬일 경우 세마포어를 잘못 사용할 가능성이 있다.4. 모니터세마포어의 단점을 해결한 상호배제 매커니즘운영체제가 처리하는 것이 아니라 프로그래밍 언어 차원에서 지원하는 방법ex.) 자바에서 synchronized키워드가 붙은 함수들은 여러 프로세스에서 동시에 실행할 수 없다.모니터가 완벽하게 구현된 경우 프로그래머는 세마포어 처럼 wait() 함수와 signal() 함수를 임계 영역에 감싸지 않아도 돼어 편리하고 안전하게 코드를 작성할 수 있다.[ Section 5. 데드락 ]1. 데드락이란? (feat. 식사하는 철학자)교착상태(데드락)여러 프로세스가 서로 작업이 끝나기를 기다리다 아무도 작업을 진행하지 못하는 상태교착상태가 발생하는 이유는 공유자원 때문이며, 어떤 자원을 여러개의 프로세스가 공유하지 않는 경우 교착상태는 발생하지 않는다.교착상태의 필요조건1. 상호배제어떤 프로세스가 한 리소스를 점유 했다면, 해당 리소스는 다른 프로세스에게 공유가 되면 안된다.2) 비선점프로세스 A가 리소스를 점유하고 있을 때, 다른 프로세스는 해당 리소스를 빼앗을 수 없다.3) 점유와 대기어떤 프로세스에서 리소스 A를 가지고 있는 상태에서 리소스 B를 원하는 상태여야 한다.4) 원형 대기점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있어야 한다.2. 데드락 해결 (feat. 은행원 알고리즘)교착상태 해결방법교착상태 회피(Deadlock avoidance)프로세스에게 교착상태가 발생하지 않는 수준의 자원을 할당전체 자원의 수와 할당된 자원의 수를 기준으로 안정 상태(Safe state)와 불안정 상태(Unsafe state)로 나눈다.운영체제는 안정 상태를 유지하려 노력하며, 불안정 상태에 빠지면 교착상태에 빠질 확률이 높아진다.은행원 알고리즘(Banker’s algorithm)은행의 여윳돈과 사업가들에게 빌려준 돈들을 보고 대출 가능한 상황(안전상태)인지 확인하고 빌려준다.운영체제에서 은행원 알고리즘 구현운영체제는 자기가 가지고 있는 시스템의 총 자원을 파악한다.프로세스는 자기가 필요한 자원의 최대 숫자(최대 요구 자원)를 운영체제에게 알려준다.안정 상태불안정 상태순환구조가 발생한 그래프 → 교착상태 발생교착상태 검출 방법(1) 가벼운 교착 상태 검출타이머를 이용하여 프로세스가 동작하지 않는 경우 교착상태에 빠진것으로 간주하고 교착상태를 해결한다.마지막으로 저장했던 체크포인트로 롤백하여 교착상태를 해결한다.(2) 무거운 교착 상태 검출자원 할당 그래프를 이용하여 현재 운영체제에서 프로세스가 어떤 자원을 사용하는지 지켜보고 교착상태가 발생하면 해결한다.교착상태를 검출한 경우 교착상태를 일으킨 프로세스를 강제로 종료하고, 다시 실행 시킬때 체크포인트로 롤백을 시킨다.이 방식은 운영체제가 지속적으로 ‘자원 할당 그래프’를 유지, 검사 해야 하기 때문에 오버헤드가 발생한다.가벼운 교착 상태 검출방식 보다 억울하게 종료되는 프로세스는 발생하지 않는다.[ Section 6. 쉬어가기 ]1. 컴파일과 프로세스작성한 프로그램 코드가 프로세스가 되고 메모리에 할당되는 전반적인 과정프로그래밍 언어컴파일 언어개발자가 작성한 코드를 컴파일 과정을 거쳐 실행 가능한 기계어로 변환컴파일 과정에서 문법 오류를 잡아낼 수 있다.C, C++, C# 등인터프리터 언어개발자가 작성한 코드를 한줄씩 해석하며 실행하는 언어컴파일 과정이 없어 실행시 오류가 발생 할 수 있고, 속도도 컴파일 언어와 비교하면 느리다.JS, Python, Ruby 등프로세스의 구조Code 영역실행해야 될 코드가 들어가는 영역Data 영역전역 변수나 배열이 들어가는 영역Stack 영역, Heap 영역 : 프로세스가 실행될 때 할당되는 메모리Stack 영역지역변수와 함수 관련 값들이 들어가는 영역Heap 영역실행 중 메모리 공간을 할당할 수 있는 유동적인 공간컴파일 언어로 작성된 파일이 프로세스가 되는 과정코드 작성컴파일러로 작성한 코드를 컴파일컴파일 과정을 거쳐 실행 파일이 생성된다.사용자가 프로그램을 실행시키면 운영체제가 프로세스를 만든다.운영체제는 실행파일에 있는 코드 영역과 데이터 영역을 가져와 프로세스의 코드 영역과 데이터 영역에 넣어주고 빈 상태의 스택과 힙을 할당한다.PCB를 만들어 관리가 가능하도록 하고, 프로그램 카운터(실행할 명령어의 주소)를 생성한 프로세스의 코드 영역의 첫번째 주소로 설정한다.운영체제 CPU 스케줄링에 따라 프로세스가 실행되다 작업을 마친다. [ Section 7. 메모리 ]1. 메모리 종류컴퓨터의 여러 종류 메모리레지스터CPU에 존재하며 가장 빠른 기억 장소컴퓨터의 전원이 꺼지면 데이터가 사라진다. = 휘발성 메모리32bit CPU, 64bit CPU → 32bit, 64bit는 레지스터의 크기를 말한다.CPU는 연산시 메인메모리(RAM) 에 있는 값을 레지스터로 가져와 연산하고 다시 메인메모리(RAM)에 저장한다.메인메모리의 값을 레지스터로 옮기려면 오래 걸리기 때문에 필요할 것 같은 데이터를 미리 캐시에 저장한다.메인메모리운영체제와 프로세스가 올라가는 공간전원이 공급되지 않으면 데이터가 지워진다. = 휘발성 메모리하드디스크나 SSD보다 속도는 빠르지만 가격이 비쌈 → 데이터 저장 X, 실행중인 프로그램만 올린다.보조저장장치(SSD, 하드디스크)가격이 저렴하고 전원이 공급되지 않아도 데이터가 지워지지 않는 비 휘발성 메모리2. 메모리와 주소운영체제는 메모리(메인 메모리, RAM) 관리를 위해 1바이트(8bit) 크기로 구역을 나누고 숫자를 매긴다. 이 숫자를 ‘주소’ 라고 부른다.32bit CPU 와 64bit CPU64bit CPU가 32bit CPU 보다 한번에 처리할 수 있는 양이 많기 때문에 속도가 더 빠르다.32bit CPU레지스터 크기: 32bitALU(산술논리연산장치) : 32bit(데이터가 이동하는) 버스 : 32bitCPU가 다룰 수 있는 메모리 : 2³² = 4GB64bit CPU레지스터 크기: 64bitALU(산술논리연산장치) : 64bit(데이터가 이동하는) 버스 : 64bitCPU가 다룰 수 있는 메모리 : 2⁶⁴물리주소와 논리 주소물리 주소 공간컴퓨터를 연결하면 0x0번지부터 시작하는 주소 공간논리 주소 공간사용자 관점에서 바라본 메모리 공간사용자는 논리주소로 물리주소에 접근 가능경계 레지스터하드웨어 적으로 운영체제 공간과 사용자 공간을 나눈다.CPU 내부에 존재하며 메모리 관리자가 사용자 프로세스가 경계 레지스터의 값을 벗어났는지 검사하고 벗어난 경우 그 프로세스를 종료시킨다.절대 주소와 상대 주소절대 주소실제 프로그램이 올라간 메모리 주소이며 메모리 관점에서의 절대 주소‘물리 주소 공간’ 이라 부른다.상대 주소사용자가 바라본 주소이며 실제 메모리 주소가 아니다.‘논리 주소 공간’이라 부른다.재배치 레지스터메모리 관리자는 CPU가 요청한 메모리 주소 값과 재배치 레지스터에 저장된 값을 더한 메모리 주소에 접근해서 데이터를 가져온다.재배치 레지스터에는 프로그램의 시작 주소가 저장되어 있다.재배치 레지스터 덕분에 모든 사용자 프로세스는 0x0번지 부터 시작한다는 가정을 사용할 수 있고, 시작 영역이 변경되어도 재배치 레지스터만 변경해주면 되는 장점이 있다.3. 메모리 할당방식메모리 오버레이(memory overlay)메모리 보다 큰 프로그램 실행 시 당장 실행할 부분만 메모리에 올리고, 나머지는 하드디스크 내부의 스왑 영역에 저장하는 기법스왑과정이 있기 때문에 조금 느리다.가변 분할 방식 (세그멘테이션)프로세스의 크기에 따라 메모리를 나누는 방식한 프로세스가 메모리의 연속된 공간에 할당되기 때문에 “연속 메모리 할당”이라고 한다.가변 분할 방식의 장/단점장점메모리의 연속된 공간에 할당되기 때문에 *내부 단편화가 없다*내부 단편화 : 크기가 더 크게 할당되어 낭비되는 공간단점외부 단편화 발생고정 분할 방식 (페이징)프로세스 크기와 상관없이 메모리를 정해진 크기로 나누는 방식한 프로세스가 메모리에 분산되어 할당되기 때문에 “비연속 메모리 할당” 이라고 한다.고정 분할 방식의 장/단점장점구현이 간단, 오버헤드가 적다.단점작은 프로세스도 큰 공간에 할당되어 공간이 낭비되는 내부 단편화가 발생외부 단편화 문제메모리를 할당 할 수 있는 공간이 충분함에도 연속된 공간에 프로세스를 할당할 수 없으면 할당하지 못하는 것내부 단편화 문제프로세스의 크기가 분할된 공간의 크기보다 작기 때문에 내부에 빈 공간이 생겨 낭비된다.분할되는 크기를 조절해서 내부 단편화를 최소화 한다.버디 시스템가변 분할 방식과 고정 분할 방식을 혼합해 단점을 최소화 함2의승수로 메모리 분할하여 메모리를 할당하는 방식버디 시스템의 장점외부 단편화 방지를 위한 메모리 공간 확보가 간단내부 단편화가 발생하긴 하지만 많은 공간의 메모리 낭비가 발생하지는 않음

알고리즘 · 자료구조인프런워밍업클럽운영체제CS

인프런 워밍업 클럽 스터디 2기 - CS 2주차 발자국

운영체제 1주차에 배웠던 것들을 바탕으로 깊숙하게 학습하는 것 같다.cpu 스케줄링에 대해 학습할 때 FIFO의 개념과 단점으로부터 점점 발전되는 SJF, RR, MLFQ 알고리즘이 등장한다.평소에 아무런 생각없이 사용했던 컴퓨터에 이러한 알고리즘이 적용됨을 알아간다는 것이 흥미로웠다.하지만 점점 기초지식이 아니기 때문에 5분짜리 강의라고 해도 두번 듣고 노션에 캡쳐하며 정리까지 하다보니 강의 시간의 3배는 걸리는 것 같다.그래도 그림과 함께 설명해주시니 이해가 잘 된다는 장점이 있기 때문에 놓치지 않고 꼼꼼히 필기하며 들어야겠다는 생각을 가진다.위 강의를 바탕으로 후에 정보처리기사에 도전해봐야겠다  자료구조와 알고리즘 작년에 프로그래밍 언어를 처음 배우면서 재귀함수가 정말 어려웠다.하지만 강사님의 꿀팁을 바탕으로 생각하다보니 이전보다 더 빠르게 코드를 이해하고 풀 수 있었다.정렬도 작년에 배우고 써먹지 않다보니 가물가물했었는데 강의를 통해 한번 더 리마인드 할 수 있었다.알고리즘을 들으면서 느끼는 건 꾸준함이 정말 중요하다 생각이 든다.작년에는 알고 있었지만 시간이 지나며 적용하지 않다보니 다 잊어버려 실무에 적용하지 못한다는 점이다. 강의를 들으면서 C#에도 적용해보고 잊지 않도록 리마인드하는 과정을 거쳐야겠다

발자국

채널톡 아이콘