블로그

빠타박스

[인프런 워밍업 클럽 2기 - CS] 지난 3주간의 여정 속에서 - 완주 후기

처음 이걸 왜 들었을까?이 과정을 듣기 2일쯤 됬던가. 벤처 게임회사에 면접을 보았다.그 회사의 면접은 그냥 말아먹었다.그 이유는 역시 기초 지식이다.  공부한지 어연 5년이 다된간다. 이쯤되면 게임개발이라는 것을 포기할만도 했다...어떻게 해야할까 하는 찰나에 인프런에 들어와 여느때 처럼 그냥 공부를 하고자 한숨을 내쉬며 들어왔는데바로 보이는... CS 이게 무슨일이지 하면서 한번 볼까? 무료라고?아.. 근데 아니였다... 기본적으로 할인을 해주나 로드맵에 있는 수강내역을 구매해야만 참가가 가능했다.나는 좀 아쉬웠다.. 가뜩이나 백수 5년째 거금을 들이기가 선뜻 겁이 났다... 그렇게 많은 돈은 아닐 수 있었지만... 나에게는 식비와 공과금을 충당해야만 하는 비용이였기 때문이다.하지만 면접에서 탈탈 털린 나로써는 CS지식이 시급했다... 나에겐 여러 장애물이 있었다...자격증 시험이였다... 항상 내 발목을 묶는 장애물이였다.이 과정을 진행하면서 실기일이 얼마 남지 않은 상태였다... 그럼에도 불구하고 CS 지식을 터득하자. 하지만 가볍게 보고 다음에 다시 보도록 하자는 마인드였다.(내가 반복하는 걸 싫어하다 보니까... 이게 참 문제다... )그렇게 그냥 열심히 했다...그냥 할 수 있는 만큼...  공부는 어떻게 해야 하죠? 난 솔직히 아직도 개발 공부란 것을 어떻게 해야할 지 모르겠다...그냥 받아적고 천천히 느리게 한다. 하나 볼때 최대한 이해하려고 다 적는다.하지만 남는게 별로 없다...반복학습이 생명인 것을 알겠다..ADHD를 겪고 있던 나로써 반복학습은 정말 지겨웠다.. 그래도 반드시 해내자 라는 마인드로 임했다...그렇게 공부한 것들을 필기하고 요약하려고 하였지만 쉽지 않았고, 최대한 가볍게 이해하려고 했다. 가장 어려웠던건 알고리즘 부분이였다... javascript로 하다보니 C++로 변환하려니까. 뭔가 비슷은 한데 헷갈리는 부분이 많았다... 안되던 것도 있었고,,,... 쉽지 않았다... 정처기 얼마 남지 않았는데 계속 붙들고 있는 경우도 발생했다그게 1주차 때이다. 그냥 무작정 하라는 대로 하였다. 최대한 깊어보이면서 간결하게다른 사람들이 쓴 것도 보았으면 좋았겠지만. 쓰고 바로 정보처리기사 공부를 해야만 했다. 18일 금요일 모든 과정이 종료 되었고, 이제 수료식만을 남겨둔채 나는 정보처리기사 공부를 집중했다.10월 20일 일요일 정보처리기사 D-Day...,..실기는 매우 어려웠었고 조졌다.... 그렇게 돌아와 낙심에 빠졌다... 그리 며칠 가지 않아서하.. CS 관련해서 심화적으로 봐야만 한다는 것을 어떻게 할까 하다가.최대한 쿠폰을 사용해서.. 보고 싶은데 해서 결국 구매를 강행했다..아직 보진 않았다. 왜냐하면 이전꺼도 다시한번 봐야만한다.다시 반복학습을 해야만 하니까. 이 과정이 끝나고 정말 운수 좋은날인가... 아는 분을 통해 일자리를 얻게 되었다...처음에는 어리둥절했다... 뭔지도 모르고 뭘 시킬지도 모르는데... 게임개발만 3년 정도를 팠다....언리얼엔진....갔더니 대표님이 언리얼엔진에 대한 이전 문제 때문에 나를 궁금해 하셨고 그일을 나에게 맡기셨다..부담스럽기도 하고 기회다 하며 재밌겠다 하며 그 기회를 붙잡았다...11월 4일 부로 출근하게 되었다. 그래서 언리얼엔진 심화 및 기초에 대한 내용을 공부하고 있어서 해당 자료구조를 못보고 있었다.  수료식그렇게 11월 1일(금)원래대로면 오프라인에 참석해야 하나.. 나의 직업군인시절 후유증으로 인해...갑자기 도져서 가지 못한다고 말하게 되었다...시작된 워밍업 클럽 수료식 과정중 코치님 감자 강사님께서 나오셔서 질의 응답 시간을 가졌다.유익한 시간이였고 좋은 정보도 얻었다. 추천 받은 책 : CODE (컴퓨터 구조에 대한 내용 밑바닥?)https://elfmfl.tistory.com/33 (펌 정보) 난 아직도 많은 공부를 해야만한다는 것을 느꼈다. 저곳에 모인 사람들 중에 분명 나보다더 대단한 사람도있고젊고 파릇파릇한 분들도 있을테고 여럿 사람들이 모였었을 것이다.부러웠다.. 저 자리에 위치할 수 있어서...하지만 또 나름 나의 시간을 아끼며 공부를 했다. 그렇게 질의응답시간이 끝나고 수료식의 대망의 수상 발표이다. 응?뭐지.. 적어도 26~30명 정도 CS 과정을 들었던거 같은데.. 우수러너에 뽑히게 되었다....다들 수상을 하고 있을 때 그저 축하해주기 위해서 남아있었는데.내가 수상하게 될 줄 은 꿈에도 몰랐다. 그래서 이 감사를 어떻게 해야 할지 바로 누군가에게 자랑을 했다. ㅎㅎ;;감사한 하루였다. 앞으로 어떤 과정이 또 생길지 모르겠다.하지만 이제 일을 시작했고, 이 일을 완벽히 하기 위해 더더욱 기초가 다져져야 한다.이 과정과 고난의 길 위를 즐기자. 기쁨으로 하루를 살아가자 이 과정을 겪을 수 있어서 감사합니다.인프런을 통해 많은 청년들이 새 꿈을 이룰 수 있게 해줬으면 좋겠다. " 모든 것의 가장 빠른 배움은 부딪히는 것이다. 그게 밑바닥이 되었든.가장 좋은것은 프로젝트를 하고 현업처럼 부딪히는 것 "     이제 다가올 2025년도를 위해인프런 공부를 하며 여러 사건과 여러 정치적인 이슈들이 있었다.우리는 내일을 위해 무언가를 지켜야 하고 싸워야 하는 경우가 생길 것이다.그저 지금 편안하게 우리가 공부할 수 있는 것은 누군가 희생되고 있음을 깨달아야 한다. "모든 일에는 당연한 것이 없다" 누군가의 배품, 누군가의 선함, 누군가의 악행,모든 것에는 이유가 있다. 포괄적차별금지법북한군파병이스라엘과 하마스 및 헤즈볼라윤모의 자금 횡령 및 국가비상금 빼돌림 여러 이슈들이 존재 한다. 우리는 공부하면서 깨어있어야 한다. 우리 미래가 결정되고우리 후대의 미래가 결정된다.해외 부자들 CEO들이 우리나라의 급격한 인구가 줄어드는 것을 바라보고 있다..대책이 없다... 그저 장막 안에서 보호를 받으면서 공부를 하는것도 그렇지만. 나라가 없어지면..공부도 무의미 하다... 깨어있는 공부를 하자. 부디 25년도에는 많은 것들이 청렴해지고 나아지길 바란다. 끝없이 성장하는 개발자가 되고생존하자. 버티며 끝까지 임하자 최선을 다하자. 내일 죽는한이 있더라도 자신의 위치에서 최선을다하자

알고리즘 · 자료구조인프런인프런워밍업클럽스터디2기자료구조알고리즘감자워밍업클럽

rhkdtjd_12

인프런 워밍업 클럽 2기 - CS 전공지식 스터디 3주차 마지막 발자국

 3주차 회고1주일에 3회 발표 하는 방식의 복습 스터디가 3주만에 드디어 끝이 났다.팀원 분들이 없었다면 나는 아마 완강도 못했을것같다. 사실 이렇게 1주일에 3번의 스터디를 한다는거와 그중 1번은 무조건 발표 해야 한다는것은 굉장히 부담이다.근데 무려 참석률 100% 를 달성하며 무사히 스터디를 마칠 수 있었던것은 정말 좋은 스터디원들을 만났기 때문이다.스터디는 확실히 나에게 좋은 영향력을 끼친것 같다. 우선적으로 내가 공부하는 방법에 대해서 고민하게 되었다. 원래 내가 강의를 공부하는 방법은 강의를 한번 보면서 중요한것들만 요약하면서 공부를 했었다. 근데A팀원분은 강의를 보면서 1차 정리를 하고 그다음에 한번더 2차정리를 하신다고 한다. 그러한 과정에서 이제 그림 그리면서 내용을 정리 하시는데 확실히 이렇게 2회독 정도 하면서 그림과 설명을 붙여가면서 정리를 하니까 복습도 잘되고 이해도 잘되는것 같았다.B팀원분은 강의를 빠르게 1번 보고 2번째 볼때 꼼꼼하게 정리를 하신다고 하셨다. 근데 꼼꼼하게 정리한다는것이 나 같은 경우에는 강의에 있는 내용들만 보통 보고 넘어간다면 이분은 좀 더 자세하게 다른 서적이나 자료들을 찾아보면서 연관되는 내용들도 함께 공부하신다. 확실히 CS 개념들을 정확하게 짚고 넘어가려면 이렇게 꼼꼼하게 공부하는게 맞는것 같다. 왜냐하면 운영체제에 대한 질문이 들어오고 강의에 대한 내용만 기억하고 있다면 첫번째 질문에는 답변 할 수 있겠지만 그에 맞는 꼬리 질문이 들어온다면 아마 대답하지 못할것이기 때문이다.앞으로 나에게 맞는 공부방법을 변형해가면서 연구 해봐야겠다. 추가적으로 해당 CS정리를 잘 하고 난후에 어떻게 해당 내용들을 개발 관련일을 하면서 휘발 되지 않고 오래 기억에 가져갈 수 있는지에 대한 고민도 해봐야겠다. 끝으로 마지막 발표 자료 캡쳐로 마무리 짓겠다.3주차 학습 요약운영체제가상메모리 개요: 물리 메모리의 한계를 극복하여 프로그램이 실제 메모리 크기와 상관없이 실행될 수 있게 해줌. 스왑 영역과 함께 사용.세그멘테이션과 페이징:세그멘테이션: 프로그램을 함수나 모듈로 나누어 할당. 외부 단편화 o, 내부 단편화 x페이징: 메모리를 동일 크기로 나누어 할당. 외부 단편화x . 내부 단편화 o혼용기법 (페이지드 세그멘테이션): 세그멘테이션과 페이징의 장점을 결합.디맨드 페이징: 자주 쓰이는 데이터만 메모리에 로드. 페이지 교체 알고리즘 사용.스레싱과 워킹셋: 과도한 스왑 작업으로 인해 성능 저하가 발생하는 현상. 워킹셋은 자주 쓰이는 페이지 집합을 유지.주변장치: 캐릭터 디바이스(마우스, 키보드)와 블록 디바이스(하드디스크, SSD)로 구분됨. DMA로 메모리에 접근.파일과 파일시스템: 파일 관리자는 파일 생성, 수정, 삭제, 권한 관리 등을 수행. 디렉토리는 파일을 체계적으로 관리하기 위한 구조.자료구조와 알고리즘정렬 알고리즘:삽입정렬: 이미 정렬된 부분에 새 값을 삽입. 시간복잡도 O(n²).병합정렬: 재귀적으로 나눈 후 병합. 시간복잡도 O(n log n).퀵정렬: 피벗을 기준으로 좌우 분할. 평균 시간복잡도 O(n log n), 최악 O(n²).동적 프로그래밍:메모이제이션: 재귀로 계산 시 결과를 저장해 중복 계산을 피함. 하향식 접근.타뷸레이션: 상향식으로 필요한 값을 모두 미리 계산해 테이블에 저장.

알고리즘 · 자료구조알고리즘자료구조운영체제

rhkdtjd_12

인프런 워밍업 클럽 - CS 3주차 미션

운영체제1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.- 레지스터 : CPU 내부에 위치한 가장 빠른 메모리로 CPU가 명령어를 실행할 때 직접 사용합니다.- 캐시 : CPU와 메인 메모리(RAM) 사이에 위치하고 CPU의 성능을 높이기 위해 사용되는 고속 메모리입니다.- 메인 메모리(RAM) : 빠르지만 휘발성 메모리입니다.- 보조 저정장치(HDD,SSD) : 영구 저장 장치로 데이터의 비휘발성 저장합니다.2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?- 경계 레지스터입니다.- 경계 레지스터는 CPU내에 존재하고 메모리 관리자가 사용자 프로세스가 경계 레지스터값을 벗어나면 해당 프로세스를 종료 시킵니다.3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?- 가변 분할방식장점 : 1. 메모리를 가변적으로 분할 가능2. 코드, 데이터, 힙, 스택 영역을 모듈로 처리 가능3. 해당 영역을 쉽게 공유 할 수 있고 메모리 접근 보호도 편리합니다.4. 내부 단편화가 없습니다.단점 1. 외부 단편화가 발생합니다. -> 이를 해결하기 위해 조각모음을 사용하는데 -> 이는 모든 프로세스를 정지하고 해야하기 때문에 굉장히 오버헤드가 큰작업 입니다.- 고정 분할 방식장점1. 메모리를 정해진 크기 만큼 분할 가능2. 구현이 간단하고 오버헤드가 작습니다.3. 외부 단편화가 없습니다.단점1. 내부 단편화가 발생합니다. -> 이를 해결 할순 없지만 내부 단편화를 최소화 하는것이 제일 메모리를 효율적으로 사용 할 수 있는 방법입니다.4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱이라고 합니다.CPU 사용률은 높지만 시스템 성능이 떨어지는 현상을 말합니다.5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?> 컴퓨터를 부팅하는데 필요한 os가 필요한데, HDD나 SSD에 해당 os가 저장되어 있다고 알고 있습니다.> 근데 생각 해보니까 만약에 USB에 os를 두고 컴퓨터와 연결시켜서 실행 한다면 실행 할 수 있을것 같습니다!!!> 옛날에 어릴때 컴퓨터를 처음 삿을때 window 운영체제를 설치 해야 되는데 그걸 USB를 통해서 설치 했던 기억이 있습니다. 즉, 그때도 컴퓨터를 실행할때 USB를 통해서 실행한것이지 SSD와 HDD와는 상관 없었던것 같습니다.6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?사용자가 파일을 삭제 했을때 파일 테이블에서 해당 파일의 헤더를 지웁니다.사용했던 블록을 free block list에 넣습니다.즉, 사용자는 파일이 삭제된것처럼 느끼지만 실제로는 사용 했던 블록의 데이터는 free block list에 그대로 남아 있어서 파일을 복구 할 수 있게 됩니다.자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬 - 장점 : 구현이 쉽다.- 시간 복잡도 : O(n2)- 단점 : 시간 복잡도가 O(n2)으로 성능이 안좋다.선택 정렬 - 장점 : 구현이 쉽다.- 시간복잡도 : O(n2)- 단점 : 시간 복잡도가 O(n2)으로 성능이 안좋다.삽입정렬- 장점 : 구현이 쉽다.- 시간 복잡도 : O(n2)- 단점 : 시간 복잡도가 O(n2)으로 성능이 안좋다.병합 정렬- 장점 : 성능이 좋다.- 시간 복잡도 : nlogn- 단점 : 추가 메모리 공간이 필요하다.퀵 정렬- 장점 : 평균적으로 가장 빠른 정렬 중 하나이며, 메모리 사용이 효율적- 시간 복잡도 : 평균 : nlogn, 최악 : O(n2)- 단점 : 피벗 선택이 잘못되면 성능이 나빠진다.2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.메모리가 부족한 시스템에서는 저는 타뷸레이션(Tabulation)을 사용하는 것이 더 적합하다고 생각합니다.우리는 서비스를 제공하는 입장에서 치명적인 오류나 결함을 방지하고 사용자 경험을 보호하는 것이 가장 중요하다고 저는 생각합니다.메모이제이션은 힙메모리에 저장하기 때문에 메모리 부족 현상으로 인해 힙 메모리 부족으로 인한 오류가 발생하여 사용자에게 서비스 중단이나 예기치 못한 오류를 발생시킬 수 있습니다. 반면, 타뷸레이션은 반복문을 사용하여 스택 메모리를 절약하고, 필요 이상으로 힙 메모리를 사용하지 않아 메모리 효율적입니다. 또한 속도 측면에서 비교 해보았을때도 메모이제이션과 타뷸레이션의 성능은 거의 비슷하기 때문에 메모리가 부족한 시스템에서는 타뷸레이션을 선택하는게 바람직 하다고 생각합니다.

알고리즘 · 자료구조알고리즘자료구조운영체제

rhkdtjd_12

[인프런 워밍업클럽 CS 2기] 2주차 발자국

[2주차 학습 내용]자료구조와 알고리즘재귀: 자기 자신을 참조하는 방식. 프로그래밍에서는 콜 스택을 사용하며 FILO(First In Last Out)의 특징을 가짐.버블 정렬: 인접한 값들을 비교하여 정렬하는 알고리즘. 단순하지만 비효율적이며 O(n²)의 시간복잡도를 가짐.선택 정렬: 정렬되지 않은 부분에서 가장 작은 값을 찾아 정렬하는 방식. O(n²)의 시간복잡도를 가짐.  운영체제CPU 스케줄링: FIFO, SJF, RR, MLFQ 등 다양한 스케줄링 방식이 있음.프로세스 간 통신 (IPC): RPC, 공유 자원과 임계 구역, 세마포어, 모니터 등을 사용하여 프로세스 간의 통신 및 자원 접근을 관리함.교착 상태 (Deadlock): 상호 배제, 비선점, 점유와 대기, 순환 대기의 조건으로 발생. 식사하는 철학자 문제와 은행원 알고리즘이 교착 상태를 설명함.메모리 관리:메모리 종류: 상대 주소와 절대 주소.메모리 할당 방식: 고정/가변 분할 방식, 버디 시스템 [2주차 회고]순탄치 않았지만 개발 관련 인생 첫 스터디라는것을 모집해서 처음으로 참여를 하고 있습니다.처음에는 복습과 완강하자! 이런 가벼운 마음으로 시작한것인데 함께 참여하는 팀원 분들이 너무 잘하시고 열정적이십니다.즉, 저는 팀원복이 꽤 있는것 같습니다. 아마 혼자 달렸으면 완강은 못했을것 같은데 팀원들과 스터디를 진행 하면서 이분들과의 약속을 지키기 위해서라도 완강 하게 되는것 같습니다.발표 자료 캡쳐화면

알고리즘 · 자료구조운영체제자료구조알고리즘

Taeho

인프런 워밍업 클럽 - CS Week 2

AlgorithmRecursion(재귀)어떠한 것을 정의할 때 자기 자신을 참조하는 것을 의미한다.재귀함수 : 재귀적으로 정의된 함수재귀함수는 콜스택이라는 메모리 가득차게 되는 경우 자동으로 종료된다.기저 조건 : 재귀함수가 종료될 수 있는 탈출 조건기저 조건이 반드시 있어야 정상적으로 수행할 수 있다.재귀함수는 함수를 호출할 때마다 Call Stack이라는 메모리 공간에 호출정보가 저장된다.→ 재귀함수는 Loop문보다 더 많은 메모리 공간을 차지한다.Call Stack(= Stack)함수가 호출되면서 올라가는 메모리 영역함수가 종료되면 콜스택에서 제거된다.FILO(First-In Last-Out)재귀함수를 사용하는 이유Loop를 대신한다기 보다는 더 복잡한 문제를 쉽게 해결하기 위해 사용된다.ex) Factorial재귀함수를 쉽게 작성하는 방법재귀함수 내에서 자기 자신을 호출할 때 해당 함수가 벌써 구현이 되어있다고 가정한다.재귀 사용하는 패턴단순 반복문반복문으로 구현했을 때보다 이점이 되는 부분이 없음Call Stack에 공간을 많이 차지해 성능이 반복문보다 좋지 않다.하향식 계산하향식 계산 : 하위문제의 결과를 기반으로 현재 문제를 계산하는 방식재귀가 반복문보다 성능이 좋은 경우큰 문제를 해결하기 위해 작은 재귀 함수를 호출한다.재귀를 사용해서만 구현이 가능하다.상향식 계산 : 하위 문제를 모아서 현재 문제를 계산하는 방식반복문으로 구현한 것보다 성능이 좋지 않음반복문이나 재귀를 사용해서 구현할 수 있다.하노이의 탑하향식 계산 방식의 좋은 예시→ 재귀함수의 좋은 예시제약 조건한 번에 하나의 원반을 움직일 수 있다.가장 위에 있는 원반만 옮길 수 있다.아래에 작은 원반이 올 수 없다. Bubble Sort인접한 두 원소를 비교하여 두 원소의 위치를 교환한다.과정배열을 처음부터 끝까지 순회하며 인접한 두 원소를 비교한다.왼쪽 원소가 오른쪽 원소보다 크면 두 원소를 교환한다.이 과정을 배열이 정렬될 때까지 반복한다.시간 복잡도O(n^2)장점이해와 구현이 간단한다.단점성능이 좋지 않다.Selection Sort배열에서 최솟값을 찾아 맨 앞으로 이동시킨다.과정정렬되지 않은 부분에서 최솟값을 찾는다.찾은 최솟값을 정렬되지 않은 부분의 첫 번째 원소와 교환한다.정렬된 부분을 한 칸 늘리고, 정렬되지 않은 부분에서 위 과정을 반복한다.시간 복잡도O(n^2)장점이해와 구현이 간단하다.단점성능이 좋지 않다.참고 : https://visualgo.net/en/sortingCPU Scheduling AlgorithmSJF(Shortest Job First)Burst Time이 짧은 작업부터 CPU를 할당한다.문제점어떤 프로세스가 얼마나 실행될지 예측하기 힘들다.→ 예측하는 것이 거의 불가능하다.Burst Time이 긴 프로세스는 아주 오랫동안 실행되지 않을 수 있다.→ Burst Time이 긴 프로세스는 Burst Time이 짧은 프로세스에게 계속해서 우선순위가 밀린다.⇒ 사용되지 않는다.RR(Round Robin)하나의 프로세스에게 일정 시간만 CPU를 할당하고 할당된 시간이 지나면 강제로 다른 프로세스에게 일정시간만큼 CPU를 할당하는 방식→ 강제로 CPU를 뺏긴 프로세스는 Queue의 가장 마지막으로 밀려난다.Time Slice(=Time Quantum) : 프로세스에게 할당하는 일정 시간Time Slice에 따라서 RR의 성능이 좌지우지된다.Time Slice를 작게 만드는 경우 Context Switching이 빈번하게 발생된다.→ Context Switching이 빈번하게 발생함에 따라 성능이 떨어진다.Time Slice가 큰 경우 FIFO와 동일하게 동작한다.Time Slice 예시Window Time Slice : 20msUnix Time Slice : 100ms단점Context Switching이 존재한다.→ 평균 대기시간이 FIFO와 동일하다면 FIFO가 더 성능이 좋다.MLFQ(Multi Level Feedback Queue)RR의 업그레이드 버전주로 사용되는 CPU 스케줄링 알고리즘CPU Bound Process : CPU를 할당받은 시간을 대부분 CPU 연산을 수행하는 프로세스CPU 사용률과 처리량이 중요I/O Bound Process : 대부분의 시간을 I/O 작업에 수행하고 적은 시간만 CPU 연산을 하는 프로세스- 응답시간이 중요MLFQ는 기본적으로 CPU 사용률과 I/O 사용률이 좋게 나오는 작은 크기의 Time Slice를 사용한다.CPU Bound Process에게는 CPU 사용률을 높이기 위해 Time Slice를 높게 할당한다.I/O Bound Process에게는 I/O 사용률을 높이기 위해 Time Slice를 낮게 할당한다.OS는 어떻게 CPU Bound Process와 I/O Bound Process를 구분할까?CPU를 사용하는 프로세스가 실행하다가 스스로 CPU를 반납하는 경우 CPU 사용률이 낮음→ I/O Bound Process일 확률이 높음CPU를 사용하는 프로세스가 실행하다가 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황인 경우 CPU 사용률이 높음→ CPU Bound Process일 확률이 높음구현 방법우선순위를 갖는 큐를 여러개 준비한다.우선순위가 높으면 Time Slice가 작다.우선순위가 낮아질수록 Time Slice가 커진다.Process간 통신하나의 컴퓨터 내에서 프로세스간 통신하는 방법Pipe운영체제가 생성한 파이프를 이용해 데이터를 읽고 쓰는 방법File통신을 하려는 프로세스들이 하나의 파일을 이용해 읽고 쓰는 방법Thread를 이용한 통신하나의 프로세스 내에서 쓰레드간 통신하는 방법쓰레드는 코드, 데이터, 힙 영역을 공유한다.(스택 영역만 별도로 갖는다.)데이터 영역의 전역 변수나 힙 영역을 이용하여 통신할 수 있다.NetworkOS가 제공하는 Socket 통신RPC(Remote Procedure Call)다른 컴퓨터의 함수를 호출하는 방법공유자원과 임계구역공유자원 : 프로세스간 통신을 할 때 공용으로 이용하는 변수나 파일여러 프로세스가 공유하기 때문에 각 프로세스의 접근 순서에 따라서 결과가 달라질 수 있다.컨텍스트 스위칭으로 시분할 처리를 하기 때문에 프로세스간의 실행 순서를 예측하기 어렵다.⇒ 동기화 문제가 발생할 수 있다.임계규역 : 여러 프로세스가 동시에 사용하면 안되는 영역상호배제 메커니즘을 통해 해결할 수 있다.경쟁조건 : 공유자원을 사용하기 위해 서로 경쟁하는 것상호배제 요구사항임계영역엔 동시에 하나의 프로세스만 접근한다.여러 요청에도 하나의 프로세스의 접근만 허용한다.임계구역에 들어간 프로세스는 빠르게 나와야한다.Semaphore상호배제 메커니즘의 한 종류Semaphore :  정수 값을 가지는 변수로, 공유 자원에 접근할 수 있는 프로세스/스레드의 수를 나타낸다.세마포어를 갖고 있는 프로세스가 실행되고 세마포어를 반납한다.기본 연산wait(S): 세마포어 값을 감소시킨다.값이 0이면 프로세스/스레드를 대기 상태로 만든다.signal(S): 세마포어 값을 증가시킵니다.대기 중인 프로세스/스레드가 있다면 깨운다.종류이진 세마포어: 0과 1 두 가지 값만 갖는다.(뮤텍스와 유사하게 사용한다.)카운팅 세마포어: 0 이상의 정수 값을 갖는다.(여러 자원을 관리할 때 사용된다.)장단점장점: 여러 프로세스/스레드 간의 복잡한 동기화 문제를 해결할 수 있다.단점잘못 사용하면 교착 상태나 기아 상태를 유발할 수 있다.ex) 세마포어를 획득하는 함수와 세마포어를 반납하는 함수의 위치 잘못 사용Mutex(MUTual EXclusion)뮤텍스는 이진 세마포어의 특수한 경우여러 스레드가 공유 자원에 동시에 접근하는 것을 방지하는 기술기본 연산Lock: 스레드가 임계 영역에 진입할 권한을 획득Unlock: 임계 영역 사용을 마치고 다른 스레드가 진입할 수 있게 한다.뮤텍스와의 차이세마포어는 여러 프로세스/스레드의 접근을 허용할 수 있지만, 뮤텍스는 하나의 프로세스/스레드만 접근을 허용한다.Monitor세마포어의 단점을 보완한 상호배제 메커니즘OS가 처리하는 것이 아니라 프로그래밍 언어단에서 지원하는 기능ex) Java : synchronized 키워드한 번에 하나의 프로세스/스레드만 실행할 수 있다.교착상태여러 프로세스가 서로 다른 프로세스의 작업이 끝나길 기다리다가 아무 작업도 수행되지 않는 상태발생 원인상호 배제 : 공유 자원은 한 번에 하나의 프로세스만 사용할 수 있다.비선점 : 다른 프로세스가 사용 중인 자원을 강제로 빼앗을 수 없다.점유와 대기 : 프로세스가 이미 자원을 보유한 상태에서 다른 자원을 요청하며 대기한다.원형 대기 : 점유와 대기를 하는 프로세스들의 관계가 원형이다.하나라도 충족하지 않으면 교착상태가 발생하지 않는다.→ 교착 상태를 예방하는 것을 구현하기는 매우 어려워서 교착 상태를 해결하는 방향으로 발전됐다.해결방법교착상태 회피프로세스들에게 자원을 할당할 대 어느 정도 자원을 할당해야 교착상태가 발생하는지 파악해서 교착상태가 발생하지 않는 수준의 자원을 할당한다.전체 자원의 수와 할당된 자원의 수를 기준으로 안정상태와 불안정 상태로 나뉜다.OS는 안정상태를 유지하려 한다.안전 상태: 모든 프로세스가 요구한 최대 자원을 할당받아 실행을 완료할 수 있는 상태불안정상태에 있더라도 무조건 교착상태에 들어가는 것이 아니라 교착상태에 빠질 확률이 높아지는 것이다.은행원 알고리즘작동 원리프로세스가 자원을 요청할 때, 그 요청이 시스템을 안전 상태로 유지할 수 있는지 확인한다.안전 상태를 유지할 수 있는 요청만 수락하고, 불안정한 상태를 초래할 수 있는 요청은 거절한다.주요 개념최대 요구량(Max Need): 프로세스가 실행을 완료하기 위해 필요한 최대 자원 양할당량(Allocation): 현재 프로세스에 할당된 자원 양필요량(Need): 최대 요구량에서 현재 할당량을 뺀 값가용량(= 시스템 총 자원, Available): 시스템에서 현재 사용 가능한 자원 양단점비용이 비싸고 비효율적이다.교착상태 검출가벼운 교착 상태 검출타이머를 이용하는 방식프로세스가 일정시간 동안 작업을 진행하지 않는다면 교착상태가 발생했다고 간주하고 교착상태를 해결한다.교착상태 해결 방법일정 시점마다 체크포인트를 만들어 작업을 저장하고 타임아웃으로 교착상태가 발생했다면 마지막으로 저장했던 체크포인트로 롤백한다.무거운 교착 상태 검출자원 할당 그래프를 이용하는 방식OS가 자원 할당 그래프를 유지하고 검사해야 하기 때문에 오버헤드가 발생한다.But. 가벼운 교착 상태 검출에서 발생할 수 있는 억울하게 종료되는 프로세스가 발생하지 않는다.OS에서 프로세스가 어떤 작업을 사용하는지 지켜보고 교착상태가 발생했다면 해결한다.Programming LanguageCompile Language개발자가 코드를 작성하고 컴파일을 수행하여 0과 1로된 기계어로 실행파일을 만든다.→ 기계어로 되어 있어 실행 속도가 인터프리터 언어에 비해 빠르다.컴파일 과정에서 개발자의 문법오류를 체크한다.ex) C, C++, C#Interpreter Language개발자가 작성한 코드를 미리 기계어로 만들어 놓지 않고 실행시 코드를 한줄씩 해석해 실행하는 언어→ 미리 검사를 하지 않기 때문에 실행할 때 오류가 발생할 수 있고, 컴파일 언어보다 느리다.ex) Javascript, Python, Ruby프로세스의 영역코드 영역실행해야 할 코드가 들어간다.데이터 영역전역 변수나 배열이 들어가는 영역스택 / 힙프로세스가 실행될 때 할당되는 메모리스택 : 지역변수와 함수 관련 값들이 저장힙 : 실행 중에 메모리 공간을 할당할 수 있는 유동적인 공간Compile 언어가 Process가 되는 방법개발자가 코드 작성전처리 단계 실행개발자가 작성한 코드를 확인하고 전처리 구문을 처리한다.C에서는 #이라는 키워드로 선언된다.ex) #include<stdio.h>, #define MY_NUMBER 100코드에 있는 모든 주석은 삭제된다.결과물로 .i 파일이 생성된다.전처리기에서 나온 결과파일을 컴파일러가 처리한다.컴파일러는 .i 파일을 기계어에 가까운 어셈블리어로 변환시킨다.결과물로 .s 파일이 생성된다.어셈블러 작업이 수행된다.오브젝트 파일.o로 변환된다.오브젝트 파일은 0과 1로 구성되어 있다.코드영역과 데이터 영역이 나뉘어져 있다.링커 작업이 수행된다.모든 오브젝트 파일을 하나의 코드 영역과 데이터 영역으로 묶어준다.실제로 실행될 주소를 매핑시켜준다.결과물로 .exe 파일이 생성된다.사용자가 .exe파일을 실행시키면 OS가 프로세스를 생성한다.OS는 파일에 있는 코드 영역과 데이터 영역을 가져와 프로세스의 코드 영역과 데이터 영역에 넣어주고, 빈 상태의 스택과 힙을 할당한다.PCB를 만들어 프로세스를 관리가 가능하게 한다.PC(프로그램 카운터)에 다음 실행할 명령어의 주소를 생성한 프로세스의 코드영역의 첫번째 주소로 설정한다.→ OS의 CPU 스케줄링에 따라서 프로세스가 실행되다가 작업을 마친다.메모리 종류레지스터가장 빠른 기억장소, CPU 내에 존재한다.휘발성 메모리CPU를 나타내는 값에서 32bit, 64bit를 의미하는 것이 레지스터의 크기이다.CPU는 계산을 수행할 때 메인 메모리에 있는 값을 레지스터로 가져와서 계산한다.계산 결과는 메인 메모리에 저장한다.캐시휘발성 메모리속도가 매우 빠른 레지스터와 레지스터에 비해 상대적으로 느린 메인 메모리 사이의 속도 간극을 메우기 위해 필요한 데이터를 미리 가져와 저장하는 저장소성능의 이유로 여러 개가 존재한다.L1, L2, L3→ 숫자가 커질 수록 느린 캐시CPU가 값을 요청해 레지스터로 값을 옮겨야 한다면 빠른 캐시를 순차적으로 확인하고, 캐시에 데이터가 없으면 메인 메모리를 조회한다.ex) L1 → L2 → L3 → 메인 메모리보조 저장장치(HDD, SSD)비휘발성 메모리메인 메모리실제 운영체제와 다른 프로세스들이 올라가는 공간휘발성 메모리데이터를 저장하기 보다는 실행중인 프로그램만 저장한다.OS는 메모리를 관리하기 위해서 1Byte 크기로 구역을 나누고 숫자(주소)를 매긴다.32bit CPU, 64bit CPU32bit CPU레지스터, ALU, Data Bus : 32bit메모리 : 2^32 = 4GB64bit CPU레지스터, ALU, Data Bus : 64bit메모리 : 2^64 = 16384PiB64bit CPU가 32bit CPU 보다 한번에 처리할 수 있는 양이 많기 때문에 속도가 더 빠르다.물리 주소 & 논리 주소물리 주소 공간 : 0x0부터 시작하는 주소 공간논리 주소 : 사용자 관점에서 바라 본 주소 공간사용자는 물리 주소를 몰라도 논리 주소로 물리 주소에 접근할 수 있다.OS를 위한 공간은 따로 확보한다.경계 레지스터H/W적으로 OS 공간과 사용자 공간을 나누는 레지스터CPU 내에 존재하는 레지스터메모리 관리자가 사용자 프로세스가 경계 레지스터의 값을 벗어났다면 검사하고, 벗어났다면 해당 프로세스를 종료시킨다.절대 주소 & 상대 주소개발자가 프로그램이 실행될 주소를 신경쓰지 않고 개발할 수 있는 이유→ 컴파일러가 컴파일을 할 때 메모리 0번지에서 실행한다고 가정하기 때문절대 주소 : 메모리 관리자가 바라본 프로세스가 올라간 물리 주소상대 주소 : 사용자가 바라보는 논리 주소재배치 레지스터프로그램의 시작 주소가 저장되어 있다.사용자가 요청한 논리 주소의 데이터를 물리 주소로 치환해준다.사용자가 메모리에 접근할 때마다 논리 주소를 물리 주소로 치환해준다.메모리 할당 방식메모리 오버레이메모리보다 용량이 큰 프로그램을 실행시키는 방법큰 프로그램을 메모리에 올릴 수 있을 정도로 분할하여 일부만 실행하고, 실행되지 않은 프로그램은 HDD의 스왑 영역에 저장하는 방식Swap스왑영역에 있는 데이터 일부를 메모리로 가져오고 메모리에 있는 데이터를 스왑영역으로 옮기는 것가변 분할 방식(= Segmentation, 세그멘테이션)프로세스의 크기에 따라 메모리를 나누는 방식하나의 프로세스가 메모리에 연속된 공간에 할당된다.→ 연속 메모리 할당이라고 한다.장점메모리에 연속된 공간에 할당된다.→ 내부 단편화가 없다.단점외부 단편화가 발생한다.고정 분할 방식(= Paging, 페이징)프로세스의 크기와는 상관없이 정해진 크기로 나누는 방식하나의 프로세스가 메모리에 분산되어 할단된다.→ 비연속 메모리 할당이라고 한다.장점구현이 간단하고 오버헤드가 적다.단점작은 프로세스도 큰 영역에 할당되어 내부 단편화가 발생한다.내부 단편화프로세스에 필요한 메모리보다 더 큰 고정 크기의 메모리 블록이 할당될 때 발생한다.할당된 메모리와 실제 사용된 메모리 사이의 차이로 인해 메모리 공간이 낭비된다.고정 크기 분할 방식에서 주로 발생한다.해결 방법은 딱히 없고, 분할되는 크기를 조절하여 내부 단편화를 최소화한다.외부 단편화메모리 할당과 해제를 반복하면서 작은 빈 공간들이 메모리 곳곳에 흩어져 생기는 현상전체 가용 메모리는 충분하지만, 연속된 큰 블록을 할당할 수 없는 상황을 만든다.가변 분할 방식에서 주로 발생한다.조각모음외부 단편화가 발생한 공간을 합쳐주는 작업현재 메모리에서 실행되고 있는 프로세스들의 작업을 일시 주징하고, 메모리 공간을 이동시켜야 한다.→ 오버헤드가 발생한다.버디 시스템가변 분할 방식 + 고정 분할 방식오늘날의 OS가 채택한 메모리 할당 방식2의 제곱으로 메모리를 분할하여 할당하는 방식→ 근접한 메모리 공간을 합치기 쉽다.→ 조각 모음보다 훨씬 간단하다.장점가변 분할 방식처럼 프로세스 크기에 따라 할당되는 메모리 크기가 달라지고, 외부 단편화를 방지하기 위해 메모리 공간을 확보하는 것이 간단하다.내부 단편화가 발생할 수 있지만 고정 분할 방식에 비해 많은 공간이 낭비되지는 않는다.Retrospect잘한 점매일매일 빠지지 않고 강의를 들은 점매일 들은 강의 내용을 요약/정리하고 그 주차의 내용들을 하나의 게시글로 정리한 것

알고리즘 · 자료구조워밍업클럽CS전공지식Week2

tenenger

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

자료 구조 및 알고리즘 배열다른 프로그래밍 언어 vs 자바스크립트 특징다른 프로그래밍 언어의 경우는 배열의 크기를 정하고 연속적인 공간을 차지한다. 반면 자바스크립트 언어의 경우에는 배열의 크기를 정하지 않고 비연속적인 공간을 차지한다.다른 프로그래밍 언어의 배열은 배열의 크기를 늘릴경우 연속적인 공간을 새로 찾아서 기존의 내용을 복사붙여넣기 하기 때문에 성능이 좋지 않다. 반면 자바스크립트 언어의 경우에는 배열의 크기를 정하지 않기 때문에 비연속적인 공간에 값을 넣어 성능이 상대적으로 좋다.다른 프로그래밍 언어의 배열은 배열의 크기를 할당해야하기 때문에 불필요한 공간을 차지할 수 있다. 반면 자바스크립트 언어의 배열은 배열의 크기를 정하지 않고 동적으로 크기가 정해지기 때문에 불필요한 공간을 줄일 수 있다. 공통 특징배열의 시작주소 + 인덱스를 이용하여 참조를 하고, 참조의 경우 O(1) 의 성능을 보여준다. 🏷 자바스크립트 언어의 경우 비연속적인 공간을 차지하는데, 연결리스트로 노드가 연결되어 있어 인덱스로 접근할 수 있어 다른 프로그래밍언어에서 사용되는 배열과 유사하게 연속적인 공간을 차지하는 것 처럼 보여진다. 단방향 연결리스트특징연결리스트는 다른 노드를 가르키는 포인터가 있고, 하나의 노드가 다른 하나의 노드를 가르키며 서로 연결되어 있지 않아 단방향 연결리스트라고 불린다. 데이터 추가시, 인덱스의 위치에 따라 성능이 달라지는데 맨 앞에 데이터 추가시 O(1)의 성능을 가지는 반면, 맨 뒤에 데이터를 추가시 마지막 노드를 확인하고 추가해야하므로 O(n)의 성능을 가진다.데이터 삭제와 조회도 마찬가지이다. 연관된 자료구조스택 스택(Stack)특징First In Last Out (FILO) 방식이며, 가장 첫번째로 들어간 노드가 가장 마지막으로 나오는 순서를 따른다. 예시로 설거지를 한 접시를 탑을 쌓는다면 가장 위의 접시부터 빼는 것을 생각하면 이해가 쉽다. 구현단방향 연결리스트를 이용하여 위에서 부터 값을 넣는 push, 가장 위에서 제거하는 pop, 가장 위에 위치한 값을 확인하는 peek, 스택이 비어있는지 확인하는 isEmpty 메서드를 구현했다. 양방향 연결리스트특징양방향 연결리스트의 경우 하나의 노드가 다른 하나의 노드를 가리키고 있는데, 서로간에 참고하는 경우를 양방향에서 알 수 있다고 해서 양방향 연결리스트라고 한다. 연관된 자료구조큐, 덱, 셋 큐(Queue)특징First In First Out (FIFO) 방식이며, 가장 첫번째로 들어간 노드가 가장 첫번째로 나오는 순서를 따른다. 예시로 마트 계산대에서 가장 먼저 줄을 선 사람부터 계산을 진행하는 것을 생각하면 이해가 쉽다. 구현양방향 연결리스트를 이용하여 값을 넣는 enqueue, 값을 제거하는 dequeue, 가장 첫번째로 위치한 값을 확인하는 front, 큐가 비어있는지 확인하는 isEmpty 메서드를 구현했다. 데크(Deque)특징스택과 큐를 특징이 혼합된 자료구조로, 데이터를 첫번째와 마지막에 데이터를 추가, 삭제, 조회를 할 수 있다. 구현양방향 연결리스트를 이용하여 맨 앞의 값을 넣는 addFirst, 맨 앞의 값을 제거하는 removeFirst, 맨 뒤의 값을 넣는 addLast, 맨 뒤의 값을 제거하는 removeLast, 데크가 비어있는지 확인하는 isEmpty 메서드를 구현했다. 해시테이블특징해시 함수 + 테이블을 합친 개념으로 프로그래밍 언어마다 용어의 차이가 있다. 자바스크립트의 경우 해시 테이블이라고 한다.테이블을 배열로 만드는 방식의 경우 테이블의 키(숫자)를 인덱스로 하여 값을 저장했다. 이 방법은 사용되지 않는 인덱스의 경우 낭비되는 공간이기 때문에 메모리 낭비를 초래한다. 그래서 해시 함수를 사용하여 낭비되는 공간을 줄이는 방식이 해시 테이블이라고 한다.해시테이블의 경우 해시 함수에 따라 성능이 좋고 나쁨이 결정되기 때문에 좋은 해시 함수를 만드는 것이 가장 중요하다. 구현배열을 만들고, 양방향 연결리스트를 배열의 원소로 넣어 하나의 배열에 여러개의 양방향 연결리스트를 가진다. 연관된 자료구조셋 셋(Set)특징중복된 자료를 허용하지 않는다. 구현해시테이블을 이용하여 값을 넣는 add, 값을 제거하는 remove, 맨 뒤의 값을 넣는 addLast, 값을 초기화하는 clear, 저장된 값들을 출력하는 printAll, 셋이 비어있는지 확인하는 isEmpty 메서드를 구현했다. 미션1여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.배열 또는 해시테이블을 선택할 거 같습니다.만약 학생을 나누는 키 값이 연속적인 경우 배열을 선택해도 메모리 낭비 공간이 없겠지만, 만약 키값이 불연속적인 경우 배열로 저장할 경우 낭비되는 공간이 생길 수 있으므로, 해시 함수를 이용하여 낭비되는 메모리 공간을 줄이는 해시테이블을 사용합니다. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.큐 자료구조를 선택할 거 같습니다.큐 자료구조의 특징이 첫번째 들어온 데이터가 가장 첫번째로 나가는 FiFO 방식이기 대문에 들어온 순서대로 처리하기에 적합한 자료구조입니다. 자료 구조 및 알고리즘 인터럽트입출력 장치의 데이터를 읽거나 쓰려고 할 때 기존의 폴링 방식의 단점을 해결하려고 나온 방식이다.기존의 폴링방식은 입출력 장치의 데이터를 지속적으로 확인해야하기 때문에 성능이 좋지 않았고, 인터럽트를 통해 입출력 장치가 CPU에게 신호를 주면 CPU는 그때 처리하는 방식이어서 성능상에 이점이 있다. 인터럽트입출력 장치의 데이터를 읽거나 쓰려고 할 때 기존의 폴링 방식의 단점을 해결하려고 나온 방식이다.기존의 폴링방식은 입출력 장치의 데이터를 지속적으로 확인해야하기 때문에 성능이 좋지 않았고, 인터럽트를 통해 입출력 장치가 CPU에게 신호를 주면 CPU는 그때 처리하는 방식이어서 성능상에 이점이 있다. 프로그램과 프로세스프로그램은 저장장치에 저장된 명령문의 집합체이다. 프로세스는 프로그램이 메모리에 적재되어 실행중인 상태, 즉 실행중인 프로그램을 뜻한다. 멀티프로그래밍과 멀티프로세싱유니프로그래밍은 메모리에 하나의 프로그램이 올라갔으며, 즉 하나의 프로세스가 있다.멀티프로그래밍은 메모리에 여러개의 프로그램이 올라갔으며, 즉 여러개의 프로세스가 있다.멀티프로세싱은 CPU가 여러개의 프로세스를 처리하는 것이다. PCB운영체제가 CPU가 프로세스를 효과적으로 관리하기 위해 PCB를 사용한다.PCB에는 프로세스에 대한 정보가 있어 시분할 시스템에서 CPU를 이용하여 여러개의 프로세스를 관리할 때 사용한다. 프로세스 상태시분할 시스템으로 여러 프로세스를 돌아가며 실행하여, 동시에 실행되는 것 처럼 보인다.생성 : PCB생성 후 메모리에 프로그램 적재 요청준비 : CPU에 의해 사용을 기다리고 있음, CPU 스케줄러에 의해 할당실행 : 준비 상태에 있는 프로세스가 CPU를 할당받아 실행되는 상태대기 : 프로세스가 입출력 요청을 하면 입출력이 완료까지 대기완료 : 프로세스 종료 및 PCB제거컨텍스트 스위칭프로세서를 실행 중에 다른 프로세스를 실행하기 위해 현재 프로세서의 상태 값을 저장하고, 다른 프로세스의 상태 값으로 교체하는 것을 뜻합니다.PCB의 프로세스 상태, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보 등이 변경된다.프로세스 생성과 종료초기 컴퓨터 부팅 후 부모 프로세스가 생성된다.이후 모든 다른 프로세스는 부모 프로세스를 복사하여 생성되며, 이는 프로세스를 새로 생성하는 것보다 성능에 이점이 있다.내부의 코드는 자식 프로세스가 exec() 함수가 실행되면 덮어쓰게된다. 쓰레드하나의 프로세스에 하나 이상의 쓰레드가 존재한다.프로세스가 많아질 수록 PCB, 코드, 데이터, 스택, 힙 영역을 만들어 줘야하기 때문에 메모리를 많이 차지하는 이슈가 있었다. 그리고 브라우저의 탭들은 프로세스마다 통신을 하기 위해 IPC를 이용해야하는데 IPC의 비용이 많은 이슈가 있었다.쓰레드는 이러한 문제를 해소하기 위해 Code, data, heap을 공유하며, stack은 쓰레드마다 하나씩 가지고, IPC 비용을 줄일 수 있었다.쓰레드를 이용하면 IPC 비용을 줄일 수 있고 메모리 공간을 절약할 수 있다. 그러나 하나의 프로세스에 문제가 생기면 프로세스에 있는 쓰레드가 모두 문제가 생기는 단점이 있다. CPU 스케줄링프로세스를 실행하기 위해 CPU 스케줄링은 고려해야할 사항이 2가지 있다.어떤 프로세스에게 CPU를 할당할 것인가.어떤 프로세스에게 얼만큼의 CPU 할당 시간을 줄것인가. 다중큐준비 상태에 있는 프로세스는 실행 상태로 변환된다.준비 상태에 있는 프로세스의 PCB는 준비 상태의 다중 큐에 존재하며 CPU 스케줄러에 의해 실행이 결정된다.대기 상태에 있는 I/O 작업의 프로세스의 PCB가 대기 상태의 다중큐에 존재하며, CPU스케줄러에 의해 실행이 결정된다.스케줄링 목표리소스 사용률오버헤드 최소화공평성처리량대기시간응답시간FIFO스케줄링 큐에 들어온 순서대로 할당하며, 먼저 들어온 프로세스가 종료되어야 다음 프로세스가 실행된다.만약 Burst Time이 오래 걸리는 프로세스의 위치에 따라 평균 대기시간이 크게 차이가 난다.현대에서는 사용되지 않으나, 일괄처리시스템에서 주로 사용된다. 미션2 while(true){ wait(1); // 1초 멈춤 bool isActivated = checkSkillActivated(); // 체크 }위 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?인터럽트 프로그램과 프로세스가 어떻게 다른가요? 프로그램은 저장장치에 저장된 명령문의 집합체입니다.프로세스는 메모리 상에 적재되어 실행중인 프로그램입니다. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요? 멀티프로그래밍은 메모리 관점에서 메모리에 여러개의 프로세스가 존재하는 것을 뜻합니다.멀티프로세싱은 CPU 관점에서 여러개의 프로세스를 처리하는 것을 뜻합니다. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?운영체제는 PCB를 사용하여 프로세서를 관리합니다.예를 들어 시분할 시스템으로 여러개의 프로세스를 번갈아가며 프로세스를 실행해야할 때, CPU에서 특정 프로세스 실행 후 레지스터를 해당 프로세서의 PCB에 저장하고 다른 프로세스의 PCB의 레지스터 정보를 불러와서 실행하는 것을 반복하여 마치 여러개의 프로세스가 동시에 실행되는 것처럼 관리할 수 있습니다. 컨텍스트 스위칭이란 뭔가요?프로세서를 실행 중에 다른 프로세스를 실행하기 위해 현재 프로세서의 상태 값을 저장하고, 다른 프로세스의 상태 값으로 교체하는 것을 뜻합니다. PCB의 프로세스 상태, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보 등이 변경됩니다. 

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

Taeho

인프런 워밍업 클럽 - CS Week 1

그림으로 쉽게 배우는 자료구조와 알고리즘(기본편)자료구조 & 알고리즘자료구조 : 데이터가 어떤 구조로 저장되고, 어떻게 사용되는지를 나타낸다.자료구조에 따라서 결과를 얻기 위한 처리 방법이 달라진다.알고리즘 : 어떤 문제를 해결하기 위한 확실한 방법시간 복잡도특정 알고리즘이 어떤 문제를 해결하는 데 걸리는 시간Bit-Ω : 최선의 시간 복잡도Big-O : 최악의 시간 복잡도가장 많이 사용된다.Big-θ : 평균의 시간 복잡도ADT(Abstract Data Type)데이터의 논리적인 동작을 정의한다.구현 방법을 명시하지 않고, 자료구조의 특성과 연산만을 설명한다.내부 구현 세부사항은 숨기고 인터페이스만을 제공한다.Array배열의 인덱스 참조는 길이에 상관없이 한 번에 가져온다.삽입, 삭제의 성능이 좋지 않다.Linked List배열의 단점인 삽입, 삭제의 성능을 보완하기 위한 자료구조특정 데이터를 찾고 싶다면 노드를 순차적으로 순회해야 한다.저장하려는 데이터들을 메모리에 분산하여 할당하고, 해당 데이터를 서로 연결한다.노드를 사용하여 데이터들을 저장하고, 각 노드가 다음 노드를 가리키도록 한다.첫 노드의 주소만 알고 있으면 그 이후의 모든 노드에 접근할 수 있다.StackLIFO(Last-in First-out)단방향 Linked List를 사용하여 구현할 수 있다.head를 사용하여 스택을 간단하게 구현할 수 있다.데이터 삽입을 무조건 첫 번째 인덱스에 수행한다.QueueFIFO(First-in First-out)양방향 Linked List를 사용하여 구현할 수 있다.Deque데이터의 삽입과 제거를 head와 tail에서 자유롭게 할 수 있는 자료구조Hash TableHash Function해시 함수는 키(key)를 입력받아 해당 키의 저장 위치(버킷 또는 인덱스)를 결정하는 계산을 하는 함수좋은 해시 함수 ⇒ 데이터를 골고루 분배시켜주는 함수 Hash Collision해시 충돌은 해시 함수가 서로 다른 두 개 이상의 입력 값에 대해 동일한 해시 값을 출력하는 상황을 의미Hash 충돌이 발생한 곳의 Value들을 연결리스트로 구성하여 데이터들을 연결한다.기존값과 새로운 값을 동시에 저장할 수 있다.찾고자 하는 Value가 나올 때까지 연결리스트를 탐색한다.→ O(n)의 성능을 갖는다.Set데이터의 중복을 허용하지 않는 자료구조HashTable을 사용하여 구현할 수 있다.→ HashTable을 사용하기 때문에 HashSet이라고도 한다.→ HashTable의 value 값은 사용하지 않고 key만 사용하여 구현한다.(key가 key와 value의 역할을 수행한다.)그림으로 쉽게 배우는 운영체제OS가 하는 일프로세스 관리 : 여러 개의 프로그램들을 동시에 수행할 수 있게 한다.메모리 관리 : 모든 프로그램은 메모리에 올라가서 동작한다.H/W 관리 : 사용자가 직접 H/W에 접근하는 것을 막는다.File System 관리Program저장장치에 저장된 명령문의 집합체저장 장치만 사용하는 수동적인 존재Process실행중인 프로그램저장장치에 저장된 프로그램이 메모리에 올라갔을 대 프로세스라고 한다.메모리, CPU, I/O 작업을 수행하는 능동적인 존재Multi-Programming메모리 관점메모리에 여러개의 프로세스가 올라온 상태Multi-ProcessingCPU 관점CPU가 여러 개의 프로세스를 처리하는 것을 의미PCB(Process Control Block)프로세스가 만들어지면 운영체제는 해당 프로세스의 정보를 갖고 있는 PCB를 만들고 저장한다.PCB들은 연결 리스트로 저장된다.운영체제는 프로세스가 종료되면 연결리스트에서 해당 프로세스의 PCB를 제거한다.Context Switching프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고, 다른 프로세스의 상태값으로 전환하는 작업작업 과정에서 PCB의 내용(프로세스 상태, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보 등)이 변경된다.Process의 생성OS가 부팅되고 0번 프로세스가 생성될 때 딱 한 번만 수행된다.→ 그 이후에 생성되는 프로세스는 fork()를 사용하여 복사해서 사용된다.→ 새로 생성하는 것보다 복사를 하는 것이 더 빠르기 때문좀비 프로세스부모 프로세스가 자식 프로세스보다 먼저 종료되거나 자식 프로세스가 비정상적으로 종료돼 exit()신호를 주지 못해서 Exit Status를 읽지 못해 메모리에 계속 살아있는 상태Thread프로세스 내에 존재하고, 1개 이상이 존재할 수 있다.하나의 프로세스 내에 있는 쓰레드들은 프로세스의 PCB, Code, Data, Heap 영역을 공유한다.Stack은 공유하지 않고, 쓰레드 마다 하나씩 갖고 있다.OS에서 작업을 처리하는 단위이다.Process vs Thread안정성Process는 독립적이기 때문에 서로 영향을 받지 않는다.Thread는 하나의 Process를 공유하기 때문에 하나의 Thread에 이상이 생기면 다른 Thread에도 이상이 전파될 수 있다.⇒ Process가 유리속도와 자원각각의 Process는 서로 고유한 자원을 갖는다.코드, 데이터, 힙, 스택 영역을 전부 따로 두고 있다.Process간에 통신을 하려면 IPC를 사용해야 해서 오버헤드가 크고 속도가 느리다.쓰레드는 하나의 Process의 자원을 스택 영역을 제외한 영역을 모두 공유하기 때문에 오버헤드가 느리다.CPU Scheduling목표목표들을 전부 만족할 수는 없다.→ 목표들에 따라 Trade-Off가 있기 때문ex) 처리량 ↑ ⇒ CPU 오래 할당, 응답시간 ↓ ⇒ 여러 프로세스에 CPU를 골고루 할당⇒ 처리량과 응답시간 사이에 Trade-Off가 발생한다.리소스 사용률CPU 사용률 높이기I/O 디바이스의 사용률 높이기오버헤드의 최소화Context Switching시에 발생하는 오버헤드를 최소화하는 것공평성모든 프로세스에게 우선순위에 따라 공평하게 CPU가 할당되어야 한다.처리량같은 시간내에 더 많은 처리를 할 수 있게 하는 것대기시간작업을 요청하고 실제 작업이 실행되기 전까지 대기하는 시간이 짧은 것응답시간사용자의 요청이 얼마나 빨리 요청하는지Retrospect아쉬운 점커리큘럼을 잘못 봐서 운영체제 쪽은 쉬는 날에 몰아서 들었다.커리큘럼을 명확하게 파악하고 당일에 들을 강의들을 정확히 정리해야겠다.잘한 점매일매일 빠지지 않고 강의를 들은 점매일 들은 강의 내용을 요약/정리하고 그 주차의 내용들을 하나의 게시글로 정리한 것

알고리즘 · 자료구조워밍업클럽CS전공지식Week1

w3w

CS_전공지식_마지막미션

운영체제 1.메모리의 종류는 어떤 것들이 있나요? 각 메모리의 특징도 함께 적어주세요. 레지스터-가장 빠른 기억장소로 cpu내에 존재, 휘발성 메모리, cpu를 구분할 때 32비트, 64비트라고 하는데 이것이 레지스터를 의미, cpu는 계산을 할 때 메인 메모리에 있는 값을 레지스터로 가져와서 계산, 계산 결과는 다시 메인 메모리에 저장캐시-레지스터와 메인 메모리 사이에 존재, 메인 메모리에 있는 값을 레지스터로 옮기려면 한참 걸리기 때문에 필요할 것 같은 데이터를 미리 가져오는데, 미리 가져온 데이터를 저장하는 곳메인메모리-실제 운영체제와 다른 프로세스들이 올라가는 공간, 전환이 공급되지 않으면 데이터가 지워지기 때문에 휘발성 메모리보조 저장장치( ssd, 하드디스크)-가격이 저렴하고 전원이 공급되지 않아도 데이터가 지어지지 않는 비휘발성 메모리 2.사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요? 경계 레지스터입니다. 3.메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요? -가변 분할 방식장점: 메모리의 연속된 공간에 할당되기 때문에 더 크게 할당돼서 낭비되는 공간인 내부단편화가 없다.단점: 외부단편화가 발생한다. -고정 분할 방식장점: 구현이 간단하고 오버헤드가 적다.단점: 내부단편화가 발생한다. 4.CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요? 스레싱입니다. 5.HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.hdd는 속도가 느리고 hdd를 넣을 큰 공간이 필요하다는 단점이 있지만, 계속해서 저장되어 있어야 하는 데이터들이 있기 때문에 컴퓨터를 실행시키는데 꼭 필요하다고 생각합니다. ssd는 데이터를 덮어 쓸 수가 없고, 똑같은 자리에 데이터를 써야 한다면 데이터를 지워야 하는 횟수가 정해져 있다는 단점이 있지만, hdd처럼 큰 공간이 필요하지 않고, 자석을 갖다대도 훼손되지 않으며, 속도가 빠르다는 장점이 있어 컴퓨터를 실행시키는데 꼭 필요하다고 생각합니다. 다 각자의 장단점이 있기에 둘다 사용해서 장단점을 보완하면 더 좋은 성능의 컴퓨터를 만들 수 있다고 생각합니다. 6.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요? 파일시스템은 효율적으로 관리하기 위해 빈 공간을 모아둔 free block list를 가지고 있습니다. 특정 파일을 삭제한다면 파일 시스템은 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 지우고 free block list에 추가합니다. 이렇게 처리하면 사용자는 파일이 삭제된 것처럼 느껴지는데, 사용했던 데이터는 남아있기 때문에 포렌식으로 파일을 복구할 수 있습니다. 자료구조와 알고리즘 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.- 버블정렬장점: 이해와 구현이 간단단점: 성능이 좋지 않음시간 복잡도: O(n^2)-선택정렬장점: 버블정렬과 마찬가지로 이해와 구현이 간단단점: 버블정렬과 마찬가지로 성능이 좋지 않음시간 복잡도: O(n^2)-삽입정렬장점: 버블정렬, 선택정렬과 마찬가지로 이해와 구현이 간단단점: 버블, 선택정렬과 마찬가지로 성능이 좋지 않음시간 복잡도: O(n^2)-병합정렬장점: 성능이 좋음단점: 이해와 구현이 어려움시간 복잡도: O(nlogn)-퀵정렬장점: 병합정렬과 동일단점: 병합정렬과 동일시간 복잡도: 평균적으로 세타(nlogn), 최악의 경우 O(n^2)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요. 메모이제이션은 재귀를 통해 문제를 하향식으로 해결합니다. 재귀만 이용한다면 성능에 문제가 발생하는데 이를 계산 결과를 저장하는 것으로 보완했습니다. 메모이제이션은 많은 메모리를 사용하여 성능을 향상시킵니다. 따라서 재귀가 직관적일 때는 메모이제이션을 사용합니다. 재귀가 직관적이지 않을 땐 상향식 조건인 타뷸레이션을 이용해 메모리도 절약하고 속도도 빠르게 해결할 수 있습니다. 메모리가 부족한 시스템이지만 재귀로 쉽게 구현이 가능할 것 같으므로 메모이제이션을 사용하는 것이 좋을 것 같다고 생각합니다.

알고리즘 · 자료구조

w3w 25일 전
이선주

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

운영체제 Q. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.CPU 레지스터: CPU에서 임의에 변수를 담는 장소로 주기억장치에 데이터를 가져와 레지스터에 저장한다.CPU 캐시(L1, L2, ~): 주기억장치에서 데이터를 가져와 레지스터에 담을 때, 지역성이론에 따라 자주 사용되는 데이터를 캐시에 저장한다.주기억장치(RAM): 주기억장치라고 불리우는 RAM은 어떠한 주소로 데이터를 가져와도 동일한 성능으로 데이터를 가져올 수 있다. 프로세스와 운영체제가 주기억장치에 올라와 실행되는 공간이다. RAM의 또다른 특성은 전원이 공급되지 않으면 데이터가 지워지는 휘발성 메모리이다.보조기억장치: 휘발성 메모리인 RAM은 데이터를 저장하기 보다는 실행되는 데이터를 저장하는데 유용하다. 때문에 작업중인 파일이나 프로그램의 데이터를 보조기억장치에 저장하여 필요할 때 RAM에 올려 사용한다. Q. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터: MMU가 경계 레지스터에 침범하려고 하는 프로세스를 강제 종료시킨다. Q. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식(세그멘테이션): 세그멘테이션은 프로세스의 크기에 맞게 적절한 메모리 크기를 할당하여 불필요한 내부 단편화로 낭비되는 메모리 영역이 없다. 또한, 프로세스 크기에 맞는 메모리 영역을 할당하기 때문에 프로세스 영역별로 권한 등의 관리가 쉽다. 단, 외부 단편화 문제가 있는데, 예를 들어, 프로세스 A가 종료되어 메모리 영역에 구멍이 생길 경우, 새롭게 실행될 프로세스 B가 프로세스 A보다 큰 메모리를 요구한다면 구멍난 메모리 영역에 할당할 수 없게 된다. 이를 외부 단편화 문제라고 부르며 외부 단편화 문제를 해결하기 위해서는 메모리 조각 모음을 실행해야 한다. 하지만, 메모리 조각 모음은 실행중인 프로세스들을 종료하고 구멍난 메모리 영역을 매꿔야하기 때문에 오버헤드가 발생한다.고정 분할 방식(페이징): 페이징은 세그멘테이션과 다르게 고정된 메모리 크기를 분할하여 프로세스들에게 할당하는 방식이다. 때문에 고정된 크기보다 작은 프로세스를 실행하려 한다면 메모리 낭비가 발생하게 되는데 이를 내부 단편화라 부른다. 하지만, 항상 고정된 크기의 메모리를 분할하여 프로세스에게 할당하여 세그멘테이션의 외부 단편화 문제가 없다. Q. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?정답: 스레싱, 이를 해결하기 위해 지역성이론에 따라 다시 현재 사용중인 페이지들은 다시 사용될 확률이 높다. 이러한 페이지를 하나로 묶어 메모리에 올리는데 이를 워킹셋이라고 부른다. Q. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? (이유를 함께 적어주세요.)HDD나 SSD와 같은 보조기억장치가 필요한 이유는 다음과 같다.CPU 레지스터나 캐시, 주기억장치는 휘발성 메모리이다. 때문에 작업했던 문서나 프로그램의 데이터 등 유지시킬 필요가 있는 상태들은 전원 공급 없이도 보조기억장치를 통해 상태를 저장해야 한다.또한, 메모리는 가격이 매우 비싸기 때문에, 메모리보다 저렴한 보조기억장치에 문서나 데이터를 저장하고 프로그램이 실행될 때 프로세스로 메모리에 올리는 방식이 효율적이다.보조기억장치에는 운영체제 프로그램을 담고 있다. 컴퓨터가 실행하면 보조기억장치에 있는 운영체제를 메모리에 올려 프로세스로 실행하게 된다.Q. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?이는 파일을 삭제할 때 파일의 헤더만 삭제하기 때문이다. 때문에 사용했던 블록의 데이터는 그대로 남아있어 포렌식을 통해 데이터를 복구할 수 있게 된다.파일을 삭제할 때 헤더만을 삭제하여 Free Block List에 추가한다. 그리고 해당 블록은 "사용 가능" 상태로 두어, 새로운 파일을 작성할 때 해당 영역에 덮어쓰기하게 된다. 이러한 방식을 통해 모든 파일을 지울 때 발생하는 디스크 입출력에 대한 부담을 줄여주어 성능을 끌어올리고, 데이터 복구 가능성 또한 열어두는 것이다.  자료구조와 알고리즘 Q. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블정렬: 현재 요소와 다음 요소를 비교하며 정렬하는 알고리즘으로 구현이 쉽지만 중첩 for 문을 사용하기 때문에 성능이 좋지 않다. 단, 정렬하려는 요소의 다음 요소를 비교하기 떄문에 안정적인 정렬 알고리즘이다. | O(n^2) |선택정렬: 정렬된 영역과 정렬되지 않은 영역을 나누어, 정렬되지 않은 영역에서 가장 작은 (또는 가장 큰) 값을 선택해 정렬한다. 구현이 쉽지만 버블정렬과 마찬가지로 중첩 for 문을 사용하기 때문에 성능이 좋지 않다. 단, 버블 정렬보다 교환 횟수가 상대적으로 적은데 이는 큰 배열에서 선택 정렬이 상대적으로 빠르다. | O(n^2) |삽입정렬: 정렬되지 않은 영역의 요소를 정렬된 영역의 적절한 위치에 삽입하는 알고리즘으로 구현이 쉽다는 장점이 있지만 중첩 for 문을 사용하기 때문에 성능이 좋지 않다. | O(n^2) |병합정렬: 정렬할 배열을 반으로 나누는데 더 이상 나눌 수 없을 때까지 반으로 나눈 후, 다시 역순으로 비교하며 병합하는 알고리즘이다. 재귀적으로 해결하기 때문에 이해 및 구현이 어렵다. 또한, 배열을 반으로 나누는 방식으로 비교적 많은 메모리 공간을 사용한다. 단, 버블/선택/삽입 정렬보다 빠른 성능을 가진다는 장점이있다. | O(nlogn) |퀵정렬: '피벗'이라는 배열의 기준이 되는 요소를 선택한 후 재귀적 호출을 통해 정렬하는 알고리즘이다. 퀵정렬은 어떤 피벗을 선택하느냐에 따라 최악의 성능인 O(n^2)이 나올 수 있다. 하지만, 매번 최악의 피벗 선택을 하는 것은 극히 낮으며, 병합정렬보다 메모리 공간을 덜 사용하기 때문에 병합정렬보다 퀵정렬이 더 좋은 평가를 받는다. | O(nlogn) | Q. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.재귀적으로 호출하는 상황에서 메모리 부족 문제를 해결하기 위해서는, 이미 해결한 문제를 저장하여 불필요한 연산과 콜스택 낭비를 해결할 수 있다. 이를 메모이제이션이라고 부른다. 메모이제이션으로 메모리 부족 문제를 해결하는 방식은 값을 저장할 해시 테이블을 두고 재귀적으로 해결할 문제를 해시 테이블의 키 값으로 저장한다. 이후 같은 문제가 재귀적으로 호출 될 때 해시 테이블을 조회하여, 이미 해결된 문제라면 해당 키에 해당하는 값을 이용하여 메모리 낭비를 해결할 수 있다. 이러한 방식에서 해시 테이블을 이용하는 이유는, 해시 테이블의 특성상 키를 이용한 조회가 O(1) 시간으로 빠르게 값을 찾을 수 있기 때문이다.

알고리즘 · 자료구조

elly

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

운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.: 레지스터 - 가장 빠른 기억장소로 CPU 내에 존재하고 있고, 휘발성 메모리입니다캐시 - 레지스터는 CPU가 사용하는 메모리로 빠른데, 그에 비해 메인메모리는 너무 느린편이라 메인메모리에 있는 데이터를 레지스터에 옮기려면 한참 걸리기 때문에 필요할 것 같은 데이터를 미리 가져와서 캐시에 저장합니다. 캐시는 휘발성 메모리입니다.메인 메모리 - 실제 운영체제와 다른 프로세스들이 올라가는 공간으로 휘발성 메모리입니다.보조저장장치 - 프로그램 파일들을 저장하고, 비휘발성 메모리입니다.사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?: 경계 레지스터 입니다.메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?: 가변 분할 방식 장점 - 메모리에 연속된 공간에 할당되기 때문에 더 크게 할당되서 낭비되는 공간인 ‘내부 단편화’가 없습니다. 단점 - ‘외부 단편화’ 발생합니다.고정 분할 방식 장점 - 구현이 간단하고, 오버헤드가 적습니다. 단점 - 작은 프로세스도 큰 영역에 할당되서 공간이 낭비되는 ‘내부 단편화’가 발생합니다.CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?: 스레싱입니다. 근본적인 원인은 물리메모리의 크기가 부족한 것으로, 하드웨어적으로 해결하려면 메모리 크기를 늘리면 됩니다. 운영체제면으로 해결하게 하려면 프로세스가 실행되는 동안 해당 프로세스에게 맞는 적절한 페이지 수를 결정함으로써 해결합니다.HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.: 일반적으로 꼭 필요합니다. 왜냐하면 컴퓨터 부팅을 위해 운영체제 실행을 해야하고, 파일 접근이나 프로그램 실행을 위해 필요하기 때문입니다.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?: 파일이 삭제될 때 실제 데이터가 완전히 제거되지 않고, 파일 시스템의 관리 정보만 업데이트되기 때문입니다.만약 특정 파일 삭제 시, 파일시스템은 파일의 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 삭제하고 free block list에 추가하는 방법으로 처리하기 때문에 포렌식으로 파일 복구가 가능합니다.  자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.: 버블정렬 장점 - 이해와 구현이 간단함 / 단점 - 성능이 O(n^2)으로 좋지 않음 / 성능 - O(n^2)선택정렬 장점 - 이해와 구현이 간단함 / 단점 - 성능이 O(n^2)으로 좋지 않음 / 성능 - O(n^2)삽입정렬 장점 - 이해와 구현이 간단함 / 단점 - 성능이 O(n^2)으로 좋지 않음 / 성능 - O(n^2)병합정렬 장점 - 성능이 O(nlogn)으로 좋음 / 단점 - 이해와 구현이 어려움 / 성능 - O(nlogn)퀵정렬 장점 - 성능이 O(nlogn)으로 좋음 / 단점 - 이해와 구현이 어려움 / 성능 - O(nlogn) (피벗이 한쪽에 쏠리면 최악의 경우 O(n^2)이긴 함)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.: 메모리가 부족한 시스템에서 문제를 해결할 때는 타뷸레이션을 선택하는 것이 더 좋을 것 같습니다.그 이유는 타뷸레이션은 메모이제이션에 비해 적은 메모리를 사용함에도 불구하고 빠른 시간을 보이기 때문입니다.  회고아직 내용을 완벽하게 이해하지 못하여 이번주 강의를 다시한번 복습할 예정인데, 그래도 미션을 통해 한번 더 살펴보면서 들었던 내용들을 머릿속에 떠올려볼 수 있어서 좋았습니다.또한 메모리 부족 시스템에서의 메모이제이션, 타뷸레이션과 선택과 같이, 현재 가지고 있는 환경에 따라 로직을 어떻게 만들지에 대한 고민이 실제 무엇인가 개발할 때도 중요하다는 생각이 들었습니다.📝⭐️

알고리즘 · 자료구조알고리즘자료구조운영체제

helloyl

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

운영체제메모리의 종류는 어떤 것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터가장 빠른 저장 장소, 휘발성 메모리캐시메인 메모리에서 미리 가져온 데이터를 저장메인 메모리휘발성 메모리, 실행 중 프로그램을 올림보조저장장치비휘발성 메모리사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식장점 : 내부 단편화 없음단점 : 외부 단편화 발생고정 분할 방식장점 : 구현이 간단함, 오버헤드가 적음단점 : 내부 단편화 발생CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.필요함, 컴퓨터를 실행시킬 때 필요한 파일들이 저장되어있음파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일 시스템이 파일의 모든 정보가 아닌 파일 테이블의 헤더를 삭제하고 Free Block List에 추가함사용했던 블록의 데이터는 그대로 남아있음자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬장점 : 이해와 구현이 간단단점 : 성능 좋지 않음시간 복잡도 : O(n^2)선택 정렬장점 : 이해와 구현이 간단단점 : 성능 좋지 않음시간 복잡도 : O(n^2)삽입 정렬장점 : 이해와 구현이 간단단점 : 성능 좋지 않음시간 복잡도 : O(n^2)병합 정렬장점 : 성능 좋음단점 : 이해와 구현이 어려움시간 복잡도 : O(nlogn)퀵 정렬장점 : 성능 좋음단점 : 이해와 구현이 어려움시간 복잡도 : Θ(nlogn) ~ O(n^2)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션적은 메모리 사용임에도 성능이 좋음

알고리즘 · 자료구조

또니

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

[운영체제]메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요. => CPU에 존재하고 휘발성 메모리인 레지스터, 메인 메모리에 있는 값을 레지스터로 옮기는 시간을 줄이기 위해 데이터를 가져와 저장하는 캐시, 실제 운영체제와 프로세스가 올라가는 휘발성 메모리인 메모리, 비휘발성이며 작업된 데이터를 저장하는 보조 저장장치가 있습니다.사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?=> 경계 레지스터 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?=> 가변분할 방식은 프로세스 크기에 따라 메모리를 할당하기 때문에 내부 단편화가 일어나지 않지만 외부 단편화가 발생합니다. 고정분할 방식은 외부 단편화를 해결하고, 메모리 관리를 효율적으로 하지만 내부 단편화가 일어나는 단점이 있습니다.CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?=> 스레싱 HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.=> 컴퓨터를 활성화 시키기 위해선 CPU를 동작시켜야하는데 이때 운영체제가 필요하다. 이때 운영체제가 저장되어야하는데, RAM과 같은 메모리는 휘발성이므로 저장을 할 수 없지만 HDD나 SSD는 비휘발성으로 운영체제를 저장하여 사용하기 때문에 필요하다.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?=> 파일을 삭제하면 모든 정보를 지우는 것 보다 헤더를 삭제하고 free block list에 추가한다. 이때 사용했던 데이터 블록이 그대로 저장되어 있어 복구할 수 있다.[자료구조와 알고리즘]1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬장점: 가장 단순하고 이해가 쉽다.단점: 성능이 좋지 않다.시간 복잡도: O(n^2)선택 정렬장점: 이해와 구현이 간단하다.단점: 성능이 좋지 않다.시간 복잡도: O(n^2)삽입 정렬장점: 이해와 구현이 간단하다.단점: 성능이 좋지 않다.시간 복잡도: O(n^2)병합 정렬장점: 버블, 선택, 삽입 정렬보다 성능이 좋다.단점: 이해하기 어렵고, 구현하기 어렵다.시간 복잡도: O(n log n)퀵 정렬장점: 적은 메모리 공간을 사용해 성능이 좋다.단점: 이해하기 어렵고, 구현하기 어렵다. 시간복잡도: O(n log n)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.=> 메모이제이션은 재귀를 사용기 때문에 메모리 비용이 크지만, 타뷸레이션은 반복문을 사용하기 때문에 메모리의 크기를 예측 할 수 있습니다. 때문에 타뷸레이션을 사용할 것 같습니다.알고리즘 강의 링크 👉그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)운영체제 강의 링크 👉그림으로 쉽게 배우는 운영체제

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

tenenger

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

자료 구조 및 알고리즘 삽입 정렬배열을 정렬된 부분, 정렬되지 않은 부분 총 두 영역으로 나누어, 정렬되지 않은 부분에서 데이터를 하나씩 꺼내어 정렬된 부분에 삽입하는 정렬 알고리즘이다.시간 복잡도는 O(n²)이다.function insertionSort (arr) { for (let i=1; i<arr.length; i++) { const memoried = arr[i]; let j; for (j=i-1; j>=0; j--) { if (arr[j] > memoried) arr[j+1] = arr[j]; else break; } arr[j+1] = memoried; } return arr; } console.log(insertionSort([4,1,3,5])) // [1,3,4,5] 병합 정렬병합 정렬은 분할 정복을 이용하여 재귀적으로 정렬하는 알고리즘이며, 배열을 반으로 분할하고 다시 병합한다.분할은 log n, 병합할 때 비교는 n이 걸리므로, 시간 복잡도는 O(n log n)이다.function mergeSort(arr) { if (arr.length <= 1) return arr; const mid = Math.floor(arr.length / 2); const leftArr = mergeSort(arr.slice(0, mid)); const rightArr = mergeSort(arr.slice(mid)); const sorted = []; let left = 0; let right = 0; while (left < leftArr.length && right < rightArr.length) { if (leftArr[left] < rightArr[right]) { sorted.push(leftArr[left]); left++; } else { sorted.push(rightArr[right]); right++; } } while (left < leftArr.length) { sorted.push(leftArr[left]); left++; } while (right < rightArr.length) { sorted.push(rightArr[right]); right++; } return sorted; } console.log(mergeSort([3,5,2,4,1,7,8,6])) 퀵 정렬병합 정렬은 분할 정복을 이용하여 재귀적으로 정렬하는 알고리즘이며, 배열에서 하나의 숫자를 '피벗'으로 선택한 뒤 작은 값은 왼쪽, 큰 값은 오른쪽으로 분할 다시 병합한다.시간복잡도의 평균은 O(n log n)이지만, 피벗에 따라 O(n²) 일 수도 있다.퀵 정렬은 병합 정렬보다 더 적은 메모리와 비교하는 횟수가 더 적어서 효율적인 경우가 있다.function quickSort (arr, left = 0, right = arr.length - 1) { if (left < right) { const pivotIndex = partition(arr, left, right); quickSort(arr, left, pivotIndex - 1); quickSort(arr, pivotIndex + 1, right); } return arr; } function partition (arr, left, right) { const pivot = arr[left]; let low = left + 1; let high = right; while (low <= high) { while (low <= high && arr[low] < pivot) { low++ } while (low <= high && pivot < arr[high]) { high--; } if (low < high) { [arr[low], arr[high]] = [arr[high], arr[low]]; } } [arr[left], arr[high]] = [arr[high], arr[left]]; return high; } console.log(quickSort([3,5,2,4,1,7,8,6])) // [ 1, 2, 3, 4, 5, 6, 7, 8 ] 동적 프로그래밍 - 메모이제이션재귀 함수는 중복된 계산을 여러 번 수행하여 성능이 좋지 않다.메모이제이션은 계산된 값을 저장하고 이를 다시 사용하여 성능을 높일 수 있다.function fibonacci(n ,memo = {}) { if (n <= 1) return n; if (!memo[n]) { memo[n] = fibonacci(n - 2, memo) + fibonacci(n - 1, memo) } return memo[n] } console.log(fibonacci(5)) 동적 프로그래밍 - 타뷸레이션타뷸레이션은 상향식 접근 방식으로, 필요하지 않는 결과값도 계산하여 재귀를 사용하지 않기 때문에 메모제이션보다 더 빠를 수 있다.특히 재귀적이지 않기 때문에 메모리를 절약할 수 있다.function fibonacciTabulation(n) { const table = [0, 1] for (let i=2; i<=n; i++) { table[n] = fibonacciTabulation(n - 2) + fibonacciTabulation(n - 1) } return table[n] } console.log(fibonacciTabulation(5)) 미션1지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬장점: 구현이 간단하고, 이미 정렬된 경우 시간 복잡도가 O(n)이다.단점: 평균 및 최악의 경우 시간 복잡도가 O(n²)이다.시간 복잡도:최선: O(n)평균: O(n²)최악: O(n²)선택 정렬장점: 구현이 간단하다.단점: 항상 시간 복잡도가 O(n²)이다.시간 복잡도:최선: O(n²)평균: O(n²)최악: O(n²)삽입 정렬장점: 작은 데이터 집합에 대해 빠르게 동작하며, 안정적인 정렬 알고리즘이다.단점: 평균 및 최악의 경우 시간 복잡도가 O(n²)이다.시간 복잡도:최선: O(n)평균: O(n²)최악: O(n²)병합 정렬장점: 분할 병합 방식으로 시간 복잡도가 O(n log n)이다.단점: 추가적인 메모리 공간이 필요하여, 공간 복잡도가 O(n)이다.시간 복잡도:최선: O(n log n)평균: O(n log n)최악: O(n log n)퀵 정렬장점: 분할 병합 방식으로 O(n log n)의 시간 복잡도를 가지고, 메모리 사용이 효율적이다.단점: 최악의 경우 O(n²)이다.시간 복잡도:최선: O(n log n)평균: O(n log n)최악: O(n²)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션을 선택할거 같습니다.메모이제이션의 경우 재귀적으로 함수를 호출하기 때문에 함수를 생성하면 메모리를 차지하고, 함수가 종료되기 전까지 점유합니다. 반면에 타뷸레이션의 경우 재귀적으로 함수를 호출하지 않기 때문에 하나의 함수에 해당되는 메모리만 차지하기 때문에 메모리가 부족한 시스템에 더 적합합니다. 운영체제 및 CS 가상메모리물리메모리의 크기보다 프로세스가 요구하는 메모리 크기가 클 경우에 보조저장장치의 스왑 영역을 활용하여 메모리의 크기를 늘리는데, 물리메모리 + 스왑영역을 합쳐서 가상메모리라고 부른다.만약 CPU의 비트가 32bit인 경우, 가상메모리의 크기는 4GB까지 가능하다. 메모리 관리자는 프로세스가 메모리의 논리주소를 요구할 경우 물리 메모리의 물리주소를 전달해주는데, 이를 동적 주소 변환이라고 한다.메모리 관리자가 매핑 테이블을 이용하여 논리주소를 물리주소로 변환할 수 있다. 세그먼테이션(배치 정책)프로세스에 메모리를 할당해주는 배치 정책 중 가변적으로 메모리를 할당해준다고 해서 세그먼테이션이라고 한다. 메모리 관리자는 논리주소를 세그먼테이션 테이블에서 물리주소로 변환할 수 있는 정보를 가지고 물리주소로 변환한다.세그먼테이션 테이블에는 세그먼트 번호, Base Address, Bound Address 가 있다. 논리주소를 물리주소로 변환하는 과정프로세스가 논리주소를 요청할 때, 메모리관리자는 세그먼트 번호를 찾아낸다.메모리 관리자는 Segment Table Base Register를 이용해 물리메모리에 있는 세그먼테이션 테이블을 찾는다.세그먼테이션 테이블에서 세그먼테이션 번호와 일치되는 행의 정보를 얻는다.Bound Address보다 논리주소가 클 경우 메모리 침범 인터럽트를 발생시켜 프로그램을 종료시키고, 크지 않을 경우 Base Address + 논리 주소를 합쳐 물리주소를 변환하여 프로세스에게 전달한다. 세그멘테이션은 메모리를 가변적으로 분할 할 수 있고, 코드영역, 힙영역, 데이터영역, 스택 영역 등을 모듈로 관리할 수 있어 메모리 접근 보호가 편리한 장점이 있다.반면, 외부 단편화가 발생하기 때문에 분할되어 있는 메모리의 공간보다 큰 메모리를 요구하는 프로세스가 있는 경우, 메모리 공간을 합쳐여하는 오버헤드가 발생하는 단점이 있다. 페이징(배치 정책)프로세스에 메모리를 할당해주는 배치 정책 중 고정적으로 메모리를 할당해준다고 해서 페이징이라고 한다. 논리 주소 공간에서 페이징은 페이지라고 불리고, 물리 주소 공간에서 페이징은 프레임이라고 불린다. 메모리 관리자는 논리주소를 페이지 테이블에서 물리주소로 변환할 수 있는 정보를 가지고 물리주소로 변환한다.페이지 테이블에는 인덱스, 프레임이 있다. 논리주소를 물리주소로 변환하는 과정프로세스가 논리주소를 요청할 때, 메모리관리자는 인덱스와 오프셋을 구한다.인덱스는 (논리주소 / 페이지 크기)의 몫오프셋은 (논리주소 / 페이지 크기)의 나머지메모리 관리자는 Page Table Base Register를 이용해 물리메모리에 있는 페이지 테이블을 찾는다.세그먼테이션 테이블에서 세그먼테이션 번호와 일치되는 행의 정보를 얻어 프레임을 얻는다.프레임의 물리주소과 오프셋을 합산하여 실제 물리주소를 계산하여 프로세스에게 물리주소를 전달한다. 페이징은 메모리를 세그먼테이션보다 쉽게 구현할 수 있는 장점이 있다.반면, 내부단편화가 발생하기 때문에 낭비되는 메모리 공간이 발생하고, 코드영역, 힙영역, 데이터영역, 스택 영역 등을 메모리에 할당해야하기 때문에 논리적으로 분할 할 수 없고, 메모리 접근 보호가 어려우며, 프로세스가 많아지면 페이지 테이블이 많아지고 메모리 공간을 차지 하기 때문에 사용자 메모리 공간이 줄어드는 단점이 있다. 페이지드 세그멘테이션(배치 정책)세그멘테이션과 페이지의 혼합한 배치정책이다. 메모리 관리자는 논리주소를 페이지드 세그멘테이션 테이블에서 물리주소로 변환할 수 있는 정보를 가지고 물리주소로 변환한다.페이지드 세그멘테이션은 2개의 테이블을 가지는데, 세그멘테이션 테이블과 페이지 테이블이다.세그멘테이션 테이블은 세그먼트번호, 권한비트, 페이지넘버, Bound Address를 가진다.페이지 테이블은 인덱스, 프레임을 가진다. 메모리 접근권한은 읽기, 쓰기, 실행 권한이 있다.프로세스의 영역별 권한은 아래와 같다.코드 영역: 읽기와 실행 가능, 수정 불가데이터 영역: 읽기와 쓰기 가능, 실행 불가능스택 & 힙 영역: 읽기와 쓰기 가능, 실행 불가능 페이지드 세그멘테이션에서 논리주소를 물리주소로 변환할 때 권한도 확인한다. 논리주소를 물리주소로 변환하는 과정프로세스가 논리주소를 요청할 때, 메모리관리자는 세그멘테이션 번호를 찾아낸다.세그먼테이션 테이블에서 세그먼테이션 번호와 일치되는 행의 정보를 얻어 권한이 위반하면 인터럽트를 발생시켜 프로그램을 종료시키고, 위반하지 않으면 페이지넘버와 페이지 개수를 얻는다.페이지 테이블에서 접근한 페이지 넘버와 일치되는 행의 프레임을 얻는다.프레임과 페이지 개수를 합산한 물리 주소를 프로세스에 전달한다. 테이블을 확인하기 위해 메모리에 2번 접근해야하는 단점이 있어 현대에서는 페이징과 페이지드 세그멘테이션을 적절하게 사용하고 있다. 디멘드 페이징(가져오기 정책)메모리에 사용할것 같은 프로세스를 메모리에 올리고, 그렇지 않은 프로세스는 스왑영역에 위치시켜 메모리를 효율적으로 사용하는 정책이다. 지역성 이론시간적 지역성: 최근에 접근한 데이터는 다시 접근할 가능성이 높다.공간적 지역성: 현재 접근한 데이터와 가까운 위치에 있는 데이터가 곧 접근될 가능성이 높다. 스왑영역에서 메모리로 가져오는 것을 스왑인, 반대로 메모리에서 스왑영역으로 내보내는 것을 스왑아웃이라고 한다. 페이지 테이블의 한 행을 페이지 엔트리(PTE)라고 불리고, 여러 비트를 통해 물리메모리의 프레임 또는 스왑영역의 위치를 알 수 있다.접근 비트: 페이지가 메모리에 올라온 후 접근 유무변경 비트: 페이지 데이터의 변경 유무유효 비트: 페이지가 물리 메모리에 있는지 스왑 영역에 있는지 유무(1은 스왑영역에 있다는 뜻)읽기/쓰기/실행 비트: 페이지에 대한 접근 권한 Page Fault프로세스가 가상주소를 요청하고 메모리 관리자가 페이지 테이블을 통해 프레임이 물리 메모리에 없으면 Page Fault 인터럽트가 발생한다.그리고 프로세스는 대기 상태에 들어가고, 메모리 관리자는 스왑인을 통해 물리 메모리에 프레임을 옮기고 다시 재시작된다. 페이지 교체 정책메모리 공간이 부족할 때 어떤 페이지를 스왑 영역으로 보낼지 결정하는 중요한 알고리즘이다. 주요 페이지 교체 정책1. Random- 페이지를 랜덤으로 교체한다.- 지역성 이론을 고려하지 않고 자주 사용되는 페이지도 보낼 수 있기 때문에 거의 사용되지 않는다.2. FIFO(First In First Out)- 가장 먼저 메모리에 들어온 페이지 교체한다.- 구현이 간단하지만 자주 사용되는 페이지도 교체될 수 있다.3. Optimum- 앞으로 오랫동안 사용되지 않을 페이지 교체한다.- 이상적인 알고리즘이나 구현하기 어렵다.4. LRU(Least Recently Used)- 가장 최근에 사용되지 않은 페이지 교체한다.- 최근 사용된 페이지가 다시 사용될 확률이 높다는 가정에 따라 동작한다.LRU를 유사하게 구현하기 위한 알고리즘1. Clock Algorithm페이지 테이블의 접근 비트를 사용하여, 일정 시간 동안 참조된 페이지인지 아닌지 확인한다.클락 핸드가 시계 방향으로 움직이며, 접근 비트가 0인 페이지를 교체한다.Enhanced Clock Algorithm은 변경 비트까지 고려한다.2. Second Chance AlgorithmFIFO 방식의 문제점을 보완하여 맨 처음 페이지가 최근에 사용된 경우 큐의 맨 뒤로 이동시켜 수명 연장한다.스레싱과 워킹셋스레싱은 CPU 사용률이 떨어지는 현상이다.Page Falut가 발생하면 CPU 사용하는 것보다 스왑인, 스왑아웃 동작하는데 자원을 소모하여 CPU 사용률이 떨어지고, 그렇다고 메모리에 페이지를 많이 올리게 되면 프로세스가 사용해야할 페이지가 줄어들어 CPU 사용률이 떨어진다. 워킹셋(Working Set)현재 메모리에 올라와 있는 페이지는 자주 사용할 확률이 높기 때문에 하나의 세트로 묶는데 이를 워킹셋이라고 한다.프로세스가 준비상태에서 컨텍스트 스위칭을 통해 실행상태로 변경할 때 사용한다.주변장치(I/O, 디바이스, 저장장치)그래픽카드, 마우스, 키보드, 하드디스크 등을 주변장치라고 한다. 주변장치는 메인보드의 버스를 통해 연결되고, Address 버스, data 버스, control 버스가 있다.주변장치의 레지스터는 입출력 데이터를 저장하는 역할을 한다. 주변장치는 캐릭터 디바이스, 블록 디바이스로 나뉜다.캐릭터 디바이스는 적은 양의 데이터(문자)를 전송하는 장치로, 마우스나 키보드가 있다.블록 디바이스는 많은 양의 데이터를 전송하는 장치로, 하드디스크가 있다.초기에는 CPU가 I/O 요청을 대기해야해서 CPU 사용률이 떨어졌고, 이를 해결하기 위해 입출력 제어기가 도입되어 I/O 작업을 CPU 대신 관리한다.입출력 제어기는 CPU와 메모리를 연결하는 시스템 버스, 주변장치를 연결하는 입출력 버스로 구성되어 있다.그래픽카드는 빠른 속도를 위해 시스템 버스에 연결한다.입출력 버스는 고속과 저속으로 나뉘는데, 고속은 하드디스크과 연결하고 저속은 마우스, 키보드와 연결한다.입출력 데이터를 저장하기 위해서 CPU 도움이 필요한데, DMA 를 통해 CPU 도움없이 주변장치가 메모리에 접근가능하다.CPU로 접근하는 메모리와 DMA로 접근하는 메모리는 다른데, DMA로 접근하는 메모리는 Memory Mapped I/O 라고 한다.마우스, 키보드볼 마우스는 잔 고장이 많았다.광학 마우스는 마우스 아래에 달린 카메라를 통해 1500회 이상을 사진으로 촬영해 마우스 좌표값을 얻는다.마우스 이벤트 전달마우스의 디바이스 컨트롤러의 DSP를 통해 좌표값을 얻는다.마우스 드라이버가 DSP에서 좌표값을 가져간다.마우스 드라이버가 CPU에 인터럽트를 보내고, 좌표 데이터 또는 클릭 이벤트를 전달해준다.운영체제가 Foreground로 프로세스에게 이벤트를 전달해준다.키보드도 마우스와 유사하게 사용자가 입력한 키를 디바이스 컨트롤러가 감지해 CPU로 인터럽트를 보내고, 운영체제가 Foreground로 프로세스에게 이벤트를 전달해준다. 하드디스크하드디스크는 Spindle이 있고, 여러개의 Platter가 있다.Platter는 disk arm에 달린 read/write head를 통해 읽고 쓰며, 자성을 띄기 때문에 N극은 0 S극은 1이다.여러개의 Platter에 track이 같은 위치에 있는 것을 Cylinder라고 한다.Sector는 하드디스크의 가장 작은 단위이다.하드디스크는 헤드를 통해 읽고, 데이터를 읽는 시간을 Seek Time이라고 한다.헤드를 통해 데이터를 찾기 때문에 찾는 시간이 오래걸린다. SSD는 HDD와 달리 물리적으로 데이터를 읽는 것이 아니라 전기적으로 읽고 쓰기 때문에 빠르고, 조용하다. 파일과 파일시스템파일은 사용자가 운영체제에 관리를 요청하면, 운영체제는 파일시스템을 통해 파일을 관리한다. 파일 시스템은 아래의 기능을 제공한다.파일 및 디렉토리 생성,수정, 삭제파일 접근 권한 관리데이터 무결성 보장백업 및 복구암호화파일은 블록 디바이스인데, 사용자가 바이트 단위로 읽으려면 파일 시스템을 통해 읽을 수 있다.파일의 정보는 FCB가 있는데 FCB를 통해 사용자는 시스템 콜인 open(), close() 함수를 통해 파일을 열고 닫을 수 있다. 순차 파일 구조는 카세트 테이프처럼 데이터가 연속적으로 저장되는 구조이며 구조가 단순하여 공간 낭비가 적다. 만약 특정 위치로 이동하려면 lseek() 시스템 콜 함수를 통해 접근할 수 있고, 이는 단점으로 데이터 수정 및 삭제하는데 시간이 오래걸린다.직접 파일 구조는 해시 함수를 이용해 데이터를 저장하는 방식으로, 해시 함수에 따라 성능에 영향을 준다.인덱스 파일 구조: 순차 접근과 직접 접근의 장점을 결합한 방식으로, 인덱스 테이블을 이용해 빠른 접근이 가능하다. 디렉토리파일은 데이터를 갖고 있고, 디렉토리는 파일 정보를 갖고 있는 파일이다. 파일과 디스크파일이 저장될 때, 디스크는 일정 크기로 나뉜 블록으로 데이터를 저장한다.데이터 저장방식은 연속할당, 불연속할당이 있다.연속 할당은 연속적으로 데이터를 저장하며 외부 단편화가 발생한다.불연속 할당은 분산하여 데이터를 저장하며 내부 단편화가 발생한다.연결 할당은 연결 리스트 자료구조로 데이터를 연결하여 접근한다.인덱스 할당은 별도의 인덱스 블록을 통해 데이터에 접근한다. 파일시스템은 비어있는 블록을 별도로 관리하는데, 이를 free block list라고 한다.파일을 삭제할 때 실제 파일이 삭제되는 것이 아니라, 파일의 헤더만 삭제하고 사용했던 블록을 free block list에 추가한다.그래서 포렌식으로 데이터를 복구할 때 실제 데이터는 존재하기 때문에 복구가 가능하다. 미션2메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터CPU가 처리하기 위해 메인메모리에 있는 값을 레지스터로 가져와 계산을 하고, 결과값을 메인메모리에 저장한다. 레지스터는 CPU에 존재한다.전력이 끊기면 데이터가 사라지는 휘발성 메모리이다.캐시메인메모리의 있는 값을 레지스터로 가지고 올 때, 성능을 위해 미리 값을 가져온다.캐시는 CPU에 L1, L2, L3... 등으로 존재한다.전력이 끊기면 데이터가 사라지는 휘발성 메모리이다.메인메모리(RAM)운영체제나 프로세스가 올라가는 공간이다.전력이 끊기면 데이터가 사라지는 휘발성 메모리이다.보조저장장치(HDD, SDD)전력이 끊겨도 데이터가 유지되는 비휘발성 메모리이다.파일, 데이터를 저장하는 공간이다. 가격 : 레지스터 > 캐시 > 메인메모리 > 보조저장장치용량 : 레지스터 < 캐시 < 메인메모리 < 보조저장장치속도 : 레지스터 > 캐시 > 메인메모리 > 보조저장장치사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?  가변 분할 방식 장점은 낭비되는 메모리 공간이 없다.(내부 단편화 없음)단점은 메모리 할당된 2개의 프로세스가 종료되고 2개의 프로세스의 요구하는 만큼 메모리 공간을 요구하는 프로세스가 발생할 경우, 실행중인 프로세스를 종료하고 메모리를 합쳐야하는 오버헤드가 발생한다.(외부 단편화)고정 분할 방식장점은 구현이 단순하고 오버헤드가 적다단점은 낭비되는 메모리 공간이 있다.(내부 단편화)CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.초기의 컴퓨터는 필수적인 장치가 아니었습니다. 그러나 컴퓨터가 발전하면서 운영체제를 통해 컴퓨터를 효율적으로 관리하고, 개인 데이터를 저장하기 위해서 오늘날에는 거의 필수로 필요한 저장장치가 되었습니다.파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일 삭제시 파일의 헤더만 삭제하고 실제 데이터는 존재하기 때문에, 포렌식으로 파일을 복구할 수 있습니다.

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

elly

[인프런 워밍업클럽 CS 2기] 3주차 발자국

3주차 학습 내용 '그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)' Section 3(Unit 6~10)'그림으로 쉽게 배우는 운영체제' Section 8, 9, 10 '그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)' Section 3(Unit 6~10) Section 3. 알고리즘정렬 - 병합정렬(Merge Sort)divide and conquer - 분할 정복해결하기 힘든 문제가 발생한다면 이걸 한 번에 해결하려고 하지 말고, 해결하기 쉬울 정도로 문제를 쪼갠 다음 하나씩 해결하라원소를 하나일 때까지 쪼개고, 역순으로 순서에 맞게 하나의 배열로 병합해줌 (재귀함수를 호출한 모양과 비슷함)코드 구현function MergeSort(arr, leftIndex, rightIndex) { if(leftIndex < rightIndex) { let midIndex = parseInt((leftIndex + rightIndex) / 2); MergeSort(arr, leftIndex, midIndex); MergeSort(arr, midIndex + 1, rightIndex); Merge(arr, leftIndex, midIndex, rightIndex); } } function Merge(arr, leftIndex, midIndex, rightIndex) { let leftAreaIndex = leftIndex; let rightAreaIndex = midIndex + 1; let tempArr = []; tempArr.length = rightIndex + 1; tempArr.fill(0, 0, rightIndex + 1); let tempArrIndex = leftIndex; while(leftAreaIndex <= midIndex && rightAreaIndex <= rightIndex) { if(arr[leftAreaIndex] <= arr[rightAreaIndex]) { tempArr[tempArrIndex] = arr[leftAreaIndex++]; } else { tempArr[tempArrIndex] = arr[rightAreaIndex++]; } tempArrIndex++; } if(leftAreaIndex > idIndex) { for(let i = rightAreaIndex; i <= rightIndex; i++) { tempArr[tempArrIndex++] = arr[i]; } } else { for(let i = leftAreaIndex; i <= midIndex; i++) { tempArr[tempArrIndex++] = arr[i]; } } } 병합정렬 성능성능측정 부분은 Merge() 함수 내 흩어진 배열을 합치는 부분하나의 데이터와 하나의 데이터가 두 개로 합쳐질 때 비교 연산을 두 번 함두 개의 데이터와 두 개의 데이터가 네개로 합쳐질 때 비교가 네 번 이뤄짐각 단계를 거칠 때마다 영역의 수가 반으로 줄어 logn이 됨분할된 배열을 병합할 때는 n개의 데이터를 n번 비교하므로 O(nlogn) 성능이 나옴병합정렬 장단점장점 - 성능이 좋음(O(nlogn))단점 - 이해와 구현이 어려움정렬 - 퀵정렬(Quick Sort)분할 정복 알고리즘으로 재귀를 사용함퀵정렬 설명정렬하기 전에 배열에 있는 숫자 중 하나를 피벗으로 설정해줌leftStartIndex는 피벗보다 큰 값을 만나면 멈춤rightStartIndex는 피벗보다 작은 값을 만나면 멈춤leftStartIndex, rightStartIndex의 값을 스왑해줌서로 지나쳤다면 더이상 진행하지 않음이상태에서 피벗과 rightStartIndex 값 스왑해줌피벗값을 기준으로 오른쪽, 왼쪽을 정렬해줌코드 구현function quickSort(arr, left, right) { if(left <= right) { let pivot = divide(arr, left, right); quickSort(arr, left, pivot - 1); quickSort(arr, pivot + 1, right); } } function divide(arr, left, right) { let pivot = arr[left]; let leftStartIndex = left + 1; let 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, leftStartIndex, rightStartIndex); } } swap(arr, left, rightStartIndex); return rightStartIndex; } function swap(arr, index1, index2) { let temp = arr[index]; arr[index1] = arr[index2]; arr[index2] = temp; } let arr = [5, 3, 7, 2, 6, 4, 9, 1, 8]; console.log("==== 정렬 전 ===="); console.log(arr); quickSort(arr, 0, arr.length - 1); console.log("==== 정렬 후 ===="); console.log(arr); 퀵 정렬의 성능피벗이 매번 배열의 반을 가르는 경우O(nlogn)피벗이 배열을 반으로 가르지 않고 한쪽에 쏠리는 경우 - 최악의 경우O(n^2)성능만 보면 병합 정렬이 더 좋다고 볼 수 있는데, 실제로 비교하면 퀵정렬이 더 적은 비교와 더 적은 메모리 공간을 차지하기 때문에 더 좋은 알고리즘으로 평가됨퀵정렬의 장단점 - 병합정렬과 동일동적 프로그래밍 - 메모이제이션재귀의 단점피보나치 수열피보나치 수열 코드function fibonacci(n) { if(n == 0 || n == 1) return n; return fibonacci(n - 2) + fibonacci(n - 1); } console.log(fibonacci(5)); 성능이 좋지 못함 - 반복 계산단점 - 이미 계산했던 것을 다시 또 계산하게 됨메모이제이션재귀의 문제점 해결방법계산 결과를 저장해두고 사용해시테이블 사용피보나치 수열 코드를 메모이제이션을 사용해 수정function fibonacci1(n) { if(n == 0 || n == 1) return n; return fibonacci(n - 2) + fibonacci(n - 1); } function fibonacci2(n) { if(n == 0 || n == 1) return n; if(memo[n] == null) { memo[n] = fibonacci2(n - 2, memo) + fibonacci2(n - 1, memo); } return memo[n]; } let start = new Date(); console.log(fibonacci1(40)); let end = new Date(); console.log("fibonacci1 함수 실행시간 : ${end - start}ms"); let start = new Date(); console.log(fibonacci2(40, {})); let end = new Date(); console.log("fibonacci2 함수 실행시간 : ${end - start}ms"); 메모이제이션 장단점장점성능 O(n)을 보임재귀덕분에 하향식 계산 방식으로 어려운 문제를 간단하게 해결할 수 있음중복 계산을 하지 않아서 속도가 빠름단점메모리 영역을 사용함(ex, 캐시)동적 프로그래밍 - 타뷸레이션상향식 계산 방식으로, 계산에 필요하지 않을 수 있는 값도 미리 계산해 테이블에 저장해둠코드 구현function fibonacci1(n) { if(n == 0 || n == 1) return n; return fibonacci(n - 2) + fibonacci(n - 1); } function fibonacci2(n) { if(n == 0 || n == 1) return n; if(memo[n] == null) { memo[n] = fibonacci2(n - 2, memo) + fibonacci2(n - 1, memo); } return memo[n]; } function fibonacci3(n) { if(n <= 1) return n; let table = [0, 1]; for(let i = 2; i <= n; i++) { table[i] = table[i - 2] + table[i - 1]; } return table[n]; } let start = new Date(); console.log(fibonacci1(40)); let end = new Date(); console.log("fibonacci1 함수 실행시간 : ${end - start}ms"); let start = new Date(); console.log(fibonacci2(40, {})); let end = new Date(); console.log("fibonacci2 함수 실행시간 : ${end - start}ms"); let start = new Date(); console.log(fibonacci3(40)); let end = new Date(); console.log("fibonacci3 함수 실행시간 : ${end - start}ms"); 성능메모이제이션은 여러번의 함수 호출로 메모리 공간에 스택을 차지하고, 메모이제이션을 위한 해시 테이블 공간까지 차지하기 때문에 메모리를 더 많이 사용함타뷸레이션은 적은 메모리 사용임에도 불구하고 빠른 시간을 보임메모이제이션 vs 타뷸레이션메모이제이션재귀를 이용해 문제를 하향식으로 해결함재귀만 이용한다면 중복 계산을 하기 때문에 성능의 문제가 발생했는데 계산 결과를 저장하는 방식으로 단점을 해결함해결하기 힘든 문제를 하향식으로 접근하고, 더 많은 메모리를 이용해 성능을 향상시킴이러한 이유로 분할 정복을 해결할 때 재귀가 더 직관적이라면 메모이제이션을 이용하는 것이 유리함타뷸레이션재귀가 직관적이지 않을 때는 상향식 접근인 타뷸레이션을 이용해 메모리도 절약하고 속도도 빠르게 할 수 있음 '그림으로 쉽게 배우는 운영체제' Section 8, 9, 10Section 8. 가상메모리가상메모리 개요컴퓨터마다 실제 메모리 크기가 다른데, 만약 운영체제나 프로세스가 특정 크기에서 동작하도록 만들어졌다면 그 크기보다 작은 메모리를 가진 컴퓨터에서는 실행되지 않음 → 가상 메모리는 이 문제를 해결함가상 메모리프로세스는 운영체제의 영역이 어디있는지, 물리 메모리의 크기가 얼마나 큰지 몰라도 됨프로세스는 메모리 관리자에게 요청만 하면됨메모리 관리자는 프로세스의 요청이 있으면 그에 맞는 물리 메모리로 연결시켜줌가상메모리의 크기는 이론적으로는 무한대이지만 실제로는 물리 메모리 크기와 CPU의 비트 수로 결정됨 (ex, 32bit CPU(대략 4GB) → 가상 메모리 크기도 4GB가 됨)가상메모리로 프로세스들 실행시키는 방법물리메모리 내용의 일부를 하드 디스크에 있는 스왑영역으로 옮기고, 처리가 필요할 때 물리 메모리로 가져와 실행시키기 때문에 운영체제와 프로세스 5개를 전부 실행시킬 수 있음 동적주소변환(Dynamic Address Translation)메모리 관리자는 물리메모리와 스왑영역을 합쳐서 프로세스가 사용하는 가상주소를 물리주소로 변환함 동적 주소 변환을 거치면 프로세스는 마음대로 사용자 데이터를 물리 메모리에 배치할 수 있음메모리 관리자의 역할물리 메모리를 어떻게 나눌지프로세스를 어디다 배치할지부족한 물리 메모리는 어떻게 처리할지 등등을 위해 복잡한 과정을 거침가상 메모리 시스템의 메모리 할당 방법가상 메모리 시스템에서는 운영체제 영역을 제외한 나머지 영역을 일정한 크기로 나누어서 프로세스에게 할당함할당하는 방식은 메모리 분할방식과 마찬가지로 ‘가변 분할 방식’, ‘고정 분할 방식’으로 나뉨 가변 분할 방식(세그멘테이션)단점 - 외부 단편화고정 분할 방식(페이징)단점 - 내부 단편화각각의 단점을 보완한 ‘세그멘테이션-페이징 혼용기법 ’ 사용세그멘테이션-페이징 혼용기법가상메모리 시스템에서 가상주소는 메모리나 스왑영역 한 곳 중에 위치메모리 관리자는 가상주소와 물리주소를 일대일 매핑 테이블로 관리함 세그멘테이션(배치정책)가변 분할 방식을 이용하는 세그멘테이션 기법프로그램은 함수나 모듈등으로 세그먼트 구성프로그램(사용자) 관점 메모리 - 코드, 데이터, 힙, 라이브러리, 스택 각각 구성(인접할 필요 없음)프로세스 관점 메모리 - 코드, 데이터, 힙, 스택 영역을 서로 인접한 것처럼 바라봄논리주소사용자, 프로세스, CPU가 바라보는 주소실제 물리주소로 변환은 중간에서 메모리 관리자(MMU)가 해줌메모리 관리자가 논리주소 → 물리주소 변환 방법메모리 관리자가 가지고 있는 세그멘테이션 테이블에 Base Address, Bound Address(Segment 크기) 정보가 저장되고 이걸 이용해 물리 메모리 주소를 계산함운영체제는 컨텍스트 스위칭을 할 떄마다 메모리 관리자 내에 Segment Table Base Register를 해당 프로세스의 것으로 값을 바꿔줘야함 → 굉장히 무거운 동작논리주소가 Bound Address보다 작다면, 논리주소 + Base Address 로 물리주소를 구함논리주소가 Bound Address보다 크다면, 메모리를 침범했다고 생각하고 에러를 발생세그멘테이션 장점메모리를 가변적으로 분할할 수 있고, 코드 영역, 데이터 영역, 스택 영역, 힙 영역을 모듈로 처리할 수 있음 → 공유와 각 영역에 대한 메모리 접근보호가 편리함세그멘테이션 단점가변 분할 방식의 단점인 “외부 단편화”가 발생함페이징(배치정책)고정분할방식을 이용한 페이징세그멘테이션 기법은 외부 단편화 문제가 있기 때문에 이를 해결하기 위해 고안됨페이징메모리를 할당할 때 정해진 크기의 페이지로 나눔모든 페이지는 크기가 같기때문에 관리가 편하고, 일정한 크기로 나눴기 때문에 외부 단편화 현상이 일어나지 않음논리주소공간에서의 페이징 → 페이지물리주소공간에서의 페이징 → 프레임 페이징의 주소변환 방법메모리 관리자가 “페이지 테이블”을 통해 CPU에서 전달받은 논리주소가 몇번 페이지, 오프셋은 얼마인지 알아냄메모리 관리자 내에 Page Table Base Register(PTBR)를 이용해서 물리 메모리에 있는 페이지 테이블을 찾고, 페이지 번호를 인덱스로 프레임 번호를 알아내고, 오프셋을 이용해 물리주소로 변환을 함페이지 테이블에 Invalid로 표시되어 있으면 스왑영역, 즉 하드디스크레 저장되어 있다는 의미임PTBR은 운영체제가 컨텍스트 스위칭을 할 때마다 해당 프로세스의 것으로 업데이트 해줌 세그멘테이션 vs 페이징 차이점페이지의 크기가 다름세그멘테이션은 프로세스마다 크기가 달라 Bound Address를 가지고 있지만, 페이징은 모든 페이지의 크기가 동일해서 크기를 표현하는 Bound Addresss는 필요하지 않음페이징은 이런 특성때문에 외부단편화는 발생하지 않지만 내부단편화가 발생함 (정해진 크기의 페이징보다 프로세스의 정보가 작으면 그만큼 공간이 낭비됨)세그멘테이션의 단점과 비교하면 많은 고간이 낭비되는게 아니라서 심각하게 생각하지 않음세그멘테이션은 논리적인 영역별로 세그먼트를 나눔(코드, 데이터, 스택, 힙 영역), 그러나 페이징은 페이지의 크기가 고정되어 있어 논리적인 영역별로 나누는 것이 아니라 페이지로 나누기 때문에 논리적인 영역을 나눌 수 없음 그래서 특정 영역만 공유하거나 권한을 부여하는게 더 어려움페이징에서 가장 신경써야하는 것은 페이지 테이블 크기임각 프로세스마다 페이지 테이블을 가지고 있는데 프로세스가 많아질수록 페이지 테이블도 많아지기 때문에 프로세스가 실제로 사용할 수 있는 메모리 영역이 줄어듦실제로 메모리 관리자가 참조하는 페이지 테이블도 물리 메모리의 운영체제 영역에 저장되어 있기 때문에 페이지 테이블 크기가 너무 크면 사용자 영역이 부족하게 됨 → 페이지 테이블의 크기를 적절하게 유지하는 것이 굉장히 중요함페이지드 세그멘테이션(배치정책)페이징과 세그멘테이션의 각각의 장점을 취한 방식 → 새로운 단점이 생기기도 함세그멘테이션 장점가변 분할 방식이라서 코드 영역, 데이터 영역, 스택 영역, 힙 영역을 세그먼트로 나눠서 관리할 수 있음그에 따라 다른 프로세스와 공유하기도 편하고, 각 영역에 대한 메모리 접근보호를 하기가 쉬움페이징 장점고정분할 방식으로 메모리를 효율적으로 관리할 수 있음메모리 접근 권한메모리의 특정 번지에 부여된 권한으로 읽기(Read), 쓰기(Write), 실행(Execute) 세 가지가 있음 프로세스는 코드 여역, 데이터 여역, 스택 영역, 힙 영역이 있는데 각 영역마다 접근 권한이 있음 코드 영역프로그램 그 자체이기 때문에 수정되면 안되므로, 읽기와 실행 권한만 있음데이터 영역일반변수, 전역변수, 상수로 선언한 변수가 저장되기 때문에 읽기 권한이 있고, 쓰기 권한은 있거나 없거나 함 실행권한은 없음스택, 힙 영역읽기, 쓰기 권한이 있고, 실행권한은 없음메모리 접근권한에 대한 검사는 가상주소에서 물리주소로 변환될 때마다 일어나는데, 만약 권한을 위반하면 에러를 발생시킴 페이지드 세그멘테이션세그멘테이션 기법 - 세그멘테이션 테이블은 Base Address와 Bound Address로 구성됨페이징 기법 - 페이지 테이블은 프레임 번호로 구성됨 위의 둘을 혼합해 페이지드 세그멘테이션으로 만듦 (각각의 역할은 이름만 바꼈을 뿐 달라진 것은 없음)세그멘테이션 테이블에 권한 비트를 추가함Base Address는 페이지 넘버로 바뀜Bound Address는 이 세그먼트 페이지 개수로 바뀜 페이지드 세그멘테이션의 단점은 물리메모리에 접근하기 위해서 메모리에 접근을 두 번해야 된다는 것첫번째, 세그멘테이션 테이블을 참조할 때두번째, 페이지 테이블을 참조할 때 일어남위의 단점 때문에 운영체제는 페이징과 페이지드 세그멘테이션 기법을 적절히 섞어서 사용함디맨드 페이징(가져오기 정책)프로세스가 실행될 때, 프로세스를 이루고 있는 코드영역, 데이터영역, 힙영역, 스택영역과 같은 모듈이 모두 메모리에 올라와 실행된다고 알고 있음하지만 실제로는 모든 모듈이 메모리에 올라오는 것이 아니라 필요한 모듈만 올라와서 실행됨도널드 커누스의 발견 - 90:10 법칙90%의 시간이 10% 코드에서 보내는 것 → 지역성 이론이라고 함지역성(두가지)공간의 지역성현재 위치에서 가까운 데이터에 접근할 확률이 높다는 것시간의 지역성최근 접근했던 데이터가 오래전에 접근했던 데이터보다 접근할 확률이 높음goto문 - 지역성 이론에 따라 성능이 좋지 않기 때문에 쓰지 않는 것을 추천지역성 이론은 조만간 쓰일 데이터만 메모리에 올리고 당분간 필요하지 않을 것 같은 데이터는 스왑영역으로 보내 성능을 향상시킴 디맨드 페이징은 조만간 필요할 것 같은 데이터를 메모리로 가져오고 쓰이지 않을 것 같은 데이터는 스왑영역으로 이동시키는 정책ex, 포토샵포토샵은 본 프로그램 외에도 이미지에 효과를 주는 외부 필터들이 있는데, 이 필터들을 포토샵과 같이 메모리에 모두 올리면 메모리를 많이 차지해서 프로그램이 더 무거워짐그래서 본 프로그램만 메모리에 올리고 외부 필터들은 사용자의 요청이 있을 때만 메모리로 가져오는 것이 메모리도 절약되고, 메모리를 효율적으로 관리할 수 있고, 프로세스의 응답속도도 빨라짐 메모리 계층구조메모리는 레지스터, 캐시, 메인 메모리, 보조저장장치로 나눌 수 있음메인 메모리에 접근하는 시간 레지스터CPU 내에 존재하고, CPU의 한사이클에 접근할 수 있어서 굉장히 빠름캐시CPU의 수 사이클에서 수십 사이클에 접근 가능메인 메모리CPU의 수백 사이클에 접근 가능보조저장장치(HDD, SSD)CPU의 수백만 사이클에 접근 가능디맨드 페이징은 스왑영역을 보조저장장치에 저장하는데, 성능향상을 위해서는 스왑영역으로 데이터를 이동시키는 것을 최소화 시켜야 함가상 메모리의 크기 = 물리 메모리 크기 + 스왑영역임스왑인, 스왑아웃 스왑인 - 스왑영역에서 물리메모리로 데이터를 가져오는 것스왑아웃 - 물리메모리에서 스왑영역으로 데이터를 내보내는 것메모리 관리자는 페이지 테이블을 참조해서 물리 메모리가 있는 프레임을 알아내거나 스왑영역의 위치를 알아내야 하는데, 이를 위해 페이지 테이블에는 여러가지 비트가 있음페이지 테이블을 이루고 있는 한 행을 페이지 테이블 엔트리(PTE)라고 부름 페이지 테이블 엔트리(PTE) 접근 비트페이지가 메모리에 올라온 후 데이터에 접근이 있었는지 알려주는 비트메모리에 읽거나 실행 작업을 했다면 1로 바뀌게 됨변경비트페이지가 메모리에 올라온 후 데이터의 변경이 있었는지 알려주는 비트메모리에 쓰기 작업을 했으면 1로 바뀌게 됨유효비트페이지가 물리 메모리에 있는지 알려주는 비트만약 유효비트가 1이라면 페이지가 스왑영역에 있고, 0이라면 물리 메모리에 있다는 의미임읽기, 쓰기, 실행 비트권한 비트로 해당 메모리에 접근권한이 있는지 검사하는 비트프로세스가 가상 메모리에 접근요청을 했을 때 메모리 관리자는 페이지 테이블을 보고 물리 메모리의 프레임을 찾아냄만약 물리 메모리에 없다면 Page Fault라는 인터럽트를 발생시킴Page Fault가 발생하면 보조저장장치의 스왑영역에 접근하게 되고 해당 프로세스는 대기상태가 됨스왑영역에 있는 데이터가 메모리에 올라가는 작업을 시작하고, 메모리에 올라갔다면 대기상태에 있던 프로세스는 다시 실행하게 됨물리 메모리와 스왑영역에서 어떻게 참조되는가(세가지)스왑이 필요없는 경우 ex, 프로세스가 페이지 0을 요청페이지 테이블의 0번 인덱스를 살펴보면 유효비트 0, 프레임 넘버 1 → 해당 주소가 물리메모리의 1번 프레임물리 메모리에 있는 1번 프레임에 접근해 데이터를 참조함스왑영역에 있는 데이터를 참조하는 경우ex, 프로세스가 페이지 2번을 요청 페이지 테이블의 2번 인덱스를 살펴보면, 유효비트가 1이고 프레임 넘버가 2임 → 페이지가 스왑영역 2번에 있다는 뜻물리메모리에 적절히 빈 공간을 찾음스왑영역 2번에 저장된 C를 물리메모리 3번 프레임으로 가져오고페이지 테이블에서 해당 엔트리의 유효비트를 0으로, 프레임 넘버를 3으로 수정함프로세스에게 데이터를 참조하게 해줌물리메모리가 꽉찼을 때 스왑영역에 있는 데이터를 참조하는 경우ex, 프로세스가 페이지 1번을 요청했다고 가정 페이지 테이블 1번 인덱스를 살펴보면, 유효비트 1, 프레임 넘버 0 → 페이지가 스왑영역 0번에 있음물리메모리로 가져오기 위해 적절한 빈공간을 찾지만 꽉 차서 여유가 없음현재 물리 메모리에서 필요하지 않다고 판단하는 영역을 스왑영역으로 옮김A가 필요하지 않다고 가정하고 스왑영역 3번으로 옮김페이지 테이블에서 0번 인덱스의 유효비트를 1, 프레임 넘버를 3으로 변경물리메모리 빈공간이 된 1번으로 B를 가져옴페이지 테이블에서 1번 인덱스의 유효비트를 0으로, 프레임 넘버를 1로 수정함프로세스에게 데이터를 참조하게 해줌스왑인(스왑영역 → 물리메모리), 스왑아웃(물리메모리 → 스왑영역) 시, 어떤게 적절한지는 운영체제가 판단함 → 페이지 교체 알고리즘페이지 교체정책메모리가 꽉찼을 때, 어떤 페이지를 스왑영역으로 보낼지 결정하는 정책임프로세스는 데이터 접근을 위해 메모리를 참조하는데, 해당 데이터가 메모리에 없으면 Page Fault가 발생함Page Fault가 발생하면, 해당 페이지를 스왑영역에서 메모리로 불러들여야하는데 메모리가 꽉차서 공간이 없다면 메모리에 있는 페이지 중 하나를 선택해서 스왑영역으로 옮겨야함메모리에 있는 페이지를 스왑영역으로 옮길 때 어떤 페이지를 선택할지 결정하는 정책을 페이지 교체 정책이라고 부르고, 페이지 교체 정책에는 여러가지가 있음페이지 교체 정책의 방법들무작위로 선택하는 방법(Random)지역성을 고려하지 않기 때문에 자주 사용되는 페이지가 선택될 때도 있어 성능이 별로 좋지 않음그래서 거의 사용되지 않음메모리에 들어온지 가장 오래된 페이지를 선택하는 방법(FIFO)자주 쓰이는 페이지가 먼저 들어왔다는 이유로 해당 페이지가 교체되면 공평하지 않음위의 단점이 있지만 구현이 간단하고 성능도 꽤 괜찮아서 조금 변형해서 많이 쓰임앞으로 가장 오랫동안 쓰이지 않을 페이지를 선택하는 방법(Optimum)사실상 구현이 불가능한 이론적인 선택방법구현이 불가능해서 필요가 없을 것 같지만, 다른 알고리즘과 성능 비교를 할 때 참조용으로 쓰임최근에 가장 사용이 적은 페이지를 선택하는 방법(LRU - Least Recently Used)지역성 이론의 시간의 지역성에 따르면 최근 사용한 데이터가 앞으로도 사용될 확률이 높기 때문에 최근에 가장 사용을 적게한 페이지가 앞으로도 사용될 확률이 적다는 결론이 나옴실제로도 Optimum 알고리즘에 근접한 성능을 보임그러나 프로그램이 지역성을 띄지 않을땐 성능이 떨어지게됨페이지 테이블 엔트리는 여러개의 비트와 페이지 넘버가 저장되는데, 이곳에 시간을 기록하려면 비트가 많이 필요하게됨많은 비트를 준비하기 어려우므로 실제 LRU를 구현할 때는 접근비트를 이용해서 LRU에 근접하게 구현함Optimum vs FIFO vs LRU 비교 ex, 페이지가 A B C A C D A D C A B 순서대로 요청되는 상황 세 방법 모두 메모리가 비어있기 때문에 처음 요청에서는 전부 Page Fault가 발생함A 요청 들어옴세 알고리즘 모두 Page Fault가 일어나지 않음C 요청 들어옴세 알고리즘 모두 Page Fault가 일어나지 않음D 요청 들어옴Page Fault 발생Optimum뒤에 들어오는 요청을 훑어봄페이지 B가 가장 사용되지 않을 것을 알기 때문에 페이지 B를 스왑영역으로 옮기고, B가 있던 자리에 D를 가져옴FIFO먼저 들어온 페이지가 먼저 나가기 때문에 가장 먼저 들어온 페이지 A를 스왑영역으로 보내고, A가 있던 자리에 D를 가져옴LRU최근에 가장 사용이 적은 페이지가 나가기 때문에 최근에 들어온 페이지의 참조 수를 계산함A 2번, B 1번, C 2번으로 B가 가장 덜 사용됐으니 B를 스왑영역으로 옮기고 B가 있던 자리에 D가 들어옴빌레이디의 역설(Belady’s Anomaly)Page Fault를 줄이려고 메모리를 더 늘려서 프레임 수를 늘렸는데, 오히려 Page Fault가 더 많이 발생하는 현상→ FIFO의 가장 큰 문제임FIFO에서만 발생하며 LRU에서는 발생하지 않음LRU 문제점시간을 기록해야하는 LRU는 구현이 힘듦시간을 기록할 bit가 많이 필요많은 bit가 있어도 시간이 아주 오래 지난다고 가정하면 어쩔수없이 오버플로우가 발생 → 오버플로우로 값이 초기화되면서 시간을 올바르게 표현할 수 없게됨클락 알고리즘 LRU 알고리즘과 유사하게 구현하는 방법접근비트 하나만 이용일정 시간 간격마다 모든 페이지의 접근 비트를 0으로 초기화함접근비트의 초기값은 0으로 설정되어 있고, 만약 페이지가 참조되었다면 1로 설정됨페이지를 원형으로 연결함스왑영역으로 옮길 페이지를 포인터로 가르키는데, 이 포인터를 클락 핸드라고 부름클락 핸드는 시계방향으로 돌게됨만약 Page Fault가 발생해서 스왑영역으로 보내야하는 상황이 나오면, 클락 핸드는 현재 참조하고 있는 페이지의 접근비트를 봄만약 접근비트가 1이라면 해당 접근비트를 0으로 바꾸고, 클락핸드가 다음 페이지를 가르킴이렇게 반복하다가 접근비트가 0인 페이지를 발견하면, 해당 페이지를 스왑영역으로 보냄향상된 클락 알고리즘(Enhanced Clock Algorithm)이 알고리즘은 접근비트만 이용하는 것이 아니라 변경비트까지 봄스왑 영역으로 보내지는 순위가 가장 높은 것은 접근비트가 0이고, 변경비트도 0인 페이지임그 다음으로 접근비트가 0, 변경비트가 1인 페이지임그 다음으로 접근비트가 1, 변경비트가 0인 페이지임마지막으로 접근비트가 1, 변경비트가 1인 페이지가 교체됨FIFO를 사용하는 경우LRU에서는 접근비트를 이용하는데, 하드웨어적으로 접근비트를 지원하지 않는 시스템에서는 FIFO를 이용할 수 밖에 없음어쩔 수 없이 FIFO를 이용하기 위해 성능을 높이는 방법을 고안함2차 기회 페이지 교체 알고리즘FIFO방식에서 자주 사용하는 페이지에게는 또 한번의 기회를 줌FIFO방식과 동일하게 동작하지만, 만약 Page Fault없이 페이지 접근에 성공했다면 해당 페이지를 큐의 맨 뒤로 이동시켜 수명을 연장시켜주는 방식이 알고리즘은 LRU보다는 안좋고, FIFO보다는 좋음스레싱과 워킹셋CPU 스케줄링CPU 사용률을 높이는 것이 목표CPU 사용률을 높이기 위해서는 동시에 실행하는 프로세스의 수, 멀티프로그래밍의 정도를 올리는 것동시에 실행하는 프로세스의 수가 늘어나면, 어떤 프로세스가 I/O작업으로 CPU를 사용할 수 없을 때 다른 프로세스로 컨텍스트 스위칭을 해서 CPU 사용률을 높일 수 있음CPU 사용률을 위해 멀티프로그래밍의 정도를 높였으면, 프로세스들이 필요로하는 공간이 있기때문에 물리메모리에 프레임을 할당해야함물리메모리의 크기는 한계가 있기 때문에 모든 프로세스의 모든 프레임을 물리메모리에 올릴 수 없고, 일부는 스왑영역에 저장됨멀티프로그래밍 정도가 늘어나는 경우에 문제가 나타남멀티프로그래밍 정도가 늘어나면 제한된 물리메모리에 모든 프로세스를 올려야하고, 당장 실행되는 프레임을 제외한 나머지 프레임들은 스왑영역에 저장되고 Page Fault가 많이 발생하게 됨CPU가 작업하는 시간보다 스왑작업의 시간이 더 길어지고, CPU 사용률은 떨어지게됨CPU 스케줄러는 CPU 사용률이 낮아지면, 더 많은 프로세스를 메모리에 올리게되고, 이렇게 반복하다보면 어느새 CPU 사용률이 0에 가깝게 떨어지게됨스레싱CPU 사용률을 높이려했지만 오히려 더 떨어지는 상황근본적인 원인은 물리메모리의 크기가 부족한 것하드웨어적으로 해결하려면 메모리 크기를 늘리면 됨그러나 4GB 램에서 16GB 램으로 올려도 성능향상을 느끼기 힘듦현재 메모리가 프로세스들이 작업을 하는데 충분한 크기라서 스레싱이 발생하지 않는다면 크기를 늘려도 별 다른점이 없기 때문임운영체제가 스레싱을 소프트웨어적으로 해결하기 위한 방법한 프로세스가 실행될 때 너무 많은 페이지를 할당하면 다른 프로세스가 사용할 페이지가 줄어들기 때문에 효율이 떨어지게됨반대로 너무 적은 페이지를 할당하면 빈번한 Page Fault가 발생하고, 스왑요청이 많아 스레싱이 발생하게됨이를 해결하기 위한, 프로세스가 실행되는 동안 해당 프로세스에게 맞는 적절한 페이지 수 결정 방법프로세스가 실행되면 일정량의 페이지를 할당 후, 만약 Page Fault가 발생하면 더 많은 페이지를 할당하고, 반대로 Page Fault가 너무 적게 발생하면 페이지를 과하게 할당해 메모리가 낭비되는 것이라고 판단하고 페이지를 회수함어떤 페이지를 유지할 것인지 결정 방법지역성 이론을 따름현재 메모리에 올라온 페이지는 다시 사용할 확률이 높기 때문에 하나의 세트로 묶어서 메모리에 올림 → 워킹셋워킹셋은 프로세스가 준비상태에서 실행상태가 되는 컨텍스트 스위칭을 할 때 사용됨Section 9. 입출력주변장치(I/O 디바이스, 저장장치)주변장치 종류그래픽카드, 하드디스크, SSD, 키보드, 마우스 등이 있음 주변장치들은 메인보드에 있는 버스로 연결됨버스 Address 버스, Data 버스, Control 버스로 이루어져 있음I/O 디바이스는 이 세가지 버스를 따로 받을 수 있음외부 인터페이스각 하드웨어에 맞게 존재함각종 레지스터장치의 상태와 데이터를 보관할 수 있음입출력 작업을 할 때 데이터를 저장하는 역할을 함값들은 CPU가 사용하기위해 메모리로 이동되기도 함데이터의 전송단위에 따른 주변장치 분류데이터의 전송단위가 캐릭터(글자)인지, 블록인지에 따라 나뉨캐릭터 디바이스마우스, 키보드, 사운드카드, 직별렬포트 등데이터 전송 단위가 캐릭터(글자)로 상대적으로 크기가 작음블록 디바이스하드디스크, SSD, 그래픽카드 등데이터 전송 단위가 블록(범위)로 상대적으로 크기가 큼각 장치 세부 설명버스 예전에는 주변장치들을 하나의 버스로 연결해서 사용함CPU가 작업을 하다가 I/O 명령을 만나면 직접 입출력장치에서 데이터를 가져왔는데 입출력중에는 다른 작업을 하지 못했기 때문에 CPU사용률이 떨어짐이를 해결하기 위해 입출력 제어기(I/O Controller)와 여러개의 버스가 추가됨 CPU는 I/O 명령을 만나면 입출력 제어기에게 입출력작업을 맡기고 다른 작업을 실행함입출력 제어기시스템 버스, 입출력 버스로 구분하여 두 개의 채널을 가지고 있음시스템 버스고속으로 작동하는 CPU와 메모리가 사용입출력 버스주변장치가 사용입출력 버스는 세부적으로 느린장치와 빠른장치를 구분하기 위해 다시 고속 입출력 버스, 저속 입출력 버스 두 개의 채널로 나뉨 → 느린장치와 빠른장치로 구분 해 속도차이로 인한 병목현상을 해결함그래픽 카드그래픽 카드가 다루는 데이터는 매우 대용량이라 고속 입출력 버스로도 감당이 안됨그에 따라 그래픽 카드는 입출력 버스에 있지 않고, 시스템 버스에 바로 연결해 사용함입출력 제어기입출력 제어기는 여러 주변장치를 처리하는데 입출력 버스에서 온 데이터를 메모리로 옮김메모리는 CPU의 명령으로 움직이기 때문에 입출력 제어기가 메모리에 접근하기 위해서는 CPU가 필요함 입출력 제어기가 CPU의 도움이 필요없도록 DMA(Direct Memory Access - 직접 메모리 접근) 제어기가 추가됨입출력 제어기는 DMA로 데이터를 직접 메모리에 저장하거나 가져올 수 있음Memory Mapped I/OCPU와 DMA가 사용하는 메모리가 겹치지 않도록 CPU가 사용하는 메모리 영역과 DMA가 사용하는 메모리 영역을 나눔마우스/키보드마우스볼 마우스회전을 감지해서 움직임을 처리하는 방식광학 마우스아래쪽에 작은 카메라가 표면으로 초당 1500회가 넘는 사진을 찍어 마우스의 디바이스 컨트롤러 내 DSP(Digital Signal Processor)로 보냄DSP는 이 사진을 분석해 마우스의 X축 좌표와 Y축 좌표 움직임을 캐치함DSP가 마우스의 움직임과 클릭같은 데이터를 감지하면, 디바이스 컨트롤러는 CPU에게 인터럽트를 보내고, 마우스 드라이버가 동작해서 데이터를 읽어감마우스 드라이버는 운영체제에게 이벤트 신호를 주는데, 운영체제는 이 이벤트 Foreground 애플리케이션으로 전달해주고 해당 애플리케이션은 받은 마우스 이벤트 처리를 함키보드사용자가 키보드 버튼을 누르면 키보드의 디바이스 컨트롤러가 어떤 키를 입력 받았는지 알아냄CPU에게 인터럽트를 보내고 키보드 드라이버는 운영체제에게 이벤트를 보냄운영체제는 Foreground 애플리케이션으로 이 이벤트를 전달해주고, 애플리케이션에서 해당 키에 맞는 동작을 수행함하드디스크/Flash Memory(SSD)하드디스크 구조 spindleplatter여러개의 트랙으로 구성됨표면에 자성이 있어 N극을 띄면 0, S극을 띄면 1로 인식함보통 하드디스크의 플래터 수는 2개 이상임실린더(cylinder)트랙은 다시 여러개의 섹터로 나뉘는데, 섹터가 하드디스크의 가장 작은 단위임 disk Arm읽기/쓰기 헤드로 플래터의 표면을 읽음read/write head헤드는 disk Arm에 고정되어 있기 때문에 모든 헤드는 항상 같이 움직임헤드가 움직이면 이 헤드들은 여러 개의 플래터를 가리키게 되는데, 이때 여러개의 플래터에 있는 같은 트랙의 집합을 실린더(cylinder)라고 부름하드디스크에서 데이터 읽어오는 예시유저프로세스가 하드디스크의 특정 섹터에 접근을 위해 요청을 보냄 (ex, 실린더 C로 가서 트랙 B에 있는 섹터 D를 읽어라)디스크암은 헤드를 실린더 C로 이동시키는데, 이를 Seek라고 부름헤드를 실린더로 이동시키는데 걸리는 시간을 Seek Time이라고 부름 → 이것때문에 하드디스크가 굉장히 느림트랙 B의 섹터 D가 헤드에 닿을 때까지 스핀들을 회전시키고, 헤드에 섹터 D가 읽히면 작업이 끝남Flash Memory요즘은 하드디스크보다 Flash Memory를 더 많이 사용함데스크탑에는 Flash Memory 이점으로 많은 사람이 SSD를 사용함핸드폰, 테블릿은 하드디스크를 넣을 큰 공간이 없어서 Flash Memory를 사용함하드디스크 vs Flash Memory하드디스크기계적으로 헤드를 움직여 속도가 많이 느리고 소음도 남자기적으로 처리하는 하드디스크는 자석을 갖다대면 데이터가 손상됨스핀들처럼 회전축같은 것들이 있어서 충격에 매우 약함Flash Memory전기적으로 읽기 때문에 굉장히 빠르고 조용함자석을 갖다대도 데이터가 안전함충격에 약하지 않음그러나 특정한 지점에 데이터를 썼다면 덮어쓰기가 불가능 하다는 단점이 있음 똑같은 지점에 데이터를 쓰려면 기존에 있던 데이터를 지우고 새로 써야하는데, Flash Memory는 지우기 가능한 횟수가 정해져있음(읽기/쓰기를 반복하면 망가져 사용할 수 없음) Section 10. 파일시스템파일과 파일시스템파일들을 하드디스크나 SSD와 같은 저장장치에 저장됨사용자가 운영체제에게 요청 시, 운영체제가 하드디스크에 안전하게 저장함운영체제는 파일 관리를 위해 파일 관리자를 둠 → 파일 시스템파일 시스템파일 관리자는 가상메모리에서 메모리 관리자가 페이지 테이블을 이용해서 가상주소를 물리주소로 변환하는 것처럼 파일 테이블을 이용해서 파일을 관리함파일 시스템의 기능파일과 디렉토리를 만듦파일과 디렉토리의 수정, 삭제를 함다른 사용자로부터 파일을 보호하기 위해 접근권한을 관리함 (요즘 운영체제는 다중 사용자 기능을 지원하기 때문에 파일을 보호하기 위해서 꼭 필요한 기능임)파일의 내용이 손상되지 않도록 무결성을 보장함예기치 못한 사고로부터 백업과 복구를 함파일을 암호화해 파일을 보호함파일시스팀 전송단위하드디스크와 Flash Memory는 블록 디바이스임 따라서 전송단위가 블록임저장 단위는 블록이지만, 사용자는 바이트 단위로 파일에 접근이 가능해야하기 때문에 파일관리자가 중간에서 관리해줌파일확장자유닉스 운영체제에는 파일확장자가 없음윈도우즈는 파일확장자가 있음파일 내부 구성헤더, 데이터로 이루어져있음헤더파일의 속성들이 담겨 있음파일 디스크립터(File Descriptor)운영체제는 파일을 관리하기 위해 정보를 보관하는 파일제어블록(File Control Block, FCB)을 가지고 있는데, 이를 파일 디스크립터(File Descriptor)라고 부름파일 디스크립터는 파일마다 독립적으로 존재하고, 저장장치에 존재하다가 파일이 오픈되면 메모리로 이동함파일 디스크립터는 파일시스템(운영체제)이 관리하고, 사용자가 직접 참조할 수는 없음사용자는 파일시스템이 건내준 파일 디스크립터로 파일에 접근할 수 있음파일 종류 분류파일은 데이터의 집합으로, 데이터의 집합을 어떻게 구성하느냐에 따라 종류를 나눌 수 있음순차파일구조파일의 내용이 연속적으로 이어진 상태 (ex, 카세트테이프)파일시스템이 사용자에게 전달해준 파일디스크립터는 파일의 맨 앞에 위치해서 사용자가 쓰거나 읽기를 시작하면 처음부터 진행함파일의 다른영역으로 가고 싶을 때 - lseek함수를 이용해 파일디스크립터 위치를 옮김 장점모든 데이터가 순서대로 기록되기 때문에 공간의 낭비가 없고 구조가 단순함단점특정지점에 바로 이동이 어려워 데이터를 삽입하거나 삭제하려면 탐색하는데 시간이 많이 걸림직접파일구조저장하려는 데이터를 해시함수를 통해 저장위치를 결정하는 파일구조자료구조에서 해시 테이블이라는 이름으로 불리는 방식json도 이 방식임 장점해시함수를 이용하기 때문에 데이터 접근이 굉장히 빠르다는 것단점해시함수의 선정이 굉장히 중요하기 때문에 해시함수를 잘 골라야한다는 점과 저장공간이 낭비될 수 있다는 점인덱스파일구조순차접근과 직접접근 방식의 장점을 취한 것으로 두가지 방식 모두 가능함ex, 음악재생 프로그램의 재생목록 디렉토리디렉토리란?파일을 하나의 공간이 아닌, 관련있는 파일을 모아둘 수 있게 하기 위함한 개 이상의 파일을 가질 수 있고, 자식 디렉토리도 가질 수 있음디렉토리는 여러층으로 구성됨최상위에 있는 디렉토리 - 루트 디렉토리유닉스, 리눅스에서는 루트 디렉토리를 “/”로 표시함, 디렉토리 별 구분을 위해서도 “/”를 사용함윈도우즈는 루트 디렉토리를 파티션 이름으로 사용하는데, 보통 “C:”으로 표시함윈도우즈는 디렉토리와 디렉토리 구분을 “\”로 함디렉토리도 파일임. 단지 일반 파일에는 데이터가 저장되어 있고, 디렉토리에는 파일 정보가 저장되어 있음 디렉토리 구조과거 - 루트 디렉토리에만 하위 디렉토리 존재했었음파일이 많아지면서 다단계 디렉토리구조가 등장함다단계 디렉토리구조어떤 디렉토리에서도 하위 디렉토리를 만들 수 있는 트리구조운영체제는 트리구조에서 순환이 생기는데, 바로가기 기능이 있기 때문임 파일과 디스크파일은 메모리와 비슷한데, 페이징과 같이 전체 디스크 공간을 일정한 크기로 나누고, 그 공간에 주소를 할당해 관리함일정한 크기로 나눈 공간을 파일시스템에서는 블록이라고 함 (메모리에서는 페이지라고 부름)한 블록의 크기는 1~8KB파일시스템은 파일정보를 파일테이블로 관리하는데, 파일이 시작하는 블록의 위치정보도 담겨있음파일 내 블록 분류여러 개의 블록들로 이루어져 있는 하나의 파일에서, 그 블록들이 어떻게 연결되었는지에 따라 분류됨연속할당파일을 구성하는 블록들을 디스크에 연속적으로 저장하는 방식임파일의 시작 블록만 알면 파일의 전체를 찾을 수 있음메모리에서 세그멘테이션 기법처럼 외부 단편화가 발생하기 때문에 실제로 사용되지 않는 방식임불연속할당디스크에 비어있는 공간에 데이터를 분산해 저장하는 방식분산된 블록은 파일시스템이 관리함연결할당, 인덱스 할당이 있음연결할당파일에 속한 데이터를 연결리스트로 관리함파일테이블에는 시작 블록에 대한 정보만 저장하고, 나머지는 연결리스트를 이용해 다른 블록에 접근하는 방식 인덱스할당테이블의 블록포인터가 데이터 블록에 직접 연결하는 것이 아니라 데이터들의 인덱스를 가지고 있는 인덱스 블록을 연결함 인덱스 할당은 데이터가 많아서 테이블이 꽉 찬 경우 인덱스 블록을 더 만들어서 연결하기 때문에 테이블을 확장할 수 있음파일의 크기가 작다면, 데이터를 바로 참조하는 블록 포인터를 이용하고, 파일의 크기가 크다면 간접 포인터를 이용해 많은 데이터에 접근할 수 있음만약 더 큰 데이터가 필요하다면, 이중 간접 포인터, 삼중 간접 포인터를 이용할 수 있음 (i-node라는 이름으로 유닉스와 리눅스에서 많이 사용되고 있음)free block list빈 공간을 찾기위해 매번 모든 메모리를 찾지 않기 위해 빈 공간을 모아둠만약 특정 파일 삭제 시, 파일시스템은 파일의 모든 정보를 지우는 것이 아니라 파일 테이블의 헤더를 삭제하고 free block list에 추가함 회고일주일 동안 스스로 칭찬하고 싶은 점, 아쉬웠던 점, 보완하고 싶은 점칭찬하고 싶은 점 : 이번주 강의가 조금 어렵게 느껴졌지만 포기하지 않고 끝까지 잘 학습한 점아쉬웠던 점 : 이번주에 회사일이 많아서 내용 중 이틀 치를 몰아서 듣게 되었는데 충분한 학습을 하지 못했다는 아쉬움이 남음보완하고 싶은 점 : 중간중간 이해가 안되는 부분들이 있었는데, 그 부분을 반복학습 해야겠습니다🙌다음주에는 어떤 식으로 학습하겠다는 스스로의 목표수료식 전까지 따로 스터디 스케쥴이 없는 것 같으니 이번주 강의를 다시한번 봐야겠습니다💪

알고리즘 · 자료구조알고리즘자료구조운영체제

minme9055

[인프런 워밍업 클럽 2기 CS] 3주차 발자국

운영체제세그멘테이션(배치정책)메모리를 논리적 단위(세그먼트)로 분할각 세그먼트는 다양한 크기 가능외부 단편화 문제 발생 가능페이징(배치정책)메모리를 동일한 크기의 페이지로 분할물리 메모리와 가상 메모리 간 매핑내부 단편화 발생 가능, 외부 단편화 해결페이지드 세그멘테이션(배치정책)세그멘테이션과 페이징 결합세그먼트를 페이지 단위로 나눔유연성과 효율성 향상디맨드 페이징(가져오기 정책)필요한 페이지만 메모리에 로드페이지 부재 시 디스크에서 가져옴메모리 사용 효율성 증가페이지 교체정책FIFO, LRU, LFU 등 다양한 알고리즘새 페이지 로드 시 어떤 페이지를 교체할지 결정페이지 부재율 최소화 목표스레싱과 워킹셋스레싱: 과도한 페이지 교체로 성능 저하워킹셋: 프로세스가 자주 참조하는 페이지 집합워킹셋 관리로 스레싱 방지주변장치(I/O 디바이스, 저장장치)CPU, 메모리 외 하드웨어 장치입력, 출력, 저장 기능 수행인터럽트 기반 동작마우스/키보드사용자 입력 장치이벤트 기반 동작인터럽트 처리 필요하드디스크/Flash Memory(SSD)하드디스크: 기계식, 대용량, 저렴SSD: 전자식, 고속, 고가비휘발성 저장 장치파일과 파일시스템파일: 관련 데이터의 논리적 집합파일시스템: 파일 저장, 조직, 검색 관리메타데이터 관리 포함디렉토리파일들의 논리적 컨테이너계층적 구조 (트리 구조)파일 검색, 그룹화 용이파일과 디스크파일 할당 방식: 연속, 연결, 인덱스 할당빈 공간 관리디스크 스케줄링 알고리즘 자료구조와 알고리즘정렬 - 삽입정렬원리: 정렬된 부분에 새 원소를 적절한 위치에 삽입시간 복잡도: 평균 및 최악 O(n^2), 최선 O(n)특징: 작은 데이터셋에 효율적, 부분 정렬된 배열에 유리안정적 정렬 알고리즘정렬 - 병합정렬원리: 분할 정복 방식, 작은 부분으로 나누고 병합하며 정렬시간 복잡도: 항상 O(n log n)특징: 대규모 데이터 정렬에 효율적, 추가 메모리 필요안정적 정렬 알고리즘정렬 - 퀵정렬원리: 피벗 선택 후 분할 정복 방식으로 정렬시간 복잡도: 평균 O(n log n), 최악 O(n^2)특징: 실제 구현에서 매우 빠름, 불안정 정렬피벗 선택 방법이 성능에 큰 영향동적 프로그래밍 - 메모이제이션원리: 계산 결과를 저장하고 재사용 (캐싱)특징: 주로 하향식(top-down) 접근법장점: 중복 계산 방지로 효율성 향상적용: 피보나치 수열, 최장 공통 부분 수열 등동적 프로그래밍 - 타뷸레이션원리: 작은 부분 문제부터 해결하며 표를 채움특징: 상향식(bottom-up) 접근법장점: 일반적으로 메모리 사용량이 적음적용: 냅색 문제, 최단 경로 문제 등3주차 후기지난 주차보다는 익숙한 단어들이 많이 보였다. 그래서 조금 가벼운 마음으로 시작했다가 어김없이 혼돈으로 접어드는 루트의 반복이었던 주였다. 언제쯤 이 단어와 개념과 친구 먹을 수 있을까 😂운영체제에서는 가상 메모리에 대해 배우면서 세그멘테이션과 페이징의 개념을 잡고, 메모리 관리 기법의 발전 과정을 따라 공부해 보았다. 입출력 장치와 파일 시스템에 대해 공부하면서는 하드웨어와 소프트웨어의 상호작용을 중점으로 공부했는데, SSD와 하드디스크에 대한 내용을 공부할 때는 노트북 살 때의 경험을 떠올리면서 들으니 다른 파트보다 조금 더 재밌게 들을 수 있었던 것 같다.알고리즘에서는 다양한 정렬 방법들과 동적 프로그래밍에 대해 배웠다. 정렬에 대해 공부할 때는 각각의 장단점을 비교하면서 언제 적합하게 사용할 수 있을지를 주요 포인트로 공부했다. 이미 이전에도 몇 번 봤던 개념이라 막 어렵다는 느낌은 없었다. 그런데 동적 프로그래밍이 개인적으로 좀 어려웠던 것 같다. 동적인건 언제나 어렵다, 다 정적이었으면 좋겠다 라고 궁시렁 거리면서 공부했다. 그래도 감자쌤과 함께 찬찬히 공부하니 완벽하게는 아니어도 어렴풋이 개념은 잡을 수 있었던 것 같다. 인프런 워밍업 클럽 2기 후기한 번도 공부해보지 않은 CS를 공부해보겠다고 시작한 워밍업 클럽은 생각보다 빠르게 지나갔다. 회사 일이랑 이직 준비랑 다른 스터디에 엄청 치이면서도 워밍업 클럽을 포기하지 않은 건, 하루에 수행할 수 있는 적합한 학습량과 감자쌤의 친절나긋한 설명 덕분이 아닐까 싶다. 그리고 워밍업 클럽을 같이 진행하면서 열심히 하시는 다른 분들의 모습에도 많은 자극을 받았던 것 같다. 3주 동안 감자쌤과 함께 배운 내용들을 완벽하게 이해했다고 할 수는 없지만, 전반적인 내용을 파악했고 어느 부분이 어려운지도 알았으니 앞으로 공부하면서 부족한 부분들을 더 채워나가야겠다.

알고리즘 · 자료구조인프런인프런워밍업클립CS운영체제자료구조알고리즘감자3주차

또니

[인프런 워밍업 클럽 2기 CS] 3주차 발자국

[3주차 학습 내용]자료구조와 알고리즘삽입 정렬: 정렬되지 않은 위치에서 데이터를 꺼내 정렬된 위치의 적절한 곳에 삽입하는 알고리즘이해와 구현이 간단하지만 성능이 좋지 않다.O(n^2)의 시간복잡도를 가지고 있다.병합 정렬: 해결하기 힘든 문제가 발생하면 해결하기 쉬울 때까지 쪼개어 하나씩 해결하는 알고리즘이해와 구현이 어렵지만 성능이 좋다.O(n log n)의 시간복잡도를 가지고 있다.퀵 정렬: 분할 정복 알고리즘의 하나로 배열의 값 중 하나를 피벗으로 설정하여 정렬하는 알고리즘이름과 같이 보통은 빠르고, 메모리 사용량이 적다.피벗의 선택에 따라 성능의 차이가 있고, 최악의 경우 속도가 느려질 수 있다.보통은 O(n log n), 최악의 경우 O(n²)의 시간복잡도를 가지고 있다.메모이제이션: 계산 결과를 기억해 중복된 계산을 하지 않는 기법하향식 계산 방식속도는 빠르지만 메모리의 사용량이 있다.타뷸레이션: 계산에 필요한 값을 전부 계산 한 뒤 테이블에 저장하는 기법상향식 계산 방식 운영체제가상메모리, 동적주소변환, 세그멘테이션, 페이징, 페이지드 세그멘테이션, 디맨드 페이징, 페이지 교체 정책스레싱과 워킹셋, 입출력 장치,파일 시스템[3주차 회고]3주간의 스터디가 이렇게 마무리 되었다. 정말 필요했던 자료구조 지식을 공부하여 알고리즘 문제를 푸는데 큰 도움이 되었고, 회사에서 일을 하는데에 운영 체제 지식이 조금 필요했던 타이밍에 좋은 기회로 공부하여 의견을 제시할 수 있어서 일을 잘 마무리 할 수 있었다. 이번 CS지식 강의는 정말 어렵고 지루할 수 있었던 분야를 그림으로 쉽게 풀어 이해할 수 있도록 설명해주신 것이 이해하는데에 엄청 큰 도움이 되었다.비록 중간 점검때에 야근 이슈로..참여를 하지 못해 수료는 하지 못했지만 끝까지 공부할 수 있는 환경과 목표를 가질 수 있게 좋은 프로그램을 만들어주신 인프랩 직원분들과 좋은 강의를 제공해주신 감자님께 감사인사드립니다.알고리즘 강의 링크 👉그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)운영체제 강의 링크 👉그림으로 쉽게 배우는 운영체제

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

seongmin kim

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

운영체제1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터휘발성 메모리컴퓨터의 bit = 레지스터의 크기메인메모리의 값을 가져와서 레지스터에서 연산하고 메인메모리로 저장캐시레지스터와 메인메모리 속도 차이 때문에 미리 데이터를 가져다 놓는 곳 메인메모리(RAM) 휘발성 메모리실제 운영체제와 다른 프로세스들이 올라오는 공간가격이 비쌈보조저장장치(HDD / SSD) 비휘발성 메모리파일 저장 공간2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터(Boundary Register): 주기억 장치(RAM)내에 존재하는 프로그램은 크게 운영체제와 사용자 영역으로 나뉜다. 사용자가 영역에 존재하는 OS영역에 침범하거나, 프로세스 경계를 벗어났다면 강제로 종료시킴3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식프로세스가 크다면, 메모리도 크게 할당 장점: '내부 단편화(연속된 공간에 할당되므로, 더 크게 할당되어 낭비되는 공간)'가 없음 단점: '외부단편화(공간이 남는데 연속된 공간이 아니라 할당 할 수 없는 현상)' 발생고정 분할 방식일정 크기로 나누고, 프로세스 크기와 상관없이 메모리 할당 장점: 구현이 간단하며, 오버헤드가 적음 단점: 크기보다 더 할당되는 '내부 단편화'가 발생4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요. 운영체제(OS)와 소프트웨어, 그리고 데이터를 저장하고 실행할 수 있도록 해 주기 때문에 실질적인 컴퓨터 사용을 위해선 꼭 필요하다. 6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일시스템의 효율적인 관리를 위해 빈 공간에 모아둔 free block List가 있다. 특정 파일을 삭제하면 파일시스템은 파일테이블의 헤더를 삭제하고 free block list를 추가하는데, 이렇게 삭제된 위치는 사용자로 하여금 삭제된 것처럼 보인다.실제로는 물리적 디스크에 그대로 남아 있으므로 복구할 수 있다.자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬 장점: 이해와 구현이 쉽다.단점: 성능이 좋지 않다.시간 복잡도: O(n²)선택정렬 장점: 이해와 구현이 쉽다.단점: 성능이 좋지 않다.시간 복잡도: O(n²)삽입정렬 장점: 이해와 구현이 쉽다.단점: 성능이 좋지 않다.시간 복잡도: O(n²)병합정렬 장점: 성능이 좋다.단점: 정렬 배열을 저장한 메모리 공간 필요하다.시간 복잡도: O(n log n)퀵정렬 장점: 성능이 좋다.단점: 피벗설정을 잘못할 경우 O(n²)의 성능이 될 수 있다. 저장할 공간이 추가로 필요하다.시간 복잡도: O(n log n)2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.- 메모이제이션 (Memoization)방식: 재귀 호출 과정에서 계산된 값을 메모리에 저장하고, 동일한 계산이 필요할 때 저장된 값을 재사용하는 방식이다. 즉, 하향식(Top-Down) 접근법으로, 문제를 재귀적으로 나누면서 필요할 때마다 계산을 수행한다.장점재귀적인 접근이기 때문에 구현이 직관적이며, 복잡한 문제를 분할하여 풀기 좋다.필요한 부분만 계산해서 저장하므로, 일부 입력값에 대해서만 최적화된 결과를 저장할 수 있다.단점각 재귀 호출마다 스택을 사용하므로, 호출 깊이가 깊어지면 스택 오버플로우가 발생할 수 있다.메모리를 적게 사용하려는 상황에서 재귀 호출의 오버헤드와 캐싱을 위한 메모리 사용이 부담이 될 수 있다.- 타뷸레이션 (Tabulation)방식: 작은 문제부터 차례대로 해결하면서, 테이블에 저장된 값을 이용해 큰 문제를 푸는 방식이다. 이는 상향식(Bottom-Up) 접근법으로, 배열을 사용해 반복적으로 값을 계산해 나가는 방식이다.장점반복적인 접근 방식을 사용하기 때문에 스택 오버플로우의 위험이 없다.재귀 호출이 없어 호출 스택을 줄일 수 있어 메모리 사용을 최적화할 수 있다.단점모든 경우를 계산해서 테이블에 저장하므로, 메모리 사용량이 많을 수 있다.문제를 작은 부분으로 분해하여 해결하는 과정이 덜 직관적일 수 있다.이에 따라, 메모리가 부족한 시스템에서 안정성을 고려한다면, 타뷸레이션을 선택하겠다.

알고리즘 · 자료구조워밍업클럽미션

minme9055

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

운영체제1. 메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.RAM: 빠른 읽기/쓰기가 가능하지만, 전원이 꺼지면 내용이 사라집니다.ROM: 읽기 전용이며, 내용이 영구적으로 보존됩니다.캐시: CPU와 가까이 있어 매우 빠르지만, 비용이 높습니다.가상 메모리: 하드디스크 일부를 RAM처럼 사용합니다. 속도는 느리지만 큰 용량을 사용할 수 있습니다.2. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터(Boundary Register)입니다. 이것이 없으면 프로그램들이 운영체제 영역을 무단으로 접근할 수 있어 문제가 생길 수 있습니다.3. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?고정 분할: 설정과 관리가 쉽습니다. 하지만 메모리 낭비가 심할 수 있습니다.가변 분할: 메모리를 효율적으로 사용할 수 있습니다. 다만 관리가 조금 복잡할 수 있습니다.4. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스래싱(Thrashing)이라고 합니다. 시스템이 너무 바빠서 정작 실제 작업은 못 하는 상황을 말합니다.5. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요? 이유를 함께 적어주세요.네, 필요합니다. 전원이 꺼져도 데이터를 유지해야 하기 때문입니다. 하지만 RAM만으로 운영되는 특수한 시스템도 있긴 합니다. 이를 "RAM 디스크" 또는 "메모리 전용 시스템"이라고 부릅니다. 주로 아주 빠른 처리 속도가 필요하거나, 데이터의 영구 저장이 필요 없는 특수한 경우에 사용됩니다.6. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제해도 실제 데이터는 지워지지 않고, 그 공간을 재사용 가능하다고 표시만 합니다. 그래서 덮어쓰기 전이라면 복구가 가능합니다.자료구조와 알고리즘1. 지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블 정렬: 구현이 쉽지만, 속도가 느립니다 (O(n^2))선택 정렬: 구현이 쉽지만, 역시 속도가 느립니다 (O(n^2))삽입 정렬: 작은 데이터에 효과적이며, 평균/최악의 경우 O(n^2)입니다병합 정렬: 안정적이고 항상 O(n log n)의 성능을 보이지만, 추가 메모리가 필요합니다퀵 정렬: 평균적으로 빠르며 O(n log n), 최악의 경우 O(n^2)의 성능을 보입니다2. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.타뷸레이션을 사용하는 것이 좋습니다. 메모이제이션은 재귀 호출을 많이 하기 때문에 스택 오버플로우가 발생할 수 있어요. 반면 타뷸레이션은 반복문으로 해결하기 때문에 메모리를 덜 사용합니다.

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

Taeho

인프런 워밍업 클럽 - CS Week 3

AlgorithmInsertion Sort영역을 2개로 나누어서 정렬을 수행하는 알고리즘정렬된 영역정렬되지 않은 영역정렬되지 않은 영역에서 데이터를 하나씩 꺼내서 정렬된 영역 내의 적절한 위치에 삽입하여 정렬하는 알고리즘시간 복잡도 : O(n^2) 장점구현이 간단하고 이해하기 쉬움추가적인 메모리 소비가 적다.단점데이터의 상태에 따라 성능 편차가 크다.최선 : O(n)최악 : O(n^2)Merge Sort재귀로 구현하는 정렬 알고리즘시간 복잡도 : O(n log n)Divide & Conquer복잡한 문제를 더 작고 관리하기 쉬운 하위 문제들로 나누어 해결하는 알고리즘 설계 기법구현 방법분할(Divide): 정렬할 배열을 거의 같은 크기의 두 부분 배열로 나눈다.정복(Conquer): 각 부분 배열을 재귀적으로 정렬한다.결합(Combine): 정렬된 부분 배열들을 하나의 정렬된 배열로 병합한다.장점속도가 빠르다.단점병합 과정에서 임시 배열이 필요하여 추가적인 메모리 공간을 사용한다.이해와 구현이 어렵다.Quick SortPivot을 사용하여 정렬하는 알고리즘시간 복잡도평균 케이스: O(n log n)최악의 케이스: O(n^2)최선의 케이스: O(n log n)구현 방법피벗 선택배열에서 피벗으로 사용할 요소를 선택일반적으로 첫 번째, 마지막, 또는 중간 요소를 선택분할 (Partition)피벗을 기준으로 배열을 두 부분으로 나눈다.피벗보다 작은 요소들은 왼쪽으로, 큰 요소들은 오른쪽으로 이동재귀 호출분할된 두 부분 배열에 대해 Quick Sort를 재귀적으로 적용한다.종료 조건부분 배열의 크기가 1 이하가 될 때까지 재귀를 반복한다.결합정렬된 부분 배열들이 자동으로 하나의 정렬된 배열로 합친다.장점공간 효율성: 추가 메모리 공간을 거의 필요로 하지 않는 제자리 정렬 알고리즘캐시 친화적: 지역성이 좋아 캐시 성능이 우수병렬화 가능: 분할 정복 접근 방식으로 인해 병렬 처리에 적합단점불안정 정렬: 동일한 키 값을 가진 요소들의 상대적 순서가 보존되지 않을 수 있다.최악의 경우 성능: 피벗 선택이 잘못되면 O(n^2)의 시간 복잡도를 가질 수 있다.재귀적 특성: 재귀 호출로 인해 스택 오버플로우가 발생할 수 있다.Memoization중복되는 연산을 저장하고, 같은 계산이 필요할 때 저장된 결과를 사용한다.재귀 호출로 구현한다.재귀 함수에 비해 함수 호출 수가 줄어들어 성능이 비교적 우수하다.분할 정복을 해결할 때 재귀가 더 직관적인 경우에 사용한다.Tabulation상향식 계산 방식계산에 필요하지 않을 수 있는 값도 미리 계산해 테이블에 저장하는 방식재귀가 직관적이지 않은 경우에 사용한다.OS가상 메모리물리 메모리가 처리할 수 없는 용량을 프로세스들이 요구할 때 물리 메모리 내용의 일부를 하드 디스크에 있는 스왑 영역으로 옮기고 처리가 필요할 때 물리 메모리로 가져와서 처리한다.→ 물리 메모리가 처리할 수 없는 용량의 작업들을 처리할 수 있게 한다.메모리 관리자는 가상주소와 물리 주소를 1: 1 매핑 테이블로 관리한다.가상 메모리 시스템에서는 OS 영역을 제외한 나머지 영역을 일정한 크기로 나누어서 프로세스에게 할당한다.Segmentation(가변 분할 방식)세그멘테이션 테이블이라는 테이블이 존재Base AddressBound Address⇒ 두 주소를 사용하여 물리 메모리 주소를 계산한다.AddressBase Address프로세스나 세그먼트의 물리 메모리 상 시작 주소를 나타낸다.MMU의 base register에 저장되어 주소 변환에 사용Bound Address (또는 Limit)프로세스나 세그먼트의 크기를 나타낸다.MMU의 bound/limit register에 저장되어 메모리 보호에 사용된다.STBR(Segment Table Base Register)OS는 컨텍스트 스위칭을 할 때마다 메모리 관리자내의 Segment Table Base Register를 해당 프로세스의 것으로 값을 바꿔줘야 한다.→ Context Switching이 고비용 작업인 이유장점메모리를 가변적으로 분할할 수 있다.코드 영역, 데이터 영역, 스택 영역, 힙 영역을 모듈로 처리할 수 있어 공유와 각 영역에 대한 메모리 접근보호가 편리하다.단점외부 단편화 발생Paging(고정 분할 방식)세그멘테이션 기법의 외부 단편화를 해결하기 위해 고안된 배치 정책페이징은 메모리를 할당할 때 정해진 크기의 페이지로 나눈다.→ 외부 단편화가 발생되지 않는다.Page : 일정한 크기로 균일하게 나뉘어진 논리주소공간Frame : 일정한 크기로 균일하게 나뉘어진 물리주소공간Page Table가상 주소를 물리 주소로 변환하는데 사용하는 테이블각 프로세스의 가상 페이지 번호(VPN)을 물리 프레임 번호(PFN)로 매핑한다.각 프로세스마다 독립적인 Page Table을 갖는다.페이지 테이블에 Invalid로 되어 있으면 스왑영역에 저장되어 있는 상태Page Table Base Register(PTER)각 프로세스의 PCB에 위치하며, 해당 프로세스의 Page Table의 시작 주소를 가리킨다.OS는 컨텍스트 스위칭을 할 때마다 메모리 관리자내의 Segment Table Base Register를 해당 프로세스의 것으로 값을 바꿔줘야 한다.장점메모리를 효율적으로 관리할 수 있다.단점내부 단편화 발생세그멘테이션의 외부 단편화와 비교하면 많은 공간을 비교하지 않는다.Segmentation vs Paging세그멘테이션은 논리적인 영역별로 세그먼트를 나눈다.→ 세그먼트마다 크기를 다르게 나눌 수 있다.→ 크도 영역, 데이터 영역, 스택 영역, 힙 영역을 나눌 수 있다.페이징은 페이지의 크기가 고정되어 있어 논리적인 영역을 나눌 수 없다.→특정 영역만 떼어내서 공유하거나 권한을 부여하기 어렵다.Paged SegmentationSegmentation + PagingSegmentation Table과 Page Table을 결합하여 사용한다.메모리 접근 권한메모리의 특정 번지에 부여된 권한Read, Write, Execute각 프로세스는 코드 영역, 데이터 영역, 힙 영역, 스택 영역이 존재한다.→ 각 영역마다 접근 권한이 있다.코드 영역 : 프로그램 자체 ⇒ 읽기/실행 권한데이터 영역 : 일반변수, 전역변수, 상수로 선언한 변수 저장 ⇒ 읽기/(쓰기-Optional) 권한힙 영역 : 읽기/쓰기 권한스택 영역 : 읽기/쓰기 권한메모리 접근 권한 검사는 가상주소에서 물리주소로 변환될 때마다 일어난다.권한을 위반하는 경우 에러를 발생시킨다.DAT(Dynamic Address Translation, 동적 주소 변환)메모리 관리자가 물리 메모리와 스왑영역을 합쳐서 프로세스가 사용하는 가상주소를 물리주소로 변환하는 과정DAT를 거치면 프로세스는 마음대로 사용자 데이터를 물리 메모리에 배치할 수 있다.Page Table Entry(PTE)페이지 테이블을 이루고 있는 행접근 비트페이지가 메모리에 올라온 후 데이터에 접근이 있었는지 알려주는 비트1 : 메모리에 읽기나 실행 작업을 수행한 경우변경 비트페이지가 메모리에 올라온 후 데이터에 변경이 있었는지 알려주는 비트1 : 쓰기 작업을 수행한 경우유효 비트페이지가 물리 메모리에 있는지 알려주는 비트1 : 페이지가 스왑영역에 위치0 : 페이지가 물리 메모리에 위치권한 비트해당 메모리에 접근권한이 있는지 검사하는 비트Page Fault프로세스가 가상 메모리에 접근요청을 했을 때 MMU(메모리 관리자)는 페이지 테이블을 보고 물리 메모리의 프레임을 찾아낸다.물리 메모리에 프레임이 없다면 MMU는 Page Fault라는 인터럽트를 발생시킨다.Page Fault가 발생하면 스왑영역에 접근하고 해당 프로세스는 대기 상태가 된다.→ 스왑 영역의 데이터가 메모리로 올라가는 작업을 수행한다.→ 데이터가 물리 메모리로 올라가는 경우 해당 프로세스가 실행 상태로 변경된다.스레싱프로세스들이 실제 실행되는 시간보다 페이지를 교체하는 데에 더 많은 시간을 사용하고 있는 현상⇒ 페이지 부재(page fault)가 과도하게 발생하여 CPU 이용률이 급격히 떨어지는 현상다중 프로그래밍의 정도가 높아져 각 프로세스에 할당된 메모리가 부족해지면서 발생CPU 이용률 저하 → 운영체제의 다중 프로그래밍 증가 → 페이지 부재 증가의 악순환이 반복근본적인 원인 : 물리 메모리의 크기가 부족한 것→ 메모리의 크기를 늘려서 해결(H/W 수준)할 수 있다.S/W 수준의 해결 방법프로세스가 실행되면 일정량의 페이지를 할당한다.→ Page Fault가 빈번하게 발생하는 경우 : 더 많은 용량의 페이지를 할당한다.→ Page Fault가 거의 없는 경우 : 적은 용량의 페이지를 할당한다.File데이터 집합 구성에 따른 분류순차파일구조파일의 내용이 연속적으로 이어진 형태ex) 카세트테이프장점모든 데이터가 순차적으로 기록되기 때문에 공간의 낭비가 없고, 구조가 단순하다.단점특정지점에 바로 이동이 어려워 데이터를 삽입하거나 삭제하려면 탐색하는데 시간이 오래 걸린다.직접파일구조저장하려는 데이터의 위치를 해시 함수를 통해 결정하는 구조자료구조에서 Hash Table이라고 불린다.ex) JSON장점해시 함수를 사용하기 때문에 데이터 접근이 굉장히 빠르다.단점해시함수의 선정이 굉장히 중요하다.저장공간이 낭비될 수 있다.인덱스 파일 구조순차접근과 직접접근 방식의 장점을 취한 구조 <탐색키, 레코드 포인터> 쌍으로 구성데이터 파일과는 별도로 저장되며, 빠른 검색을 위해 사용된다.File Descriptor(= File Control Block)OS가 파일을 제어하기 위한 정보를 보관하는 Block파일마다 독립적으로 존재한다.저장장치에 존재하다가 파일이 오픈되면 메모리로 이동한다.OS가 관리하고 사용자가 직접 참조할 수 없다.사용자는 File Descriptor를 사용하여 File에 접근할 수 있다.파일의 맨 앞에 위치해서 사용자가 쓰거나 읽기를 시작하면 처음부터 진행한다.느낀점회사에서 프로젝트와 병행하면서 '오늘 하루는 괜찮지 않을까...?' 라는 안일한 생각을 했었지만 디스코드 커뮤니티에서 다들 열심히 일하는 모습을 보고 자극 받아 하루도 빠짐없이 완강하게 될 수 있었다.스터디를 하는게 강제성이 부여되는 것 같아서 안일한 생각을 뿌리칠 수 있었다.개발을 하다가 상사분들이 하는 얘기를 잘 따라가지 못했었는데 CS 강의를 듣고 나니 '아~ 이래서 그런 얘기를 하신거구나'라는 생각이 들게 되었다.다음번에도 스터디가 있으면 적극적으로 참여해야겠다. 

알고리즘 · 자료구조워밍업클럽CS전공지식Week3

알고리즘

*이 내용은 인프런 그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)을 수강하며 정리한 내용입니다.  재귀(recursion)재귀는 어떠한 것을 정의할 때 자기 자신을 참조하는 것을 뜻해. 그러므로 재귀함수는 탈출 조건, 즉 기저 조건이 반드시 있어야 해.콜스택함수가 호출되면서 올라가는 메모리 영역으로 스택이라고도 불러. FILO의 특징을 띄고있어.상향식 계산 vs 하향식 계산재귀를 이용한 상향식 계산하지만 재귀는 하향식 계산일 때 위력을 발휘해!하노이 탑function hanoi(count, from, to, temp){ if(count == 0) return; hanoi(count - 1, from, temp, to); console.log(`${count} ${from} -> ${to}`); hanoi(count - 1, temp, to, from); } hanoi(3, "A", "C", "B"); 정렬버블정렬데이터를 옆 데이터와 비교하는 정렬이야.function BubbleSort(arr){ for(let i = 0; i < arr.length - 1; i++){ for(let j = 0; j < (arr.length - i - 1); j++){ if(arr[j] > arr[j + 1]){ // j, j+1 비교 let temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }성능위와 같으므로 빅 오는 O(n**2)이 돼!성능이 중요한 시스템을 만드려면 버블 정렬은 어려울 수도 있어...장점 : 이해와 구현이 간단함단점 : 성능이 좋지 않음선택 정렬배열의 정렬되지 않은 영역의 첫 번째 원소를 시작으로 마지막 원소까지 비교 후 가장 작은 값을 첫 번째 뭔소로 가져오는 정렬이야.function SelectionSort(arr){ for(let i = 0; i < arr.length - 1; i++){ let minValueIndex = i; for(let j = i + 1; j < arr.length; j++){ // 가장 작은 index 찾기 if(arr[j] < arr[minValueIndex]){ minValueIndex = j; } } let temp = arr[i]; arr[i] = arr[minValueIndex]; arr[minValueIndex] = temp; } }성능 버블정렬과 동일해! 즉 선택 정렬의 정렬도 O(n**2)이야.장점 : 이해와 구현이 간단함단점 : 성능이 좋지 않음  삽입정렬정렬되지 않은 영역의 데이터를 정렬된 영역에 끼워 넣는 정렬방식이야. 정렬된 영역을 뒤에서부터 역순으로 비교해.function InsertionSort(arr){ for(let i = 1; i < arr.length; i++){ let insertingData = arr[i]; let j; for(j = i - 1; j >= 0; j--){ if(arr[j] > insertingData){ arr[j + 1] = arr[j]; }else{ break; } } arr[j + 1] = insertingData; } } 성능 :위 정렬들과 마찬가지고 O(n**2)이야.장점 : 이해와 구현이 간단함단점 : 성능이 좋지 않음병합정렬분할 정복 알고리즘이야.숫자 하나가 들어있는 배열로 만들어주었으면 두 배열을 순서에 맞게 정렬한 후 두개의 숫자가 들어있는 배열 하나로 만들어 줘.이런식으로~같은 방식으로 이렇게 배열해주면 돼.function MergeSort(arr, leftIndex, rightIndex){ if(leftIndex < rightIndex){ let midIndex = parseInt((leftIndex + rightIndex) / 2); MergeSort(arr, leftIndex, midIndex); MergeSort(arr, midIndex + 1, rightIndex); Merge(arr, leftIndex, midIndex, rightIndex); } } function Merge(arr, leftIndex, midIndex, rightIndex){ let leftAreaIndex = leftIndex; let rightAreaIndex = midIndex + 1; let tempArr = []; tempArr.length = rightIndex + 1; tempArr.fill(0, 0, rightIndex + 1); let tempArrIndex = leftIndex; // tempArrIndex에 정렬해주기 ( leftArea 혹은 rightArea 둘 중 하나 정렬.) while(leftAreaIndex <= midIndex && rightAreaIndex <= rightIndex){ // 왼쪽 영역과 오른쪽 영역이 정렬되지 않을 동안 if(arr[leftAreaIndex] <= arr[rightAreaIndex]){ tempArr[tempArrIndex] = arr[leftAreaIndex++]; }else{ tempArr[tempArrIndex] = arr[rightAreaIndex++]; } tempArrIndex++; } // 남은 절반 값 넣어주기 // 한쪽 영역이 전부 병합되었다면 나머지 영역은 정렬이 되어있다. if(leftAreaIndex > midIndex){ for(let i = rightAreaIndex; i <= rightIndex; i++){ tempArr[tempArrIndex++] = arr[i]; } }else{ for(let i = leftAreaIndex; i <= midIndex; i++){ tempArr[tempArrIndex++] = arr[i]; } } for(let i = leftIndex; i <= rightIndex; i++){ arr[i] = tempArr[i]; } }성능하나의 데이터와 하나의 데이터가 하나로 합쳐질 때 비교 연산을 두 번 해.마찬가지로 두개의 데이터와 두개의 데이터가 하나로 합쳐질 때에는 비교가 네번 이루어져.각 단계를 거칠 때마다 영역의 수가 반으로 줄기 때문에 log(n)으로 말할 수 있어.분할된 배열을 병합할 때는 n개의 데이터를 n번 비교하므로n과 log(n)을 곱해서 O(nlogn)이야.장점 : 성능이 좋음단점 : 이해와 구현이 어려움퀵정렬병합정렬과 마찬가지고 분할 정복 알고리즘이야.우선 pivot을 랜덤으로 설정해.leftStartIndex는 오른쪽으로 이동하다가 피벗보다 큰 값을 만나면 멈춰.rightStartIndex는 왼쪽으로 이동하다가 피벗보다 작은 값을 만나면 멈춰.그리고 두 값을 swap 해.계속 반복하다가 서로 지나치게 되면 rightStartIndex와 pivot을 swap해줘.이렇게되면 pivot를 기준으로 왼쪽은 모두 pivot보다 작은 값이 위치하고, 오른쪽은 모두 pivot보다 큰 값이 위치하게 돼.이를 반복하면 되는거지!quickSortfunction quickSort(arr, left, right){ if(left <= right){ // 기저 조건 let pivot = divide(arr, left, right); // 정렬된 pivot의 위치 console.log(right); quickSort(arr, left, pivot - 1); quickSort(arr, pivot + 1, right); } }dividefunction divide(arr, left, right){ // 정렬 let pivot = arr[left]; let leftStartIndex = left + 1; let rightStartIndex = right; while(leftStartIndex <= rightStartIndex){ // leftStartIndex 이동 while(leftStartIndex <= right && pivot >= arr[leftStartIndex]){ leftStartIndex++; } while(rightStartIndex >= (left + 1) && pivot <= arr[rightStartIndex]){ // rightStartIndex 이동 rightStartIndex--; } if(leftStartIndex <= rightStartIndex){ // 서로 지나치지 않았다면 swap swap(arr, leftStartIndex, rightStartIndex); } } swap(arr, left, rightStartIndex); // pivot과 rightStartIndex를 swap return rightStartIndex; }swapfunction swap(arr, index1, index2){ let temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; } 성능데이터가 한 개가 될 떄까지 반으로 나누므로 log(n)!이 작업을 데이터 n개만큼 반복해야하므로 n을 곱함!보통 최악의 pivot을 선택하는 경우는 드물기때문에 평균 성능인 nlogn으로 표시해.퀵 정렬의 장단점은 병합 정렬과 동일해. 병합 정렬이 더 좋아보이지만 실제로 퀵 정렬이 더 좋게 평가돼.  동적 프로그래밍메모이제이션피보나치 수열을 구현할 때 재귀함수를 이용하게되면 위 사진처럼 중복되는 호출이 많아. 그럼 중복되는 계산 결과를 저장하고, 같은 계산이 필요할 때 저장도니 결과를 사용하면 더 좋겠지?그렇게되면 함수의 호출 수가 줄어들게되고 성능이 향상될거야.이를 메모이제이션이라고 해.그럼 어떤 자료구조를 사용하면 될까? 바로 해시 테이블이야.빠른 데이터 탐색, 삽입, 삭제가 가능하기 때문이지!해시 테이블의 key로 계산하려는 값을, value로 계산 결과를 저장하면 검색을 빠르게 할 수 있을거야.자바스크립트 객체 또한 해시테이블이므로 이를 이용하여 코드를 작성해볼게.function fibonacci2(n, memo){ if(n == 0 || n == 1) return n; if(memo[n] == null){ // 계산 결과가 없다면 저장 memo[n] = fibonacci2(n - 2, memo) + fibonacci2(n - 1, memo); } return memo[n]; }이러면 실행 속도가 훨씬 빨라져.타뷸레이션function fibonacci2(n, memo){ if(n == 0 || n == 1) return n; if(memo[n] == null){ memo[n] = fibonacci2(n - 2, memo) + fibonacci2(n - 1, memo); } return memo[n]; }   참조 : 그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편) 3주차 회고칭찬하고 싶은 점 : 기한을 지켰다 😅아쉬웠던 점 : 권장 커리큘럼을 지키지 못했다.

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

유선아

[발자국] 인프런 워밍업클럽 CS 2기 3주차 발자국

학습 했던 내용 요약자료구조 및 알고리즘   버블정렬장점 : 이해와 구현이 간단하다.단점 : 성능이 좋지 않다.시간 복잡도 : O(n²)선택 정렬장점 : 이해와 구현이 간단하다.단점 : 성능이 좋지 않다.시간 복잡도 : O(n²)삽입 정렬장점 : 이해와 구현이 간단하다.단점 : 성능이 좋지 않다.시간 복잡도 : O(n²)병합 정렬장점 : O(nlog n) 성능으로 버블, 선택 , 삽입 정렬보다 성능이 훨씬 좋다.단점 : 재귀적인 기법으로 이해하기 어렵고, 구현하기 어렵다.시간 복잡도 : O(n logn)퀵 정렬장점 : 성능이 좋고, 병합 정렬보다도 적은 메모리 공간을 차지해 더 좋은 알고리즘으로 평가 받는다.단점 : 재귀적인 기법으로 이해하기 어렵고, 구현하기 어렵다.시간복잡도 : O(n logn)메모이제이션계산 결과를 저장해서 여러번 계산하지 않도록 하는 기법계산 결과를 해시 테이블에 저장하고 재사용해 속도가 빠르다 .하향식 계산 방식으로 문제를 해결한다. 타뷸레이션계산에 필요한 모든 값을 전부 계산 후 테이블에 저장하는 기법상향식 계산 방식으로 문제를 해결한다. 운영체제가상메모리컴퓨터의 물리적 메모리의 크기를 확장하기 위해 사용되는 기술 동적주소변환 (Dynamic Address Translation)메모리 관리자가 물리 메모리와 스왑 영역을 합쳐서, 프로세스가 사용하는 가상 주소를 물리 주소로 변환하는 것가변분할 방식을 이용하는 세그멘테이션 기법메모리 관리자내에 있는 Segment Table Base Register를 이용해 세그멘테이션 테이블 찾아내고, 이를 이용해 논리 주소를 물리 주소로 변환한다. 메모리를 가변적으로 분할 할 수 있지만, 가변 분할의 단점인 외부 단편화가 발생한다 .고정분할 방식을 이용한 페이징 기법메모리를 할당 할 때 정해진 크기의 페이지의 나누는 기법으로 메모리 관리자 내에 Page Table Base Register를 이용해서 물리 메모리에 있는 페이지 테이블을 찾고 , 이를 이용해 논리 주소를 물리 주소로 변환한다. 페이징은 외부 단편화가 발생하지 않는 대신, 내부 단편화가 발생한다. 페이지드 세그멘테이션 세그멘테이션과 페이징을 혼합해 장점을 취한 방식으로물리 메모리에 접근하기 위해서 메모리에 접근을 두 번 해야 한다는 단점이 있다. 1. 세그멘테이션 테이블을 참조할 때 2. 페이지 테이블을 참조할 때디맨드 페이징 (가져오기 정책)조만간 필요할 것 같은 데이터를 메모리로 가져오고, 쓰이지 않을 것 같은 데이터는 스왑영역으로 이동시키는 정책페이지 테이블 엔트리 PTE 페이지 테이블을 이루고 있는 한 행페이지 테이블 엔트리는 프레임 넘버로 구성되어 있는데, 실제로는 접근 비트, 변경 비트, 유효 비트, 읽기-쓰기-실행 비트 등 더 많은 비트 들이 있다.Page Fault Page Fault는 프로세스가 가상 메모리에 있는 페이지에 접근하려고 할 때, MMU가 페이지 테이블을 참조하여 해당 페이지가 물리 메모리에 존재하는지 확인하는 과정에서, 물리 메모리에 해당 페이지가 없는 경우 발생하는 인터럽트다.페이지 교체 정책페이지 교체 정책은 메모리에 빈 공간이 없을 때, 어떤 페이지를 선택해서 스왑 영역으로 보낼지(스왑 아웃)를 결정하는 운영체제의 정책이다.스왑 인은 스왑 영역에서 물리 메모리로 페이지를 가져오는 것이고, 스왑 아웃은 물리 메모리에서 스왑 영역으로 페이지를 보내는 것이다. 이러한 스왑 인과 스왑 아웃의 적절성은 운영체제가 판단한다.Random 무작위로 선택하는 방법FIFO 메모리에 들어온 지 가장 오래된 페이지를 선택하는 방법 Optimum 앞으로 가장 오랫동안 쓰이지 않을 페이지를 선택하는 방법LRU (Least Recently Used) 최근에 가장 사용이 적은 페이지를 선택하는 방법 Clock 알고리즘 : 접근비트 하나만 이용하고, 일정 시간 간격마다 모든 페이지의 접근비트를 0으로 초기화 한다.Enhanced Clock Algorithm : 변경 비트까지 보는 향상된 Clock 알고리즘2차 기회 페이지 교체 알고리즘 : FIFO 방식에서 자주 사용되는 페이지에게는 또 한 번의 기회를 주는 것. FIFO 방식과 동일하게 동작하지만, 만약 Page Fault 없이 페이지 접근에 성공했다면, 해당 페이지를 큐에 맨 뒤로 이동시켜 수명을 연장시켜주는 방식스레싱CPU 사용률을 높이려 했지만 오히려 더 떨어지는 상황이 나오는 것워킹셋현재 메모리에 올라온 페이지는 다시 사용할 확률이 높기 때문에 하나의 세트로 묶어서 메모리에 올리는 것 워킹셋은 프로세스가 준비 상태에서 실행 상태가 되는 컨텍스트 스위칭을 할 때 사용된다.회고일주일 동안 스스로 칭찬하고 싶은 점일주일치 진도대로 인강을 다 수강하고, 미션과 발자국도 기한내에 진행한 점. 아쉬웠던 점며칠은 복습이 잘 되었고, 며칠은 복습은 잘 하지 못한 점 보완하고 싶은 점 이해가 어려웠던 부분들은 더 찾아보면서 이해해보기 다음주 학습 목표한번 배웠다고 끝내는 것이 아니라 계속해서 복습을 진행하기 출처 : 그림으로 쉽게 배우는 운영체제 - 감자 , 그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)- 감자

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

채널톡 아이콘