블로그

대롱대롱

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

Luvel

[정보처리기사 실기 2024 3회차] 1주일 92점 합격수기 feat. 인프런 주말코딩

 주말 코딩님 덕분에 정말 "효율적"으로 실기 합격했습니다! 가채점 점수 92점, 발표일에 합격인증까지 올리겠습니다~😀10월 20일에 있었던 3회차 정보처리기사 실기를 막 마치고 얻은 점수입니다. 약 1주일 간 주말코딩님 인프런 강의와 함께하며 정보처리기사를 준비했구요 (2~3일 숨고르기 증발 시간 포함 대략 10일)가장 큰 목표인 "최소비용", "효율"을 중시하며 시험을 준비했던 과정을 공유해보려고 합니다. (우리 모두 바쁘자나요~)고득점 목표는 정말 전혀 없었는데 주말코딩님과 핵심만 집중하다보니 덤으로 얻었다고 생각해요1. 학습 목표저한테 가장 중요했던 것은 "최소비용 및 시간으로 안정적인 합격하기" 였어요.시중 책들이나 강의가 불필요하게 깊게 파고 비싸서 시간과 비용이 아깝다고 느꼈어요(몇 백페이지 어떻게 다보나요... 필기도 CBT로 기출만 풀고 넘어왔습니다)자격증 공부는 실질적인 개발 공부와 다른 측면이 있으니 자격증 준비는 정말 최소한의 비용으로 해야겠다고 마음 먹었습니다.부가적으로 C언어 메모리 관련 지식과 CS 큰그림 정리만 얻자는 마음으로 준비했어요 그런 점에서 주말코딩 님 강의는 저의 목표와 매우 적합했습니다!주말코딩 님도 수강생들에게 핵심만 집중적으로 공략해서 빠르게 합격하길 원하셨거든요. 모두 다른 할 일들이 많으니까요!!(주말코딩 정처기 인프런 강의: https://u.inf.run/3Bu7c2O)2. 강사님 성향 & 실제 체감한 시험 경향강사님 기본 전제는 100점 중 60점 넘으면 통과이므로전체 5~60% 비중인 코딩 영역은 최대한 다 맞추자 (1개정도의 킬러문제는 그냥 틀리자)이론 영역은 찍기도 가능하니 1~2개만 맞추자를 강조하십니다. 납득이 되고 매우 합리적인 전략이에요.이론 영역에 대해 조금 더 생각해볼 부분은 강사님께서 조금 보수적으로 잡고 말씀하신 부분이 있고, 실제 공부하다보면 이론은 1~2개보다 충분히 더 맞출 수 있습니다. 강사님이 중요한 부분만 정리한 총 1~2시간 정도 강의와 20페이지 정도되는 이론 요약집 제공해주세요. 항상 빈출되는 5~10가지 유형만 확실히 정리하고 가도 안정적으로 점수 추가 가능하다고 느꼈어요. 이외 나머지는 대차게 틀리면 됩니다! 다 맞출 필요가 없으니까요 🤣 사람이니까 코딩영역 실수해서 조금 더 틀려도 합격권 넉넉할거라고 느껴요.코딩 영역은 주말 코딩님 이전 명성도 있고 실제로 강의를 워낙 잘해주셔서 정말 킬러 문항 1개만 틀리고 다 맞을 수 있습니다! 비전공자지만 독학한 베이스가 있긴해서 운좋게 킬러 문제도 건졌어요실제로 시험을 봐보니 최근 시험 경향이 코딩 난이도를 높이고 이론을 너무 어렵게 안내려고 하는 느낌이 들었습니다.이론이 최근 기출 포함해 항상 나오는 문제 주제가 5~10개 풀 정해놓고 돌려서 나오는 경향이라 그 부분만 확실해도 얘기한대로 기존 목표인 이론 1~2개 맞추기보다 더 맞출 수 있을 것 같습니다.결과적으로 코딩 문제는 다 맞추고, 이론에서 8점 깎였어요 (한 문제 틀리고, 한 문제 부분점수)"코딩만은 확실히"를 지향하는 주말 코딩님의 방식은 매우 타당했습니다 3. 공부 방법당시 10일 정도 남았었고 2~3일 보통 숨고르기 시간으로 날리잖아요~ 하하하그래서 저는 공부 전략을 다음과 같이 잡았습니다. [강의 중요 부분 수강 + 강사님 이론 요약집 외우기 + 이론만 잽싸게 기출 보기][강의 중요 부분 수강]강의는 시간 관계상 부가적인 부분만 제끼고 최대한 들었습니다. (75프로 수강했네요)비전공자지만 개발경험은 있어서 앞에 언어 공통 문법 부분이랑 뒤에 고난도 코드영역의 정렬만 제꼈습니다. (정렬 문제는 개념몰라도 주요 강의 내용만으로 코드 풀 수 있어요) 코딩 기출문제 풀이 강의는 무조건 하루 한개씩 들었고 다만 시간 관계상 강사님 C, Java, Python 변형문제 강의는 못들었어요 (기출 강의 중간중간에도 변형 문제는 소개해주셔서 다행히 괜찮았던 것 같아요)고난도 코드영역에 SQL 기출문제는 꼭 챙겨봤습니다.이렇게만 공부해도 코딩 + DB 영역 50점은 먹고 가요 (주말코딩 님 그는 정말...)시험 3~4일전 강사님 이론 강의를 살살 듣기 시작했는데요 운영체제 페이지 교체 부분부터 정리했어요기출보니 요즘 자주 나오더라구요! 요 영역이 조금 빡세보여도 강의듣고 하면 풀만해서 여기도 5점 가져가는 것 같아요그리고 결국 시험 기간 이틀 전에서야 빡세게 이론 강의 완강하고 그 후 이론 요약집만 달렸어요 (머릿 속 이상적 계획과의 괴리...) [강사님 이론 요약집 외우기]이론은 강사님 강조해주시는 영역 몇가지 있어요주요 포인트결합도/응집도, 테스트 스텁 및 드라이버, 테스트 종류와 방식 (블랙/화이트), 라우팅 프로토콜(RIP, OSPF...), 데이터베이스 이론(로킹, 상호배제 조건 등)...시간 날 때 나머지보안용어와 암호화 기법, OSI 7계층 주요 포인트만 확실히 하고 간다 생각했고 (결합도/응집도, 테스트 종류 방식 진짜 맨날 나와요)여기에 추가로 디자인 패턴만 설명보고 용어 쓸 수 있게 준비했습니다. (+위에서 강의로 봤던 페이지 교체 부분도요!) 시간 날 때 나머지 부분도 요약집 내에서만 준비했어요 OSI 7계층에 용어들만 키워드 위주 암기 미리했고 (계층 이름, ARP, RARP, ICMP, IGMP 정도), 보안용어 암호화 기법은 시험가기 전 30분정도만 봤습니다. (운에 맞기고 틀려요 그냥~)그래도 필기 때 한번 봤던 내용들이라 익숙함은 있더라구요  [이론만 잽싸게 기출 보기]코딩 영역은 강의 기출 풀이로 거의 충분해서이론 공부 병행하면서 이론 기출만 23년~24년도 빠르게 확인해봤습니다.강의나 요약집에서 이미 봤던 기출도 있고 해서 이쯤이면 금방 빠르게 볼 수 있어요.뉴비티 사이트가 필기 공부할 때 썼던 CBT 처럼 잘되어 있어서 공부하는 동안 잘 활용했어요.(뉴비티, https://newbt.kr/%EC%8B%9C%ED%97%98/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC+%EC%8B%A4%EA%B8%B0)4. 마무리처음에는 실기 준비 어떻게 공부할지 고민했습니다. 아는 지인은 시중에 수제X 책 사서 했다더라구요.제 성향에는 비효율적인 방법이었어요 컴팩트한 시간을 매우 중요시하는데 핵심을 벗어나 너무 폭넓게 공부해야 하니까요.유튜브 검색을 통해 어쩌다 주말 코딩 님을 알게 되었는데, 강사님의 효율적인 학습 지향점을 듣고 바로 납득하고 강의 수강을 정했습니다.플랫폼도 개발 컨텐츠에 친화적인 인프런이니까 수강기간 걱정없이 들을 수 있는 점이 신뢰와 안정감을 줬구요.덕분에 처음 목표인 안정적 합격도 이뤘지만 보다 과하게 93점을 받았는데, 주말 코딩님 지향점의 장점 덕분이라 생각합니다.언제나 느끼지만 핵심이 중요하다고 생각해요.제 시험 준비 기록이 정보처리기사 준비하시는 다른 분들의 시간 절약 및 정신적 건강에 조금이나마 도움이 되었으면 좋겠습니다. (기록에는 시간을 아끼지 않았거든요 하핳)준비하시는 모든 분들 파이팅하시고 쾌속 합격하시길 바랍니다! Reference[인프런 주말코딩] 일주일만에 합격하는 정보처리기사 실기: https://u.inf.run/3Bu7c2O[뉴비티] 실기 기출 풀이 플랫폼: https://newbt.kr/%EC%8B%9C%ED%97%98/%EC%A0%95%EB%B3%B4%EC%B2%98%EB%A6%AC%EA%B8%B0%EC%82%AC+%EC%8B%A4%EA%B8%B0

개발 · 프로그래밍 자격증정보처리기사주말코딩인프런실기

김정환

🚀 개발 스킬 레벨업! 25% 할인 이벤트 (~ 2024년 11월 3일 까지) 🚀

개발자분들, 그리고 개발자가 되기를 꿈꾸는 취업 준비생 여러분, 모두 주목해주세요! 오늘부터 2024년 11월 3일까지 인프런 강의 25% 할인 이벤트를 진행합니다.이런 분들께 추천드립니다실무에서 사용하는 최신 웹 기술을 배우고 싶은 개발자 성공적인 취업을 목표로 웹 개발 역량을 키우고 있는 취준생📅 할인 기간: 2024년 10월 21일 ~ 2024년 11월 3일 이번 기회에 개발 역량을 한 단계 업그레이드해보세요.강의 목록리액트 1부) 만들고 비교하며 학습하는 리액트:React의 핵심 개념과 동작 원리를 다양한 예제를 통해 이해하세요. 리액트 2부) 고급 주제와 훅:리액트의 고급 기능과 최신 트렌드를 따라잡고 싶은 분들께 강력 추천! 프론트엔드 개발환경의 이해와 실습 (Webpack, Babel, ESLint):현업에서 사용하는 개발 환경을 직접 구성해보며 익히는 시간! 실습 UI 개발로 배워보는 순서 JavaScript와 Vue.js 개발:실전 프로젝트로 JavaScript와 Vue.js를 체계적으로 배우세요! 트렐로 개발로 배우는 Vue.js, Vuex, Vue-router 프론트엔드 실전 기술:실제 프로젝트를 통해 프론트엔드 스킬을 한 단계 업그레이드하세요. 견고한 JS 소프트웨어 만들기 :코드 품질을 높이고 유지보수성을 강화하는 방법을 배울 수 있습니다.  

개발자취업준비프론트엔드리액트VueJavaScript할인

대롱대롱

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

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

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

쿠버네티스(K8S)에서 OpenTelemetry 설정하기

OpenTelemetry를 Kubernetes 클러스터에 설정하여 애플리케이션의 트레이스를 수집하고, Grafana Tempo로 전송해 시각화합니다.Cert-Manager 설치 (선택 사항)Kubernetes OpenTelemetry Operator 설치kubectl create ns opentelemetry-operator helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts helm repo update #helm show values open-telemetry/opentelemetry-operator > opentelemetry-operator_values.yaml helm upgrade --debug --install --reuse-values \ opentelemetry-operator open-telemetry/opentelemetry-operator \ --namespace opentelemetry-operator \ --create-namespace \ --values "opentelemetry-operator_values.yaml" \ --version 0.29.2 \ --set admissionWebhooks.certManager.enabled=false \ --set admissionWebhooks.certManager.autoGenerateCert=true Kubernetes Tempo 설치kubectl create ns tempo #helm show values grafana/tempo-distributed > tempo_values.yaml helm upgrade --debug --install \ tempo grafana/tempo-distributed \ --create-namespace \ --namespace tempo \ --values "tempo_values.yaml" \ --version 1.4.2 Grafana 데이터 소스에 Tempo 추가kubectl get svc tempo-distributor-discovery -n tempo NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE tempo-distributor-discovery ClusterIP None <none> 3100/TCP,4318/TCP,4317/TCP,55680/TCP 9m9s Grafana URL 예시: http://tempo-query-frontend-discovery.tempo:3100OpenTelemetry Collector 설치#helm show values open-telemetry/opentelemetry-collector > opentelemetry-collector_values.yaml helm upgrade --debug --install --reuse-values \ opentelemetry-collector open-telemetry/opentelemetry-collector \ --values "opentelemetry-collector_values.yaml" \ --namespace opentelemetry-operator 자동 계측 설정kubectl create ns nlp kubectl delete -f opentelemetry-instrumentation.yaml -n nlp kubectl apply -f opentelemetry-instrumentation.yaml -n nlp kubectl get instrumentations.opentelemetry.io -n nlp 마스터 노드가 워커 노드의 9443/tcp 포트에 접근할 수 있도록 방화벽 규칙을 추가하거나 기존 규칙을 수정하여 9443/tcp 접근을 허용해야 합니다.테스트 애플리케이션 설정kubectl apply -f test2.yaml -n nlp kubectl logs -l app.kubernetes.io/name=opentelemetry-operator \ --container manager -n opentelemetry-operator --follow 각 네임스페이스에 계측 설치 필요:PROJECTS=(devops devops-dev common common-dev) for item in "${PROJECTS[@]}"; do echo "===================== ${item}" kubectl delete -f opentelemetry-instrumentation.yaml -n ${item} kubectl apply -f opentelemetry-instrumentation.yaml -n ${item} done Ingress-Nginx 생성kubectl -n opentelemetry-operator apply -f collector-ingress.yaml curl을 이용한 테스트curl -i http://collector.opentelemetry-operator.topzone.io/v1/traces -X POST -H "Content-Type: application/json" -d @span.json 자동 계측 (Node.js)패키지 추가test-application/package.json"dependencies": { "@opentelemetry/api": "^1.7.0", "@opentelemetry/auto-instrumentations-node": "^0.40.0" } 사이드카 추가apiVersion: apps/v1 kind: Deployment metadata: name: test-application spec: selector: matchLabels: app: test-application template: metadata: annotations: instrumentation.opentelemetry.io/inject-nodejs: "true" 수동 계측 (Python)from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry import trace from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor resource = Resource(attributes={ SERVICE_NAME: "tz-devops-admin" }) traceProvider = TracerProvider(resource=resource) processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://collector.opentelemetry-operator.topzone.io/v1/traces")) traceProvider.add_span_processor(processor) trace.set_tracer_provider(traceProvider) def do_GET(self, httpd): tracer = trace.get_tracer("do_GET") with tracer.start_as_current_span("ri_cal") as span: span.set_attribute("printed_string", "done") with tracer.start_as_current_span("ri_usage") as span: span.set_attribute("printed_string", "done") 참고: https://github.com/doohee323/tz-eks-main/tree/eks-main-t/tz-local/resource/opentelemetry원문)https://www.linkedin.com/pulse/opentelemetry-k8s-dewey-hong-jdnzc/?trackingId=UGXm85DYTRaCjn%2F0wugyVw%3D%3D

대롱대롱

인프런 워밍업 클럽 2기 CS 후기 및 오프라인 수료식 후기

인프런 워밍업 클럽이 끝났습니다한달간의 여정이 끝났네요오프라인으로 수료식을 한다기에 냉큼 달려갔습니다어떤 분들과 같이 스터디를 했는지 궁금했기 때문이죠 이번에 판교를 처음 가봤습니다지하철로 판교역까지 가서 한 20분 걸으면 목적지가 나옵니다판교 구경도 할 겸 좀 걸어봤습니다 판교테크노스타트업캠퍼스 3층 인프랩에 도착해서 이름표 받고 들어갔습니다올 때까지는 조용했는데 인프랩에 들어가고 나니 와글와글 하더라구요많은 분들이 오셨는데 저는 아는 얼굴도 없고 파워I라서 일단 조용히 앉아있었습니다(사람 많은 곳을 갔을 때 흔한 I의 모습) 간단한 식사로 피자와 음료가 제공되었어요알콜/논알콜 음료로 구분되었는데 저는 알콜 음료를 집었습니다이때 아니면 회사에서 언제 알콜을 마셔보겠습니까ㅎㅎㅎ스터디 종류에 따라 회의실에 모여서 네트워킹을 진행했어요저는 CS스터디를 들었기 때문에 CS 스터디원들이 모인 곳으로 갔습니다회의실 이름이 볼드모트인가... 암튼 그랬습니다저 혼자 알콜 먹나 했는데 한 분 더 있어서 서로 위안이 되었습니다먼저 간단하게 자기소개부터 시작했는데 백엔드와 프론트엔드 분들이 많더군요AI는 저 혼자더라구요... AI스터디로 열어줘요....현업에 계신 분들도 많아서 오 신기하다하고 그분들이 얘기를 들었죠고등학생 분도 있었는데 벌써 진로를 정하고 움직이다니 대단하다고 생각했습니다 네트워킹 이후에는 온라인 접속자들과 함께하는 Q&A 시간이 진행되었습니다질문들 중에서 주요 질문 5개만 감자님이 뽑아서 답변을 해주셨습니다 Q&A까지 마치고 다시 모든 참여자들이 한자리에 모였어요코치분들 소개가 진행된 후 스터디별로 우수러너 시상이 진행되었어요CS스터디가 가장 마지막 발표라서 옆에 앉은 분이랑 이런저런 이야기하고 있었는데 놀랍게도 옆에 분과 제가 우수러너로 발표되었어요되면 좋겠는데... 안되면 슬프겠지만 어쩔 수 없지...의 마인드였는데 받으니까 좋았습니다우수러너 혜택으로 인프런 한정판 굿즈와 1:1멘토링권이 주어졌어요에코백 안에 유리컵이랑 우산이랑 미니미한 뱃지가 들어있었는데 굉장히 귀엽습니다우수러너가 되길 너무 잘한 것 같아요(초록초록한 캐릭터 너무 귀엽습니다)(가슴팍에 새겨진 깨알같은 인프런 워밍업클럽. 이런 디테일을 제가 아주 좋아합니다) 아무튼 이렇게 인프런 워밍업 스터디가 진짜 끝났습니다뭔가 시원섭섭하고 그러네요다음번에는 어떤 스터디가 열릴지 기대됩니다AI 스터디도 열렸으면 하는 바램이 있습니다^^수료식 준비하신 스탭분들과 코치님들 모두 고생많으셨습니다다음에 기회가 되면 또 만나요~~      

워밍업클럽CS스터디수료식

김예지

[인프런 워밍업 스터디 클럽 2기 FE] 오프라인 수료식 후기

 오프라인 수료식 후기 퇴근하고 판교까지 늦지 않게 갈 수 있을까 걱정했는데 다행히 여유 있게 도착해서 이름표를 받았다.안으로 들어가니 이미 많은 분들이 일찍 도착해 계셨다.  코치님이랑 다른 러너분들이랑 자기소개도 하고 피자 먹으면서 자유 네트워킹 시간을 가졌다. 발자국을 남길 때 봤던 분들을 직접 만나게 되어서 좋았다. 다들 좋으신 분들이라 오프라인 수료식에 갈지 말지 고민했던 게 무색하게 재밌던 시간이 되어서 오길 잘했다는 생각이 들었다. 잠깐의 쉬는 시간이 지나고 시작된 Q&A 시간도 좋았다. 코치님께서 하나하나 해주시는 답변들이 정말 큰 도움이 되었다. 메모를 조금 하고 싶었는데 필기도구도 안 챙겼고.. 핸드폰에 쓰면 딴짓하는 사람처럼 보일까 봐 최대한 기억만 했다.그리고 하고 싶었던 질문이 있어서 할까 말까 고민하고 있었는데 마침 다른 분이 물어봐 주셔서 내 궁금증도 같이 해소가 되었다. 다른 분들은 어떤 고민을 하고 어떤 생각을 하시는지 들을 수 있는 점도 좋았다.궁금했던 부분도 해결하고 모르는 것들도 많이 알게 되어서 유익한 시간이었다. 자유 네트워킹, Q&A 시간이 너무 빠르게 지나간 것 같아서 아쉽다는 생각이 들었다. 다른 분들이랑 얘기를 더 나누고 싶었다.  이번에 워밍업클럽 신청하길 잘한 것 같다. 3주동안 열심히 했던 만큼 성장한 부분이 있다고 생각한다.      귀여운 인프런 굿즈가 생겼다 ✌  

워밍업클럽

강지원

[인프런 워밍업 스터디 클럽 2기 FE] 강지원 오프라인 수료식 후기

인프런 워밍업 클럽 2기 오프라인 수료식 후기 처음으로 같이 스터디를 한 분들을 만나는 자리라 떨리는 마음으로 출발했다.판교역에 도착해서 버스를 기다리는데 정류장에 이런 문구가 붙어있었다.정류장에서도 코딩에 관련한 글을 읽을 수 있다니 '이 곳은 정말 코딩에 진심인 사람들이 있는 동네구나' 라는 생각이 들어서 신기하기도 하고 재밌는 마음으로 버스를 기다렸다. 시간에 딱 맞게 도착해서 거의 바로 프론트엔드 팀과 같이 앉는 시간이 되었는데 처음부터 다들 편하게 대해주셔서 많이 긴장했던 것이 풀려갔다. 자기 소개 시간에 들어보니 다른 분들은 거의 취직을 한 상태에서 이 스터디에 참여하셨다. 아직 취직을 하지 못해서 상대적으로 시간이 많던 나도 따라가기가 벅찰 분량의 스터디였는데 본업을 하면서 스터디까지 하신 모습에 감탄하면서 더 열심히 해야겠다고 마음을 다짐했다. 코치님과 피자를 먹으며 대화를 나누고, Q&A시간을 가지면서 개발자 인생에 도움이 되는 이야기를 정말 많이 들을 수 있었다. 한창 힘들 때였는데 응원을 많이 해주셔서 정말 감사하고 힘이 됐다. 질문에 대한 대답도 하나하나 적어오셔서 알려주신 것이 감동이었다. 이 시간이 더 길었으면 좋았을텐데 아쉽게 느껴졌다. 피자는 아주 맛있었다!  가장 걱정했던 시간이었던 것이 무색하게도 순식간에 끝난 네트워킹 시간이 끝나고 드디어 우수러너 발표 시간이 왔다. 우수러너가 되지 못하더라도 할 수 있는 최선을 다했으니 그것에 만족하자고 생각하면서 왔는데 막상 시상식이 시작되니 기대감이 커지기 시작했다. 그렇게 두근두근 하고 있는데 거짓말처럼 내 이름이 불렸다. 오랜만에 정말 큰 기쁨과 성취감을 느껴본 것 같다. 정말 갖고 싶었던 인프런 굿즈도 받고 코치님과 사진도 찍었다. 나와 같이 우수러너가 되신 분의 블로그를 보며 감탄할 때가 많았는데 그 분과 함께 받을 수 있어서 더 기분이 좋았다. 인프런 스터디를 통해서 실력도 멘탈도 많이 성장했다. 이번 스터디에 참가하기를 정말 잘한 것 같다ㅎㅎ 오프라인 수료식은 현장 분위기가 정말 좋았고, 코치님, 다른 개발자 분들과 함께 얘기를 나눠볼 수 있는 점도 정말 좋았다. 만약 3기에 오프라인 수료식을 고민하고 있는 사람이 있다면 무조건 가는 것을 추천한다. 수료식이 끝나고 저녁에 먹고 남은 피자를 들고 가고 있는데 피자가 많이 남았다면서 한판씩 더 주셔서 감사했다ㅎㅎ 앞으로 인프런에서의 좋은 기억을 가지고 더 열심히 살아야겠다.

인프런워밍업클럽오프라인수료식후기

빠타박스

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

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

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

두부

[인프런 워밍업 클럽 2기 - CS] 완주 후기

인프런 워밍업 클럽 2기가 끝났습니다. 사실 참여하기 전에는 '내가 이걸 완주할 수 있을까?' 싶은 마음이 있었지만, 워밍업 클럽에 참가하신 다른 참가자분들의 격려와 적절하게 짜인 스케줄에 힘입어서 완주할 수 있었던 것 같습니다. 감사합니다. 😊워밍업 클럽을 통해서 많은 것을 얻은 것 같습니다. 정보처리기사를 취득하긴 했으나 자료구조와 알고리즘... 뿐만 아니라 사실 모든 CS 분야에서 취약한 상태였습니다. 단편적인 지식만 안고 있고 이것을 활용할 방법이나 쓰임새는 알지 못하는 상태였습니다. 그런데 워밍업 클럽에서 주차별 미션을 해결하는 과정에서 '아 이 지식은 이런 상황에서 쓰일 수 있겠구나.'하는 감을 잡게 되었습니다. 이것 때문에 가장 많은 도움을 받았던 활동을 꼽아보라고 말씀하신다면 미션과 Q&A 세션을 선택하고 싶습니다.쓰다 보니 길어지게 되었는데, 저는 이 글을 보시고 '인프런 워밍업 클럽 한 번 해볼까?' 하는 마음이 드셨다면 한 번은 꼭 참여해 보시길 권해드리고 싶습니다. 새로운 지식을 얻고 그것을 활용하는 방법을 아는 것도 정말 도움이 되는 일이지만, 그것을 넘어서 나와 같은 길을 달리고 있는 누군가가 있다는 사실을 아는 건 꽤나 많은 도움이 되는 것 같아서요. 저는 꽤 많은 도움이 되었습니다.아마 저는 다음 인프런 워밍업 클럽도 참여할 것 같습니다. ㅎㅎ 워밍업 클럽에 참가하셨던 분들 모두 고생 많으셨고, 코치분들과 운영진분들께도 정말 감사하다는 말씀을 드리고 싶습니다. 모두 행복하세요. 감사합니다!

인프런인프런워밍업클럽스터디2기

마소캠퍼스

[Gen AI 인사이트] AI 툴로 마케팅 색상 전략 완성하기!

똑똑하게 업무를 처리하는 방법, 마소캠퍼스가 알려드릴게요!최신 AI 기술로 더욱 효율적이고 스마트하게 일해보세요. 색상은 마케팅의 핵심 요소 중 하나입니다!효과적인 색상 선택이 브랜드 이미지를 강화하고 소비자와의 연결을 깊게 해줄 수 있어요.이번 카드뉴스에서는 AI 툴을 활용한 색상 활용법을 소개합니다.함께 더 똑똑한 마케팅을 만들어보세요!첫인상에서 색상이 차지하는 비중이 무려 90%라는 사실, 알고 계셨나요?소비자들은 색상을 통해 브랜드의 감정적 메시지를 읽어냅니다.특히 색상은 감정과 행동에 큰 영향을 미치기 때문에 마케팅에서 매우 전략적으로 활용되어야 해요.색상 이론을 참고해 더 효과적인 마케팅을 만들어보세요! Tip: 따뜻한 색상은 눈길을 끌고, 차가운 색상은 안정감을 줄 수 있어요. 전략적으로 색상을 배치해보세요.색상 선택이 어렵게 느껴질 때, AI 기반의 색상 도구들을 활용해보세요!이 도구들은 사용자 경험을 개선하고 더 나은 마케팅 디자인을 위한 색상 조합을 제안해 줍니다.실전에서 바로 쓸 수 있는 색상 도구들을 소개합니다!Adobe Color는 색상 테마를 만들고 트렌디한 색상을 찾을 수 있는 최고의 도구예요.색상환(Color Wheel)을 활용해 보색, 유사색, 단색 등의 조합을 손쉽게 설정할 수 있어요.UI/UX, 패션, 그래픽 디자인 등 다양한 분야에서 유용하게 활용할 수 있답니다. Tip: 보색을 활용해 강조하고, 유사한 색상으로 일관성 있는 디자인을 완성해보세요!Picular는 키워드를 입력하면 해당 키워드에 맞는 색상을 찾아주는 도구입니다.예를 들어 '성장'이라는 키워드를 입력하면, 따뜻하고 긍정적인 느낌을 주는 색상이 추천돼요.배경과 이미지의 색상을 일관되게 맞추고 싶다면 꼭 활용해보세요!2 Colors는 두 가지 색상 조합을 추천해주는 간편한 도구입니다.간단하면서도 효과적인 색상 조합으로 콘텐츠를 돋보이게 만들 수 있어요.강조하고 싶은 부분이 있다면, 이 도구를 활용해 색상 선택의 고민을 덜어보세요!다양한 디자인 스타일에 맞춘 색상 팔레트를 제공하는 Colorion.특히, UX/UI 디자인에 최적화된 팔레트를 제공합니다.Full color, Material design, FlatUI design 등 여러 가지 팔레트 옵션을 제공하니 필요에 맞게 활용해보세요!색상 도구를 사용하면 복잡한 색상 이론 없이도 자신감 있는 색상 선택이 가능해요!트렌디한 색상을 마케팅에 반영하면 더 세련된 이미지를 만들 수 있어요.브랜드 정체성을 유지하면서도 다양한 색상 옵션을 탐색할 수 있어요. 개성을 살리면서도 실수를 줄여보세요!툴이 제안하는 색상이 항상 정답은 아니에요. 브랜드의 개성과 소비자 반응을 고려해 최종 결정을 내리세요!성공적인 마케팅, 더 이상 어렵지 않아요! AI와 함께 똑똑하게 색상을 활용하는 방법을 마소캠퍼스가 알려드립니다. 색상을 전략적으로 사용하는 방법을 배우고 싶다면, 함께 성장해요! 😊 📌관련 강의 <AI로 피그마에 날개 달기>더 간편하게! 더 실용적으로! AI로 누구나 만드는 실전 Figma>>https://bit.ly/3XCBp8E <<  

디자인 기타마케팅AI마케팅adobe디지털마케팅그래픽디자인uxui디자인트렌드컬러컬러이론컬러팔레트마소캠퍼스

f1rstf1y9

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

운영체제메모리의 종류는 어떤것들이 있나요? 각 메모리의 특징도 함께 적어주세요.1. 레지스터레지스터는 CPU 내에 존재하는 가장 빠른 기억 장로, 계산 중간에 필요한 값들을 일시적으로 저장하기 위해 사용합니다.2. 캐시(Cache)레지스터는 굉장히 빠르고, 메인메모리는 너무 느리기 때문에 메인 메모리에 있는 값을 레지스터로 옮기려면 한참 걸리므로 필요할 것 같은 데이터를 미리 가져와서 캐시에 저장합니다. 성능 상의 이유로 여러개를 둡니다.3. 메인메모리(RAM)메인메모리는 실제 운영체제와 다른 프로세스들이 올라가는 공간입니다. 휘발성 메모리로, 전원이 공급되지 않으면 데이터가 지워집니다. 하드디스크나 SSD보다 속도는 빠르지만, 가격이 비싸므로 데이터를 저장하기 보다는 실행 중인 프로그램만 올립니다.4. 보조 저장 장치(HDD, SDD)사무용 프로그램, 게임, 작업한 파일 등을 저장할 필요가 있는데, 비싸고, 휘발성인 메모리에 저장할 순 없어서, 가격이 저렴하고 전원이 공급되지 않아도 데이터가 지워지지 않는 비휘발성 메모리인 HDD, SDD를 사용합니다.사용자 프로세스가 메모리의 운영체제 영역에 침범하지 못하도록 만든 레지스터는 어떤 레지스터일까요?경계 레지스터입니다. 경계 레지스터는 프로세스가 사용할 수 있는 메모리의 범위를 저장하는 레지스터로, 사용자 프로세스가 경계 레지스터의 범위를 벗어났는지 검사하여 벗어났다면 해당 프로세스를 종료시키는 등의 조치로 메모리를 보호합니다.메모리 할당 방식에서 가변 분할 방식과 고정 분할 방식의 장단점은 뭔가요?가변 분할 방식은 프로세스의 크기에 맞게 메모리를 동적으로 할당하는 방식입니다. 따라서 프로세스의 크기에 딱 맞게 메모리를 할당하므로 내부 단편화 문제가 적고, 메모리를 효율적으로 사용할 수 있다는 장점이 있습니다. 하지만 프로세스가 종료되면서 중간중간 작은 빈 공간이 생기면 새로운 프로세스를 적절히 배치하기 어려운 외부 단편화 문제가 발생할 수 있다는 단점이 있습니다.고정 분할 방식은 메모리를 미리 여러 개의 고정 크기 블록으로 나누어 각 프로세스에 할당하는 방식입니다. 따라서 구현이 간단하고, 오버헤드가 적으며 외부 단편화 문제가 없다는 장점이 있습니다. 하지만 작은 프로세스도 큰 영역에 할당될 수 있어 공간이 낭비되는 내부 단편화 문제가 발생할 수 있는 단점이 있습니다.고정 분할 방식은 CPU 사용률을 올리기 위해 멀티프로그래밍을 올렸지만 스왑이 더 많이 이루어져 CPU 사용률이 0%에 가까워 지는 것을 뭐라고 할까요?스레싱입니다. 스래싱은 프로세스에 적절한 페이지 수를 할당하는 것으로 해결 할 수 있습니다. 이를 위해 자주 사용될 확률이 높은 현재 사용중 페이지를 통째로 메모리에 올리는 워킹셋 기법을 사용할 수 있습니다.HDD나 SSD는 컴퓨터를 실행시키는데 꼭 필요한 걸까요?HDD나 SSD는 컴퓨터를 실행시키는데 반드시 필요하진 않다고 생각합니다. 그 이유는 HDD, SDD가 없다고 가정했을 때, 일반적으로 HDD,SDD에 저장되는 것들이 다른 곳에 저장될 수 있다고 생각했기 때문입니다. HDD, SDD는 비휘발성 메모리로, 여기에 운영체제와 사용자 데이터 등을 저장합니다. HDD, SDD가 없다면 USB 같은 다른 비휘발성 메모리에 운영 체제, 데이터 파일 등을 저장할 수 있을 것입니다.다만, USB와 같은 저장 장치를 사용할 경우 속도나 기능적 측면에서 HDD, SDD에 비해 제약이 따를 것이기 때문에, 속도와 성능을 고려하여 장기적으로 사용할 것이라면 HDD, SDD를 사용하는 것이 좋다고 생각합니다. 파일을 삭제해도 포렌식으로 파일을 복구할 수 있는 이유가 무엇일까요?삭제된 파일은 파일 테이블에서 헤더 정보가 지워지거나 비워지면서, 그 파일이 사용한 블록을 free block list로 추가합니다. 즉, 파일의 물리적인 데이터는 여전히 디스크에 남아 있지만, 운영체제는 이 블록들을 빈 공간으로 처리해 새로운 파일이 해당 블록을 사용할 수 있도록 표시합니다. 파일이 삭제되었을 때, 사용된 블록(파일이 저장된 물리적 위치)은 사실상 지워지지 않고 그대로 디스크에 남아 있는 상태입니다. 포렌식은 디스크에서 삭제된 파일이 사용한 블록을 찾아내어 헤더 정보가 없는 데이터를 복구합니다. 삭제된 파일이 사용한 블록이 새로운 데이터로 덮어쓰여지지 않았으면, 이 데이터를 복구할 수 있습니다.자료구조와 알고리즘지금까지 배운 5개의 정렬 알고리즘의 장단점과 시간 복잡도를 적어주세요.1. 버블 정렬- 시간 복잡도 : 평균 O(n^2)- 장점 : 구현이 매우 간단합니다.- 단점 : 시간 복잡도가 O(n^2)으로 성능이 낮습니다. 비교 및 교환을 많이 해야 하기 때문에, 큰 데이터셋에서 비효율적입니다.2. 선택 정렬- 시간 복잡도 : 평균 O(n^2)- 장점 : 구현이 간단합니다.- 단점 : 시간 복잡도가 O(n^2)으로 성능이 낮습니다. 비교 및 교환을 많이 해야 하기 때문에, 큰 데이터셋에서 비효율적입니다.3. 삽입 정렬- 시간 복잡도 : 평균 O(n^2)- 장점 : 구현이 간단합니다. - 단점 : 시간 복잡도가 O(n^2)으로 성능이 낮습니다. 비교 및 교환을 많이 해야 하기 때문에, 큰 데이터셋에서 비효율적입니다.4. 병합 정렬- 시간 복잡도 : 평균 O(nlogn)- 장점 : O(nlogn) 시간복잡도로 매우 빠릅니다. - 단점 : 추가적인 메모리 공간이 O(n)만큼 필요합니다.5. 퀵 정렬- 시간 복잡도 : 평균 O(n log n) / 최악 O(n^2)- 장점 : 평균적으로 매우 빠르고, 메모리 사용이 O(log n)로 적습니다.- 단점 : 피벗을 잘못 선택한다면, 최악의 경우 O(n^2)으로 좋지 못한 성능을 보입니다.메모리가 부족한 시스템에서 어떤 문제를 해결하는데 재귀로 쉽게 구현이 가능할 것 같습니다. 여러분이라면 메모이제이션과 타뷸레이션 중 어떤 걸 이용하실 건가요? 이유를 함께 적어주세요.저라면 타뷸레이션을 사용할 것 같습니다. 메모이제이션은 동적으로 필요한 값만 캐시하고 계산을 추후에 하기 때문에, 재귀와 더 잘 맞물린다고 생각하지만, 재귀가 깊어지면 스택 오버플로우가 발생할 수 있다는 문제점이 있습니다. 또한, 메모이제이션은 메모리의 불필요한 사용이 있을 수 있기 때문에 메모리가 부족한 상황에서는 안정적인 메모리 사용이 가능한 타뷸레이션이 더 합리적인 선택이라고 생각합니다.

f1rstf1y9

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

3주차 학습내용운영체제가상메모리가상 메모리를 사용하면 프로세스는 운영체제 영역이 어디 있는지, 물리 메모리의 크기가 얼마나 큰지 몰라도 됨프로그래머는 물리 메모리의 크기와 프로세스가 메모리의 어느 위치에 올라가는지 신경 쓰지 않고 0x0번지에서 시작된다고 생각하고 프로그래밍프로세스는 메모리 관리자를 통해 메모리에 접근 -> 물리 메모리에 직접 접근할 일이 없고 메모리 관리자(MMU)에게 요청만 하면 됨메모리 관리자는 물리 메모리와 스왑 영역을 합쳐 프로세스가 사용하는 가상 주소를 물리 주소로 변환 => 동적 주소 변환(Dynamic Address Translation)물리 메모리 내용의 일부를 하드 디스크의 스왑 영역으로 옮긴 뒤 처리가 필요할 때 물리 메모리로 가져와 실행세그멘테이션(배치정책)가변분할 방식으로, 프로세스의 메모리를 다양한 크기의 논리적 단위인 세그먼트로 나누어 관리하는 메모리 관리 전략Base Address와 Bound Address정보가 담긴 세그멘테이션 테이블을 가지고 있어 이를 통해 물리 메모리 주소를 계산Base Address: 세그먼트가 물리 메모리 내에서 시작하는 위치Bound Address: 세그먼트 크기논리 주소를 MMU에 전달 => MMU는 이 논리주소가 몇 번 세그먼트 인지 알아냄 => MMU 내의 Segment Table Base Register를 이용해 물리 메모리 내에 있는 세그먼트 테이블을 찾음 => 세그먼트 테이블 내 세그먼트 번호를 인덱스로 Base Address와 Bound Address를 찾음MMU는 논리주소와 Bound Address의 크기를 비교논리주소 < Bound Address : 물리주소 = 논리주소 + Base Address논리주소 > Bound Address : 메모리 침범으로 간주하고 에러 발생장점메모리를 가변적으로 분할 가능코드, 데이터, 스택, 힙 영역을 모듈로 처리할 수 있어 메모리 보호 및 공유 기능 향상단점외부 단편화 발생페이징(배치정책)고정 분할 방식으로, 물리 메모리를 고정 크기의 블록(페이지 프레임)으로 나누고, 프로세스의 가상 메모리 역시 같은 크기의 페이지로 분할하여, 각 가상 페이지를 필요에 따라 물리 메모리의 페이지 프레임에 동적으로 매핑하는 방식페이지 : 논리 주소 공간에서 같은 크기로 나눈 블록프레임 : 물리 주소 공간에서 같은 크기로 나눈 블록CPU가 논리 주소를 전달 => MMU는 그 주소에 해당하는 페이지와 오프셋을 알아냄 => MMU 내의 PTBR(Page Table Base Register)를 이용해 물리 메모리에 있는 페이지 테이블을 찾음 => 페이지 번호를 인덱스로 해 프레임 번호를 알아낸 뒤 오프셋을 이용해 물리주소로 변환페이지 넘버 = 논리주소 / 페이지 크기오프셋 = 논리주소 % 페이지 크기물리주소 = 프레임값 + 오프셋장점외부 단편화 문제 해결논리 메모리는 물리 메모리에 저장될 때 연속되어 저장될 필요 없음단점내부 단편화 발생페이지 테이블의 크기를 적절히 유지해야 함페이지드 세그멘테이션(배치정책)메모리 관리의 두 가지 기본 접근 방식인 세그멘테이션과 페이징의 장점을 결합한 메모리 관리 전략프로그램의 메모리 공간을 논리적인 단위인 세그먼트로 나눈 다음, 각 세그먼트를 다시 고정 크기의 페이지로 분할하여 관리하는 방식메모리 접근 권한code 영역: 읽기, 실행data 영역: 읽기, (쓰기)heap 영역: 읽기, 쓰기stack: 읽기, 쓰기가상 주소에서 물리 주소로 변환될 때마다 메모리 접근 권한에 대한 검사 => 권한 위반 시 에러 발생시킴가상 주소가 들어오면 몇 번 세그먼트인지 알아냄 => 물리 메모리에 있는 페이지 테이블 찾음 => 그먼트 번호에 따라 인덱스를 참조하여 먼저 해당 세그먼트가 메모리 접근 권한을 위반하는지 검사 => 접근 권한 위반시 프로세스를 종료, 접근 권한에 부합할시 페이지 넘버와 페이지 개수를 가져옴 => 페이지 테이블에서 페이지 넘버에 따라 인덱스를 참조하여 프레임 알아냄장점각각의 세그먼트는 논리적 영역별로 나누어 독립적으로 관리 가능메모리를 효율적으로 관리단점물리 메모리에 접근하기 위해 메모리에 두 번 접근해야 디맨드 페이징(가져오기 정책)프로그램 실행 시 모든 코드와 데이터를 메모리에 적재하는 것이 아닌, 필요로 하는 데이터만을 메모리로 가져오고 쓰이지 않을 것 같은 데이터는 스왑 영역으로 이동 시키는 방식지역성 이론goto문을 사용하지 않는 이유가 되는 이론공간의 지역성 : 현재 위치와 가까운 데이터에 접근할 확률이 높다.시간의 지역성 : 최근 접근했던 데이터가 오래 전에 접근했던 데이터보다 접근할 확률이 높다.지역성 이론에 따라 조만간 쓰일 데이터만 메모리에 올리고 당분간 필요하지 않을 것 같은 데이터는 스왑 영역으로 보내 성능 향상메모리 계층 구조레지스터: CPU 1 사이클캐시(L1, L2): CPU n~nn사이클메인 메모리: CPU nnn사이클보조 저장 장치: CPU nnnnnnn사이클메모리에 접근하는 시간은 보조 저장 장치로 갈수록 느려짐디맨드 페이징은 스왑 영역을 보조 저장 장치에 저장하는데, 성능 향상을 위해서는 스왑 영역으로 데이터 이동시키는 것을 최소화해야 함가상 메모리 크기 = 메인메모리 + 스왑 영역스왑 인 : 스왑 영역에서 물리 메모리로 데이터 가져오는 것스왑 아웃 : 물리 메모리에서 스왑영역으로 데이터 내보내는 것PTE : 페이지 테이블 엔트리, 페이지 테이블을 이루는 한 행페이지 교체정책 page fault가 생겼고, 현재 메모리가 가득 차있을 때 메모리에서 스왑 영역으로 페이지를 넣고 가져와야 하는데, 이 과정에서 어떤 페이지를 스왑영역으로 옮길지를 결정하는 것random무작위로 페이지를 선택해 교체하는 방식지역성을 고려하지 않아 성능이 좋지 않음FIFO(First In First Out)메모리에 가장 먼저 적재된 페이지를 선택해 교체하는 방식하드웨어적으로 접근비트를 지원하지 않는 시스템에서 사용장점구현이 간단함단점자주 사용되는 페이지도 교체되므로 낮은 성능Optimum앞으로 가장 오랫동안 쓰이지 않을 페이지를 선택해 교체하는 방식가장 오랫동안 쓰이지 않을 페이지를 알 수 없으므로 이론적으로만 존재하는 방식이며 다른 정책과 성능을 비교하기 위한 참조용으로만 쓰임LRU(Least Recently Used)최근 가장 사용이 적은 페이지를 선택해 교체하는 방식지역성 이론의 시간 지역성에 따른 방식장점FIFO에 비해 효율적단점프로그램이 지역성을 띄지 않을 때 성능 저하시간을 기록하기 위한 많은 bit 필요하며 시간이 오래되면 오버플로우 발생접근 시간을 기록하기 위한 추가적 메커니즘 필요Clock AlgorithmLRU와 비슷모든 페이지에 접근 비트를 하나만 사용하여 일정 시간 간격마다 모든 페이지의 접근 비트를 0으로 초기화하며 페이지가 참조될 때 접근 비트를 1로 설정, 클락 핸드가 시계방향으로 페이지들을 순환하며 사용 비트가 0인 페이지를 선택해 교체하는 방식Enhanced Clock Algorithm접근 비트와 변경 비트를 동시에 두고 교체할 페이지를 선택하는 방식교체 1순위: 접근 비트 0 / 변경 비트 0교체 2순위: 접근 비트 0 / 변경 비트 1교체 3순위: 접근 비트 1 / 변경 비트 0교체 4순위: 접근 비트 1 / 변경 비트 12차 기회 페이지 교체 알고리즘하드웨어적으로 접근비트를 지원하지 않는 시스템에서 사용되어야 하는 FIFO의 단점이었던 자주 사용되는 페이지의 교체 문제를 개선한 방식먼저 들어왔지만 Page Fault 없이 페이지 접근에 성공한 경우 자주 사용되는 페이지이므로 해당 페이지를 큐의 맨 뒤로 이동시켜 수명을 연장시키는 알고리즘성능 : FIFO < 2차 기회 페이지 교체 알고리즘 < LRU스레싱운영체제는 CPU사용량을 늘리려 함 => 사용량을 늘리려고 멀티프로그래밍 정도를 늘리려고 하는데 무작정 늘려버리면 오히려 스왑작업이 많아져서 사용량이 줄어들게 됨 => 해당 상황이 스레싱원인 : 물리메모리의 크기가 작은 것해결 방법메모리 크기 증가프로세스에 적절한 페이지의 수 할당 한 프로세스에 많은 페이지 할당시 다른 프로세스의 페이지가 줄어들어 낮은 효율한 프로세스에 적은 페이지 할당시 빈번한 Page Fault 발생으로 스래싱 발생프로세스에 맞게 유지할 페이지 결정워킹셋 : 현재 사용중인 페이지들은 자주 사용될 확률이 높기 때문에 이를 통째로 메모리에 올리는 것주변장치(I/O 디바이스, 저장장치)그래픽 카드, 하드디스크, SSD, 키보드, 마우스 등주변 장치 분류캐릭터 디바이스데이터 전송단위가 character로, 상대적으로 크기가 작다.마우스, 키보드, 사운드카드, 직렬/병렬 포트 블록 디바이스데이터 전송단위가 block으로, 상대적으로 크기가 작다.하드디스크, SSD, 그래픽카드 등입출력 버스 구조초기 : 버스 하나에 주변 장치를 모두 연결CPU가 작업을 진행하다가 입출력 명령을 만나면 직접 입출력장치에서 데이터를 가져오는 폴링 방식 이용 => CPU 사용률이 낮아짐현재 : 입출력 제어기(I/O Controller)와 여러개의 버스 추가CPU는 I/O 작업 발생 시 입출력 제어기에 이를 맡기고 다른 작업 진행메모리가 입출력 제어기에 직접 연결하기 위해 DMA(Direct Memory Access)를 추가하고 사용하는데 이를 Memory Mapped I/O라고 부름마우스/키보드광학 마우스 작동 원리마우스 밑면에 작은 카메라 탑재, 초당 1500회가 넘는 사진을 찍어 디바이스 컨트롤러 내 DSP로 보냄DSP는 사진을 분석해 마우스의 x축 좌표와 y축 좌표 움직임 분석디바이스 컨트롤러는 CPU에게 인터럽트를 보내고 마우스 드라이버가 동작해 데이터 읽음마우스 드라이버는 운영체제에게 이벤트 신호를 보내고 운영체제는 이 이벤트를 Foreground 애플리케이션으로 전달해당 애플리케이션은 받은 마우스 이벤트 처리, 해당 동작 수행키보드 작동 원리사용자가 키 입력디바이스 컨트롤러가 어떤 키를 입력 받았는지 알아냄CPU에게 인터럽트 보냄키보드 드라이버는 운영체제에 이벤트를 보내고 운영체제는 이 이벤트를 Foreground 애플리케이션으로 전달해당 애플리케이션은 받은 키보드 이벤트 처리, 해당 동작 수행   하드디스크/Flash Memory(SSD)블록 디바이스의 한 종류하드 디스크 구조spindle이라고 하는 막대가 있고 그곳에는 platter라는 원판들이 붙어 있음. disk arm이 platter의 값을 읽음. platter > track > sector구조하드 디스크 작동 원리유저 프로세스가 하드디스크의 특정 섹터에 접근 요청(실린더 C로 가서 트랙 B에 있는 섹터 D를 읽어라)seek: 디스크암은 헤드를 실린더 C로 이동.seek Time: 헤드를 실린더로 이동시키는 시간으로, 하드디스크가 느린 이유트랙 B의 섹터D가 헤드에 닿을때까지 스핀들 회전헤드에 섹터D가 읽히면 작업 종료단점속도 느리고 소음 발생자석을 대면 데이터 손상 충격에 약함Flash Memory장점전기적으로 데이터를 읽어 속도가 빠르고 조용하다 자석을 대도 데이터 보존 충격에 강함단점특정 부분에 데이터를 쓴 경우 덮어쓰기 불가 및 데이터 삭제 횟수가 정해져있어 같은 부분에 데이터 삽입과 삭제를 반복할 경우 망가져 사용 불가 파일과 파일시스템파일들은 하드디스크나 SSD같은 저장 장치에 저장되는데, 사용자가 직접 저장하면 손상시킬 수 있어 운영체제가 안전하게 저장파일 시스템 기능파일과 디렉토리 생성파일과 디렉토리 수정/삭제파일 권한 관리무결성 보장백업과 복구암호화파일 제어 블록 = 파일 디스크립터모든 파일마다 있고 오픈되면 메모리로 이동운영체제가 관리하고 사용자는 접근할 수 없음파일의 분류순차파일구조카세트테이프들어온 순서대로 작동하기에 공간의 낭비가 없고 구조가 단순특정지점으로 바로 이동이 어려움직접파일구조해시 함수를 통해 저장 위치를 정하는 방식(json도 이 방식 사용)데이터 접근이 매우 빠름해시함수를 잘 골라야 하며 저장공간이 낭비될 수 있음인덱스 파일구조앞선 두 가지 방식을 합친 것노래 재생목록디렉토리파일과 다른 디렉토리를 포함할 수 있는 컨테이너파일을 주제나 유형별로 그룹화하여 조직화할 수 있음디렉토리도 하나의 파일로, 파일이 데이터를 저장한다면 디렉토리는 파일 정보를 저장디렉토리 구조계층적 구조 : 최상위에 루트 디렉토리(/) 존재초기 : 루트 디렉토리에만 디렉토리가 존재할 수 있고 다른 디렉토리에서는 하위 디렉토리를 만들 수 없는 구조현재 : 다단계 디렉토리 구조로, 모든 디렉토리가 하위 디렉토리를 만들 수 있는 트리구조파일과 디스크디스크는 블록(1~8kB)으로 나뉘어있음. 파일시스템은 파일정보를 파일 테이블로 관리하고, 파일이 시작하는 블록 위치 정보도 기록되어있음.파일 할당 방식연속 할당블록들을 디스크에 연속적으로 저장하는 방식시작블록만 알면 나머지도 알 수 있으나 내부단편화가 발생 -> 그래서 사용하지 않음불연속 할당디스크의 비어있는 공간에 집어넣고 파일시스템이 두가지 방식으로 관리연결 할당파일에 속한 데이터를 연결리스트로 관리파일 테이블에는 시작 블록에 대한 정보만 저장하고 다른 블록은 연결리스트를 통해 접근인덱스 할당(i-node 방식)파일 테이블의 블록 포인터가 데이터 블록에 직접 연결하는것이 아닌, 데이터들의 인덱스를 가지고 있는 인덱스 블록에 연결데이터가 많아 테이블이 꽉 찬 경우 인덱스 블록을 더 만들어 연결하기 때문에 테이블 확장 가능파일 크기가 작다면 데이터를 바로 참조하는 블록 포인터 이용, 파일 크기가 크다면 간접 포인터를 이용해 많은 데이터에 접근 가능디스크를 구성하는 블록의 크기가 너무 작으면 공간 낭비는 줄지만 관리해야 할 블록의 수가 많아지고, 블록의 크기가 너무 크면 관리해야하는 블록의 수는 적지만 내부단편화로 낭비되는 공간이 많아짐빈공간을 찾을 때 항상 모든 공간을 찾는것보다는 빈공간 리스트를 만들고 삭제한 후에 리스트에 빈 공간의 주소를 추가하는 방식이 좋음알고리즘정렬 - 삽입정렬장점 : 간단한 이해와 구현단점 : 낮은 성능A = [34, 58, 13, 94, 29] # 이미 정렬된 부분이라고 가정하는 0번째 요소를 제외한 나머지 부분 순회 for i in range(1, len(A)): # 이미 정렬된 부분(0번째~i-1번째)에서 자리 찾기 # 뒤에서부터 훑으면서 큰 원소들을 만날 때마다 교환 for j in range(i-1, 0, -1): if A[j+1] > A[j]: break A[j], A[j+1] = A[j+1], A[j]정렬 - 병합정렬정렬해야 할 것을 아주 잘게 나눈 다음 정렬하고 병합하는 것을 반복하는 정렬 방법장점 : O(nlogn)의 좋은 성능단점 : 이해와 구현 어려움, 시스템의 스택 크기가 큰 데이터를 정렬할 때 제한적def merge_sort(unsorted_list): # 리스트를 더 이상 나눌 수 없으면 해당 리스트를 그대로 리턴 if len(unsorted_list) <= 1: return unsorted_list # 리스트를 반으로 나누기 mid = len(unsorted_list)//2 # 왼쪽 부분을 재귀적으로 정렬 left = merge_sort(unsorted_list[:mid]) # 오른쪽 부분을 재귀적으로 정렬 right = merge_sort(unsorted_list[mid:]) # left, right 리스트를 처음부터 순회하기 위한 인덱스 초기화 left_idx = right_idx = 0 # 정렬된 left, right 두 리스트를 병합한 결과를 저장할 리스트 초기화 merged = [] # 왼쪽과 오른쪽 리스트의 앞부분 부터 비교해가며 병합 while (left_idx < len(left) and right_idx < len(right)): # 현재 가리키고 있는 왼쪽 값이 오른쪽 값보다 작으면 왼쪽 값을 병합리스트에 추가하고, 왼쪽 인덱스에 1 더하기 if right[right_idx] > left[left_idx]: merged.append(left[left_idx]) left_idx += 1 # 현재 가리키고 있는 오른쪽 값이 왼쪽 값보다 작으면 왼쪽 값을 병합리스트에 추가하고, 왼쪽 인덱스에 1 더하기 else: merged.append(right[right_idx]) right_idx += 1 # 왼쪽 리스트에 남은 값이 있으면 병합 리스트에 추가 while (left_idx < len(left)): merged.append(left[left_idx]) left_idx += 1 # 오른쪽 리스트에 남은 값이 있으면 병합 리스트에 추가 while (right_idx < len(right)): merged.append(right[right_idx]) right_idx += 1 # 병합된 결과 리턴 return merged A = [34, 58, 13, 94, 29] A = merge_sort(A)정렬 - 퀵정렬배열의 값 중 한가지를 피벗으로 설정 (피벗 설정 방법은 여러가지)맨 왼쪽, 맨 오른쪽, 양쪽 이동 값을 만든다장점 : O(nlogn)의 좋은 성능단점 : 이해와 구현 어려움, 최악의 경우 시간복잡도가 O(n^2)A = [34, 58, 13, 94, 29] def quick_sort(low, high): if low < high: # pivot을 가장 큰 값으로 임의로 선택 pivot = A[high] # 현재 pivot보다 작은 부분의 마지막 요소의 인덱스 # 주어진 리스트 안에서 pivot보다 작은 요소의 개수 - 1 i = low - 1 # 분할 과정 for j in range(low, high): # low부터 high-1까지 순회 # pivot보다 작은지 확인 if A[j] <= pivot: i = i + 1 A[i], A[j] = A[j], A[i] # 작은 부분(왼쪽 부분)으로 옮기기 # 작은 부분의 마지막 요소의 바로 뒤 요소와 pivot을 교환 # pivot을 기준으로 pivot보다 작은 원소는 왼쪽으로, 큰 원소는 오른 쪽으로 배치 A[i+1], A[high] = A[high], A[i+1] # 분할 과정 이후 pivot의 최종 위치 pivot_idx = i + 1 # 재귀적 정렬 - 왼쪽 부분 정렬 quicksort(low, pivot_idx - 1) # 재귀적 정렬 - 오른쪽 부분 정렬 quick_sort(pivot_idx + 1, high) # 초기 호출 quick_sort(0, len(A)-1)동적 프로그래밍 - 메모이제이션계산 결과를 저장해서 여러번 계산하지 않도록 하는 기법계산 결과를 해시 테이블에 저장하고 재사용해 속도가 빠르다 .하향식 계산 방식으로 문제를 해결동적 프로그래밍 - 타뷸레이션계산에 필요한 모든 값을 전부 계산 후 테이블에 저장하는 기법상향식 계산 방식으로 문제를 해결회고3주간의 워밍업클럽 2기가 마무리되었다. 끝나고 회고를 작성하면서 드는 생각은 이것저것 챙기려고 하다보니, 3주간 약간은 쫓기면서 수업을 수강하진 않았는가 하는 아쉬움도 들고, 그럼에도 혼자 수강했다면 절대 완강하지 못했을 거란 생각이 들어서 참여하길 잘했다고 생각한다!알고리즘 공부는 개인적으로도 필요성을 많이 느껴서 블로그에 정리도 해보고, 따로 이런저런 글도 많이 읽어서 익숙했는데 운영체제는 사실 예전에 CS 면접 준비를 위해 잠깐 슥 겉핥기로 훑어본게 전부였고, 그때도 제대로 이해하진 못해서 좀 걱정되는 부분도 있었다. 다행히 친절한 난이도의 강의와 설명 덕분에 큰 무리없이 강의를 수강할 수 있었다. 기회가 된다면 다시 강의를 한바퀴 돌리면서 좀 더 개념을 확실히 익히고 추가적으로 궁금한 점이 생기는 부분을 더 깊게 파고들어보고 싶다. 일단은 기초 개념을 잡았다는 것에 만족:-)이제 워밍업 클럽은 끝났지만, 이걸로 공부를 완전히 끝내서는 당연히 안될 것이다. 인프런에 올린 발자국의 배운 내용 요약은 내가 강의를 들으면서 휘갈겼던(..) 노트를 그대로 옮긴거라, 추후엔 내 블로그에 이해한 내용을 나만의 방식으로 정리한 것과 강의를 들으면서 생겼던 의문, 그리고 그 의문에 대한 답 등등..을 정리하며 추가적으로 공부할 예정이다. (제발 하길...)워밍업 클럽 2기 안녕👋

f1rstf1y9

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

2주차 학습 내용운영체제CPU 스케줄링 알고리즘 - SJF(Shortest Job First)Burst Time이 짧은 프로세스를 먼저 실행하는 알고리즘이론적으론 FIFO보다 성능이 좋지만, 구현에 문제가 발생할 수 있음어떤 프로세스가 얼마나 실행될지 예측 어려움Burst Time이 긴 프로세스는 아주 오랫동안 실행되지 않을 수도 있음CPU 스케줄링 알고리즘 - Round Robin한 프로세스에게 일정 시간만큼 CPU를 할당하고, 할당 시간이 지나면 강제로 다른 프로세스에게 일정 시만큼 CPU를 할당하는 알고리즘프로세스에게 할당하는 일정 시간 => 타임 슬라이스, 타임 퀀텀타임 슬라이스의 값에 따라 RR 알고리즘의 성능이 크게 바뀜타임 슬라이스가 큰 경우(무한대라고 가정)먼저 들어온 프로세스의 작업이 종료될 때까지 실행 => FIFO 알고리즘이 됨타임 슬라이스가 작은 경우(1ms라고 가정)컨텍스트 스위칭이 너무 자주 일어남프로세스 처리량보다 컨텍스트 스위칭을 처리하는 양이 더 커짐 => 오버헤드가 너무 큼최적의 타임 슬라이스 : 사용자가 느끼기에 여러 프로세스가 버벅거리지 않고, 동시에 실행되는 것처럼 느껴지면서 오버헤드가 너무 크지 않는 값Windows는 20ms, Unix는 100ms 정도 CPU 스케줄링 알고리즘 - MLFQ(Multi Level Feedback Queue)오늘날 운영체제에서 가장 일반적으로 쓰이는 CPU 스케줄링 기법기본적으로 CPU 사용률과 I/O 사용률이 좋게 나오는 작은 크기의 타임 슬라이스를 선택하되, CPU Bound Process들에게는 타임 슬라이스를 크게 줌CPU를 사용하는 프로세스가 스스로 CPU를 반납하면 I/O Bound Process일 확률이 높고, 실행 도중 CPU 스케줄러에 의해 강제로 CPU를 뺏기는 상황이 발생하면 CPU Bound Process일 확률이 높음우선순위 큐를 여러 개 준비하여, 우선순위가 높으면 타임 슬라이스 크기가 작고, 우선순위가 낮으면 타임 슬라이스 크기가 커짐처음엔 타임 슬라이스가 작게 할당되어있다가, CPU가 강제로 뺏기면 좀 더 큰 타임 슬라이스를 할당받게 됨프로세스 간 통신프로세스는 독립적으로 실행되기도 하지만, 다른 프로세스와 데이터를 주고받으며 통신을 하는 경우도 있음한 컴퓨터 내에서 프로세스 간 통신하는 방법파일을 이용하는 방법통신하려는 프로세스들이 하나의 파일을 이용해 읽고 쓰는 방법파이프를 이용하는 방법운영체제가 생성한 파이프를 이용해 데이터를 읽고 쓰는 방법한 프로세스 내에서 쓰레드 간 통신하는 방법데이터 영역의 전역 변수나 힙을 이용해 통신네트워크를 이용한 방법운영체제가 제공하는 소켓통신이나 다른 컴퓨터에 있는 함수를 호출하는 RPC(원격 프로시저 호출)를 이용해 통신공유자원과 임계구역공유자원프로세스가 통신할 때 공동으로 이용하는 변수, 파일 등여러 프로세스가 공유하고 있기 때문에 각 프로세스의 접근 순서에 따라 결과가 달라질 수 있음임계 구역(Critical Section)여러 프로세스가 동시에 사용하면 안되는 영역경쟁 조건(Race Condition) : 공유 자원을 서로 사용하기 위해 경쟁하는 것임계 구역 문제를 해결하기 위한 조건상호 배제(Mutual Exclusion) 메커니즘 필요임계 구역엔 주어진 시간에 항상 하나의 프로세스만 접근할 수 있어야 한다동시에 여러 개의 요청이 있더라도 하나의 프로세스의 접근만 허용한다.임계 구역에 들어간 프로세스는 빠르게 나와야 한다.세마포어프로세스들은 대기 큐에서 공유 자원을 사용하기 위해 대기하고, 운영 체제가 관리하는 열쇠를 가진 프로세스만 공유 자원을 사용할 수 있음 => 이때 이 열쇠를 세마포어(정수형 변수)라고 함공유 자원의 개수에 따라 세마포어의 값 또한 달라짐wait() : 열쇠를 요청해서 열쇠를 받고 문을 잠금. 열쇠가 없으면 기다림signal() : 방에서 나와 문지키는 직원에게 열쇠 반납단점 : wait() 함수, signal() 함수의 순서를 이상하게 호출해서 세마포어를 잘 못 사용할 가능성이 있음 => 모니터로 해결!모니터운영체제가 처리하는 것이 아닌, 프로그래밍 언어 차원에서 지원하는 방법Java에서 synchronized라는 키워드가 붙으면, 이 키워드가 붙은 함수들은 동시에 여러 프로세스에서 실행시킬 수 없음 = 상호배제가 완벽하게 이루어짐만약 프로세스 A에서 increase() 함수를 실행하면, 프로세스 B는 synchronized 키워드가 붙은 decrease() 함수도 실행할 수 없음교착상태(데드락)여러 프로세스가 서로 다른 프로세스의 작업이 끝나길 기다리다가 아무도 작업을 진행하지 못하는 상태교착상태의 필요 조건 (한가지라도 충족하지 않으면 교착상태 발생 X)상호배제 : 어떤 프로세스가 한 리소스를 점유했다면, 그 리소스는 다른 프로세스에게 공유되면 안됨 비선점 : 프로세스 A가 리소스를 점유하고 있는데 프로세스 B가 리소스를 빼앗을 수 없어야 함 점유와 대기 : 어떤 프로세스가 리소스A를 가지고 있는 상태에서 리소스 B를 원하는 상태여야 함 원형 대기 : 점유와 대기를 하는 프로세스들의 관계가 원형을 이루고 있어야 함 교착 상태의 네가지 조건을 이용해서 교착상태를 예방하는 방법을 연구해보고자 했으나, 제약이 많고 비효율적이라 해결하는 방법을 연구함교착상태 회피(Deadlock avoidance)프로세스들에게 자원을 할당할 때 어느정도 자원을 할당해야 교착상태가 발생하는지 파악해서 교착상태가 발생하지 않는 수준의 자원 할당을 함전체 자원의 수와 할당된 자원의 수를 기준으로 안정 상태, 불안정 상태로 나눔운영체제는 최대한 안정 상태를 유지하려고 자원할당 함불안정 상태에 있더라도 무조건 교착 상태에 빠지는 것이 아닌, 교착 상태에 빠질 확률이 높아짐운영체제에서 은행원 알고리즘 구현하기안정상태은행원 알고리즘은 각 프로세스가 현재 요구할 수 있는 요청이 예상되는 자원을 구함  P1에서 4개를 요청하면 현재 사용 가능 자원이 2개뿐이므로 거절P2에서 2개를 요청하면 2개 모두 P2에 할당, P2는 작업을 마치고 6개를 반납사용 가능한 자원이 6개가 되어, P1, P3 모두에 필요한 만큼 할당 가능불안정 상태사용 가능한 자원이 1개현재 사용 가능한 자원 개수로는 P1, P2, P3가 요청할 수 있는 최대 요청인 2개를 충족하지 못함 => 불안정 상태모든 프로세스가 최대 자원을 요청하지 않는다면 교착 상태에 빠지지 않을 수도 있지만, 불안정상태에 빠지지 않도록 유지하는게 좋음교착상태의 검출 방식가벼운 교착 상태 검출프로세스가 일정 시간 동안 작업을 진행하지 않는다면 교착상태가 발생했다고 간주해결 방법 : 일정 시점마다 체크포인트를 만들어 작업을 저장하고 타임아웃으로 교착 상태가 발생했다면 마지막으로 저장했던 체크포인트로 롤백무거운 교착 상태 검출자원 할당 그래프 이용현재 운영체제에서 프로세스가 어떤 자원을 사용하는지 지켜보고 교착 상태가 발생했다면 해결그래프에 순환 구조가 생긴다면 교착 상태가 생긴 그래프교착 상태를 검출하면 교착 상태를 일으킨 프로세스를 강제 종료시키고, 다시 실행시킬 때 체크포인트로 롤백단점 : 운영체제가 지속적으로 자원할당그래프를 유지하고 검사해야하므로 오버헤드가 발생장점 : 가벼운 교착상태에서 발생하는 억울하게 종료되는 프로세스는 발생하지 않음메모리 종류레지스터가장 빠른 기억장소, CPU 내에 존재휘발성 메모리 - 컴퓨터의 전원이 꺼지면 데이터가 사라짐CPU를 구분할 때 말하는 32bit, 64bit는 레지스터의 크기를 말함CPU는 계산을 할 때, 메인메모리에 있는 값을 레지스터로 가져와 계산하고, 결과는 메인메모리에 저장캐시휘발성 메모리레지스터는 굉장히 빠르고, 메인메모리는 너무 느림 => 메인 메모리에 있는 값을 레지스터로 옮기려면 한참 걸리므로 필요할 것 같은 데이터를 미리 가져와서 캐시에 저장성능의 이유로 여러개를 둠메인메모리(RAM)실제 운영체제와 다른 프로세스들이 올라가는 공간전원이 공급되지 않으면 데이터가 지워지므로 휘발성 메모리하드디스크나 SSD보다 속도는 빠르지만, 가격이 비싸므로 데이터를 저장하기 보다는 실행 중인 프로그램만 올림 보조저장장치(HDD, SSD)사무용 프로그램, 게임, 작업한 파일 등을 저장할 필요가 있는데, 비싸고, 휘발성인 메모리에 저장할 순 없음가격이 저렴하고 전원이 공급되지 않아도 데이터가 지워지지 않는 비휘발성 메모리를 만듦 메인메모리오늘날의 컴퓨터 구조인 폰 노이만 구조는 모든 프로그램을 메모리에 올려 실행시킴운영체제는 메모리를 관리하기 위해 1바이트 크기로 구역을 나누고 숫자를 매김 => 이 숫자는 "주소"라고 부름물리 주소와 논리 주소물리 주소 : 메모리를 컴퓨터에 연결하면 0x0번지부터 시작하는 주소 공간논리 주소 : 사용자 관점에서 바라본 주소 공간사용자는 물리 주소를 몰라도 논리 주소로 물리 주소에 접근할 수 있음경계 레지스터메모리에는 수많은 프로세스가 올라오는데, 운영체제를 위한 공간은 따로 마련해둠. 이때,하드웨어적으로 운영체제 공간과 사용자 공간을 나누는 경계 레지스터를 만듦메모리 할당 방식유니 프로그래밍메모리 오버레이유니프로그램 방식에서 메모리보다 더 큰 프로그램을 실행시키는 방법큰 프로그램을 메모리에 올릴 수 있도록 잘라서 당장 실행시켜야 할 부분만 메모리에 올리고 나머지는 용량이 큰 하드디스크의 스왑 영역에 저장하는 기법멀티프로그래밍가변 분할 방식(세그멘테이션)프로세스의 크기에 따라 메모리를 나누는 방식장점 : 내부 단편화 없음단점 : 외부 단편화 발생고정 분할 방식(페이징)프로세스의 크기와 상관 없이 메모리를 정해진 크기로 나누는 방식 장점 : 구현이 간단하며 오버헤드가 적음단점 : 작은 프로세스도 큰 영역에 할당돼서 공간이 낭비되는 내부 단편화 발생버디 시스템오늘날 가변 분할 방식과 고정 분할 방식을 혼합하여 단점을 줄인 방식2의 승수로 메모리를 분할해 메모리를 할당하는 방식가변 분할 방식처럼 프로세스 크기에 따라 할당되는 메모리 크기가 달라지고, 외부 단편화를 방지하기 위해 메모리 공간을 확보하는 것이 간단함고정 분할 방식처럼 내부 단편화가 발생하긴 하지만 많은 낭비가 발생하진 않음알고리즘재귀(recursion)어떠한 것을 정의할 때 자기 자신을 참조하는 것재귀 함수탈출 조건이 없으면 콜스택이라는 메모리 공간이 가득차서 자동으로 종료언제 종료될지 예측할 수 있게 하기 위해 탈출 조건, 즉 기저 조건이 반드시 필콜스택함수가 호출되면서 올라가는 메모리 영역, 스택이라고도 부름FILO(먼저 들어온 데이터가 나중에 나감) 특성을 가짐함수를 호출하면 함수는 콜스택에 올라가고, 종료되면 콜스택에서 제거됨버블 정렬(Bubble Sort)앞에 있는 숫자와 뒤에 있는 숫자를 비교해서 자리를 바꾸는 알고리즘데이터를 옆 데이터와 비교하면서 자리를 바꾸는게 버블이 일어나는 것 같아서 붙여진 이름시간복잡도 : O(n^2)장점 : 이해와 구현이 쉽다단점 : 성능이 좋지 않다.function BubbleSort(arr){ for(let i = 0; i < arr.length - 1; i++){ for(let j = 0; j < (arr.length - i - 1); j++){ if(arr[j] > arr[j + 1]){ let temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }선택 정렬 (Sellection Sort)배열의 정렬되지 않은 영역을 순회하며 가장 작은 값을 탐색 후 교체하는 방법시간복잡도 : O(n^2)장점 : 이해와 구현이 쉽다단점 : 성능이 좋지 않다function SelectionSort(arr){ for(let i = 0; i < arr.length - 1; i++){ let minValueIndex = i; for(let j = i + 1; j < arr.length; j++){ if(arr[j] < arr[minValueIndex]){ minValueIndex = j; } } let temp = arr[i]; arr[i] = arr[minValueIndex]; arr[minValueIndex] = temp; } }회고칭찬하고 싶은 점이번 주부터 알고리즘 스터디를 시작하고, 또 매일 출근도 하면서 오늘 있었던 코딩테스트까지 일주일 간 이것저것 할일이 많았는데 포기하지 않고 이번주차 진도를 따라잡았다. CS 중에서도 운영체제는 개념이 잘 잡혀있지 않았는데, 공부를 하면서 운영체제에서 가장 중요한 개념인 프로세스와 CPU 스케줄링에 대해 어느정도 개념을 이해할 수 있는 일주일이었다.아쉬웠던 점이번주에도 역시나 매일매일 정해진 분량을 학습하기보다는 시간이 남는 타임에 몰아들은 경우가 더 많았던 것 같다.보완해야할 점남은 일주일도 바쁠 예정이기 때문에..현실적으로 매일매일 정해진 분량을 지켜서 노트까지 정리해가며 학습하기엔 벅차더라도, 지난 주처럼 너무 한번에 몰아서 하지 말고 출퇴근 시간을 이용해서 강의를 가볍게 보고 추후에 다시 복습하는 개념으로 노트를 정리하면 좋을 것 같다.

워밍업클럽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)을 사용하는 것이 더 적합하다고 생각합니다.우리는 서비스를 제공하는 입장에서 치명적인 오류나 결함을 방지하고 사용자 경험을 보호하는 것이 가장 중요하다고 저는 생각합니다.메모이제이션은 힙메모리에 저장하기 때문에 메모리 부족 현상으로 인해 힙 메모리 부족으로 인한 오류가 발생하여 사용자에게 서비스 중단이나 예기치 못한 오류를 발생시킬 수 있습니다. 반면, 타뷸레이션은 반복문을 사용하여 스택 메모리를 절약하고, 필요 이상으로 힙 메모리를 사용하지 않아 메모리 효율적입니다. 또한 속도 측면에서 비교 해보았을때도 메모이제이션과 타뷸레이션의 성능은 거의 비슷하기 때문에 메모리가 부족한 시스템에서는 타뷸레이션을 선택하는게 바람직 하다고 생각합니다.

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

하얀종이개발자

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

운영체제 3주차 학습 요약 가상메모리컴퓨터의 물리적 메모리의 크기를 확장하기 위해 사용되는 기술운영체제가 각 프로세스마다 독립적인 메모리공간을 할당할 수 있게 해줌이때문에 프로그래머는 프로그램이 메모리 어디에 위치하는지 신경쓰지 않고, 0부터 시작된다고 생각하고 프로그래밍 함동적주소변환 (DAT)메모리관리자가 가상메모리의 논리주소를 물리주소로 변환하는 것을 말함세그멘테이션 분할 방식에서 논리 주소를 물리주소로 변환메모리관리자는 CPU에서 받은 논리주소를 세그멘테이션 테이블을 이용하여 물리주소를 찾음페이징 분할 방식에서 논리 주소를 물리주소로 변환메모리관리자는 CPU에서 받은 논리주소를 페이지 테이블을 이용하여 물리주소를 찾음페이지드 세그멘테이션 분할 방식에서 논리 주소를 물리주소로 변환세그멘테이션 테이블의 속성값으로 페이지 테이블의 인덱스를 추가할 수 있게하여 세그멘테이션, 페이지 테이블을 모두 이용해서 물리주소를 찾음가상메모리는 세그멘테이션으로 분할되어 있고, 물리메모리는 페이징으로 분할되어 있어 각 분할방식의 장점을 취할 수 있게 함메모리 접근권한세그멘테이션 테이블에 메모리의 특정번지에 권한을 부여하는 속성을 추가하여, 메모리 접근시 권한을 검사할 수 있음디멘드 페이징 정책조만간 필요할 것 같은 데이터를 메모리에 가져오고 쓰이지 않을 것 같은 데이터는 스왑영역으로 보내는 정책필요한 데이터를 언제 메모리로 가져올지를 결정하는 것페이지 테이블 엔트리접근비트, 변경비트, 유효비트, 권한비트 (프레임번호만 있는게 아님)페이지 폴트프로세스가 가상메모리에 접근요청했을때 물리메모리에 데이터가 없을때 발생하는 인터럽트페이지 폴트가 발생하면 보조저장장치의 스왑영역에 접근하여 스왑영역에 있는 데이터를 메모리에 올리는 작업을 함페이지 교체정책스왑영역에서 데이터를 찾아 메모리에 올리려고 했는데, 이미 메모리가 가득찼을때 조회할 데이터를 메모리에 추가하기위해 데이터를 남기거나 스왑영역으로 보내는 정책무작위, FIFO, Optimum, LRU, Clock Algorithm, Enhanced Clock Algorithm스레싱과 워킹셋스레싱제한된 물리 메모리에 프로그램을 많이 올려 스왑 영역에 데이터가 많이 저장되고 Page Fault가 자주 발생하게 되면 CPU 사용률이 떨어짐. 스케줄러에 의해 운영체제는 CPU 사용률을 올리기 위해 더 많은 프로세스를 메모리에 올리게 되고 이를 반복하게 되면 CPU 사용률이 0에 가깝게 떨어지는데 이를 스레싱이라고 함워킹셋현재 메모리에 올라온 페이지는 다시 사용할 확률이 높기에 하나의 세트로 묶어서 메모리에 올리는데 이를 워킹셋이라고 함입출력장치주변장치(I/O 디바이스, 저장장치)들은 메인보드에 있는 버스로 연결되어 있음각 하드웨어에 맞게 외부 인터페이스가 존재캐릭터 디바이스, 블록디바이스 입출력 제어기는 두 개의 채널, 시스템 버스와 입출력 버스로 구분파일과 파일시스템운영체제가 파일을 관리하기 위한 파일 관리자파일을 관리하는 하드디스크나 Flash Memory(SSD)는 블록 디바이스, 파일 시스템은 전송 단위는 블록이지만, 사용자는 바이트 단위로 파일에 접근이 가능해야 함, 파일 관리자가 이를 중간에서 관리파일의 종류순차파일구조, 직접파일구조, 인덱스파일구조디렉토리관련있는 파일을 모아둘 수 있도록 하는 장치알고리즘 & 자료구조 3주차 학습 요약 삽입 정렬 (Insertion Sort)정렬되지 않은 영역에서 데이터를 하나씩 꺼내서 정렬된 영역 내 적절한 위치에 "삽입"해서 정렬하는 알고리즘삽입하려는 데이터를 정렬된 영역의 원소를 역순으로 순회하면서 비교O(n²)장점 : 작은 데이터나 거의 정렬된 데이터에 대해 매우 효율적단점 : 속도가 느려서 대규모 데이터에 비효율적 병합 정렬 (Merge Sort)정렬하려고 하는 배열을 잘게 쪼갠다음, 순서에 맞게 재배열하는 알고리즘 (재귀)O(n log n) 장점 : 속도가 빠르며 대규모 데이터에서도 일정한 성능을 보임 단점 : 추가 메모리 공간이 필요하며, 메모리 효율이 떨어질 수 있음퀵 정렬 (Quick Sort)배열의 숫자중 하나를 피벗으로 설정하고, 피벗의 왼쪽에는 작은값, 피벗의 오른쪽에는 큰값을 정렬하는 알고리즘분할시 왼쪽과 오른쪽의 포인트가 교차하면 피벗과 오른쪽 포인트의 값과 교환하여 피벗값을 정렬해나감평균 O(n log n), 최악 O(n²) 장점 : 평균적으로 매우 빠르고, 메모리 사용이 적음 단점 : 피벗 선택에 따라 성능이 달라지며, 최악의 경우 속도가 느려질 수 있음 (그러나 최악이 되는 경우는 거의 없음)동적프로그래밍메모이제이션계산 결과를 따로 기억해서 여러 번 중복 계산하지 않도록 하는 기법하향식 계산 방식으로 활용타뷸레이션계산에 필요한 모든 값을 전부 계산 후 테이블에 저장하는 기법상향식 계산 방식으로 활용 회고스터디의 마지막 주차가 되었네요. 나름 정리도 하고 CS전공지식 스터디 내부에서 다른분들이랑 모여 발표 스터디도 하면서 열심히 학습하면서 많이 배운시간이 었던거 같아요. 특히나 알고리즘을 직접 구현해보면서 각 알고리즘의 장.단점을 외우지 않아도 조금만 생각해보면 장.단점을 도출할 수 있게 되어서 좋았어요.스터디 발표 & 정리 자료 캡쳐빠르게 끝나 아쉬움반 후련함반이 있지만, 계속 복습하고 부족한 부분 채워나가면서 열심히 해나가겠습니다.많이 배웠습니다. 즐거웠어요.

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

정지형

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

💡 1주차 회고강의를 듣기만 하고 따로 적어두진 않아서 정리하는데 오래걸렸다...! 다음주부터는 들으면서 해야겠다.미션같은 경우 순수 js로 구현해본적이 없어서 어려울거라 생각했는데 막상 해보니 괜찮았다.단 효율적인 코드로 작성한건지는 모르겠다...! 일단 기능만 구현하고 스타일은 꾸미지 않았는데 시간 나는 대로 틈틈히 스타일도 추가로 작업해야겠다.역시 스타일이 안들어가니 허전해.. 🤔 직장인이라서 진도를 따라갈 수 있을까 했는데 이번주와 다음주에 공휴일이 있어서 다행이다. 럭키비키잖아🍀다음주도 열심히 뚠뚠 🐜 가보자고!📝 강의 내용 요약 섹션 2 자바스크립트 기초console객체브라우저의 디버깅 콘솔(Firefox 웹 콘솔 등)에 접근할 수 있는 메서드를 제공log뿐만 아닌 time, table, clear...다양한 메서드가 있음.var, let, const변수 선언 방식var - 중복 선언과 재할당 가능 let(ES6) - 중복 선언 불가, 재할당 가능const(ES6) - 중복 선언과 재할당 불가유효한 참조 범위(scope)함수 레벨 스코프(function-level scope) - var블록 레벨 스코프(block-level-scope) - let, const호이스팅(Hoisting)코드가 실행되기 전 변수 및 함수 선언이 로컬 범위의 맨 위로 끌어올려지는 경우를 말함.변수생성 과정선언단계 =[ TDZ(일시적 사각지대) ] => 초기화단계(undefined값 할당) => 할당 단계 (값 할당)타입별 변수 호이스팅var - 선언, 초기화함수 선언문 : 선언, 초기화, 할당let, const - 선언 (선언 전 접근시 TDZ로 오류발생)자바스크립트 타입 (동적 타입)원시 타입 (number, string, boolean,undefined, null, symbol• bigInt)고정된 크기로 Call Stack 메모리에 저장, 실제 데이터가 변수에 할당참조 타입 (object, arrays, functions, classes, ...)데이터 크기가 정해지지 않고 Call Stack 메모리에 저장, 데이터의 값이 heap에 저장되며 변수에 heap 메모리의 주소값이 할당 타입변환js 변수는 새 변수 및 다른 데이터 유형으로 변환할 수 있습니다.1. js 함수를 사용하여,2. js 자체에 의해 자동으로 • 문자열과 숫자: + 연산 시 숫자가 문자열로 변환됨.  • 숫자 연산: -, *, /에서 문자열이 숫자로 변환됨.• 비교: == 연산 시 두 값 중 하나가 다른 타입으로 변환됨.  • Boolean 컨텍스트: if나 while 같은 논리적 평가 시 다양한 값이 true나 false로 변환됨.  • 숫자와 불리언: 숫자 연산 시 true는 1, false는 0으로 변환됨.Math객체Template Literals - backtick(`) 줄바꿈을 쉽게할 수 있고 문자열 내부에 표현식 포함할 수 있게됨.Loops루프의 종류for - 코드 블록 여러번 반복for/in - 객체의 속성을 따라 반복while - 지정된 조건이 true인 동안 코드 블록 반복do/while - 조건이 true인지 검사하기 전 코드 블록 한 번 실행 이후 조건이 true인 동안 루프 반복섹션 3 Window 객체 및 DOMwindow Object브라우저에 의해 자동으로 생성되며 웹 브라우저의 창(window)를 나타냅니다.또한 window는 브라우저의 객체이지 js의 객체가 아닙니다.이 window 객체를 이용해서 1.이 브라우저 창에 대한 정보와 제어를 할 수 있고 2.var 키워드로 변수를 선언하거나 함수를 선언하면 이 window 객체의 프로퍼티가 됨.dom(문서 객체 모델) - 메모리에 웹 페이지 문서 구조를 트리구조로 표현해서 웹 브라우저가 HTML 페이지를 인식하게 해줌.웹 페이지 빌드 과정(Critical Rendering Path CRP)웹 브라우저가 HTML 문서를 읽고, 스타일 입히고 뷰포트에 표시하는 과정document object브라우저 내에서 콘텐츠를 보여주는 웹페이지 자체객체 사용시 웹 페이지의 상태와 모든 HTML 태그에 접근 가능요소 탐색요소 생성 createElement요소 삭제 removeChild요소 교체 replaceChild섹션 4 EventEventListener - 이벤트가 발생했을때 어떠한 액션을 위한 함수를 호출. 해당 함수가 이벤트 리스너addEventListerner() - 이벤트 리스너를 객체나 요소에 등록해야 사용가능. 등록해주는 함수Event 종류UI 이벤트키보드 이벤트마우스 이벤트포커스 이벤트폼 이벤트Event Bubbling가장 깊게 중첩된 요소에 이벤트가 발생했을 때 이벤트가 위로 전달되는 것[출처 : 저자, 따라하며 배우는 자바스크립트 A-Z 강의 자료 #3 Event,인프런 강의]Event Capturing제일 상단에 있는 요소에서 아래로 이벤트가 내려오는 것[출처 : 저자, 따라하며 배우는 자바스크립트 A-Z 강의 자료 #3 Event,인프런 강의]이벤트의 3단계 흐름1. 캡처링 단계 - 이벤트가 하위 요소로 전파되는 단계2. 타깃 단계 - 이벤트가 실제 타깃 요소에 전달되는 단계3. 버블링 단계 - 이벤트가 상위 요소로 전파되는 단계[출처 : 저자, 따라하며 배우는 자바스크립트 A-Z 강의 자료 #3 Event,인프런 강의]Event Delegation - 하위요소의 이벤트를 상위 요소에 위임(제어)하는 것[출처 : 저자, 따라하며 배우는 자바스크립트 A-Z 강의 자료 #3 Event,인프런 강의]섹션 5 자바스크립트 중급자바스크립트 this함수에서 this 사용 => Window 객체를 가리킴메소드에서 this 사용=>해당 객체를 가리킴constructor 함수에서 this 사용 =>빈 객체를 가리킴forEach(callback, thisArg)화살표 함수에서 this 사용 => 상위 스코프의 this를 가리킴(Lexical this)bind, call, apply 메소드함수의 this 컨텍스트를 제어const person1 = { firstName: “John”, lastName: “Doe” } ------------------------------------- const fullName = function() { console.log(this.firstName + “ “ + this.lastName); } //call() fullName.call(person1); ------------------------------------- const fullName = function (city, country) { console.log(`${this.firstName}, ${this.lastName}, ${city}, ${country}`); } fullName.call(person1, "Oslo", "Norway"); // 인수 넣어 사용 가능 //apply() fullName.apply(person1, ["Oslo", "Norway"]); // call 메서드와 비슷하지만 인수에 배열넣어야 함. ------------------------------------- //bind() function func(language) { if (language === “kor”) { console.log(`language: ${this.korGreeting}`); } else { console.log( (`language: ${this.engGreeting}`); } } Const greeting = { korGreeting: “안녕 “, engGreeting: “Hello “, }; Const boundFunc = func.bind(greeting); boundFunc(‘kor’); //call, apply와 다른 점 직접 함수를 실행하지 않고 반환 ㅁ 조건부 삼항 연산자 (result ? result = "" : result = "")Event Loop자바 스크립트 동기 코드인데 비동기 코드를 작성하기 위해 브라우저에서 사용한다면 브라우저 api (window object)Node에서 사용한다면 Node api(global object) 사용.web API 실행시 내부 진행[출처 : 저자, 따라하며 배우는 자바스크립트 A-Z 강의 자료 #4 자바스크립트 중급, 인프런 강의]자바스크립트 엔진메모리 힙 - 메모리 할당이 발생 (변수를 정의하면 저장되는 창고)호출 스택 - 코드가 실행될 때 스택들이 이곳에 쌓임.[출처 : 저자, 따라하며 배우는 자바스크립트 A-Z 강의 자료 #4 자바스크립트 중급, 인프런 강의]undefined vs null둘다 원시 자료형undefined = 아무 값도 할당받지 않은 상태null = 비어있는, 존재하지 않는 값 Map, Filter, ReduceClosure다른 함수 내부에 정의딘 함수가 있는 경우 외부 함수가 실행을 완료하고 해당 변수가 해당 함수 외부에서 더 이상 액세스할 수 없는 경우에도 해당 내부 함수는 외부 함수의 변수 및 범위에 액세스할 수 있음.Destucturing배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 js 표현식let { accessory, animal, color } = animalData;전개 연산자특정 객체 또는 배열의 값을 다른 객체, 배열로 복제하거나 옮길 때 사용.const arr = [...arr1, ...arr2];얕은 비교 vs 깊은 비교얕은 비교숫자, 문자열 등 원시 자료형은 값을 비교배열, 객체 등 참조 자료형은 값 혹은 속성을 비교하지 않고, 참조디는 위치를 비교깊은 비교객체의 경우에도 값으로 비교Object depth가 깊지 않은 경우 : JSON.stringfy() 사용Object depth가 깊은 경우 : lodash 라이브러리의 isEqual() 사용얕은 복사 vs 깊은 복사얕은 복사중첩된 배열이나 객체가 있다면 따라서 변경됨.spread operator, Object assign, Array.from(), slice, shallow copyObject.freeze() - 얕은 동결 : 객체를 동결합니다. 중첩된 구조에서 올바른 역할을 수행하지 못함.깊은 복사중첨된 곳에 따로 spread operator 사용lodash 라이브러리를 이용한 deepCopystructuredCloneconst 참조 타입 데이터 변경const array = ["A", "B", "C"];array.push("D");call stack에 reference ID는 같고 heap memory값만 바뀌어서 에러가 나지 않음.함수 표현식 vs 함수 선언문예시// 함수 표현식 function funcDeclaration() { return '함수 선언문'; } // 함수 선언문 let funcDeclaration = function () { return '함수 표현식'; }함수 선언식은 호이스팅에 영향을 받지만 표현식은 받지 안음.strict mode엄격모드는 제한된 버전을 선택하여 암묵적인 느슨한 모드를 해제하기 위한 방법적용방법파일에 "use strict" 지시자 입력함수 안에 "use strict" 사용해서 그 함수만을 위해서 strict mode를 적용class를 사용하면 자동으로 strict mode가 적용됨Intersection observer기본적으로 브라우저 뷰포트와 설정한 요소의 교차점을 관찰하며, 요소가 뷰포트에 포함되지 않는지, 더 쉽게는 사용자 화면에 지금 보이는 요소인지 아닌지 구별Pure Function순수 함수의 규칙1. 같은 입력값이 주어졌을 때, 언제나 같은 결과값을 리턴한다. (same input => same output)2. 사이드 이펙트를 만들지 않는다. (no dise effects)사용하는 이유1. 클린 코드를 위해서2. 테스트를 쉽게하기 위해서3. 디버그를 쉽게 하기 위해서4. 독립적인 코드를 위해서(Decoupled / Independent)Curry functionf(a,b,c)처럼 단일 호출로 처리하는 함수를 f(a)(b)(c)와 같이 각각의 인수가 호출 가능한 프로세스로 호출된 후 병합될 수 있게 변환하는 것자바스크립트 엔진자바스크립트를 실행하려면 자바스크립트 엔진이 필요.브라우저에는 자바스크립트 엔진이 있어서 실행 가능.IIFE(Immediately Invoked Function Expression)정의되자마자 즉시 실행되는 함수를 말한다.사용하는 주된 이유는 변수를 전역으로 선언하는 것을 피하기 위함.내부 안으로 다른 변수들이 접근하는 것을 막을 수도 있음.첫 번째() 소괄호 => 전역 선언 막고, IIFE 내부 안으로 다른 변수 접근두번 째() 소괄호 => 즉시 실행 함수를 생성하는 괄호( function() { // Do fun stuff } )() 섹션 6 OOP ( 객체 지향 프로그래밍) 하나의 문제 해결을 위한 독립된 단위 "객체"들의 모임알아보기 쉽고 재사용성이 높아짐특징자료 추상화불필요한 정보는 숨기고 중요한 정보만 표현해 프로그램 간단히 만드는 것상속기존 클래스의 자료와 연산을 이용할 수 있게 하는 기능다형성한 요소에 여러개념을 넣어 놓는 것 같은 메소드라도 각 인스턴스에 따라 다양한 형태를 가질 수 있는 것.클래스 & 오버 라이딩 - 자식 클래스의 메서드가 부모 클래스의 메서드와 다르게 동작하거나 변수가 다른 값으로 지정될 수 있음.캡슐화클래스 안에 관련 메서드, 변수를 하나로 묶어줌바깥에서의 접근을 막아 보안이 강화되고 잘 관리되는 코드 제공prototype & prototype chain자바스크립트 객체가 다른 객체로부터 메서드와 속성을 상속받는 메커니즘.sub class(Inheritance) - extends 키워드를 사용해 부모클래스 기능 그대로 자식 클래스를 만들 수 있음super() - 부모 생성자 호출ES6 classesstatic 정적 메서드 사용 - "prototype"이 아닌 클래스 함수 자체에 메서드를 설정할 수도 있습니다.사용 예시class Person { // 생성자(constructor)는 클래스의 인스턴스가 생성될 때 호출됩니다. constructor(name, age, job) { this.name = name; // 클래스의 속성 설정 this.email = email; this.birthday = new Date(birthday); } // 메서드 정의: 클래스 내의 함수 introduce() { return `Hello my name is ${this.name}`; } static multipleNumbers(x, y) { return x * y; } } console.log(Person.multipleNumbers(2, 9); 섹션 7 비동기시간이 오래 걸리는 작업을 먼저 시작하고, 그 작업이 끝나지 않아도 다음 작업을 먼저 처리.(<->) 동기 - 작업이 순차적으로 진행되어, 앞선 작업이 끝날 때까지 다음 작업을 실행하지 않음. callback, promise 그리고 Async/Await비동기 요청이 여러개 있을 때 하나의 요청이 다른 요청의 결과에 의존해야하는 경우 사용[출처 : 저자, 따라하며 배우는 자바스크립트 A-Z 강의 자료 #6 비동기,인프런 강의 ] 👩🏻‍💻 미션1번 (Day2)음식 메뉴 앱2번 (Day3)가위 바위 보 앱3번(Day4)퀴즈 앱4번(Day5)책 리스트 나열 앱 5번(Day5)Github Finder 앱

웹 개발워밍업클럽FE과제

rhkdtjd_12

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

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

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

Taeho

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

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

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

tenenger

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

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

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

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

운영체제컴퓨터의 역사애니악(진공관) -> 1950년도 초 (집적회로 개발) -> 1950년도 중후반(싱글 스트림 배치 시스템) -> 1960년도 (시분할 시스템) -> 1970년도 (개인 컴퓨터의 시작) 컴퓨터의 CPU 가격이 비쌌기 때문에 CPU 사용률을 끌어 올리는 쪽으로 발전  시분할 시스템메모리에 여러 프로그램을 올려놓고 시간을 나누어서 빠르게 돌아가며니서 실행을 시킨다.이 작업의 장점은 하나의 프로그램이 입력을 대기 중이더라도 다른 프로그램이 작업 중이기 때문에 CPU의 사용률이 결과적으로 올라가는 장점을 가지게 된다. Unix멀티 프로그래밍다중 사용자파일 시스템 문제점메모리에 여러 프로그램을 올려서 사용하기 때문에 메모리 침범 문제가 생겼다. 운영체제의 구조커널이 핵심프로세스와 메모리, 저장장치를 관리 핵심적인 기능을 담당 사용자는 커널에 직접 접근할 수 없고 인터페이스를 통해 접근할 수 있다.인터페이스 -> GUI, CLI 어플리케이션은 시스템 콜을 통해서 커널에 접근할 수 있다.커널은 사용자로부터 자신을 보호하기 위한 시스템 콜이라는 인터페이스를 가지고 있다. 컴퓨터 하드웨어와 구조하드웨어는 프로그램 내장 방식의 폰 노이만 구조를 하고 있다.폰노이만 구조예전에는 하드웨어로 프로그램을 만들었기 때문에 프로그램이 달라질 때마다 매번 스위치와 배선을 다시 조정해야했다.이를 해결하기 위해 CPU와 Memory를 두고 이들 사이를 BUS로 연결 데이터를 전달하는 통로를 말한다.프로그램을 메모리에 내장 : 프로그램 내장 방식이라고 호칭 메인보드다른 하드웨어간의 연결을 담당 CPU중앙 처리 장치라고 부른다.ALU 산술 논리 연산장치 : CPU에서 실제로 데이터 연산을 담당한다.Contorl Unit 제어 장치: 모든 장치들의 동작을 지시하고 제어하는 장치Register 레지스터: CPU내에서 계산을 위해 임시로 보관하는 장치 메모리의 종류RAM, ROMRAM : Ramdom Access Memory 전력이 끊기면 데이터를 잃어버린다. 메인 메모리로 사용된다.ROM : Read Only Memory 전력이 끊겨도 데이터를 계속 보관할 수 있다. 데이터를 한 번 쓰면 수정이 불가능 -> 컴퓨터 부팅과 관련된 바이오스를 저장하는데 사용된다.  컴퓨터의 부팅 과정ROM에 저잦ㅇ된 바이오스가 실행된다주요 하드웨어 이상이 없는지 체크이상이 없다면 마스트 부트 레코드에 저장된 Boot Loader를 메모리로 가져와서 실행합니다. 인터럽트CPU가 입출력 장치에 읽거나 쓰려고 하는 상황CPU는 입출력 작업이 들어오면 입출력 관리자에 명령, CPU는 주기적으로 입출력 관리자를 확인polling 방식주기적으로 CPU가 확인해 줘야하니 성능이 좋지 않다는 단점이 있다.인터럽트는 폴링 방식의 단점을 해결한 방식-> CPU가 입출력 관리자에 명령 -> 입출력 관리자는 입출력이 완료됬을 때 CPU에게 신호를 주고 CPU는 그 신호를 받아서 -> 인터럽트 서비스 루틴을 실행해서 작업 완료 프로세스와 쓰레드프로그램은 컴퓨터 관점에서 하드디스크, 즉 저장장치만 사용하는 수동적 존재프로세스: 실행중인 프로그램 프로세스는 메모리도 사용하고 운영체제의 CPU 스케줄링 알고리즘에 따라 CPU도 사용하고 필요에 따라 입력과 출력을 하기 때문에 능동적인 존재라고 말 할 수 있다. 프로세스의 구조 Code 영역: 자신을 실행하는 코드가 저장Data 영역 : 자신을 실행하는 코드 저장, 전역 변수와 Static(정적) 변수가 저장되어 있습니다.스택 영역 : 지역 변수와 함수 호출을 했을 때 필요한 정보들이 저장된다.Heap 영역: 프로그래머가 런타임시 할당할 수 있는 메모리 공간  유닛 프로그래밍 : 오직 하나의 프로세스가 올라간 것멀티 프로그래밍 : 메모리에 여러 개의 프로세스가 올라온 것멀티 프로세싱 : CPU관점으로 정의, CPU가 여러 개의 프로세스를 처리하는 것PCB(Process Control Block)프로그램이 메모리에 올라가서 실행 중인 상태를 프로세스운영체제는 여러 프로세스를 전부 다 관리하고 공평하게 실행 시켜야 한다.PCB(Process Control Block)을 만들고 저장합니다.PCB들은 연결 리스트라는 자료구조로 저장됩니다. 운영체제는 프로세스가 종료되면 해당 프로세스의 PCB 제거 프로세스 상태생성 : 메모리에 프로그램 적재를 요청준비 : CPU를 사용하기 위해 기다리고 있는 상태실행 : CPU 스케줄러에 의해 실행대기 : 입출력 요청을 하면 입출력이 완료될 때까지 기다리는 상태완료 : 프로세스가 종료된 상태Context Switching프로세스를 실행하는 중에 실행중인 프로세스의 값을 저장하고 다른 프로세스의 상태 값으로 교체하는 과정 프로세스 생성과 종료운영체제가 시작되고 0번 프로세스를 1번 생성하게 되고 나머지 모든 프로세스는 0번 프로세스를 복사해서 쓰게 된다.부모를 복사한 자식 프로세스의 코드와 데이터 영역을 원하는 값으로 덮어서 쓰게 된다. 쓰레드프로세스는 독립적 다른 프로세스가 영향을 받지 않는다.프로세스간의 통신은 IPC 통신 사용쓰레드 간의 통신은 같은 프로세서의 데이터를 공유할 수 있다. CPU 스케줄링컴퓨터 자원 분배에 관한 문제를 해결하기 위한 방법 CPU를 할당받아 실행하는 작업을 CPU Burst, 입출력 작업을 IO Burst 라고 한다. 다중 큐CPU 스케줄러는 준비상태에서 다중 큐에 들어 있는 프로세스들 중에 적당한 프로세스를 선택해서 실행상태로 전환  프로세스 정보를 담고 있는 PCB는 준비 상태의 다중 큐에 들어가서 실행되기를 기다리고 있고 CPU 스캐줄러에 의해 실행상태로 전환됩니다. 스케줄링의 목표리소스 사용오버헤드 최소화공평성 - 모든 프로세스에게 공평하게 CPU가 할당 되어야한다.처리량대기 시간 - 작업을 요청하고 실제 작업이 이루어지는데까지 대기시간이 짧는 것을 목표로응답시간  FIFOFirst in First out스케줄링 큐에 들어온 순서대로 실행하는 방식 SJFShortest Job FirstBurst Time이 짧은 프로세스를 먼저 실행 RRround robin 방식강제로 다른 프로세스에게 일정 시간을 할당정해진 시간만큼 동작 MLFQMulti Level Feedback Queue여러개의 큐가 존재, 큐들은 우선 순위가 존재 

f1rstf1y9

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

1주차 학습 내용운영체제운영체제의 구조커널프로세스, 메모리, 저장 장치 등을 관리사용자가 직접 접근하지 못하고, 인터페이스로만 접근 가능인터페이스GUI(Graphic User Interface)GLI(Command Line Interface)시스템콜어플리케이션은 시스템콜을 활용해 커널에 접근드라이버하드웨어와 커널의 인터페이스 컴퓨터 하드웨어와 구조메인보드 : 다른 하드웨어를 연결하는 장치로, 장치 간 데이터 전송은 메인보드의 버스가 담당CPU(Central Processing Unit, 중앙 처리 장치)산술논리 연산 장치(ALU) : 실제 데이터 연산 담당제어 장치(Control Unit) : 모든 장치들의 동작을 지시, 제어레지스터: CPU 내에서 계산을 위해 임시로 보관메모리RAM(Random Acess Memory) : 전원을 끄면 데이터가 날아감, 메인 메모리로 사용, 랜덤한 위치의 어떤 데이터를 읽든 속도가 동일ROM(Read Only Memory) : 전원을 꺼도 데이터 보관 가능, 컴퓨터 부팅 관련 바이오스 저장부팅과정컴퓨터 전원 누름 -> ROM에 저장된 BIOS 실행 -> 주요 하드웨어 이상 여부 체크 -> 이상이 없으면 부트 로더 실행 -> 운영체제를 메모리로 불러오기 -> 바탕화면이 보임인터럽트CPU 입출력 명령이 들어왔을 때 언제 완료되는지 계속 확인해야하는 폴링 방식의 단점을 해결한 것CPU가 입출력 관리자에게 명령을 내리고 자기는 다른 작업함 -> 입출력이 완료되면 CPU에게 신호를 주고 CPU는 신호를 받아서 ISR 실행시켜 작업 완료 프로그램과 프로세스프로그램하드디스크와 같은 저장장치에 저장된 명령문의 집합저장 장치만 사용하므로 수동적인 존재프로세스하드디스크에 저장된 프로그램이 메모리에 올라갔을 때, 즉 실행 중인 프로그램메모리, CPU 사용 및 입/출력 등 능동적인 존재code, data, stack, heap 영역으로 구성멀티프로그래밍과 멀티프로세싱멀티프로그래밍 : 메모리에 여러 개의 프로세스가 올라온 것멀티프로세싱 : CPU가 여러 개의 프로세스를 처리하는 것PCB(Process Control Block)프로세스의 정보를 가지고 있는 것으로, 연결리스트 자료구조로 저장됨.포인터, 프로세스 상태, 프로세스 ID, 프로그램 카운터, 레지스터 정보, 메모리 관련 정보, CPU 스케줄링 정보 등을 저장프로세스 상태생성 -> 준비 -> 실행 -> *(대기 -> 준비 -> 실행 ->) 완료대기 상태: 입출력 요청이 들어오면 입출력이 완료될때까지 기다리는 상태컨텍스트 스위칭프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스의 상태를 저장하고 다른 프로세스의 상태값으로 교체하는 작업컨텍스트 스위칭이 일어날 때 PCB의 내용이 변경됨쓰레드요구하는 작업의 수가 늘어나면 프로세스의 수가 늘어나고, 프로세스의 수만큼 PCB, 코드, 데이터, 스택, 힙 영역을 만들어줘야해서 무거워짐 => 이를 해결하기 위해 쓰레드 고안프로세스 내에 1개 이상 존재하며, PCB, 코드, 데이터, 힙 영역을 공유함CPU 스케줄링운영체제가 모든 프로세스에게 CPU를 할당하거나 해제하는 작업어떤 프로세스에게 CPU 리소스를 줄지, 얼마의 시간동안 CPU를 할당할지를 고려함Burst : 한 작업을 연속적으로 처리하는 것으로, 보통 작업 처리에 필요한 시간을 의미 (CPU Burst, I/O Burst)스케줄링 목표리소스 사용률 높이기, 오버헤드 최소화, 공평성, 처리량, 대기 시간, 응답 시간서로 상반되는 상황이 있기 때문에 사용하는 시스템에 따라서 목표를 다르게 설정CPU 스케줄링 알고리즘 - FIFOFirst In First Out, 먼저 들어온 작업이 먼저 나간다프로세스의 Burst Time에 따라 성능차이가 심하게 나므로 현대 운영체제에서 잘 쓰이지 않고 일괄처리 시스템에서 쓰임알고리즘자료구조와 알고리즘자료구조 : 데이터가 어떤 구조로 저장되고 어떻게 사용되는지를 나타냄알고리즘 : 어떤 문제를 해결하기 위한 확실한 방법자료구조에 따라 알고리즘이 달라지므로, 상황에 맞는 적절한 자료구조를 선택하고 이에 맞는 알고리즘을 적용할 줄 알아야함시간복잡도최선 : 빅-오메가, 평균 : 빅-세타, 최악 : 빅-오주로 빅-오 표기법을 많이 사용함성능 : O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(2^n) < O(n!)표기법계산에 가장 많은 영향을 미치는 항만 표기상수는 큰 의미 없음배열일반적인 배열크기가 정해져있고, 정해진 크기만큼 연속적인 메모리 공간에 값을 할당운영체제는 가장 첫번째 주소만 기억함참조 성능은 O(1), 삭제, 삽입 성능은 좋지 않음자바스크립트의 배열 상황에 따라서 연속적, 불연속적으로 메모리 할당하는데 대부분 불연속적으로 할당(내부적으로 연결)장점읽기, 쓰기와 같은 참조에는 O(1)의 성능을 가짐단점크기 예측이 힘들기 때문에 메모리 낭비가 발생할 수 있음데이터의 삽입, 삭제가 비효율적임연결리스트배열의 단점을 해결하기 위해 저장하려는 데이터를 메모리 공간에 분산해 할당하고, 데이터를 서로 연결해주면 됨 => Node를 만들어 수행Node의 구조 : data를 담는 변수, 다음 노드를 가리키는 변수장점배열에서 초기 크기를 알아야하는 단점이 없음중간에 데이터를 삽입 혹은 삭제하려면, 특정 노드의 다음 가리키는 노드만 바꿔주면 됨단점데이터들이 전부 떨어져있기 때문에 바로 접근하기 힘듦 => O(n)의 성능스택(Stack)First In Last Out(FILO)으로, 먼저 들어간 데이터가 가장 나중에 나오는 규칙이 있음Redo, Undo 기능, 괄호짝 검사 등에 사용큐(Queue)First In First Out(FIFO)로, 먼저 들어간 데이터가 먼저 나오는 규칙이 있음계산대에 줄을 서는 경우, 맛집 대기줄 등 일렬로 기다리는 줄을 생각하면 됨덱(Deque)데이터의 삽입과 제거를 head와 tail 두 군데서 자유롭게 할 수 있는 자료구조해시테이블(Hash Table)해시(Hash), 맵(Map), 해시맵(HashMap), 딕셔너리(Dictionary)라고도 불림해시와 테이블이 합쳐진 자료구조테이블을 그냥 배열에 저장하면, 낭비되는 공간이 발생할 수 있음테이블의 기존 인덱스를 순차적인 인덱스로 만들기 위해 어떤 계산을 하는 함수를 해시라고 함key만 알면 value에 O(1)의 성능으로 읽기가 가능삽입, 삭제, 수정도 O(1)장점빠른 데이터 탐색, 삽입, 삭제를 할 수 있음단점공간의 효율성이 좋지 않음좋은 해시 함수의 구현이 필수적임셋(Set)데이터의 중복을 허용하지 않는 자료구조해시 테이블을 이용하므로 쉽게 구현 가능해시 테이블을 사용한다고 해서 Hash Set이라고도 불림value 값은 사용하지 않고 key만 사용해서 구현함(key가 데이터)회고칭찬하고 싶은 점강의를 허투루 듣지 않기 위해서 강의 노트를 작성하면서, 좀 더 궁금한 점이 생기면 의문점을 작성해두고 추가로 찾아보는 등 디테일한 이해를 위해 노력했다. 아쉬웠던 점휴일이나 주말 등 강의를 들을 시간이 넉넉한 때를 생각하면서 당일에 들어야하는 분량을 미루는 일이 잦았다.보완해야할 점퇴근 후 피곤하더라도 완전히 그날 강의를 안듣기 보다는, 한 강의라도 들으면서 꾸준히 강의를 수강하는 습관을 들이도록 노력하자!

워밍업클럽CS발자국

채널톡 아이콘