블로그

감자

램(RAM)은 어떤 역할을 할까요?

혹시 데스크톱이나 노트북을 살 때 상품 스펙을 본 적 있으신가요?컴퓨터를 좀 안다는 사람들은 가격과 이 스펙을 보면서 비교합니다.스펙을 보면 메모리가 항상 표시되어 있습니다.메모리는 어떤 역할을 하는 걸까요?하드디스크랑은 어떤 차이가 있는 것일까요? 램은 이렇게 생긴 녀석입니다.Random Access Memory의 약자를 따서 RAM이라고 부르죠.램은 폰 노이만 구조 컴퓨터에서 빠질 수 없는 장치입니다.(현대 컴퓨터는 모두 폰 노이만 구조임!)CPU는 0과1을 단순 계산하는 능력만 갖고 있는 계산기이고 많은 데이터를 저장할 수 없답니다.기억력이 부족한 CPU를 위해서 램이라는 것이 필요합니다.여러분이 만든 프로그램이나 다른 사람이 만든 프로그램을 실행시키면 "프로그램이 메모리에 올라간다" 라고 말합니다.하드디스크나 SSD에 저장된 프로그램이 RAM으로 이동하는 과정을 말합니다.사실 하드디스크나 SSD와 같은 보조 저장장치는 컴퓨터의 실행에서 중요한 역할은 하지 않습니다.저는 어렸을 때 스타래프트나 디아블로를 하기 위해서 PC방에 자주 갔었습니다.(성큰 디펜스 좋아했어요😊)출처 인터넷 커뮤니티이때는 자리에 앉기 전에 사장님한테 게임 CD를 받고, CD를 삽입해서 게임을 즐겼었죠.😁 (PC방 카운터에 CD가 진열되어 있었답니다)출처 인터넷 커뮤니티(아저씨 디아 CD주세요)출처 나무위키 아이템을 복사, 아이템을 싸게 판다는 사기도 많이 당해서 인생이 호락호락하지 않다는 것을 깨닫기도 했어요.마우스도 지금과는 많이 달라서 게임 도중에 마우스 볼이 잘못돼서 억울하게 게임을 졌던 추억도 있네요... ㅎㅎ(가운데 볼이 움직여서 마우스 커서 움직임... 지금의 레이저 방식과 비교하면 너무 올드하죠?)출처 인터넷 커뮤니티 갑자기 옛날이야기가 나와서 저도 모르게 너무 신났네요.(라떼는....)다시 본론으로 돌아와서!이렇게 CD를 넣고 게임을 실행한 이유는 뭐였을까요?이때는 하드디스크, 즉 보조 저장장치의 용량이 너무 작아서 CD가 보조 저장장치 역할을 대신한 것이었습니다.CD 컴퓨터의 CD롬에 넣으면 프로그램이 램에 올라가서 게임을 실행할 수 있었죠.하드디스크는 없더라도 램은 꼭 있어야 하는 장치죠.요즘 컴퓨터에선 많은 프로그램을 동시에 실행시킵니다.램의 크기가 16GB, 32GB 등으로 그렇게 크지 않은데 많은 프로그램을 동시에 실행시킵니다.이는 보조 저장장치를 이용하는 가상 메모리라는 기술이 등장해 가능해졌습니다. 속도는 조금 느리만요.😥CD나 하드디스크, SSD에 저장된 프로그램이 메모리로 이동하게 되면 그것을 프로세스라고 부릅니다.프로세스에 대해서 자세히 알고 싶다면 운영체제를 공부해보시는 건 어떨까요?컴퓨터의 역사와 함께 어떻게 동작하는지 자세히 배우게 됩니다. 😀add_shortcode('course','328188','list')

보안 · 네트워크 기타메모리메인메모리RAM운영체제

왜 CS 전공지식은 ‘개발자 기본기’로 꼽힐까?

컴퓨터 구조, 자료구조, 알고리즘, 운영체제, 네트워크, 데이터베이스 등은 컴퓨터공학 및 컴퓨터과학, 소프트웨어공학 등의 전공에서 반드시 배우는 주제로 꼽힙니다. 학교나 학과마다 커리큘럼에 차이는 있더라도 내용 자체는 모두 동일한 개념을 배우게 되는데요.이러한 CS 전공 지식은 컴퓨터 관련 학과에서의 전공 이해를 좌우할 뿐만 아니라, 개발자 채용을 위한 기술 면접 과정에서 주로 검증하는 핵심 개념이기도 합니다. 가령 서비스 개발자라면 비즈니스 로직을 구축하는 등, 프로그램의 구조를 만들고 문제를 해결하는 바탕이 되기 때문입니다. 이미 실무에 진출한 개발자들조차도 CS 전공 지식을 강조하는 이유가 여기에 있죠.다시 말해 CS 전공 지식은 개발자로서 필요한 문제 해결 역량을 결정하는 기본기 역할을 합니다. 대학생, 취업 준비생, 주니어 개발자 등을 막론하고 실력 있는 프로그래머가 되기 위한 든든한 뿌리가 필요하다면 CS 전공 지식에 주목해야 합니다.•••기술 면접 전, 실무 프로젝트 전 빠르게 기초를 정리하고 싶으신가요?지금 인프런 프리즘 [CS 전공 지식 로드맵]을 통해 학습해보세요. https://www.inflearn.com/roadmaps/643•••인프런 프리즘 브랜드 스토리 읽어보기 >>

개발 · 프로그래밍 기타CS전공지식컴퓨터구조알고리즘자료구조운영체제네트워크데이터베이스컴퓨터공학인프런프리즘InflearnPrism

대롱대롱

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

마지막 3주차 미션! 시작합니다 운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.레지스터 - 가장 빠른 기억장소로 CPU에 있어요. 휘발성 메모리입니다.캐시 - 레지스터와 메인 메모리 사이에 있는 휘발성 메모리입니다. 메인메모리에 있는 데이터를 미리 저장합니다.(메인)메모리 - 실제 운영체지와 다른 프로세스들이 올라가는 공간으로 휘발성 메모리입니다.보조기억장치(하드디스크,SSD) - 가격이 (상대적으로) 저렴하며 비휘발성메모리입니다. 사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터가 있어서 사용자 프로세스가 메모리의 운영체제 영역에 침범하게 되면 프로세스를 강제종료 시킬 수 있어요. 메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변분할 방식은 프로세스 크기에 맞는 메모리공간을 할당하는 방식입니다.내부단편화는 일어나지 않는다는 장점이 있지만 외부단편화가 발생할 수 있다는 단점이 있어요.고정분할 방식은 프로세스 크기에 상관없이 정한 크기만큼 공간을 할당하는 방식입니다.구현이 간단하고 오버헤드가 발생하지 않지만 내부단편화가 발생할 수 있다는 단점이 있어요. CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱이라고 합니다. 메모리 부족으로 페이지 폴트가 많이 발생하게 되어 대부분의 시간에 스왑을 하게 되는 현상입니다. HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?이유를 함께 적어주세요.꼭 필요하다고 할 수는 없습니다. 일반적으로 HDD나 SSD에 운영체제를 설치하고 컴퓨터 부팅할 때 불러와서 동작을 합니다. 그러나 HDD나 SSD에서만 이러한 동작을 할 수 있는 것은 아니기 때문에 꼭 필요하지는 않습니다. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?파일을 삭제하게 되면 파일시스템은 파일의 모든 정보를 지우는 것이 아니라 파일테이블의 헤더를 삭제하고 free block list에 추가합니다. 사용했던 블록을 이 리스트에 추가하기 때문에 사용했던 블록의 데이터는 그대로 남아있게 됩니다. 그렇기 떄문에 포렌식으로 파일을 복구할 수 있는 것입니다. 자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.버블정렬, 선택정렬, 삽입정렬위 세 정렬은 구현이 쉽고 직관적이지만 성능이 좋지 않습니다.(O(n^2))병합정렬큰 문제를 작은 문제로 쪼개서 해결하기 때문에 성능이 좋습니다(O(nlogn). 그러나 정렬할 배열을 넣을 메모리가 필요하다는 것이 단점입니다.퀵정렬공간효율적이고 캐시친화적이며 병렬화도 가능합니다. 정렬 알고리즘 중 우수한 성능을 보입니다.(O(nlogn)에 근접한 성능)그러나 피벗을 잘못 선택한다면 성능이 저하되어 최악의 경우 성능이 O(n^2)이 될 수도 있습니다. 메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.   재귀로 쉽게 구현할 수 있다면 메모이제이션이 좋지만 메모이제이션은 메모리를 많이 사용한다는 문제가 있습니다. 메모리가 부족한 이슈가 있기 때문에 결과적으로는 타뷸레이션을 사용할 것 같습니다.

cs자료구조운영체제미션

대롱대롱

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

드디어 스터디의 마지막 발자국을 작성하는 날이 왔습니다. - 이번주에 공부한 내용의 키워드 - 운영체제컴파일과 프로세스메모리-레지스터, 캐시, 메인메모리, 보조저장장치절대주소/상대주소가변분할/고정분할가상메모리동적주소변환세크멘테이션 분할방식/페이징 분할 방식스레싱/워킹셋여러가지 주변장치(입출력 디바이스와 저장장치)하드디스크파일과 파일시스템디렉토리디스크 자료구조와 알고리즘버블/선택/삽입/병합/퀵 정렬동적 프로그래밍(메모이제이션/타뷸레이션) - 이번주에 공부한 내용 요약 - 운영체제메모리는 가장 빠른 레지스터, 데이터 임시 저장하는 캐시, RAM이라 불리는 메인메모리, 그리고 보조기억장치가 있습니다. 물리주소는 말 그대로 물리적인 메모리 주소이고 논리주소는 사용자 관점에서 본 상대적 주소입니다. 메모리 할당방식으로는 가변분할방식과 고정분할방식이 있습니다. 현대에서는 두 가지 방식을 모두 사용하여 단점을 최소화하는 버디시스템을 사용합니다.가상메모리는 컴퓨터의 물리적 메모리의 크기를 확장하기 위해 사용되는 기술입니다. 동적주소변환은 메모리관리자가 가상메모리의 논리주소를 물리주소로 변환하는 것을 의미합니다.논리주소를 물리주소로 변환할 때 세그멘테이션 분할 방식은 메모리 관리자가 논리주소를 세그멘테이션 테이블을 이용해 물리주소를 찾고, 페이징 분할 방식은 논리주소를 페이지 테이블을 이용해 물리주소를 찾습니다.프로세스가 가상메모리에 접근요청 했을 때 물리메모리에 데이터가 없다면 페이지 폴터라는 인터럽트가 발생합니다. 이 때 HDD의 스왑영역에 있는 데이터를 메모리에 올리는 작업이 수행됩니다.스레싱은 페이지폴트가 발생해서 CPU사용률이 0에 가깝게 떨어지게 되는 현상을 의미합니다. 워킹셋은 메모리에 올라온 페이지를 하나의 세트로 묶어 메모리에 올리는 것을 의미합니다.주변장치들은 메인보드에 있는 버스로 연결되어 있으며 두 개의 채널과 두개의 버스로 구분합니다.파일관리자는 운영체제가 파일을 관리하기 위해 필요한 존재입니다. HDD나 flash memory는 블록 디바이스로 전송단위가 블록이지만 사용자는 바이트 단위로 파일에 접근해야 해서 파일관리자가 중간에서 관리해야합니다.파일은 순차파일구조, 직접파일구조, 인덱스파일구조가 있습니다.관련있는 파일을 모아두기 위해 필요한 것이 디렉토리입니다. 자료구조와 알고리즘정렬에는 크게 5가지 방식이 있습니다간단해서 구현은 쉽지만 성능은 좋지 못한 버블, 선택, 삽입 정렬과 이들보다 상대적으로 성능이 좋은 병합정렬과 퀵정렬이 있습니다.동적프로그래밍 방식으로 메모이제시녀과 타뷸레이션이 있습니다.메모이제이션은 계산결과를 기억하며 재귀를 사용합니다. 하향식 계산방식입니다.타뷸레이션은 계산에 필요한 모든 값을 계산하여 테이블에 저장하고 상향식 계산방식입니다.- 이번 주 회고 겸 스터디 회고 - 눈 깜짝할 사이에 스터디 마지막이 되었습니다. 완주를 위해 달려왔는데 목적했던 바를 이루어서 뿌듯합니다. 개인적으로 따로 다른 분들과 스터디를 했는데 운이 좋게도 열정적이고 좋은 분들을 만나 복습과 완강을 함께 할 수 있었습니다. 일주일에 세번씩 꾸준하게 디스코드 상에서 스터디를 했는데 아주 만족스러웠습니다. 덕분에 허물뿐인 완강이 아니라 제대로 공부하면서 완강을 하게 되었어요.이번주에는 중간점검도 있었는데 그 때 감자님께서 회고를 읽어보신다는 것을 알았습니다. 그동안 너무 주저리주저리 길게 쓰는 것은 지양해야겠다고 생각했는데 그냥 길~게 쓸걸 하는 아쉬움이 있습니다. 짧아서 심심하셨겠다는 생각이 드네요. 이번주 회고는 마지막인만큼 좀 분량 있게 써보겠습니다. 일단 이 CS스터디를 신청한 이유는 '그래도 개발의 길을 걷는 사람이 CS지식도 모르다니! 이럴 수는 없다!'는 마음이 있었기 때문입니다. 기본 지식은 쌓아야 한다는 생각이 강했어요(제가 운영체제 과목을 들은 적이 없습니다..^^;;). 그래서 제가 자주 하는 '일단 신청하자'를 시전했습니다. 왜 하필 이 강의를 선택했냐고 물으신다면 답은 하나입니다. 재미있어 보여서요. 저는 도파민중독자입니다. 일단 재미가 있어야 뭔가를 시작합니다. 감자님 강의를 보는데 애니메이션으로 설명하는 것이 너무 재미있어 보였어요. 이전에 '아 지금 공부하는 게 눈으로 보이면 좋겠다...'라는 생각을 했는데 이 강의가 딱 이 생각에 맞아버린 것이죠. 애니메이션으로 공부하니 재미있고 재미있으니 더 공부하고 싶고... 이런 선순환이 반복되어 어느덧 완강이라는 종착지에 다다르게 된 것입니다. 스터디원들과 스터디를 하다보니 발표자료도 만들게 되었는데 발표자료 만드는 것도 많은 정성을 기울였습니다. 남에게 보여야 하는 것인데 허접하게 만들 수는 없잖아요. 처음에는 노트앱에 기본으로 있는 템플릿을 썼는데 그 템플릿이 너무 마음에 들지 않았어요. 맘에 안들면 제가 만들면 됩니다(자급자족 라이프!). 그래서 만들어진 것이 '감자전용 템플릿'입니다. 귀엽게 디자인이 뽑혔고 이렇게 만든 템플릿 덕분에 스터디를 재미있게 할 수 있었던 것 같습니다. 강의 들으면서 1차적으로 적은 야생의 거친 필기를 이 템플릿으로 더 잘 정리하려는 마음에 한 파트 정리하는데 시간이 좀 많이 걸린다는 소소한 단점이 있기는 합니다... 그렇지만 이렇게 정리한 것이 나중에 복습할 때 도움이 크게 될 것이라 믿어 의심치 않습니다.적다보니 길어졌네요. 스터디가 끝나니 아쉬움이 남기는 합니다. 다음에도 이런 스터디가 또 열렸으면 좋겠어요. 저번에 들어보니 컴퓨터구조 강의도 준비하신다던데.... 그때 한번 또 스터디가 열렸으면 하는 소소한 바램이 있습니다. 이번에 들은 내용들 복습하면서 더 심화적인 내용도 개인적으로 공부해야겠습니다. 좋은 강의 감사하고 다음에 또 뵐 기회가 있으면 좋겠습니다.

운영체제자료구조CS워밍업클럽스터디

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주차 회고]순탄치 않았지만 개발 관련 인생 첫 스터디라는것을 모집해서 처음으로 참여를 하고 있습니다.처음에는 복습과 완강하자! 이런 가벼운 마음으로 시작한것인데 함께 참여하는 팀원 분들이 너무 잘하시고 열정적이십니다.즉, 저는 팀원복이 꽤 있는것 같습니다. 아마 혼자 달렸으면 완강은 못했을것 같은데 팀원들과 스터디를 진행 하면서 이분들과의 약속을 지키기 위해서라도 완강 하게 되는것 같습니다.발표 자료 캡쳐화면

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

빠타박스

면접을 위한 CS전공지식 노트 [ 운영체제와 컴퓨터 ]

1. 운영체제와 컴퓨터3.1.1운영체제의 역할CPU 스케쥴링과 프로세스 관리CPU 소유권을 어떤 프로세스에 할당 할지프로세스의 생성과 삭제자원 할당 및 반환 관리메모리 관리한정된 메모리에 어떤 프로세스를 할당해야 하는지디스크 파일 관리디스크 파일을 어떠한 방법으로 보관 할지I/O 디바이스 관리마우스, 키보드 와 컴퓨터간에 데이터를 주고 받는 것을 관리구조유저 프로그램 < GUI = 시스템 콜 = 커널 = 드라이브 < 하드웨어— GUI, 시스템 콜, 커널, 드라이브 ) 운영체제GUI가 없고 CUI만 있는 리눅스GUI : 사용자가 전자 장치와 상호 작용 하는 사용자 인터페이스의 형태, 단순 명령창이 아닌 아이콘을 마우스로 클릭하는 단순 동작으로 컴퓨터와 상호작용드라이버 : 하드웨어를 제어하기 위한 소프트웨어CUI : 그래픽이 아닌 명령어로 처리하는 인터페이스시스템 콜운영 체제가 커널에 접근하기 위한 인터페이스유저 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출 할 때 쓴다.유저 프로그램이 I/O 요청으로 트랩(trap)을 발동하면 올바른 I/O 요청인지 확인 후 유저 모드가 시스템 콜을 통해 커널 모드로 변환되어 실행된다.이 때 유저 모드에서 파일을 읽지 않고 커널 모드로 들어가 파일을 읽고 다시 유저 모드로 돌아가 그 뒤에 있는 유저 프로그램의 로직을 수행한다. - 이 과정을 통해 컴퓨터 자원에 대한 직접접근을 차단할 수 있고 프로그램을 다른 프로그램으로부터 보호할 수 있다.I/O요청 : 입출력 함수, 데이터베이스, 네트워크 파일 접근 등에 관한 일메모리(프로세스, 스레드) ⇒ 시스템 콜 ⇒ 커널 ⇒ OS프로세스나 스레드에서 운영체제로 어떠한 요청을 할 때 시스템콜이라는 인터페이스와 커널을 거쳐 운영체제에 전달 된다.시스템 콜은 하나의 추상화 계층시스템 콜을 통해 네트워크 통신이나 데이터베이스와 같은 낮은 단계의 영역 처리에 대한 부분을 많이 신경 쓰지 않고, 프로그램을 구현할 수 있는 장점이 있다.modebit시스템 콜이 작동될 때 modebit을 참고해서 유저 모드와 커널 모드를 구분한다.I 또는 0의 값을 가지는 플래그 변수카메라, 키보드 등 I/O 디바이스는 운영체제를 통해서만 작동해야 한다.ex) 카메라를 켜는 프로그램 → 만약 유저모두를 기반으로 카메라가 켜진다면, 사용자가 의도하지 않았는데 공격자가 카메라를 갑자기 켤 수 있는 등 나쁜 짓을 하기가 쉽다. 물론 커널 모드를 거쳐 운영체제를 통해 작동한다고 해도 100% 막을 수는 없지만, 운영체제를 통해 작동하게 해야 막기가 쉽다.이를 위한 장치가 modebit이다.modebit의 0은 커널모드 , 1은 유저 모드라고 설정한다.유저 프로그램이 카메라를 이용하려고 할 때 시스템 콜을 호출하고 modebit을 1에서 0으로 바꾸며 커널 모드로 변경한 후 카메라 자원을 이용한 로직을 수행한다. 이후 modebit을 0에서 1로 바꿔서 유저모드로 변경하고 이후 로직을 수행한다.유저 모드 : 유저가 접근할 수 있는 영역, 제한적으로 두며 컴퓨터 자원에 함부로 침범하지 못하는 모드커널 모드 : 모든 컴퓨터 자원에 접근할 수 있는 모드커널 : 운영체제의 핵심, 시스템콜 인터페이스를 제공한다, 보안, 메모리, 프로세스, 파일 시스템, I/O 디바이스, I/O요청 관리 등 운영체제의 중추적인 역할 수행3.1.2 컴퓨터의 요소컴퓨터CPU, DMA컨트롤러, 메모리, 타이머, 디바이스 컨트롤러 등으로 이루어져있다.CPU(Central Processing Unit)산술 논리 연산 장치, 제어장치, 레지스터로 구성되어 있는 컴퓨터 장치인터럽트에 의해 단순히 메모리에 존재하는 명령어를 해석해서 실행하는 일꾼관리자 → 커널 → HDD or SSD,(프로그램) → 메모리(RAM) 프로세스 < = > 일꾼관리자 역할을 하는 운영체제의 커널이 프로그램을 메모리에 올려 프로세스로 만들면 일꾼인 CPU가 이를 처리한다.제어장치 (CU, Control Unit)프로세스 조작을 지시하는 CPU의 한 부품입출력장치 간 통신을 제어하고 명령어들을 읽고 해석하며 데이터 처리를 위한 순서를 결정한다.레지스터CPU안에 있는 매우 빠른 임시기억장치CPU와 직접 연결되어 있으므로 연산 속도가 메모리보다 수십 배에서 수백 배 까지 빠르다.CPU는 자체적으로 데이터를 저장할 방법이 없기에 레지스터를 거쳐 데이터를 전달한다.think. 그럼 레지스터에 저장되고, CPU로 보내기에 이전 데이터도 잠시 머무를 수 있어서 빠르게 불러 올 수도 있고, 저장 장치 이기에, 이미 처리된 데이터가 저장되어서 미리 빠르게 불러 들일 수 있을 것같다.?산술논리연산장치(ALU, Arihmetic Logic Unit)덧셈, 뺄셈, 같은 두 숫자의 산술 연산과 배타적 논리합, 논리곱 같은 논리 연산을 계산 하는 디지털 회로CPU의 연산처리제어장치, 레지스터, 산술논리연산장치를 통해 연산하는 예시제어장치가 메모리에 계산할 값을 로드한다, (레지스터에도 로드한다)제어장치가 레지스터에 있는 값을 계산하라고 산술논리연산장치에 명령한다.제어장치가 계산된 값을 다시 레지스터에서 메모리로 계산한 값을 저장한다.인터럽트어떤 신호가 들어왔을 때 CPU를 잠깐 정지시키는 것발생종류키보드, 마우스, 등 I/O 디바이스로 인한 인터럽트0으로 숫자를 나누는 산술 연산에서의 인터럽트프로세스 오류인터럽트가 발생되면 인터럽트 핸들러 함수가 모여 있는 인터럽트 벡터로 가서인터럽트 핸들러 함수가 실행된다.인터럽트 간에는 우선순위가 있고 우선순위에 따라 실행되며,인터럽트는 하드웨어 인터럽트, 소프트웨어 인터럽트 로 나뉜다.**하드웨어 인터럽트**키보드를 연결하다거나, 마우스를 연결하는 일 등의 I/O 디바이스에서 발생하는 인터럽트인터럽트 라인이 설계된 이후 순차적인 인터럽트 실행을 중지하고 운영체제에 시스템콜을 요청해서 원하는 디바이스로 향해 디바이스에 있는 작은 로컬 버퍼에 접근하여 일을 수행한다.**소프트웨어 인터럽트**트랩(trap)이라고도 한다,프로세스 오류 등으로 프로세스가 시스템콜을 호출할 때 발동한다.DMA 컨트롤러I/O 디바이스가 메모리에 직접 접근할 수 있도록 하는 하드웨어 장치CPU에만 너무 많은 인터럽트 요청이 들어오기 때문에 CPU 부하를 막아 주며, CPU의 일을 부담하는 보조 일꾼이라 보면 된다.하나의 작업을 CPU와 DMA컨트롤러가 동시에 하는 것을 방지한다.메모리전자회로에서 데이터나 상태, 명령어 등을 기록하는 장치RAM(Random Access Memory)를 메모리라 한다.CPU는 계산을 담당하고 메모리는 기억을 담당한다.비유 :CPU는 일꾼, 메모리는 작업장, 작업장의 크기가 곧 메모리의 크기작업장이 클수록 창고에서 물건을 많이 가져다 놓고 많은 일을 할 수 있듯이메모리가 크면 클수록 많은 일을 동시에 할 수 있다.타이머몇 초 안에는 작업이 끝나야 한다는 것을 정하고 특정 프로그램에 시간제한을 다는 역할시간이 많이 걸리는 프로그램이 작동할 때 제한을 걸기 위해 존재한다.디바이스 컨트롤러(Device Controller)컴퓨터와 연결되어 있는 I/O 디바이스들의 작은 CPU

게임 프로그래밍네트워크운영체제CS코딩게임개발it

운영체제

*이 내용은 인프런 그림으로 쉽게 배우는 운영체제를 수강하며 정리한 내용입니다. program과 process하드디스크등과 같은 저장장치에 저장된 명령문의 집합체를 말해.애플리케이션이나 앱이라고도 불리고 windows 운영체제에서는 .exe 의 모습을 하고있지.그럼 process는 뭘까?간단히 말하면 실행중인 프로그램이야.하드디스크에 저장된 프로그램이 메모리에 올라갔을 때 실행 중인 프로그램, 즉 프로세스라고 불려.프로그램은 수동적, 프로세스는 수동적인 존재라고 할 수 있어. process의 구조CodeDataHeap : 프로그래머가 동적으로 메모리를 할당하는데에 쓰인다. ( malloc, free )Stack컴파일 과정멀티프로그래밍과 멀티프로세싱유니프로그래밍 : 메모리에 오직 하나의 프로세스가 올라온 것 멀티프로그래밍 : 메모리에 여러 개의 프로세스가 올라온 것   멀티프로세싱 :  CPU가 여러 개의 프로세스를 처리하는 것PCB (Process Control Block)프로세스가 만들어지면 운영체제는 해당 프로세스의 정보를 가지고있는 PCB를 만들고 저장해.PCB들은 연결리스트라는 자료구조로 저장돼.운영체제는 프로세스가 종료되면 해당 프로세스의 PCB를 연결리스트에서 제거해.프로세스 상태실행상태에 있는 프로세스의수는 CPU의 개수만큼 입니다.대기상태프로세스가 입출력 요청을 하면 입출력이 완료될 때까지 기다리는 상태야.CPU에 비해 입출력작업은 상당히 느려.특정 프로세스가 입출력 요청을 하면 입출력이 완료될 때까지 CPU를 기다리게 하는건 굉장히 비효율적이야.대신 입출력 요청을 한 프로세스를 "대기상태"로 두고 다른 프로세스에게 CPU를 할당해그러다가 시간이 지나서 입출력 작업이 완료되면 "대기상태"에 있던 프로세스에게 CPU 할당 기회를 줘 컨텍스트 스위칭프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 변경하는 작업이야.컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경돼. 실행 중인 프로세스의 작업 내용을 PCB에 저장하고 실행될 기존 프로세스의 PCB의 내용대로 CPU가 다시 세팅돼.컨텍스트 스위칭이 일어날 때 PCB에 변경하는 값들로는 아래와 같아.운영체제에서 프로세스 A와 프로세스 B사 컨텍스트 스위칭을 하는 법을 알려줄게.먼저 CPU에서 프로세스 A를 실행해.시간이 지난 후 운영체제에서 CPU가 프로세스 A를 너무 오래 실행했다고 판단하면프로세스 A는 하던 일을 멈추고, 현재 CPU의 레지스터 값 등을 PCB A에 저장해.이제 PCB B를 참조해서 이전 프로세스 B의 상태로 CPU의 레지스터값을 설정해.여기에는 다음 실행할 명령어의 주소를 가지고있는 프로그램 카운터(PC)를 가지고있기 때문에 바로 프로세스 B의 명령어를 실행할 수 있어.프로세스 B가 점유시간동안 CPU를 사용하다가 점유시간이 다되면 운영체제는 다시 인터럽트를 발생시키는거지. 컨텍스트 스위칭은 CPU 점유시간이 다됐거나, I/O 요청이 발생하거나, 다른 종류의 인터럽트가 있을 때 등의 상황에서 발생해. 프로세스 생성과 종료일반적으로 프로세스가 생성될 때의 방법에 대해 설명할게..exe 파일을 더블클릭으로 실행하면 운영체제는 해당 프로그램의 코드영역과 데이터영역을 메모리에 로드하고 빈 스택과 빈 힙을 만들어 공간을 확보해.그리곤 이 프로세스를 관리하기 위한 PCB를 만들어서 값을 초기화해줘.지금 설명한 프로세스 생성과정은 운영체제가 부팅되고 0번 프로세스가 생성될 떄 딱 한번 실행돼.그리고나서 나머지 모든 프로세스는 새로 생성하지않고 0번 프로세스를 복사해서 사용하게 돼.이때 fork() 함수를 사용해.복사해서 사용하는 이유는 새로 생성하는 것보다 복사를 하는게 더 빠르기 때문이야.0번 프로세스를 복사해서 생성된 프로세스들을 자식 프로세스라고 해. 그럼 0번 프로세스는 부모 프로세스가 되겠지?자식 프로세스는 부모 프로세스의 코드영역, 데이터영역, 스택영역과 PCB의 내용을 전부 복사해.0번 프로세스의 코드와 데이터를 모두 복사해서 실행하면 0번 프로세스가 똑같이 실행되는거 아닌가?맞아...그럼 자기가 원하는 함수를 어떻게 실행시킬까? 바로 exec() 함수를 이용하면 돼.fork() 함수로 프로세스를 복사 후 exec() 함수를 실행시키면 자식 프로세스의 코드와 데이터 영역을 원하는 값으로 덮어쓰게 돼.그럼 이때부터 자식 프로세스는 부모 프로세스와 완전히 다르게 동작하게되는거지!쓰레드   참조 : 그림으로 쉽게 배우는 운영체제 3주차 회고칭찬하고 싶은 점 : 기한을 지켰다 😅아쉬웠던 점 : 권장 커리큘럼을 지키지 못했다.

운영체제워밍업클럽CS

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)이긴 함)메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.: 메모리가 부족한 시스템에서 문제를 해결할 때는 타뷸레이션을 선택하는 것이 더 좋을 것 같습니다.그 이유는 타뷸레이션은 메모이제이션에 비해 적은 메모리를 사용함에도 불구하고 빠른 시간을 보이기 때문입니다.  회고아직 내용을 완벽하게 이해하지 못하여 이번주 강의를 다시한번 복습할 예정인데, 그래도 미션을 통해 한번 더 살펴보면서 들었던 내용들을 머릿속에 떠올려볼 수 있어서 좋았습니다.또한 메모리 부족 시스템에서의 메모이제이션, 타뷸레이션과 선택과 같이, 현재 가지고 있는 환경에 따라 로직을 어떻게 만들지에 대한 고민이 실제 무엇인가 개발할 때도 중요하다는 생각이 들었습니다.📝⭐️

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

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주차

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주차

유선아

[발자국] 인프런 워밍업클럽 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운영체제자료구조

Jay

워밍업 클럽 CS 3주차 발자국 : 운영체제

가상 메모리가상 메모리 개요가상 메모리는 부족한 물리 메모리를 효율적으로 사용하기 위한 기술로, 메모리 관리자가 가상 주소를 물리 주소에 매핑하여, 실제 물리 메모리보다 더 큰 메모리 공간을 사용할 수 있게 합니다. 이를 통해 각 프로세스는 독립적인 메모리 공간을 가지며, 안정성과 보안을 높입니다. 개발자는 물리 메모리의 크기나 위치에 신경 쓰지 않고, 0x0 번지에서 시작한다고 생각하며 프로그래밍할 수 있습니다. 실제 메모리 접근은 메모리 관리자가 처리하며, 프로세스는 물리 메모리에 직접 접근하지 않습니다. 가상 메모리의 크기는 CPU의 비트 수에 따라 결정됩니다. 예를 들어, 32비트 CPU는 4GB의 가상 메모리 공간을 제공합니다. 물리 메모리가 부족할 때는, 일부 내용을 하드디스크의 스왑 영역으로 옮겨 필요한 경우 다시 가져와 실행합니다. 이 과정을 동적 주소 변환이라 부르며, 이를 통해 물리 메모리 부족 문제를 해결할 수 있습니다. 메모리 관리는 가상 주소를 물리 주소로 변환하고, 프로세스의 메모리 배치, 스왑 영역 처리 등 복잡한 과정을 수행합니다. 물리 메모리 0번지는 운영체제에 할당되며, 프로세스는 사용할 수 없습니다. 가상 메모리 시스템에서는 메모리를 고정 크기로 나누어 프로세스에 할당하는 페이징과, 가변 크기로 할당하는 세그멘테이션 방식을 사용합니다. 페이징은 내부 단편화, 세그멘테이션은 외부 단편화의 단점이 있으며, 이를 보완한 세그멘테이션-페이징 혼용 기법이 사용됩니다. 가상 주소는 메모리나 스왑 영역에 위치하며, 메모리 관리자는 가상 주소와 물리 주소를 1대1로 매핑해 관리합니다 배치 정책세그멘테이션세그멘테이션은 가변 분할 방식을 사용하여 메모리를 분할하는 기법입니다. 프로그램은 함수나 모듈 등으로 나뉘며, 각각의 세그먼트가 생성됩니다. 예를 들어, 메인 코드, 전역 데이터, 힙, 스택 등의 영역이 각각 독립적인 세그먼트로 구성됩니다. 이 세그먼트들은 물리 메모리에서 서로 인접하지 않아도 되지만, 프로세스는 이를 인접한 것처럼 인식합니다. 프로세스와 CPU가 바라보는 논리 주소는 실제 메모리 주소와 다르며, 이를 물리 주소로 변환하는 역할은 메모리 관리자(MMU)가 수행합니다. MMU는 세그멘테이션 테이블을 사용하여 논리 주소를 물리 주소로 변환합니다. 이 테이블에는 베이스 주소(Base Address)와 바운드 주소(Bound Address) 정보가 포함되어 있습니다. 논리 주소가 주어지면, 메모리 관리자는 해당 논리 주소가 속하는 세그먼트를 찾고, 세그멘테이션 테이블에서 해당 세그먼트의 베이스와 바운드 주소를 참조하여 물리 주소를 계산합니다. 논리 주소가 바운드 주소 범위 내에 있으면 베이스 주소와 더해져 물리 주소가 계산되며, 범위를 초과하면 메모리 침범 오류를 발생시켜 해당 프로세스를 종료합니다. 예시 1: CPU가 세그먼트 1번의 논리 주소 0x632로 접근메모리 관리자가 세그먼트 1번을 확인세그멘테이션 테이블에서 1번 세그먼트의 베이스 주소(5200)를 찾음논리 주소(632)와 바운드 주소(1000)를 비교하여 범위 내임을 확인논리 주소와 베이스 주소를 더해 물리 주소 5832로 변환 예시 2: CPU가 세그먼트 3번의 논리 주소 750으로 접근메모리 관리자가 세그먼트 3번을 확인논리 주소(750)가 바운드 주소(500)를 초과하므로 메모리 침범 오류 발생프로세스가 종료됨 세그멘테이션의 장점은 메모리를 가변적으로 나눌 수 있어 코드, 데이터, 스택, 힙 영역을 모듈로 처리할 수 있고, 각 영역에 대한 접근 보호와 공유가 용이하다는 점입니다. 반면, 단점은 가변 분할 방식에서 발생하는 외부 단편화입니다. 페이징페이징은 메모리 관리를 위한 고정 분할 방식으로, 외부 단편화 문제를 해결하기 위해 고안되었습니다. 페이징에서는 메모리를 일정한 크기의 페이지로 나누어 할당합니다. 모든 페이지의 크기가 동일하기 때문에 관리가 용이하며, 외부 단편화가 발생하지 않습니다. 대신, 페이지 크기보다 작은 데이터를 저장할 때는 내부 단편화가 발생할 수 있습니다. 논리주소와 물리주소논리주소공간: 사용자와 프로세스가 바라보는 주소 공간물리주소공간: 실제 메모리에서 사용되는 주소 공간논리주소공간과 물리주소공간은 일정한 크기의 페이지와 프레임으로 나뉘며, 두 공간은 매칭됩니다. 주소 변환 과정페이징에서도 메모리 관리자는 페이지 테이블을 사용해 논리주소를 물리주소로 변환합니다. 논리주소가 전달되면, 메모리 관리자는 해당 논리주소가 몇 번 페이지에 속하는지 확인하고, 페이지 번호와 오프셋을 이용해 물리주소를 계산합니다.논리주소에서 페이지 번호를 추출: 페이지 테이블의 인덱스 역할해당 인덱스를 참조해 프레임 번호를 가져옴오프셋을 더해 최종 물리주소로 변환페이징에서 페이지 테이블에 "invalid"로 표시된 페이지는 스왑 영역(하드디스크)에 저장되어 있다는 의미입니다.또한, 컨텍스트 스위칭 시, 운영체제는 페이지 테이블을 해당 프로세스에 맞게 업데이트해야 합니다. 32비트 CPU 주소 변환 예시가상 메모리의 크기는 약 4GB (2^32 바이트)가상 메모리를 16MB(2^24 바이트) 페이지로 나누면, 24비트는 페이지 크기, 나머지 8비트는 페이지 번호를 나타냅니다. 즉, 총 256개의 페이지가 존재하게 됩니다.물리 메모리는 가상 메모리와 동일한 크기로 페이지로 나뉘지만, 물리 주소 공간이 더 작아도 문제가 없습니다. 부족한 메모리는 스왑 처리로 해결되기 때문입니다. 주소 변환 예시 1: 논리주소 1000번지페이지 번호: 1000 / 16777216 = 0오프셋: 1000 % 16777216 = 1000페이지 테이블의 0번 인덱스를 참조해 프레임 3을 가져오고, 오프셋을 더해 물리주소를 구함.주소 변환 예시 2: 논리주소 31554432번지페이지 번호: 31554432 / 16777216 = 1오프셋: 31554432 % 16777216 = 14777216페이지 테이블의 1번 인덱스를 참조해 프레임 1을 찾아 물리주소로 변환. 페이징과 세그멘테이션의 차이페이지 크기: 페이징은 고정된 크기의 페이지를 사용하며, 세그멘테이션은 프로세스마다 다른 크기의 세그먼트를 가짐.단편화: 페이징에서는 내부 단편화가 발생하고, 세그멘테이션에서는 외부 단편화가 발생합니다.메모리 접근 방식: 세그멘테이션은 코드, 데이터, 스택, 힙 등 논리적 영역에 맞춰 나누지만, 페이징은 고정된 크기의 페이지로 나누기 때문에 특정 영역을 떼어내서 공유하거나 권한을 부여하기 어렵습니다. 페이징의 한계페이징에서 가장 신경 써야 하는 점은 페이지 테이블의 크기입니다. 각 프로세스는 고유한 페이지 테이블을 가지며, 프로세스 수가 많아질수록 페이지 테이블이 차지하는 메모리 공간도 증가합니다. 메모리 관리자 역시 물리 메모리 내의 운영체제 영역에 페이지 테이블을 저장하기 때문에, 페이지 테이블이 커지면 사용자 영역의 메모리가 부족해질 수 있습니다.따라서 페이지 테이블의 크기를 적절하게 유지하는 것이 매우 중요합니다. 페이지드 세그멘테이션페이지드 세그멘테이션은 세그멘테이션과 페이징의 장점을 결합한 메모리 관리 방식입니다. 세그멘테이션은 영역별로 메모리를 관리하고, 페이징은 메모리를 일정 크기로 나누어 관리 효율성을 높입니다. 이 방식은 두 기법의 이점을 활용할 수 있지만, 새로운 단점도 존재합니다. 장점세그멘테이션의 가변 분할 방식을 사용해 프로세스의 코드, 데이터, 스택, 힙 영역을 독립적으로 관리 가능. 각 영역에 대해 메모리 접근 보호 및 공유가 용이합니다.페이징의 고정 분할 방식을 통해 메모리를 효율적으로 관리하고 외부 단편화를 줄일 수 있습니다.단점이 기법의 단점은 메모리 접근이 두 번 이루어진다는 점입니다:세그멘테이션 테이블을 참조하여 세그멘트 정보를 가져올 때페이지 테이블을 참조하여 페이지 정보를 가져올 때이중 접근으로 인한 오버헤드가 발생할 수 있습니다. 메모리 접근 권한각 프로세스는 영역별로 읽기, 쓰기, 실행 권한이 다르게 부여됩니다:코드 영역: 읽기와 실행 권한만 있고, 수정이 불가능합니다.데이터 영역: 읽기와 쓰기 권한이 있으며, 실행 권한은 없습니다.스택 & 힙 영역: 읽기와 쓰기 권한이 있으나 실행 권한은 없습니다.이 권한은 가상 주소를 물리 주소로 변환할 때마다 확인되며, 만약 권한 위반이 발생하면 에러를 발생시키고 프로세스를 종료시킵니다. 페이지드 세그멘테이션의 주소 변환 과정세그멘트 번호를 가상 주소에서 추출하여 해당 세그먼트에 대한 메모리 접근 권한을 확인합니다.권한이 적합하면, 세그멘트에서 페이지 번호와 페이지 개수를 가져옵니다.페이지 번호로 페이지 테이블에 접근하여 해당 프레임 번호를 찾습니다.물리 메모리의 프레임에 접근해 오프셋을 더하여 최종 물리 주소를 계산합니다.만약 해당 프레임이 물리 메모리에 없다면, 스왑 영역에서 불러옵니다.  현대 운영체제는 페이징과 페이지드 세그멘테이션을 상황에 맞게 혼합하여 사용하고 있습니다. 페이지드 세그멘테이션의 장점은 두 기법의 이점을 취해 메모리 관리의 유연성과 효율성을 높이는 반면, 오버헤드로 인한 성능 저하를 피하기 위해 적절한 균형을 유지하는 것이 중요합니다. 가져오기 정책디멘드 페이징 정책디멘드 페이징은 프로세스 실행 시 필요한 데이터만 메모리에 올려서 실행하는 방식으로, 메모리 효율을 극대화하는 가져오기 정책입니다. 이 방법은 프로세스의 모든 데이터가 처음부터 메모리에 로드되지 않고, 필요한 시점에만 가져오므로 메모리 자원을 아낄 수 있습니다. 지역성 이론과 디멘드 페이징90:10 법칙에 따르면 프로그램은 90%의 시간을 10%의 코드에서 소모합니다. 이 원리를 지역성 이론으로 설명할 수 있는데, 지역성 이론에는 두 가지 중요한 개념이 있습니다:시간적 지역성: 최근에 접근한 데이터는 다시 접근할 가능성이 높다.공간적 지역성: 현재 접근한 데이터와 가까운 위치에 있는 데이터가 곧 접근될 가능성이 높다.디멘드 페이징은 이 이론을 바탕으로, 메모리에서 당장 필요하지 않은 데이터는 스왑 영역으로 보내고, 필요할 것 같은 데이터만 메모리에 올리는 정책입니다. 메모리 계층 구조레지스터: CPU 내에서 가장 빠른 메모리.캐시 메모리: CPU에서 비교적 가까운 메모리로, 빠른 속도로 접근 가능.메인 메모리: 데이터 접근이 캐시보다 느리지만 대용량 데이터를 저장.보조저장장치 (스왑 영역): 메모리보다 훨씬 느리지만 데이터를 저장하는 데 사용됨. 스왑 인/스왑 아웃스왑 인: 보조저장장치(스왑 영역)에 있던 데이터를 물리 메모리로 가져오는 과정.스왑 아웃: 물리 메모리에 있는 데이터를 보조저장장치(스왑 영역)로 내보내는 과정.운영체제는 효율적인 메모리 관리를 위해 스왑 인/스왑 아웃을 최소화하려고 합니다. 페이지 테이블과 비트프로세스가 가상 메모리에 접근할 때 운영체제는 페이지 테이블을 통해 물리 메모리와 스왑 영역 간의 데이터를 관리합니다. 페이지 테이블의 각 항목은 페이지 엔트리(PTE)라고 불리며, 여러 가지 비트를 포함하고 있습니다:접근 비트: 페이지가 메모리에 올라온 후에 접근되었는지 나타냅니다.변경 비트: 페이지의 데이터가 변경되었는지 나타냅니다.유효 비트: 페이지가 물리 메모리에 있는지 스왑 영역에 있는지 알려줍니다.읽기/쓰기/실행 비트: 페이지에 대한 접근 권한을 정의합니다. Page Fault와 프로세스 대기프로세스가 가상 메모리에 접근하려 할 때, 만약 요청한 페이지가 물리 메모리에 없으면 Page Fault라는 인터럽트가 발생합니다. 이때 운영체제는 스왑 영역에 접근하여 필요한 페이지를 물리 메모리로 가져오고, 프로세스는 대기 상태로 전환됩니다. 이후 페이지가 메모리에 올라가면 프로세스는 다시 실행됩니다. 3가지 상황에서의 처리 과정스왑이 필요 없는 경우: 요청된 페이지가 이미 물리 메모리에 있으면 즉시 데이터에 접근할 수 있습니다.스왑 영역에 있는 데이터를 참조하는 경우: 요청된 페이지가 스왑 영역에 있으면 물리 메모리로 데이터를 가져와서 사용합니다.물리 메모리가 꽉 찬 경우: 새로운 페이지를 가져오기 전에, 현재 물리 메모리에서 사용하지 않는 페이지를 스왑 영역으로 옮겨 공간을 확보합니다.  디멘드 페이징은 지역성 이론에 기반하여 메모리 자원을 효율적으로 사용하는 기법입니다. 메모리 관리자는 페이지 교체 알고리즘을 통해 스왑 인/아웃을 최적화하고 성능을 유지하려고 합니다. 페이지 교체 정책페이지 교체 정책은 메모리 공간이 부족할 때 어떤 페이지를 선택해 스왑 영역으로 보낼지를 결정하는 중요한 알고리즘입니다. 이 과정에서 페이지 폴트가 발생하며, 메모리에 새로운 페이지를 불러오려면 기존의 페이지를 교체해야 하는 상황이 생깁니다. 페이지 교체 정책은 주로 프로그램의 지역성 원칙을 바탕으로 하며, 다양한 알고리즘들이 존재합니다. 주요 페이지 교체 정책 1. 무작위 선택 (Random) - 랜덤하게 페이지를 선택해 교체합니다. - 지역성 이론을 고려하지 않기 때문에 성능이 좋지 않으며, 거의 사용되지 않습니다.2. FIFO (First In, First Out) - 가장 먼저 메모리에 들어온 페이지를 먼저 내보내는 방식입니다. - 구현이 간단하지만, 자주 사용되는 페이지도 교체될 수 있다는 단점이 있습니다. - FIFO는 페이지 폴트를 줄이려고 메모리를 늘렸을 때, 오히려 페이지 폴트가 증가하는 빌레이디의 역설이 발생할 수 있습니다.3. Optimum (OPT) - 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체하는 방식입니다. - 이론적으로 최적의 방법이지만, 앞으로의 메모리 접근을 예측할 수 없기 때문에 실제로 구현하기는 어렵습니다.4. LRU (Least Recently Used) - 가장 최근에 사용되지 않은 페이지를 교체하는 방식입니다. - 시간의 지역성에 기반하여, 최근에 사용된 페이지가 다시 사용될 확률이 높다는 가정에 따라 작동합니다. - 실제로 많이 사용되는 알고리즘이며, 성능이 우수하지만 구현이 복잡하고 추가적인 하드웨어 지원이 필요할 수 있습니다. LRU와 유사한 알고리즘1. Clock Algorithm (클락 알고리즘) - LRU의 구현 복잡성을 해결하기 위해 고안된 방식입니다. - 페이지의 접근 비트를 사용하여, 일정 시간 동안 참조된 페이지인지 아닌지를 판단합니다. - 클락 핸드가 시계 방향으로 움직이며, 접근 비트가 0인 페이지를 교체 대상으로 선택합니다. - Enhanced Clock Algorithm은 접근 비트 외에 변경 비트까지 고려하여 성능을 더 향상시킵니다.2. Second Chance Algorithm (2차 기회 알고리즘) - FIFO 방식의 문제점을 보완하기 위해, 자주 사용되는 페이지에 두 번째 기회를 주는 방식입니다. - FIFO 큐에서 페이지가 교체 대상이 될 때, 해당 페이지가 최근에 참조된 경우 큐의 맨 뒤로 이동시켜 수명을 연장시킵니다. 선택적 사용시스템 하드웨어가 LRU 구현을 지원하지 않으면 FIFO를 사용할 수밖에 없는 경우가 있습니다. 이때는 성능 향상을 위해 2차 기회 알고리즘이나 다른 보완 기법들을 사용할 수 있습니다.결론적으로, LRU는 가장 좋은 성능을 보이는 경우가 많지만, 구현 복잡성을 고려해 Clock Algorithm 같은 유사 알고리즘이 더 자주 사용됩니다. 스레싱과 워킹셋스레싱(Thrashing)은 CPU 사용률을 높이기 위해 멀티 프로그래밍 정도를 지나치게 높였을 때 발생하는 문제로, CPU가 실제 작업을 처리하는 것보다 스왑 작업에 더 많은 시간을 소비하는 현상입니다. 이로 인해 성능이 급격히 저하되며, 결국 CPU 사용률도 떨어지게 됩니다. 스레싱 발생 과정1. 멀티 프로그래밍 정도 증가: 동시에 실행되는 프로세스의 수가 늘어나면 CPU 사용률을 높이려는 의도에서 물리 메모리에 더 많은 프로세스를 올리게 됩니다.2. 메모리 부족: 메모리는 한정되어 있기 때문에 모든 프로세스의 모든 페이지를 물리 메모리에 적재할 수 없으며, 페이지 폴트가 빈번하게 발생합니다.3. 페이지 폴트 증가: 페이지 폴트가 많아지면 프로세스가 필요로 하는 페이지를 계속 스왑 영역에서 불러와야 하며, 이에 따라 스왑 작업이 많아집니다.4. CPU 사용률 감소: 페이지 폴트로 인한 스왑 작업이 지나치게 많아지면 CPU가 작업에 집중하지 못하고, 결국 CPU 사용률이 낮아집니다.5. 스레싱: 스왑 작업이 CPU의 작업을 방해하게 되어 CPU 사용률이 0에 가까워지며, 시스템이 스왑 작업에 묶여 제대로 동작하지 않는 상태가 됩니다.스레싱은 물리 메모리의 부족이 근본 원인으로, 이를 하드웨어적으로 해결하려면 물리 메모리의 크기를 늘리면 되지만, 단순히 메모리 크기를 늘린다고 해서 항상 성능이 크게 향상되는 것은 아닙니다. 워킹셋(Working Set)워킹셋은 각 프로세스가 실행되기 위해 필요한 페이지들의 집합을 의미합니다. 프로세스는 지역성 이론에 따라 특정 시간 동안 주로 사용하는 데이터나 코드를 메모리에 올려두는데, 이 페이지들의 집합을 워킹셋이라고 합니다. 워킹셋을 정의하는 것은 스레싱을 방지하고 시스템 성능을 최적화하는 중요한 방법 중 하나입니다.- 지역성 이론: 프로세스는 특정 시점에서 일정한 범위의 메모리 공간을 집중적으로 참조하는 경향이 있습니다. 이 지역성을 고려해, 자주 사용하는 페이지들만 메모리에 올려두는 것이 효율적입니다. 스레싱 방지 방법: 워킹셋 모델운영체제는 각 프로세스가 어느 정도의 페이지를 필요로 하는지 모니터링하여, 워킹셋 모델을 통해 적절한 페이지 수를 유지합니다. 다음과 같은 과정을 통해 스레싱을 방지할 수 있습니다.1. 페이지 할당 및 조정: - 프로세스가 실행되면 처음에 일정량의 페이지를 할당합니다. - 페이지 폴트가 발생하면 해당 프로세스에 더 많은 페이지를 할당해 메모리 사용량을 늘립니다. - 반대로 페이지 폴트가 거의 발생하지 않으면 페이지가 과도하게 할당된 것으로 간주하고, 메모리 낭비를 방지하기 위해 일부 페이지를 회수합니다.2. 워킹셋 유지: - 현재 메모리에 적재된 페이지들이 프로세스의 워킹셋에 속한다고 가정하고, 이 페이지들을 유지합니다. - 페이지 폴트가 많이 발생하면 워킹셋에 필요한 페이지를 추가하고, 사용 빈도가 낮은 페이지를 스왑 영역으로 내보냅니다. 스레싱은 프로세스와 메모리 간의 균형이 깨질 때 발생하며, 이를 방지하기 위해서는 프로세스마다 적절한 양의 페이지를 메모리에 적재하고, 워킹셋을 기반으로 효율적으로 관리해야 합니다. CPU 사용률을 높이기 위한 멀티 프로그래밍의 정도는 물리 메모리의 용량과 페이지 교체 정책에 의해 결정되며, 운영체제는 이를 지속적으로 모니터링하여 스레싱을 방지할 수 있습니다.  입출력 장치주변장치 주변장치의 기본 구성I/O 디바이스는 CPU와 메모리 외부에 있는 장치들로, 그래픽카드, 하드디스크, SSD, 키보드, 마우스 등 여러 가지가 포함됩니다.이들은 메인보드에 버스를 통해 연결되며, 각각의 장치 상태와 데이터를 보관할 수 있는 레지스터들을 가집니다.장치마다 데이터를 전송하는 방식이 다르며, 캐릭터 디바이스와 블록 디바이스로 나뉩니다.캐릭터 디바이스: 마우스, 키보드 등 적은 양의 데이터를 전송하는 장치.블록 디바이스: 하드디스크, SSD 등 많은 양의 데이터를 전송하는 장치. 입출력 제어기와 버스초기에는 CPU가 직접 주변장치에서 데이터를 가져오면서 입출력 작업을 처리했으나, 이는 효율성이 떨어졌습니다. 이를 해결하기 위해 입출력 제어기(I/O Controller)가 도입되어 CPU가 다른 작업을 할 수 있도록 입출력 제어기가 입출력 작업을 관리하게 되었습니다.입출력 제어기는 CPU와 빠른 메모리를 연결하는 시스템 버스와, 주변장치들을 연결하는 입출력 버스로 구성됩니다.속도 차이를 해결하기 위해, 입출력 버스는 고속 입출력 버스와 저속 입출력 버스로 나뉩니다. 예를 들어, 그래픽 카드와 같은 고속 장치는 시스템 버스에 바로 연결되기도 합니다.DMA(Direct Memory Access) 제어기가 도입되어 CPU의 개입 없이도 입출력 제어기가 메모리에 직접 데이터를 읽고 쓸 수 있게 되었으며, 이를 Memory Mapped I/O라고 부릅니다. 마우스, 키보드마우스광학 마우스는 카메라로 마우스 아래의 이미지를 초당 수천 회 촬영해 마우스의 움직임을 감지합니다.마우스의 디바이스 컨트롤러는 이 데이터를 분석하고 인터럽트를 통해 CPU에 알립니다. CPU는 운영체제와 애플리케이션이 마우스 이벤트를 처리할 수 있게 해줍니다.키보드키보드도 마우스와 비슷한 방식으로 동작하며, 사용자가 입력한 키를 디바이스 컨트롤러가 감지해 CPU로 인터럽트를 보냅니다. 운영체제는 해당 이벤트를 적절한 애플리케이션에 전달합니다.  하드디스크, SSD하드디스크하드디스크는 물리적으로 회전하는 플래터(Platter)와 이를 읽는 헤드(Head)로 구성됩니다.실린더(Cylinder)는 여러 개의 트랙이 있는 위치를 의미하며, 섹터(Sector)는 하드디스크의 가장 작은 저장 단위입니다.하드디스크의 성능은 데이터를 읽기 위해 헤드를 움직이는 시간이 느려지는 탐색 시간(Seek Time)에 의해 제한됩니다. 이 시간 때문에 하드디스크는 상대적으로 느리게 동작합니다.SSD(Flash Memory)SSD는 전기적으로 데이터를 읽고 쓰기 때문에 빠르고 조용하며, 하드디스크와 달리 기계적 움직임이 없어서 충격에 강합니다.다만, 플래시 메모리는 같은 지점에 데이터를 여러 번 쓰고 지우는 작업에 한계가 있어, 반복적인 쓰기 작업이 장치의 수명을 단축시킬 수 있습니다.  파일 시스템파일과 시스템파일 시스템은 데이터 저장 및 관리를 위해 설계된 소프트웨어 구성 요소로, 파일과 디렉토리의 생성, 수정, 삭제를 포함한 다양한 작업을 처리합니다. 파일 시스템의 구조와 역할파일 시스템은 파일 및 디렉토리를 관리하며, 디스크와 같은 저장 장치에 데이터를 효율적으로 저장합니다. 주요 기능은 다음과 같습니다:파일 및 디렉토리 생성, 수정, 삭제파일 접근 권한 관리데이터 무결성 보장백업 및 복구, 암호화 파일 구조파일은 다양한 데이터 집합으로 이루어지며, 그 구성 방식에 따라 세 가지 주요 구조로 구분됩니다:순차 파일 구조: 데이터가 연속적으로 저장되는 구조로, 파일의 특정 지점에 접근하는 데 시간이 오래 걸리지만 구조가 단순하여 공간 낭비가 적습니다.직접 파일 구조: 해시 함수를 이용해 데이터를 저장하는 방식으로, 데이터 접근이 빠르지만, 해시 함수의 선택이 중요합니다.인덱스 파일 구조: 순차 접근과 직접 접근의 장점을 결합한 방식으로, 인덱스 테이블을 이용해 빠르게 데이터를 검색할 수 있습니다. 디렉토리디렉토리 역시 파일의 한 종류로, 다른 파일들의 정보를 저장하는 역할을 합니다. 다단계 디렉토리 구조를 통해 트리 형태로 파일을 관리할 수 있으며, 윈도우의 바로가기처럼 순환 구조를 가지기도 합니다. 파일과 디스크파일이 저장될 때, 디스크는 일정 크기로 나뉜 블록으로 데이터를 저장합니다. 블록 할당 방식은 크게 두 가지로 구분됩니다: 연속 할당: 파일의 블록이 연속적으로 저장되는 방식으로, 외부 단편화 문제가 발생할 수 있어 현대 시스템에서는 잘 사용하지 않습니다.불연속 할당: 파일의 블록들이 분산되어 저장되며, 연결 할당과 인덱스 할당 방식이 존재합니다.연결 할당: 연결 리스트 구조로 파일 블록을 관리하는 방식입니다.인덱스 할당: 인덱스 블록을 통해 여러 데이터 블록에 접근하는 방식입니다. 유닉스와 리눅스에서는 이를 i-node로 관리합니다. 디스크 관리 및 블록 크기블록 크기가 작으면 내부 단편화가 줄어들어 공간 낭비가 적어지지만, 관리할 블록 수가 많아집니다. 반대로, 블록 크기가 크면 내부 단편화로 인해 공간 낭비가 발생할 수 있지만, 관리할 블록 수는 줄어듭니다. 파일 삭제 및 복구파일을 삭제할 때, 실제로 파일의 데이터가 사라지지 않고 파일 시스템은 파일 테이블에서 파일의 헤더만 삭제하고, 사용했던 블록을 프리 블록 리스트에 추가합니다. 이런 이유로 데이터 복구 프로그램을 통해 삭제된 파일의 데이터를 복원할 수 있습니다.

CS운영체제

Jay 1개월 전
유선아

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

유선아

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

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 전공지식<10월 둘째주 발자국>

⭐10월 첫 째주 회고배운 내용CS => cpu 스케줄링,공유자원, 메모리FIFO -> SJF -> RR ->MLFQ타임슬라이스 등장으로 스케줄링 발전이 이뤄졌다.오버헤드없이, 공평하게 모든 프로세스들이 작업하는 것이 목표타임슬라이스 크기에 따라 성능이 달라진다.공유자원 : 통신하면서 같이 이용하는 변수,파일들을 말한다.공유자원은 한 프로세스가 사용하고 있을 때 다른 프로세스도 같이 사용되어서는 안된다. 1프로세스,1공유자원 -> 그렇지 않을 때 동기화 문제가 생긴다.임계구역, 경쟁조건, 상호배제 알고리즘상호배제 :세마포어, 모니터교착상태 : 상호배제, 비선점,점유과 대기, 원형대기 데드락, 은행원 알고리즘메모리 : --레지스터 --> 캐쉬 --> RAM ----> 보조저장장치 순으로 느림Algorithm => 재귀재귀 : 자기자신을 참조한다.하위문제의 결과를 현재문제와 계산재귀함수 : 콜스택, 팩토리얼 계산, 하노이탑정렬 : 배열을 기반으로 한 알고리즘 -> 버블,선택 정렬 회고알고리즘의 어느정도 메커니즘은 알겠다! 하지만 이런 알고리즘을 문제화되서 풀기엔 개념강의만 보면 부족할 것이다. 알고리즘 관련 문제도 풀어보려고 노력하는데 첫 걸음 떼기가 어렵다.알고리즘 문제, 백준이나 프로그래머스-- 같은 알고리즘 프로그램을 같이 하는 스터디같은 걸 만들어서 하면 어떨까 싶다. 혼자하면 어려운 거 나올 때 진짜 포기하고싶어지니까... 혼자하면 오래못하니까 ..운영체제같은 경우에는 스토리따라서 이해하고 외워가고 있다. 이렇게 회고할 때나 리프레쉬하고 월요일날 공부시작할 때 저번주에 어떤거공부했지 하면서 핵심키워드 따라서 복습하고 있다.공부할 때 시간에 쫓겨서 하지 말자 ㅜㅜㅜ 머리에 더 안들어온다.잘한점! 이번주 그래도 전날 들은 수업 블로그에 또 다시 올려서 복습했다! 수업들을 때도 노션에 필기하고 블로그에도 필기하고 회고에도 한 번 씩 더 쓰면서 상기시키기 더 좋은 것 같다.이번주 목표! 아침운동꼭! 알바 가기 전에 인프런 수업 두개 듣기@@

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

yeonjin1939

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

자료구조와 알고리즘 재귀(Recursion)재귀(Recursion)란 어떠한 것을 정의할 때 자기 자신을 참조하는 것을 뜻한다.재귀 함수는 말 그대로 자기 자신을 계속 호출하는 함수이다. 아래의 예시를 보자.function myFunction(number){ console.log(number); myFunction(number + 1); } myFunction(1);재귀 함수는 위의 결과처럼 자기 자신을 계속 호출해 메모리가 가득 찰 때까지 반복한다.이런 재귀 함수를 쓰임새 있게 만들려면 함수를 종료하는 탈출 조건(=기저 조건)이 반드시 있어야 한다.위의 코드에서 1~10까지의 데이터만 얻기 위해 기저 조건을 삽입 했을 때 비로소 원하는 데이터를 얻을 수 있다.function myFunction(number){ if(number > 10) return; console.log(number); myFunction(number + 1); } myFunction(1);재귀 함수의 이해콜스택함수가 호출되면서 올라가는 메모리 영역으로, 스택으로도 부른다. 스택이 가지는 특성인 FILO(First In Last Out)를 따라 먼저 들어온 데이터가 나중에 나간다.재귀 함수의 경우 함수 안에서 호출한 자신의 함수를 계속 스택 위로 쌓아 올리게 된다. 위의 코드를 그림으로 보면 다음과 같다. 그러므로 가장 위에 실행된 함수를 먼저 처리하고 먼저 실행한 단계 별로 내려가며 실행을 완료해 나가면 된다. 재귀적으로 생각하기반복적 실행반복문으로 구현했을 때보다 크게 이점이 되는 부분이 없고 오히려 메모리 공간을 많이 차지해 for문보다 성능이 낮다.하향식 계산하위 문제의 결과를 기반으로 현재 문제를 계산하는 방식인데, 이 계산 방법은 오직 재귀 함수로만 가능하며 재귀 함수를 사용하는 이유라고 할 수 있다.배열의 합, 문자열의 길이, 지수 함수를 모두 재귀 함수를 이용해 구현 해봤는데, 이전의 문제가 이미 해결됐다고 가정하는 식으로 코드를 작성하면 좀 더 쉽게 재귀 함수를 이용할 수 있다. 하노이의 탑재귀 함수를 배울 때 가장 기본으로 나오는 문제로, 규칙은 다음과 같다. 문제: 기둥 A에 꽃혀있는 3개의 크기가 다른 원반1,2,3을 기둥 B로 옮기기기둥은 A, B, C 세 가지가 존재한다.크기가 작은 순으로 원반1, 원반2, 원반3이 존재한다.규칙1. 한 번에 한 개의 원반만 옮길 수 있다.규칙2. 가장 위에 있는 원반만 옮길 수 있다.규칙3. 작은 원반 위에 큰 원반이 올 수 없다.위의 문제를 해결하기 위한 과정은 다음과 같다.path1기둥C로 원반3을 옮겨야 하므로 먼저 기둥B로 원반 1, 2를 옮겨야 한다.그런데 기둥B로 원반 1, 2를 옮기기 위해 먼저 기둥C로 원반 1을 옮겨야 한다.이를 콜스택에 넣는다고 생각하면 아래와 같고, 맨 위부터 수행하면 된다.path2기둥 B에 남아 있는 원반1,2를 기둥C로 옮겨야 한다.그런데 기둥C로 원반 1,2를 기둥C로 옮기기 위해 먼저 기둥A로 원반 1을 옮겨야 한다.이를 콜스택에 넣는다고 생각하면 아래와 같고, 맨 위부터 수행하면 된다.위의 흐름을 토대로 매개변수로 count, from, to, temp를 이용해 코드로 구현할 수 있다.시작(From): A목표(To): C임시(Temp): B 버블 정렬(Bubble Sort)왼쪽의 원소부터 인접한 원소와의 대소를 비교하여 더 큰 원소를 뒤쪽으로 보내며 자리를 바꾸는 정렬 방식버블 정렬의 원리다음과 같은 배열이 있다고 할 때, 버블 정렬이 진행되는 과정을 알아보자.array = [4,2,3,1]path 11-1. 4와 2를 비교해 더 큰 숫자가 앞에 있으니 둘의 자리를 바꾼다.[2, 4, 3, 1]1-2. 4와 3을 비교해 더 큰 숫자가 앞에 있으니 둘의 자리를 바꾼다.[2, 3, 4, 1]1-3. 4와 1을 비교해 더 큰 숫자가 앞에 있으니 둘의 자리를 바꾼다.[2, 3, 1, 4]차례대로 모든 원소를 한 번 지났으므로 path 1을 끝낸다.가장 큰 숫자인 4가 마지막에 위치했으므로 다음 path에서는 4를 제외하고 정렬을 수행한다.path 24를 제외하고 다시 맨 앞의 원소부터 비교해 나가기 시작한다.2-1. 2와 3을 비교했지만 규칙에 맞으니 넘어간다.[2, 3, 1, 4]2-2. 3과 1을 비교해 더 큰 숫자가 앞에 있으니 둘의 자리를 바꾼다.[2, 1, 3, 4]차례대로 모든 원소를 한 번 지났으므로 path 2를 끝낸다.다음으로 큰 수인 3이 세번 째에 잘 위치했으므로 다음 path에서는 3 또한 제외하고 정렬을 수행한다.path 3다시 맨 앞의 원소부터 비교해 나가기 시작한다.2-2. [1, 2, 3, 4]2와 1을 비교해 더 큰 숫자가 앞에 있으니 둘의 자리를 바꾼다.모든 원소가 작은 원소부터 큰 원소 순서대로 잘 자리했으니 정렬을 마친다. 버블 정렬의 성능버블정렬은 이해와 구현이 간단하다. 그렇다면 성능은 어떨까?배열의 개수가 n개일 경우 정렬을 해야하는 횟수는 (n-1)+(n-2)+(n-3)+...+2+1로, 이를 식으로 표현하면 n(n-1)/2 즉, (n²-n)/2가 된다.이를 빅 오로 표기하면 O(n²)의 성능을 갖는다고 할 수 있다. 이는 입력량에 따른 계산량이 급격하게 상승하여 좋은 성능이 아니다.버블 정렬의 장단점버블 정렬의 장점간단한 이해와 구현이 가능버블 정렬의 단점O(n²)의 낮은 성능 선택 정렬(Selection Sotr)배열의 정렬되지 않은 영역의 첫 번째 원소를 시작으로 마지막 원소까지 비교 후 가장 작은 값을 첫 번째 원소로 가져오는 정렬 방식 선택 정렬의 원리다음과 같은 배열이 있다고 할 때, 선택 정렬이 진행되는 과정을 알아보자.array = [6, 3, 4, 1, 2, 5]path 1첫 번째 원소인 6을 시작으로 한 칸씩 옆으로 이동하며 가장 작은 원소를 찾아 첫 번째 원소와 자리를 교체한다.[1, 3, 4, 6, 2, 5]차례대로 모든 원소를 한 번 지났으므로 path 1을 끝낸다.가장 작은 원소인 1이 첫번째에 위치했으므로 다음 path에서는 1을 제외한 부분에서 다시 정렬을 수행한다.path 21을 제외하고 두 번째 원소부터 비교해 나아가기 시작한다.두 번째 원소인 3을 시작으로 한 칸씩 옆으로 이동하며 가장 작은 원소를 찾아 3과 자리를 교체한다.[1, 2, 4, 6, 3, 5]차례대로 모든 원소를 한 번 지났으므로 path 2를 끝낸다.두 번째로 작은 원소인 2가 두 번째에 위치했으므로 다음 path에서는 1과 2를 제외한 부분에서 다시 정렬을 수행한다.path 31과 2를 제외하고 세 번째 원소부터 비교해 나아가기 시작한다.세 번째 원소인 4를 시작으로 한 칸씩 옆으로 이동하며 가장 작은 원소를 찾아 4와 자리를 교체한다.[1, 2, 3, 6, 4, 5]차례대로 모든 원소를 한 번 지났으므로 path 3을 끝낸다.세 번째로 작은 원소인 3이 세 번째에 위치했으므로 다음 path에서는 1, 2, 3을 제외한 부분에서 다시 정렬을 수행한다.path 41, 2, 3을 제외하고 네 번째 원소부터 비교해 나아가기 시작한다.네 번째 원소인 6을 시작으로 한 칸씩 옆으로 이동하며 가장 작은 원소를 찾아 6과 자리를 교체한다.[1, 2, 3, 4, 6, 5]차례대로 모든 원소를 한 번 지났으므로 path 4를 끝낸다.네 번째로 작은 원소인 4가 네 번째에 위치했으므로 다음 path에서는 1, 2, 3, 4를 제외한 부분에서 다시 정렬을 수행한다.path 51, 2, 3, 4를 제외하고 다섯 번째 원소부터 비교해 나아가기 시작한다.다섯 번째 원소인 6을 시작으로 한 칸씩 옆으로 이동하며 가장 작은 원소를 찾아 6과 자리를 교체한다.[1, 2, 3, 4, 5, 6]차례대로 모든 원소를 한 번 지났으므로 path 5를 끝낸다.다섯 번째로 작은 원소인 5가 다섯 번째에 위치했으며 하나 남은 원소 6은 자동으로 정렬되어 모든 원소가 작은 원소부터 큰 원소 순서대로 잘 자리했다.정렬을 마친다. 선택 정렬의 성능선택 정렬은 이해와 구현이 간단하다. 그렇다면 성능은 어떨까?배열의 개수가 n개일 경우 정렬을 해야하는 횟수는 (n-1)+(n-2)+(n-3)+...+2+1로, 이를 식으로 표현하면 n(n-1)/2 즉, (n²-n)/2가 된다.이를 빅 오로 표기하면 O(n²)의 성능을 갖는다고 할 수 있다. 버블 정렬과 같은 성능이라고 할 수 있다. 선택 정렬의 장단점선택 정렬의 장점간단한 이해와 구현이 가능선택 정렬의 단점O(n²)의 낮은 성능 운영체제(Operating System) CPU 스케줄링스케줄링의 성능 평가CPU 스케줄링의 성능을 평가하는 기준은 다음과 같다.평균 대기 시간프로세스 여러 개 실행시 모든 프로세스가 실행되기까지의 대기 시간의 평균 CPU 스케줄링의 종류FIFO(First In First Out)스케줄링 큐에 들어온 순서대로 CPU를 할당 받는 방식으로, 먼저 들어온 프로세스의 실행이 완전히 끝나야만 다음 프로세스 실행이 가능하다. ex) 마트 계산대장점단순하며 직관적단점한 프로세스가 완전히 끝나야만 다음 프로세스 진행이 가능하다는 점에서 실행 시간이 짧고 늦게 도착한 프로세스가 실행 시간이 길고 빨리 도착한 프로세스의 작업을 기다려야 한다는 것I/O 작업이 있을 시 CPU는 작업이 끝날 때 까지 쉬기 때문에 낮은 효율성평균 대기 시간Burst Time이 짧은 프로세스 먼저 실행시 평균 대기 시간이 짧다.Burst Time이 긴 프로세스 먼저 실행시 평균 대기 시간이 길다.프로세스의 Burst Time에 따라 평균 대기 시간의 차이가 크기 때문에 잘 쓰이지 않고, 일괄처리 시스템에 사용된다.  SJF(Shortest Job First)FIFO 스케줄링에서 발견한 특징에 의해 고안된 스케줄링 방법으로, Burst Time이 짧은 프로세스를 먼저 실행하는 방식이다.이는 이론적으로는 FIFO보다 성능이 더 좋지만 문제점이 있다.어떤 프로세스가 얼마나 실행될지 예측 불가Burst Time이 긴 프로세스는 Burst Time이 짧은 프로세스 작업이 계속 들어올 시 순서가 계속 밀려나 아주 오랜 시간 동안 실행되지 못할 수 있다. RR(Round Robin)FIFO 스케줄링의 단점을 해결하기 위해 고안된 스케줄링 방법으로, 각 프로세스에게 일정 시간만큼 할당하여, 실행 중이던 프로세스의 할당 시간이 끝나면 CPU 할당을 끝내고 큐의 가장 뒤로 위치 시킨 뒤 다음의 프로세스를 실행하는 방식이다.타임 슬라이스(타임 퀀텀)프로세스에게 할당하는 일정 시간평균 대기 시간타임 슬라이스 값에 따라 크게 달라진다.타임 슬라이스 값이 아주 클 경우, FIFO 알고리즘과 같은 평균 대기 시간을 가진다.타임 슬라이스 값이 아주 작을 경우, 잦은 컨텍스트 스위칭 발생으로 오버헤드가 커진다.그러므로 사용자가 프로세스가 끊기지 않고 동시에 실행되는 것처럼 느끼면서 가장 큰 타임 슬라이스 값을 찾아야 한다.  MLFQ(Multi Level Feedback Queue)RR 스케줄링을 기반으로 만들어졌으며 운영체제는 CPU Bound Process와 I/O Bound Process를 구분하며 CPU Bound Process는 타임 슬라이스를 크게, I/O Bound Process는 타임 슬라이스를 작게 주는 방식으로, 오늘날 운영체제에서 가장 일반적으로 쓰이는 스케줄링 기법이다.타임 슬라이스 선택 방식우선순위가 낮을수록 타임 슬라이스 크기가 커지고, 우선순위가 높을수록 타임 슬라이스 크기가 작은 큐 여러 개가 존재.모든 프로세스는 높은 우선순위의 큐에서 시작해 점점 큰 타임 슬라이스를 가진 낮은 우선순위의 큐까지 한칸씩 내려가며 만족하는 타임슬라이스를 가지는 우선순위 큐에 위치한다. CPU 사용률이 높은 프로세스의 경우 타임 슬라이스가 크므로 낮은 우선순위 큐에 많이 위치하게 되고, I/O 사용률이 높은 프로세스의 경우 타임 슬라이스가 작으므로 높은 우선순위 큐에 많이 위치한다.프로세스 동기화독립 프로세스와 협력 프로세스운영체제 내에서 프로세스들이 상호작용하는 방식에 따라 독립 프로세스(Independent Processes)와 협력 프로세스(Cooperating Processes)로 구분한다. 독립 프로세스(Independent Processes)독립 프로세스는 다른 프로세스의 실행에 영향을 받지 않으며, 다른 프로세스에 영향을 주지도 않는 프로세스이다.독립 프로세스의 특징자원의 독립성: 자신의 메모리 공간과 시스템 자원 독립적 사용실행의 독립성: 프로세스의 실행이 다른 프로세스의 상태나 실행에 비의존통신의 부재: 프로세스 사이에 명시적인 데이터 공유 또는 통신 부재협력 프로세스(Cooperating Processes)협력 프로세스는 다른 프로세스와 데이터를 공유하거나, 어떤 방식으로든 서로 영향을 주고받는 프로세스협력 프로세스의 특징데이터 공유: 프로세스간 데이터 또는 자원의 공유동기화: 프로세스 작업의 진행 속도에 따라 서로 동기화 가능통신: 프로세스 간 통신을 통해 서로 정보 교환그렇다면 협력 프로세스는 데이터를 공유하고, 작업을 조율하기 위해 어떻게 통신할까? 프로세스의 통신 종류스레드 간 통신(Thread Communication) 한 프로세스 내에서의 통신 프로세스 내의 쓰레드는 코드, 데이터, 힙영역 공유하고 스택은 자기 것을 소유하는데 이 중 데이터 영역에 있는 전역변수나 힙을 통해 통신프로세스 간 통신(Inter-Process Communication, IPC) 한 컴퓨터 내에서의 프로세스 간 통신 파일을 이용한 읽고 쓰기 운영체제가 생성한 파이프를 이용해 데이터를 읽고 쓰기 다른 컴퓨터의 다른 프로세스 간 통신 운영체제가 제공하는 소켓을 통한 통신 다른 컴퓨터에 있는 함수를 호출하는 RPC(원격 프로시저 호출)를 이용해 통신 공유자원과 임계구역공유자원이란?프로세스 간 통신(IPC)을 할 때 공동으로 이용하는 변수나 파일이 공유자원에 여러 프로세스가 동시에 접근할 때 발생할 수 있는 상황을 경쟁조건(Racing Condition)이라고 하며 그 상황에서 발생할 수 있는 문제는 다음과 같다.여러 프로세스가 공유하기 때문에 각 프로세스의 접근 순서에 따라 결과가 달라질 수 있다.컨텍스트 스위칭으로 시분할 처리를 하기 때문에 어떤 프로세스가 언제 처리될지 모른다.연산 결과를 예측하기 힘들다.위와 같은 문제들로 인해 임계구역 관리가 필요하다.임계구역(Critical Section)이란?여러 프로세스가 동시에 사용하면 안되는 영역으로, 임계구역 내의 코드를 실행하는 동안 해당 자원에 대한 독점적인 접근이 보장되어야 한다. 이는 동시 실행되는 프로세스나 스레드 사이에서 데이터의 일관성과 무결성을 유지한다. 임계구역 문제 해결을 위한 조건상호 배제(Mutual Exclusion) 메커니즘상호 배제 매커니즘의 요구사항 3가지임계영역엔 동시에 하나의 프로세스만 접근동시에 여러 요청이 있을 경우에도 하나의 프로세스 접근만 허용임계구역에 들어간 프로세스는 빠르게 다시 나옴 임계구역 문제 해결 기법1. 세마포어(Semaphore)공유자원을 필요로 하는 프로세스들은 대기 큐에 순서대로 대기 하고 먼저 온 프로세스에게 세마포어(정수형 변수=공유 변수의 개수, 예를 들어 공유 변수가 한 개일 때 s = 1)를 부여한다. 해당 프로세스의 실행이 끝나고 부여된 세마포어가 반납될 때 까지 다음의 프로세스는 이 세마포어를 받기 위해 기다려야 하는 방식예를 들어 코드로 살펴보자면 아래와 같다.먼저 온 프로세스는 wait() 함수로 세마포어를 부여 받고, 코드를 실행해 나간다. 이후에 온 프로세스는 세마포어를 부여 받기 위해 기다렸다가 이전의 프로세스가 코드 실행을 마치고 signal() 함수로 세마포어를 반납하면 그 때 세마포어를 부여 받을 수 있다. wait(변수); 실행 코드; signal(변수); 세마포어의 단점wait() 함수와 signal() 함수의 위치를 실수로 바꿔 잘못 사용할 가능성 존재 2. 모니터(Monitor)세마포어의 단점을 해결한 상호 배제 메커니즘으로, 운영체제가 아닌 프로그래밍 언어 차원에서 지원하는 방법wait() 함수와 signal() 함수로 해당 코드를 감쌀 필요 없이 프로그래밍 언어가 지원하는 언어로 간편하고 안전하게 상호 배제 메커니즘을 실현할 수 있다.예를 들어 JAVA에서는 임계구역을 표시하기 위해 동기화된 메서드 'synchronized method'를 사용한다. synchronized 구문이 실행되는 동안 여러 프로세스에서 모니터를 점유하려고 시도해도 할 수 없으며 해당 구문이 끝날 때까지 대기해야 한다. 교착상태(Deadlock)여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다 어떤 프로세스도 작업을 진행하지 못하는 상태로, 시스템의 자원을 비효율적으로 사용하게 만들며 최악의 경우 시스템의 정지를 초래할 수 있다.발생 이유공유 자원을 통해 여러 개의 프로세스가 자원을 공유하기 때문필요 조건교착상태가 발생하려면 다음의 네 가지 조건을 모두 충족해야 한다.상호 배제: 어떤 프로세스가 리소스를 점유 했다면 다른 프로세스에게 해당 리소스는 공유 되면 안된다.비선점: 어떤 프로세스가 리소스를 점유 했다면 다른 프로세스는 해당 리소스를 빼앗을 수 없다.점유와 대기: 어떤 프로세스가 리소스를 가지고 있는 상태에서 다른 리소스를 원하는 상태원형 대기: 점유와 대기를 이루는 프로세스들이 원형을 이루는 형태교착 상태 해결교착 상태 회피(Deadlock Avoidance)프로세스에 자원을 할당할 때 어느 정도 할당해야 교착 상태가 발생하는지 파악하여 교착 상태가 발생하지 않는 수준의 자원을 할당하는 방법전체 자원의 수와 할당된 자원의 수를 기준으로 안정 상태와 불안정 상태로 나눈다.안전 상태는 시스템이 프로세스의 모든 추가 요구를 충족시킬 수 있는 충분한 자원을 가지고 있어서, 모든 프로세스가 교착 상태 없이 실행을 완료할 수 있는 상태이며 불안전 상태는 교착 상태에 빠질 확률이 높아진 상태이다.운영체제는 최대한 안정 상태를 유지하기 위해 자원을 할당 은행원 알고리즘(Banker's Algorithm)다익스트라(Edsger W. Dijkstra)에 의해 고안된 교착 상태 회피 알고리즘 중 하나운영체제는 프로세스에 자원을 할당하기 전에 자신이 가지는 총 자원의 수(시스템 총 자원의 수)를 미리 알고 있어야 하며 각 프로세스는 자신이 필요한 최대 자원의 수(최대 요구 자원)를 운영체제에 미리 알린다. 위의 안정 상태에서 P1이 자원 요청을 할 경우 예상 자원이 사용 가능한 자원인 2보다 크기 때문에 자원을 할당하지 않는다.P2가 자원 요청을 하면 예상 자원이 사용 가능한 자원으로 할당 가능하기 때문에 P2에게 자원 2개를 할당 하고, P2는 2개의 자원을 더 받아 작업을 마치고 총 6개의 자원을 반납한다.사용 가능한 자원이 6개가 됐으므로 P1에 자원을 할당 할 수 있게 되어 자원 4개를 할당한다.반면 위와 같은 불안정 상태에서는 사용 가능한 자원이 1개뿐인데 반해 모든 프로세스의 요청 예상 자원이 2개로, 어떤 프로세스에게도 자원을 할당해 주지 못한다.하지만 프로세스가 최대 자원을 요청하지 않는다면 교착 상태에 빠지지 않을 수도 있다. 그래도 불안정 상태에 빠지지 않도록 유지하는 것이 좋다. 은행원 알고리즘의 단점높은 비용비효율적 위의 단점으로 인해 교착 상태의 발생은 허용하고, 교착 상태가 발생했을 때 해결하는 방식을 연구했다.교착상태 검출 방식1. 가벼운 교착 상태 검출타이머를 이용해 프로세스가 일정 시간 동안 작업을 진행하지 않는 상태 검출교착 상태 해결일정 시점마다 체크포인트를 만들어 작업 저장해놓은 뒤 타임 아웃으로 교착상태가 발생할 시 마지막으로 저장했던 체크포인트로 롤백 2. 무거운 교착 상태 검출자원 할당 그래프(Resource Allocation Graph)를 이용해 운영체제는 프로세스가 어떤 자원을 사용하는지 지켜보다가 교착 상태가 발생 시 검출이 그래프에서 교착 상태는 순환 대기(circular wait) 조건을 만족하는 사이클로 나타난다.교착 상태 해결교착 상태를 일으킨 프로세스 강제 종료 시킨 뒤 다시 실행시킬 때 체크포인트로 롤백 시킨다.단점운영체제가 지속적으로 자원 할당 그래프를 유지하고 검사해야해 오버헤드 발생 메모리의 종류레지스터가장 빠른 기억 장소로, CPU 내 위치. 컴퓨터가 꺼지면 데이터가 사라져 휘발성 메모리라고 부른다. 32bit, 64bit 등으로 크기를 구분해 32bit 레지스터를 가지는 CPU를 32bit CPU, 64bit 레지스터를 가지고 있으면 64bit CPU라고 한다.CPU는 계산을 할 때 메인 메모리에 있는 값을 레지스터로 가져와 계산, 계산 결과는 다시 메인 메모리에 저장한다.어셈블리 코드를 보면 기계어와 1:1 매칭이 되어 실제로 레지스터를 사용하는 것을 볼 수 있다. 캐시레지스터와 메인 메모리 사이에 존재하는 휘발성 메모리.레지스터는 속도가 매우 빠른 반면 메인 메모리는 속도가 느린 편이다. 메인 메모리에 있는 데이터를 레지스터로 옮기려면 오랜 시간이 걸리기 때문에 필요 할 것 같은 데이터를 미리 저장해 두는 역할을 한다. 성능의 이유로 여러개(L1, L2, L3..)를 둔다. 메인 메모리실제 운영체제와 다른 프로세스들이 올라가는 공간으로, 전원이 공급되지 않으면 데이터가 지워지는 휘발성 메모리.하드디스크나 SSD보다 속도는 빠르지만 가격이 비싸 데이터 저장보단 실행 중인 프로그램만 올리는 용도 보조 저장장치(SSD, 하드디스크)가격이 저렴하고 전원이 공급되지 않아도 데이터를 저장하는 비휘발성 메모리 메모리의 구조오늘날의 컴퓨터는 CPU와 메인 메모리가 함께 사용되어 모든 프로그램을 메모리 위로 올려 실행하는 폰 노이만 구조로, 하나의 프로그램만 메모리에 올라가던 예전에 비해 관리하기가 복잡해졌다.메모리는 1Byte(8bit)마다 주소를 가진다.32bit CPU는 레지스터 크기, ALU(산술논리연산장치), 버스의 크기가 32bit이며 CPU가 다룰 수 있는 메모리도 2³²으로 4GB이다.64bit CPU도 레지스터 크기, ALU(산술논리연산장치), 버스의 크기가 64bit이며 CPU가 다룰 수 있는 메모리도 2⁶⁴으로 거의 무한대에 가깝다.메모리를 컴퓨터에 연결하면 0번지부터 주소가 있다. 이를 물리 주소 공간이라 한다.사용자 관점에서의 공간은 논리 주소 공간이며, 이를 통해 물리 주소 공간에 접근한다. 메모리는 운영체제 영역을 따로 가지고 있어 이 영역이 침범 되면 위험할 수 있다.경계 레지스터CPU 내에 존재하는 레지스터로, 하드웨어적으로 운영체제 공간과 사용자 공간을 나눈다. 메모리 관리자가 사용자 프로세스가 경계 레지스터 값을 벗어났는지 검사하고 만약 벗어났다면 그 프로그램을 강제 종료한다. 절대주소와 상대주소사용자가 상대주소(논리주소)로 접근 시 메모리 관리자는 재배치 레지스터에 있는 프로그램의 시작 주소를 가지고 있어, 이 시작 주소에 상대주소를 더한 절대 주소(물리 주소)를 찾는다.메모리 관리자를 통해 모든 사용자 프로세스는 0x0번지부터 시작한다는 가정으로 편리하게 프로그램을 만들 수 있다. 메모리 할당 방식유니 프로그래밍 환경메모리 오버레이메모리보다 큰 프로그램을 실행하면 당장 필요한 부분만 먼저 메모리에 올리고 나머지 부분은 하드디스크의 스왑 영역에 저장하는 기법하지만 이는 스왑 영역에 있는 데이터 일부를 메모리로 옮기고, 메모리에 있는 데이터를 스왑 영역으로 옮기는 과정이 필요하기 때문에 동작이 느리다. 멀티 프로그래밍 환경1. 가변 분할 할당(Dynamic-Partition Allocation, 세그멘테이션)프로세스의 크기에 따라 메모리를 할당하는 방식장점프로세스 크기에 맞게 메모리가 할당되어 내부 단편화가 없다내부 단편화란?프로세스의 크기가 할당된 메모리 크기보다 작을 경우 발생되는 메모리 낭비 공간단점메모리의 할당과 회수 과정에서 작은 메모리 공간이 여러 곳에 분산될 수 있다. 이 공간을 합친 총 메모리 공간이 충분함에도 연속된 공간이 아니기 때문에 크기가 큰 프로세스가 들어갈 수 없어 낭비되는 외부 단편화 발생가변 분할 방식에서 외부 단편화가 생기는 경우 그 공간들을 합쳐주는 조각 모음을 실행하면 문제가 해결되지만 실행중인 다른 프로세스들을 중지하고 위치를 옮기는 과정이 필요해 오버헤드 발생 2. 고정분할 할당 (Fixed-Partition Allocation, 비연속 메모리 할당, 페이징)프로세스 크기와 상관없이 고정된 크기의 메모리를 할당하는 방식장점구현이 간단하고 오버헤드가 적다단점프로세스의 크기가 할당된 고정 메모리 크기보다 작을 경우 내부 단편화 발생분할되는 크기를 조절해 내부 단편화를 최소화 해줘야 한다. 3. 버디 시스템2의 승수로 메모리를 분할해 메모리 할당하는 방식으로, 가변 분할 할당 방식과 고정분할 할당 방식을 혼합해 단점을 줄임장점프로세스 크기에 따라 할당되는 메모리 크기가 달라지며 외부 단편화를 방지하기 위해 메모리 공간을 확보하는 것이 간단하다.내부 단편화가 발생하긴 하지만 공간 낭비가 적다. 회고 지난 주에 이어 알고리즘 같은 경우에는 강의를 보며 따라하기 전에 내가 미리 구현 해보는 시간을 가짐으로써 지난 주에 가졌던 아쉬움을 타파해보려고 노력한 점을 칭찬해주고 싶다. 보고 따라 치는 것만 하는 것 보다 먼저 구현해 봄으로써 내가 어떻게 사고하고 있고, 잘 안 됐던 부분에서는 어떤 지점에서 사고가 부족했는지 확실히 알 수 있었다.운영체제의 경우 강의를 토대로 다른 자료들도 함께 봄으로써 조금 더 폭넓게 이해하려고 노력했다. 그러다보니 생각보다 시간이 많이 소요되기도 한다. 정해진 시간 안에 조금 더 효율적으로 공부할 수 있도록 루틴을 짤 필요가 있을 것 같다.

알고리즘운영체제재귀함수버블정렬선택정렬

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

강의 수강 내용 및 회고 운영체제공유자원, 임계구역, 세마포어, 모니터, 데드락, 메모리 등 간만에 들어보는 단어들이 많아서 반가웠다. 예전에 업무중 세마포어란 단어가 나왔을 때 뭐였는지 생각이 잘 안나서 멈칫했던 적이 있었어서 더 반가웠던 것 같다. 이번주 강의를 들으면서 어설프게 알고 있던 운영체제 이론들을 머릿속에서 체계적으로 정리할 수 있어서 좋았다. 그림으로 한단계 한단계 눈으로 보는 것이 이해에 무척 도움이 되었고, 미션을 해결하기 위해 강의 내용을 떠올릴 때도 좀 더 차근차근히 생각할 수 있었다.  자료구조와 알고리즘재귀와 정렬에 대해서 배웠다. 재귀는 대학생 때부터 계속 그랬듯이 이해가 된거 같으면서도 안된 것 같고.. 적용을 할 수 있을 것 같으면서도 헷갈리고..의 반복이었다. 그래서 강의에서 재귀를 적용할 수 있는 문제유형에 대해 설명해준 부분이 무척 마음에 들었다. 하향식 문제풀이를 적용하는 문제에 재귀를 적용하는 방법을 배웠고, 실제로 하노이탑 문제가 손쉽게 풀리는 것을 보고 나니 재귀 알고리즘이 이전보다 더 매력적으로 느껴졌다. 역시.. 나머지는 연습을 하는 수 밖에 없겠다. 정렬 알고리즘은 솔직히 머리로 생각할 때는 '넘 쉬운걸ㅋ'하고 넘어갔는데, 막상 코드로 구현하려니 인덱스를 설정하는데 있어서 실수를 조금 했다. 머리로만 생각하는 것보다 코드로 한번 구현해보는게 훨~씬 도움이 많이 된다는 걸 또 한번 느낀다. 칭찬할 점아침에 눈뜨자마자 학습을 진행해봤는데, 생각보다 공부도 잘되고 아침시간이 윤택해져서 좋았다. 저녁에 공부를 하려고 하면 피곤하기도 하고 지쳐서 조금 우울하게 공부하는데, 아침에 공부를 하니까 집중이 더 잘되는 느낌이었다. 그리고 확실히 강의 내용을 듣고난 뒤에 의문인 점들을 검색해보니 이전에는 이해하는데 좀 더 오래걸렸던 자료도 훨씬 더 빨리 읽히는 느낌이 들었다. 공부한 보람이 느껴지는 부분~ 아쉬웠던 점이번주는 매일 차근차근히 강의를 듣고 진도를 나가고 싶었는데, 평일에 너무 바빠서 결국 금토일에 몰아서 학습할 수 밖에 없었다. 다행히 강의 내용이 그렇게 많지 않기도 하고, 이미 아는 내용이 절반 이상이라 학습하는데 문제는 없었지만.. 마지막주는 좀 더 차분히 학습할 수 있었으면...  보완할 점저번주에 다짐했던 대로 강의를 들으면서 요약정리를 해보기는 했는데, 중간까지 하다가 속도가 너무 느려서 우선 강의 내용을 이해하는데 좀 더 초점을 맞춰서 학습했다. 나머지 정리는 강의를 한번 더 복습하면서 찬찬히 해야겠다.

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

minme9055

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

운영체제SJF (Shortest Job First)가장 짧은 실행 시간을 가진 작업을 먼저 처리하는 스케줄링 알고리즘평균 대기 시간을 최소화하는 효과가 있지만, 실행 시간을 정확히 예측하기 어려워 사용에 제한이 있음RR (Round Robin)각 프로세스에 고정된 시간 할당량(타임 슬라이스)을 부여하여 순환 방식으로 CPU를 할당하는 알고리즘공정성을 보장하지만, 타임 슬라이스 설정이 성능에 큰 영향을 미침MLFQ (Multi-Level Feedback Queue)다중 우선순위 큐를 사용하여 프로세스의 특성에 따라 동적으로 우선순위를 조정하는 스케줄링 알고리즘CPU Bound 프로세스는 장시간 CPU를 점유하여 우선순위가 낮은 큐로 이동I/O Bound 프로세스는 자주 I/O 작업을 수행하여 높은 우선순위 큐로 유지프로세스 간 통신 (Inter-Process Communication, IPC)프로세스들이 데이터를 교환하거나 동기화하기 위해 사용하는 메커니즘주요 방법: 파이프, 메시지 큐, 공유 메모리, 소켓효율적인 통신을 위해 다양한 기술이 사용됨공유 자원과 임계 구역 (Critical Section)여러 프로세스나 스레드가 동시에 접근할 수 있는 자원을 사용할 때 발생할 수 있는 문제를 방지자원 접근을 제한하는 코드 블록을 임계 구역이라고 함임계 구역을 효과적으로 관리하는 것이 중요함세마포어 (Semaphore)임계 구역을 제어하기 위한 동기화 도구로, 자원의 사용 가능 수를 추적하는 카운터 사용P (wait) 연산: 자원을 요청하고, 사용 가능할 때까지 대기V (signal) 연산: 자원을 해제하고, 대기 중인 프로세스에게 자원을 양도이를 통해 동시 접근 문제를 해결모니터 (Monitor)고수준의 동기화 메커니즘데이터 구조와 관련 연산을 하나의 단위로 묶어 상호 배제를 보장세마포어보다 구조화된 접근을 제공하여 동시성 문제를 쉽게 관리데드락이란? (feat. 식사하는 철학자)두 개 이상의 프로세스가 서로가 점유하고 있는 자원을 기다리며 무한히 대기하는 상태식사하는 철학자 문제는 이를 설명하는 대표적인 예제로, 철학자들이 포크를 공유하며 식사할 때 발생할 수 있는 교착상태를 보여줌데드락 해결 (feat. 은행원 알고리즘)교착상태를 방지하거나 해결하기 위한 방법 중 하나로 은행원 알고리즘을 사용시스템이 안전 상태(safe state)를 유지하도록 자원 할당을 사전에 검증하여 교착상태를 예방안전 상태란 모든 프로세스가 요청을 완료할 수 있는 상태를 의미함메모리 종류주기억장치(RAM): 휘발성 메모리로 프로그램 실행 중 데이터를 저장보조기억장치(HDD, SSD): 비휘발성 메모리로 영구적으로 데이터를 저장캐시 메모리: CPU와 주기억장치 간의 속도 차이를 줄이기 위해 사용되는 고속 메모리메모리와 주소메모리는 고유한 주소(address)를 통해 접근각 메모리 셀은 고유한 주소를 가지며, 프로그램은 이 주소를 사용하여 데이터를 읽거나 씀주소 체계는 메모리 관리와 프로세스 간의 통신에 중요한 역할을 함메모리 할당 방식정적 할당: 컴파일 시 메모리 크기가 결정되며, 프로그램 실행 중 변경되지 않음동적 할당: 프로그램 실행 중에 메모리를 할당하고 해제할 수 있음자료구조와 알고리즘재귀 (Recursion)함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법문제를 더 작은 하위 문제로 분할하여 해결기저 조건을 정의하여 재귀 호출을 종료재귀적으로 생각하기문제를 자기 자신과 유사한 더 작은 문제로 분해하여 해결하는 접근 방식특히 데이터 구조의 트리 구조나 분할 정복 알고리즘에서 유용함재귀 - 하노이 탑 (Tower of Hanoi)재귀적 접근을 통해 해결할 수 있는 고전적인 문제n개의 원반을 시작 기둥에서 목표 기둥으로 옮기는 과정에서 재귀 호출을 이용하여 효율적으로 문제를 해결정렬 - 버블정렬 (Bubble Sort)인접한 요소를 비교하여 필요에 따라 교환하면서 리스트를 정렬하는 단순한 정렬 알고리즘구현이 쉽지만 시간 복잡도가 O(n²)으로 비효율적임정렬 - 선택정렬 (Selection Sort)리스트에서 가장 작은(또는 큰) 요소를 찾아 현재 위치에 교환하는 방식으로 정렬하는 알고리즘시간 복잡도는 O(n²)이며, 데이터 이동이 적은 편이지만 안정적이지 않음2주차 후기운영체제에서 처음 접하는 단어들이 난무하는 2주차였다. 잠시 정신이 혼미할 뻔 했지만 😵‍💫 내용을 차근히 따라가면서 조금씩 이해해 나갈 수 있었던 것 같다. 특히 개념 - 개념과 관련된 문제와 그 원인 - 해결의 관점에서 접근하니 나름 재밌게 공부했던 것 같다.알고리즘은 말은 많이 들어봤지만 실제로 잘 써본 경험은 없는 개념들에 대해 공부했다. 실제로 구현도 해 보면서 진행하니 이해하는 데 많은 도움이 되었다.이번 주는 '프론트엔드 개발자로 일을 할 때 이런 개념들까지도 알아야하나?'라는 생각이 들었던 것 같다. 뭔가 프론트보다는 서버에서 더 많이 접할 것 같은 느낌? 그래도 알아두면 나중에 도움이 될 테니 이해를 잘 해둬야겠다는 생각을 했다.

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

minme9055

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

운영체제 (Operating Systems)1. FIFO 스케줄링의 장단점FIFO (First-In, First-Out) 스케줄링은 먼저 도착한 프로세스를 먼저 실행하는 방식입니다.장점:단순함: 구현이 매우 간단하고 이해하기 쉽습니다.공정성: 모든 프로세스가 도착한 순서대로 처리되어 순서에 대한 공정성을 보장합니다.단점:긴 대기 시간: 긴 실행 시간을 가진 프로세스가 먼저 도착하면, 뒤에 있는 짧은 프로세스들이 오랜 시간 대기해야 합니다.비효율성: 응답 시간이 중요한 시스템에서는 비효율적일 수 있습니다.2. SJF 사용의 어려움SJF (Shortest Job First)는 실행 시간이 가장 짧은 작업을 먼저 처리하는 스케줄링 알고리즘입니다.사용하기 어려운 이유:실행 시간 예측의 어려움: 실제 환경에서는 프로세스의 정확한 실행 시간을 사전에 알기 어렵습니다.스타베이션 문제: 긴 작업이 지속적으로 도착할 경우, 긴 작업들이 계속 뒤로 밀려 무기한 대기할 수 있습니다.동적 변화 대응의 어려움: 시스템 부하나 프로세스 특성이 변할 때 유연하게 대응하기 어렵습니다.3. RR 스케줄링에서 타임 슬라이스가 너무 작을 때 발생하는 문제RR (Round Robin) 스케줄링은 각 프로세스에 고정된 시간 할당량을 부여하여 순환 방식으로 CPU를 할당하는 알고리즘입니다.문제점:오버헤드 증가: 프로세스 간의 컨텍스트 스위칭이 빈번하게 발생하여 시스템 오버헤드가 증가합니다.실행 시간 비효율성: 짧은 타임 슬라이스로 인해 많은 스위칭이 필요하게 되어 실제 작업에 소요되는 시간이 늘어날 수 있습니다.캐시 효율 저하: 잦은 컨텍스트 스위칭으로 인해 캐시 히트율이 떨어지고, 캐시 미스가 증가할 수 있습니다.4. MLFQ에서 CPU Bound Process와 I/O Bound Process 구분 방법MLFQ (Multi-Level Feedback Queue)는 여러 개의 우선순위 큐를 사용하여 프로세스의 특성에 따라 동적으로 우선순위를 조정하는 스케줄링 알고리즘입니다.CPU Bound Process: 주로 CPU를 많이 사용하는 프로세스로, MLFQ에서는 장시간 CPU를 점유하는 경향이 있어 우선순위가 낮은 큐로 이동할 수 있습니다.I/O Bound Process: 자주 I/O 작업을 수행하고 CPU 사용 시간이 짧은 프로세스로, I/O 요청 시 우선순위가 상승하여 높은 우선순위 큐로 이동합니다.운영체제는 프로세스의 CPU 사용 패턴과 I/O 활동을 모니터링하여, 각 프로세스가 CPU Bound인지 I/O Bound인지를 판단하고 적절한 우선순위를 할당합니다.5. 공유 자원이란?공유 자원 (Shared Resource)은 여러 프로세스나 스레드가 동시에 접근하여 사용할 수 있는 자원을 말합니다. 예를 들어, 파일, 데이터베이스, 프린터, 메모리 공간 등이 있습니다.특징:동시 접근 가능성: 여러 프로세스가 동시에 접근할 수 있어 효율적인 자원 활용이 가능합니다.경합 상태: 동시에 접근하면 상호 배제(Mutual Exclusion)나 일관성 유지 문제 등이 발생할 수 있습니다.동기화 필요성: 공유 자원에 대한 올바른 접근을 보장하기 위해 동기화 메커니즘(예: 세마포어, 뮤텍스)을 사용해야 합니다.6. 교착상태 발생 조건교착상태 (Deadlock)는 두 개 이상의 프로세스가 서로가 점유하고 있는 자원을 기다리며 무한히 대기하는 상태를 말합니다. 교착상태가 발생하기 위해서는 다음 네 가지 조건이 모두 충족되어야 합니다:상호 배제 (Mutual Exclusion): 자원은 동시에 하나의 프로세스만 사용 가능해야 합니다.점유와 대기 (Hold and Wait): 한 프로세스가 자원을 점유하면서 추가적인 자원을 기다려야 합니다.비선점 (No Preemption): 이미 할당된 자원을 선점할 수 없어야 합니다.순환 대기 (Circular Wait): 프로세스들이 자원에 대해 순환적으로 대기하는 선형 경로가 존재해야 합니다.이 조건들을 모두 만족하면 교착상태가 발생할 수 있으므로, 이를 방지하거나 해결하기 위해서는 이 조건들 중 하나 이상을 위반해야 합니다.자료구조와 알고리즘 (Data Structures and Algorithms)1. 재귀함수에서 기저조건 미설정 시 발생 문제재귀 함수 (Recursive Function)에서 기저 조건 (Base Case)은 재귀 호출을 종료시키는 조건입니다. 기저 조건을 만들지 않거나 잘못 설정하면 다음과 같은 문제가 발생할 수 있습니다:무한 재귀 호출 (Infinite Recursion): 기저 조건이 없으면 함수가 자기 자신을 계속해서 호출하게 되어 종료되지 않고 무한히 실행됩니다.스택 오버플로우 (Stack Overflow): 재귀 호출이 계속해서 쌓이면서 호출 스택이 가득 차게 되어 프로그램이 충돌하거나 비정상 종료될 수 있습니다.논리적 오류: 기저 조건이 잘못 설정되면 함수가 의도한 대로 동작하지 않아 잘못된 결과를 반환할 수 있습니다.따라서 재귀함수를 구현할 때는 적절한 기저 조건을 설정하여 재귀 호출이 올바르게 종료되도록 해야 합니다.2. 0부터 입력 n까지 홀수의 합을 더하는 재귀 함수 구현function sumOdd(n) { // 기저 조건: n이 0보다 작거나 같을 때 if (n <= 0) { return 0; } // n이 홀수인 경우 if (n % 2 !== 0) { return n + sumOdd(n - 1); } // n이 짝수인 경우 return sumOdd(n - 1); } console.log(sumOdd(10)); // 출력: 25 console.log(sumOdd(15)); // 출력: 64기저 조건: n이 0보다 작거나 같을 때 0을 반환하여 재귀 호출을 종료합니다.홀수 처리: n이 홀수인 경우, n을 더하고 n - 1을 인자로 재귀 호출합니다.짝수 처리: n이 짝수인 경우, n을 더하지 않고 n - 1을 인자로 재귀 호출합니다.예제 실행:sumOdd(10)은 1 + 3 + 5 + 7 + 9 = 25를 반환합니다.sumOdd(15)는 1 + 3 + 5 + 7 + 9 + 11 + 13 + 15 = 64를 반환합니다.

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

elly

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

2주차 학습 내용 '그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)' Section 3(Unit 1~5)'그림으로 쉽게 배우는 운영체제' Section 3(Unit 5~7), Section 4, 5, 7 '그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)' Section 3(Unit 1~5) Section 3. 알고리즘재귀재귀란?어떠한 것을 정의할 때 자기 자신을 참조하는 것을 뜻함재귀적으로 정의된 함수를 재귀함수라고 함콜스택?함수가 호출되면서 올라가는 메모리 영역으로 스택이라고도 불림스택이기 때문에 First In Last Out 특성을 가짐 function factorial(number) { if(number == 1 || number == 0) { return 1; } else { return number * factorial(number - 1); } } console.log(factorial(5));  재귀적으로 생각하기패턴 1. 반복실행 : 반복문에 비해 크게 이점이 되는 부분은 없음. 오히려 콜스택에 공간을 많이 차지해 성능은 for문 보다 좋지 않음.for(let i = 1; i < 11; i++) { console.log(i); } function myFunction(number) { if(number > 10) return; console.log(number); myFunction(number + 1); } myFunction(1); 패턴 2. 하위 문제의 결과를 기반으로 현재 문제를 계산하는 것 : 팩토리얼 계산하향식 계산return number * factorial(number - 1); 상향식 계산function factorial(number) { let sum = 1; for(let i = 1; i <= number; i++) { sum *= i; } return sum; } function factorial2(number, i = 1, sum = 1) { if(i > number) return sum; return factorial2(number, i + 1, sum * i); } 재귀함수를 위의 코드처럼 상향식으로 쓸 수도 있긴하지만의 진정한 위력은 하향식 계산에서 발휘됨하향식 계산 예제로 알아보기예제 1) 배열의 숫자 모두 더하기function sumArray(arr) { if(arr.length == 1) return arr[0]; return sumArray(arr.slice(0, -1) + arr[arr.length - 1]); } let arr = [1,2,3,4,5]; let sum = sumArray(arr); console.log(sum); 예제 2) 문자열 길이 구하기function strLength(arr) { if(arr[0] == null) return 0; return strLength(arr.slice(0, -1)) + 1; } let str = "abcde"; let len = strLength(str) console.log(len); 예제 3) 지수함수 만들기function power(x, n) { if(n == 0) return 1; return power(x, n - 1) * x; } console.log(power(2, 5));  재귀 - 하노이 탑1883년 프랑스 수학자 에두아르드 뤼카가 발표한 게임기둥 A → 기둥 C 옮기기원반 1 → 기둥 C 이동, 원반 2→ 기둥 B, 원반 1 → 기둥 B 이동, 원반 3 → 기둥 C 이동, 원반 1 → 기둥 A 이동, 원반 2 → 기둥 C 이동, 원반 1 → 기둥 C 이동 → 성공하향식 재귀함수로 하노이 탑 게임 풀어보기기둥 A에 있는 원반 1, 2, 3을 기둥 C로 옮기려 함첫번째 목표로 원반 3을 기둥 C로 옮기는 것원반 1, 2를 목표 기둥이 아닌 기둥 B로 옮겨야 함원반 1이 기둥 C로 이동하위 문제가 없다면 스택에서 하나씩 꺼내서 문제를 해결할 수 있음두번째 목표로 원반 2를 기둥 C로 옮기는 것원반 1을 기둥 A로 옮김코드로 살펴보기honoi(3, "A", "B", "C") : honoi(원반갯수, 시작기둥, 목표기둥, 임시기둥)function hanoi(count, from, to, temp) { // 3, A, C, B 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, C, A }  정렬 - 버블정렬(Bubble Sort)배열에 숫자가 무작위로 들어가 있을 때, 데이터를 옆 데이터와 비교하면서 자리를 바꿈(반복에 따라 맨 마지막 원소는 큰 값이므로 범위에서 제외)코드 구현function BubbleSort(arr) { for(let i = 0; i < arr.length - 1; i++) { for(let j = 0; j < arr.length - -- 1; j++) { if(arr[j] > arr[j + 1]) { let temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } let arr = [4, 2, 3, 1]; console.log("==== 정렬 전 ===="); console.log(arr); BubbleSort(arr); console.log("==== 정렬 후 ===="); console.log(arr); 버블 정렬의 성능버블 정렬의 장단점장점 - 이해와 구현이 간단함단점 - 성능이 O(n^2)으로 좋지 않음 정렬 - 선택정렬(Selection Sort)배열의 정렬되지 않은 영역의 첫번째 원소를 시작으로 마지막 원소까지 비교 후, 가장 작은 값을 첫번째 원소로 가져옴(배열 끝까지 반복)코드 구현function SelectionSort(arr) { for(let i = 0; i < arr.length - 1; i++) { let minValueIndex = i; for(let j = i + 1; j < arr.length; j++) { if(arr[j] < arr[minValueIndex]) { minValueIndex = j; } } let temp = arr[i]; arr[j] = arr[minValueIndex]; arr[minValueIndex] = temp; } } let arr = [4, 2, 1, 3]; console.log("==== 정렬 전 ===="); console.log(arr); SelectionSort(arr); console.log("==== 정렬 후 ===="); console.log(arr); 선택 정렬의 성능선택 정렬의 장단점장점 - 이해와 구현이 간단함단점 - 성능이 좋지 못함 (O(n^2))  '그림으로 쉽게 배우는 운영체제' Section 3(Unit 5~7), Section 4, 5, 7 Section 3. CPU 스케줄링(Unit 5~7)CPU스케줄링 개요컴퓨터 자원필수 장치 - CPU, 메모리주변 장치 - HDD, 키보드, 마우스CPU스케줄링운영체제가 모든 프로세스에게 CPU를 할당/해제 하는 것CPU가 스케줄링에서 고려할 사항어떤 프로세스에게 CPU 리소스를 줄 것인가?CPU를 할당받은 프로세스가 얼마의 시간동안 CPU를 사용해야하는가?CPU BurstCPU를 할당받아 실행하는 작업I/O Burst입출력 작업다중큐프로세스 상태에서 준비상태, 대기상태는 큐(Queue)라는 자료구조로 관리됨실행 → 준비 상태가 될 때, 운영체제는 그에 맞는 준비 큐에 넣음실행 → 대기 상태가 될 때, I/O 작업 종류에 따라서 분류된 큐에 들어가게 됨 (ex, 하드디스크 작업 → HDD 큐)정확히는 프로세스 정보를 가지고 있는 PCB가 들어가게 됨스케줄링 목표리소스 사용률CPU 사용률 높이기, I/O 디바이스의 사용률 높이기 등등오버헤드 최소화스케줄링을 하기 위한 계산이 너무 복잡해지거나, 컨텍스트 스위칭을 너무 자주하지 않도록공평성모든 프로세스에게 공평하게 CPU가 할당되어야 함공평의 의미는 시스템에 따라 달라질 수 있음처리량같은 시간 내에 더 많은 처리를 할 수 있는 방법대기 시간작업을 요청하고 실제 작업이 이루어지기 전까지 대기 시간이 짧은 것을 목표로 함응답 시간대화형 시스템에서 사용자의 요청이 얼마나 빨리 반응하는지가 중요하기 때문에 응답시간이 짧은 것을 목표로 함목표간에 서로 상반되는 상황이 있는데, 이 때는 사용자가 사용하는 시스템에 따라 목표를 다르게 설정하게 됨 (ex, 터치스크린 → 응답시간 짧도록, 과학 계산 → 처리량이 높도록 초점 맞춤)FIFO(First In First Out)스케줄링 큐에 들어온 순서대로 CPU를 할당받는 방식먼저 들어온 프로세스가 완전히 끝나야만 다음 프로세스가 실행될 수 있음장점단순하고 직관적단점한 프로세스가 완전히 끝나야 다음 프로세스가 시작되기 때문에 실행시간이 짧고 늦게 도착한 프로세스가 실행시간이 길고 빨리 도착한 프로세스의 작업을 기다려야 함I/O 작업이 있다면 끝날 때까지 쉬고있기 때문에 CPU 사용률이 떨어지게 됨스케줄링의 성능 → 평균 대기 시간으로 평가함프로세스의 실행 순서만 바꿔도 평균 대기 시간의 차이가 많이 남FIFO 알고리즘은 프로세스의 Burst Time에 따라 성능의 차이가 심하게 나기 때문에 현대 운영체제에서 잘 쓰이지 않고, 일괄처리시스템에 쓰임SJF(Shortest Job First)작업의 순서에 따라 평균 대기 시간이 달라지는 FIFO에서 Burst Time이 짧은 프로세스를 먼저 실행했을 때 평균대기시간이 짧아지는 알고리즘을 만들기로 함 → SJFFIFO보다 이론적으로 성능이 좋음실제 구현 시 두 가지 문제 발생첫번째 문제어떤 프로세스가 얼마나 실행될지 예측하기 어려움 (유저의 사용시간에 따라 달라짐)두번째 문제Burst Time이 긴 프로세스는 아주 오랫동안 실행되지 않을 수도 있다는 것RR(Round Robin)FIFO 알고리즘은 일괄처리 시스템에 적절하기 때문에 시분할 처리 시스템에서는 사용하기 힘들고, SJF 알고리즘은 프로세스의 종료시간을 예측하기 힘듦FIFO 알고리즘의 단점을 해결해보기로 함문제점 - 한 프로세스가 그 다음 프로세스가 실행됨한 프로세스에게 일정 시간만큼 CPU를 할당하고 강제로 다른 프로세스에게 일정시간만큼 CPU를 할당함 → 강제로 CPU를 뺏긴 프로세스는 큐의 가장 뒷부분으로 밀려남프로세스에게 할당하는 일정 시간은 ‘타임 슬라이스’ 또는 ‘타임 퀀텀’이라고 부름작업에 따라 RR 알고리즘과 FIFO 알고리즘의 평균 대기 시간이 비슷할 수도 있는데, 이 때는 RR 알고리즘이 더 비효율적인 방식임컨텍스트 스위칭이 있기 때문에 컨텍스트 스위칭 시간이 더 추가되기 때문RR 알고리즘 성능은 타임 슬라이스의 값에 따라 크게 달라짐타임 슬라이스가 큰 경우 : 먼저 들어온 프로세스의 작업이 종료될 때까지 실행하니 FIFO 알고리즘과 동일해짐타임 슬라이스가 작은 경우 : 컨텍스트 스위칭이 너무 자주 일어나게 되고, 타임 슬라이스에서 실행되는 프로세스의 처리량보다 컨텍스트 스위칭을 처리하는 양이 훨씬 커져서 오버헤드가 너무 커지게 됨최적의 타임 슬라이스를 결정하는 방법 → 유저가 느끼기에 여러 프로세스를 사용하기에 동시에 실행되는 것처럼 버벅이지 않고 오버헤드가 너무 크지 않은 값을 찾아야 하는 것MLFQ(Multi Level Feedback Queue)오늘날 운영체제에서 가장 일반적으로 쓰이는 CPU 스케줄링 기법RR의 업그레이드 된 알고리즘MLFQ 설명 예시P1 (CPU Bound Process)I/O 작업 없이 CPU 연산만 하는 프로세스CPU 사용률과 처리량을 가장 중요하게 생각P2 (I/O Bound Process)1초 CPU 작업을 하고 10초 I/O 작업을 함응답속도를 가장 중요하게 생각두 프로세스로 두 가지 상황에 따라 성능을 비교해 봄타임 슬라이스가 100초인 경우타임 슬라이스가 1초인 경우I/O 사용률을 봤을 때 더 좋음P1 입장에서는 CPU 사용율은 100초일 때와 비교했을 때 손해가 없지만, 컨텍스트 스위칭이 있기 때문에 오버헤드가 생겨서 손해를 봄P2 입장에서는 I/O 사용률이 많이 높아졌기 때문에 이득을 봄손해를 보는 프로세스의 문제를 해결하기 위해 MLFQ가 나오게 됨MLFQ는 기본적으로 CPU 사용률과 I/O 사용률이 좋게 나오는 작은 크기의 타임 슬라이스를 선택함. 그리고 P1과 같은 CPU Bound Process들에게는 타임 슬라이스를 크게 줌운영체제가 프로세스가 I/O Bound Process인지, CPU Bound Process인지 구분하는 방법I/O Bound ProcessCPU를 사용하는 프로세스가 실행하다가 스스로 CPU를 반납하면 CPU 사용이 적은 것이니 I/O Bound Process일 확률이 높음CPU Bound ProcessCPU를 사용하는 프로세스가 타임 슬라이스 크기를 오버해서 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황이면 CPU 사용이 많은 것이니 CPU Bound Process일 확률이 높음위의 아이디어를 가지고 우선순위를 가진 큐를 여러개 준비함 → 우선순위가 높으면 타임 슬라이스가 작고, 우선순위가 낮을수록 타임 슬라이스 크기가 커짐MLFQ 외에도 HRN, SRT, MLQ, Priority 등 다양한 알고리즘이 있지만, MLFQ가 주류임 Section 4. 프로세스 동기화프로세스 간 통신프로세스는 독립적으로 실행되기도 하지만 다른 프로세스와 데이터를 주고받으며 통신을 하는 경우도 있음네트워크로 연결된 다른 프로세스와 통신할 수도 있음통신 방법한 컴퓨터 내에서 통신하는 방법파일과 파이프 이용파일통신하려는 프로세스들이 하나의 파일을 이용해 읽고 쓰는 방법파이프운영체제가 생성한 파이프를 이용해 데이터를 읽고 쓰는 방법쓰레드를 이용한 방법한 프로세스 내에서 쓰레드 간 통신을 하는 방법코드, 데이터, 힙 영역을 공유, 스택만 따로 가짐여기서 데이터 영역에 있는 전역변수나 힙을 이용네트워크를 이용한 방법운영체제가 제공하는 소켓통신이나 다른 컴퓨터에 있는 함수를 호출하는 RPC(원격 프로시저 호출)를 이용해 통신하는 방법이 있음공유자원과 임계구역공유자원공동으로 이용하는 변수나 파일들문제점공유자원은 여러 프로세스가 공유하고 있기 때문에 각 프로세스의 접근 순서에 따라 결과가 달라질 수 있음컨텍스트 스위칭으로 시분할 처리를 하기 때문에 프로세스의 실행 순서를 예측하기 어려움그에 따라 실행 결과를 예측하기 힘들고, 여기서 발생한 문제를 ‘동기화 문제’라고 부름이 문제를 해결하기 위해 여러 프로세스가 동시에 사용하면 안되는 영역을 ‘임계구역(Critical Section)’이라고 함공유자원을 서로 사용하기 위해 경쟁하는 것을 ‘경쟁조건(Race Condition)’이라고 함임계구역의 문제를 해결하기 위한 방법상호 배제(Mutual Exclusion) 매커니즘상호 배제 매커니즘의 요구사항주어진 시간에 항상 하나의 프로세스만 접근할 수 있음동시에 여러개의 요청이 있더라도 하나의 프로세스의 접근만 허용함임계구역에 들어간 프로세스는 빠르게 나와야 함세마포어상호배제 매커니즘의 한가지예시직원 A, 직원 B가 공유자원인 프린터를 사용하는 상황동시에 프린터 요청 시, 경쟁 조건이 됨직원 A, 직원 B의 결과물이 섞여서 나오게 되는 오류 발생프린터실과 프린터실 열쇠 관리자를 두어 프린터 사용 시, 프린터실 열쇠를 받아 프린터 이용하게 됨. 프린터실 열쇠 관리자에게 열쇠가 없다면 누군가 프린터실 사용중이므로 기다려야 함위의 예시는 세마포어 매커니즘동기화에서 중요한 개념예시를 현실 프로세스 매커니즘으로 생각직원들 → 프로세스프린터 → 공유자원프로세스가 기다리는 공간 → 대기큐열쇠 관리자 → 운영체제열쇠 → 세마포어(semaphore)세마포어 - 정수형 변수코드 예시예시) 게임에서 물약 먹어서 체력 회복 / 공격받아서 체력 줄어드는 상황이 동시에 진행됨// 세마포어 선언 int s = 1; // 물약 먹는 코드 wait(s); // 열쇠를 요청해서 열쇠를 받고 문을 잠금 int currentHealth = GetHealth(); health = currentHealth + 50; signal(s); // 방에서 나와 문지키는 직원에게 열쇠 반납 // 공격받는 코드 wait(s); // 열쇠를 요청해서 열쇠를 받고 문을 잠금 int currentHealth = GetHealth(); health = currentHealth - 10; signal(s); // 방에서 나와 문지키는 직원에게 열쇠 반납 세마포어를 이용하면 공유자원에 여러 프로세스가 동시에 접근하지 못하기 때문에 동기화 문제가 발생하지 않음세마포어의 문제점wait() 함수와 signal() 함수를 이상하게 호출하여 세마포어를 잘못사용할 가능성이 있음이 문제를 해결한 방법 → 모니터모니터세마포어의 단점을 해결한 상호배제 매커니즘모니터는 따로 운영체제가 처리하는 것이 아니라 프로그래밍 언어 차원에서 지원하는 방법자바 예시synchronized가 붙으면 동시에 여러 프로세스에서 실행시킬 수 없음 → 상호배제가 완벽하게 됨increase() 뿐만 아니라 synchronized가 붙은 decrease()도 실행할 수 없음모니터의 구현만 완벽하다면, 프로그래머는 세마포어처럼 wait(), signal() 함수를 임계영역에 감싸지 않아도 되서 편리하고 안전하게 코드 작성 가능함 Section 5. 데드락데드락이란?(feat.식사하는 철학자)여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무도 작업을 진행하지 못하는 상태 → 교착상태일상생활 예시교통상황교착상태가 발생하는 이유공유자원 때문. 만약 어떤 자원을 여러 개의 프로세스가 공유하지 않는다면 교착상태는 발생하지않음식사하는 철학자 예시포크가 2개 있어야 식사가 가능한데, 우연히 모든 철학자가 자신의 오른쪽의 포크를 동시에 사용할 때 → 교착상태교착상태의 필요조건필요조건에는 네 가지가 있는데, 모두 충족되어야 교착상태 발생함상호배제어떤 프로세스가 한 리소스를 점유했다면, 그 리소스는 다른 프로세스에게 공유가 되면 안됨식사하는 철학자 예시에서 ‘포크’가 리소스에 해당비선점프로세스 A가 리소스를 점유하고 있는데, 프로세스 B가 리소스를 빼앗을 수 없어야 함식사하는 철학자 예시에서 철학자 A의 포크를 철학자 B가 뺏을 수 없음점유와 대기어떤 프로세스가 리소스 A를 가지고 있는 상태에서 리소스 B를 원하는 상태여야 함식사하는 철학자에서 오른쪽 포크를 든 상태에서 왼쪽 포크를 기다리고 있는 상태원형 대기점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있음식사하는 철학자에서 서로가 서로의 포크를 원하는 상황이 원형을 이룸교착상태를 예방하는 방법을 고려했으나, 제약이 많고 비효율적이라 다른 방식 연구 → 교착상태에 빠졌을 때 해결하는 방법 연구데드락 해결(feat. 은행원 알고리즘)교착상태 해결방법으로 ‘교착상태 회피(Deadlock avoidance)’라는 방법이 있음교착상태 회피(Deadlock avoidance)프로세스에게 자원을 할당할 때 어느정도 자원을 할당해야 교착상태가 발생하는지 파악해서 교착상태가 발생하지 않는 수준의 자원 할당을 함교착상태 회피는 전체 자원의 수와 할당된 자원의 수를 기준으로 안전상태(Safe state)와 불안정 상태(Unsafe state)로 나눔운영체제가 최대한 안정상태를 유지하려고 자원할당을 함불안정 상태에 있더라도 무조건 교착상태에 빠지는 것이 아니라 교착상태에 빠질 확률이 높아짐교착상태 회피를 표한한 알고리즘 → 은행원 알고리즘은행이 1000만원을 가지고 있다고 가정하고, 사업가 A에게 500만원, 사업가 B에게 400만원을 빌려줌(은행 잔고 100만원) → 이후 사업가 A가 은행에게 200만원을 더 빌려주면 빌린돈을 상환할 수 있다고 함 → 은행이 B에게 상환을 요청할 때, B도 200만원을 더 빌려주면 상환가능하다고 함 → 은행은 대출해줄 수도, 상환받을 수도 없는 교착상태에 빠지게 됨은행이 사업가들에게 돈을 빌려줄 때, 은행의 여윳돈과 사업가들에게 빌려준 돈들을 보고 대출 가능한 상황(안전상태)인지 확인하고 빌려줌운영체제에서 은행원 알고리즘을 구현하는 방법운영체제는 프로세스에게 자원을 할당하기 전에 자기가 가지고 있는 전체 자원의 수를 알고 있어야 함 → 시스템의 총 자원프로세스들은 각자 자기가 필요한 자원의 최대 숫자를 운영체제에게 알려줘야 함 → 최대 요구자원안정상태모든 프로세스에게 자원할당 후, 요청이 예상되는 자원이 맞는 프로세스에게 먼저 할당 함 그 후에 자원을 반납 받고 다른 프로세스에게 또 다시 할당할 수 있게 됨불안정상태현재 사용 가능한 자원이 1개이기 때문에 P1, P2, P3 모두 자원 추가할당이 안됨불안정상태에 있더라도 모든 프로세스가 최대자원을 요청하지 않는다면, 교착상태에 빠지지 않을수도 있지만 불안정상태에 빠지지 않도록 유지하는게 좋음은행원 알고리즘은 교착상태를 피하는 좋은 방법이지만, 비용이 비싸고 비효율적임 → 그래서 알고리즘 연구자들은 교착상태가 발생하지만, 교착상태가 발생했을 때 이를 해결하는 방식을 연구함교착상태를 검출하는 방법을 연구(두가지)가벼운 교착상태 검출 → 타이머 이용프로세스가 일정시간동안 작업을 진행하지 않는다면, 교착상태가 발생했다고 간주하고 이를 해결함해결방법 - 일정 시점마다 체크포인트를 만들어 작업을 저장하고 타임아웃으로 교착상태 발생 시, 마지막으로 저장했던 체크포인트로 롤백하는 것무거운 교착상태 검출 → 자원 할당 그래프 이용현재 운영체제에서 프로세스가 어떤 자원을 사용하는지 지켜보고, 교착상태 발생 시 이를 해결함해결방법 - 운영체제가 자원 할당 그래프를 계속 지켜보고 교착상태 검출 시, 교착상태를 일으킨 프로세스를 강제 종료 시킴 그 후 다시 실행시킬 때 체크포인트로 롤백을 시킴이 방법은 운영체제가 지속적으로 ‘자원 할당 그래프’를 유지하고 검사해야 하기때문에 오버헤드가 발생함그러나 가벼운 교착상태 검출에서 발생할 수 있는 억울하게 종료되는 프로세스는 발생하지 않음Section 7. 메모리메모리 종류왜 여러종류의 메모리가 필요한가레지스터가장 빠른 기억장소로 CPU 내에 존재하고 있음컴퓨터 전원이 꺼지면, 데이터 사라짐 - 휘발성 메모리32bit, 64bit - 레지스터 크기CPU는 계산을 할 때 메인메모리에 있는 값을 레지스터로 가져와 계산을 함 → 계산 결과는 다시 메인메모리에 저장캐시휘발성 메모리레지스터는 CPU가 사용하는 메모리로 빠름, 그에 비해 메인메모리는 너무 느린편 → 메인메모리에 있는 데이터를 레지스터에 옮기려면 한참 걸리기 때문에 필요할 것 같은 데이터를 미리 가져와서 저장함 → 캐시캐시는 성능의 이유로 여러개를 둠만약, CPU가 값을 요청해 레지스터로 값을 옮겨야한다면, 단계에 따라 가장 속도가 빠른 L1캐시를 보고 → 여기 없다면 L2캐시를 확인 → 여기도 없으면 메인 메모리에서 값을 가져옴메인 메모리실제 운영체제와 다른 프로세스들이 올라가는 공간전원이 공급되지 않으면 데이터가 지워짐 → 휘발성 메모리하드디스크나 SSD보다 속도는 빠르지만 가격이 비쌈 → 데이터 저장보다는 실행중인 프로그램만 올림보조저장장치(HDD, SSD)사무용 프로그램 게임과 같은 파일들을 저장가격이 저렴하고 전원이 공급되지 않아도 데이터가 지워지지 않음 → 비휘발성 메모리메모리와 주소메인메모리폰 노이만 구조는 모든 프로그램을 메모리에 올려 실행시킴멀티프로그램 - 여러개의 프로그램이 올라오게 되어 관리가 복잡해짐운영체제는 관리를 위해 1바이트(8bit) 크기로 구역을 나누고 숫자를 매김 → 주소32bit CPU vs 64bit CPU32bit CPU레지스터 크기가 32bit이고, CPU가 처리하는 ALU도, 데이터가 이동하는 버스도 32bit임.CPU가 다룰 수 있는 메모리도 2^32로 4GB임32bit CPU레지스터 크기가 64bit이고, CPU가 처리하는 ALU도, 데이터가 이동하는 버스도 64bit임.CPU가 다룰 수 있는 메모리도 2^64로 거의 무한대에 가까움64bit CPU가 32bit CPU보다 한번에 처리할 수 있는 양이 많기 때문에 속도가 더 빠름물리주소, 논리주소물리주소 공간 - 메모리를 컴퓨터에 연결하면 0x0번지부터 시작하는 주소공간논리주소 공간 - 사용자 관점에서 바라본 주소공간사용자 프로세스가 운영체제를 침범하지 않도록 하드웨어적으로 운영체제 공간과 사용자 공간을 나누는 ‘경계 레지스터’를 만듦경계 레지스터CPU 내에 존재하는 레지스터메모리 관리자가 사용자 프로세스가 경계 레지스터의 값을 벗어났는지 검사하고, 만약 벗어났다면 그 프로세스를 종료시킴절대주소, 상대주소상대주소(논리 주소 공간) - 컴파일러가 컴파일을 할 때, 메모리 0번지에서 실행한다고 가정함절대주소(물리 주소 공간) - 실제 프로그램이 올라간 주소는 4000번지(메모리 관리자가 바라본 주소)예를 들어 0x100번지 데이터를 가져올 때, 메모리 관리자는 CPU가 요청한 0x100번지와 재배치 레지스터에 있는 0x4000번지의 값을 더한 0x4100(절대 주소, 물리 주소)에 접근해서 데이터를 가져옴재배치 레지스터에는 프로그램의 시작 주소가 저장되어 있음메모리 관리자는 사용자가 메모리에 접근할 때마다 위의 예시처럼 계산함메모리 할당방식유니프로그래밍에서 메모리의 크기보다 큰 프로그램을 실행시키는 방법큰 프로그램을 메모리에 올릴 수 있도록 잘라서 당장 실행시켜야할 부분만 메모리에 올리고, 나머지는 용량이 큰 하드디스크(하드디스크 내 스왑영역)에 저장시키는 기법 → 메모리 오버레이(memory overlay)멀티프로그래밍에서 메모리의 크기보다 큰 프로그램을 실행시키는 방법(두가지)가변 분할 방식(가상 메모리 관점 - 세그멘테이션)프로세스의 크기에 따라 메모리를 나누는 방식한 프로세스가 메모리에 연속된 공간에 할당되기 때문에 ‘연속 메모리 할당’이라고 함장단점장점 - 메모리에 연속된 공간에 할당되기 때문에 더 크게 할당되서 낭비되는 공간인 ‘내부 단편화’가 없음단점 - ‘외부 단편화’ 발생메모리 공간이 쪼개져있어서 용량을 합쳐 계산하면 프로세스에게 할당을 할 수 있을 것 같지만, 사실 할당할 수 없음 → 외부 단편화해결방법외부 단편화가 발생한 공간을 합쳐주는 조각모음을 함그러나 조각모음을 하려면 현재 메모리에서 실행되고 있는 프로세스들의 작업을 일시 중지해야하고, 메모리공간을 이동시키는 작업을 해야하기 때문에 오버헤드가 발생함고정 분할 방식(가상 메모리 관점 - 페이징)프로세스 크기와 상관없이 메모리를 정해진 크기로 할당한 프로세스가 메모리에 분산되어 할당되기 때문에 ‘비연속 메모리 할당’이라고 함장단점장점 - 구현이 간단하고, 오버헤드가 적음단점 - 작은 프로세스도 큰 영역에 할당되서 공간이 낭비되는 ‘내부 단편화’가 발생내부 단편화따로 해결방법은 없고, 분할되는 크기를 조절해서 내부단편화를 최소화 함버디 시스템오늘날의 운영체제는 가변분할 방식과 고정분할방식을 혼합하여 단점을 줄임2의 승수로 메모리를 분할해 메모리를 할당하는 방식여기서도 내부 단편화가 발생하지만, 적은 용량으로 발생또한 프로세스가 사용을 마치고 메모리에서 나가도 근접한 메모리 공간을 합치기 쉬움 → 2의 승수로 동일하게 나눠서 반대로 조립만 하면 큰 공간이 만들어지기 때문 (조각모음보다 간단)장단점 가변 분할 방식처럼 프로세스 크기에 따라 할당되는 메모리 크기가 달라지고 외부 단편화를 방지하기 위해 메모리 공간을 확보하는 것이 간단함고정분할 방식처럼 내부 단편화가 발생하기는 하지만, 많은 공간의 낭비가 발생하지는 않음  회고일주일 동안 스스로 칭찬하고 싶은 점, 아쉬웠던 점, 보완하고 싶은 점칭찬하고 싶은 점 : 이번주 강의를 매일 집중해서 잘 학습한 점아쉬웠던 점 : 어제 들었던 강의 내용이 오늘 다시보면 잘 기억이 안난다는 점보완하고 싶은 점 : 기억력 이슈라 반복할 수밖에 없을 것 같습니다🥲다음주에는 어떤 식으로 학습하겠다는 스스로의 목표다음주에도 이번주처럼 오늘 범위의 강의를 듣기 전에 어제 범위의 강의를 머릿속으로 다시 생각하고 정리하는 시간을 갖겠습니다.

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

채널톡 아이콘