🔥딱 8일간! 인프런x토스x허먼밀러 역대급 혜택

블로그

감자

컴퓨터 공학(CS)이 중요할까요?

저는 학부 시절에 전공수업을 들으면서 항상 답답한 마음이 있었어요.논리회로, 컴퓨터 구조, 자료구조, 알고리즘, 운영체제, 네트워크 등 컴퓨터 공학에서 꼭 배우는 과목을 들을 때마다 너무 막연한 기분이었죠.분명히 한 과목을 들을 땐 해당 내용에 대해서 자세히 배우지만 너무 이론적인 것만 배우는 느낌이 들었고,"왜 지금 당장 결과가 보이는 내용으로 공부하지 않을까?"라는 질문을 했었죠.🧐CPU가 어떤 구조이고 어떻게 동작하는지 이론적으로는 배우지만 정작 CPU가 어떻게 생겼는지는 아무도 알려주지도 않고 스스로 찾아본 적도 없었어요.CPU뿐만 아니라 RAM, 하드디스크 등 주변장치가 어떻게 생긴 줄도 몰랐죠.다른 과 친구들은 "너 컴퓨터 잘 아니까 부품도 잘 알고 조립도 잘하겠네?"라고 종종 물어보지만 그렇지 않았죠.네트워크 수업 때는 모뎀, 허브, 라우터 등 전부 이론적으로, 기껏해야 그림으로 된 예시로 보니까 현실 세계랑 매칭이 잘되지 않았어요.교수님들은 학교에서 배우는 전공이 중요하다고 말씀하실 때 항상 따라붙는 말이 있었어요.컴퓨터 공학은 매우 복잡하므로 Divide and Conquer(분할 정복)로 접근해 하나씩 자세히 알아보는 것이 중요하다, 하지만 이렇게 하나씩 배운 개념을 조합해 전체적으로 볼 줄도 알아야 한다.당시엔 전체적으로 볼 줄 알아야 한다는 말이 크게 와닿지 않았었는데요. 첫 직장에서 백엔드 개발자로 일하는 순간부터 느꼈어요.회사에서 사용하는 기술 스택들은 처음 접해보는 것들이었고 말로만 듣던 AWS도 직접 만져봐야 했죠.이때 많은 기술 스택과 AWS에서 사용하는 용어들은 굉장히 혼란스러웠죠.하지만 용어만 다를 뿐 전공에서 배운 개념들은 그대로였어요.제가 고생했던 것은 "실제로" 이것들이 어떻게 연결되어 동작하는지가 머리에 잘 정리되어 있지 않았던 것이었죠.회사에서도 공부할 시간을 줘서 얼마 되지 않아서 정리할 수 있었어요.그때 교수님들의 말씀이 다시 생각났어요."하나씩 배운 개념을 조합하는 게 이래서 중요하구나~"라고요.회사에 적응하고 개발할 때도 학과에서 배운 내용이 직/간접적으로 도움 된 적이 많아서 그때마다 교수님들을 떠올렸죠.한 번은 사용자의 특정 요청 중 일부가 아주 가끔 중복돼서 들어오는 경우가 있었어요.똑같은 환경에서 테스트해봐도 확인해볼 수도 없었고 하루에 하나가 있을까 말까 했죠.저희 팀에선 이 문제가 한 달 넘게 해결하지 못하고 있었던 상황이었어요.저도 이 문제가 왜 발생하는지 골치 아팠었죠.🧟그러던 어느 날 문득 원인이 예측됐어요. 운영체제에서 배웠던 개념에서 떠올릴 수 있었어요.그래서 예측한 원인을 해결할 방법을 찾아 코드를 수정했고 지켜봤어요!똑같은 문제는 다시는 발생하지 않았죠. 👏 이렇게 실무에서 컴퓨터 공학(CS)의 중요성을 알게 되어 기본기가 탄탄해야 한다는 말에 극공감하게 됐어요.하지만 CS를 배우는 건 어렵고 지루해서 금방 포기하게 되죠.그래서 저는 수업에서 들었던 궁금증, 그때 알았으면 좋았을 것들을 그림과 예시를 들어가며 직접 만들기로 했어요.현재 준비하고 있는 강의는 네트워크인데요.이론적인 내용뿐만 아니라 우리가 일상에서 볼 수 있는 기기가 네트워크에서 어떤 용어로 쓰이고 어떤 역할을 하는지,큰 그림을 맞춰볼 거예요. 만약 CPU의 동작 방식을 배웠다면 위의 그림처럼 CPU가 실제로 어떻게 생겼는지도 알아야 헷갈리지 않겠죠?네트워크는 하드웨어와 소프트웨어가 공존하기 때문에 이렇게 하드웨어까지 알아가며 퍼즐을 맞춰갈 겁니다.이만 다음 강의인 "그림으로 쉽게 배우는 네트워크"를 준비하러 가보겠습니다.😊

개발 · 프로그래밍 기타CS전공자비전공자컴퓨터공학그림으로쉽게배우는네트워크

감자

컴퓨터 네트워크 강의를 준비중입니다.

안녕하세요 "그림으로 쉽게 배우는 컴퓨터공학" 커리큘럼을 만들고 있는 감자입니다!지금까지 제가 만들어 온 모든 강의에서는 여러분의 이해를 돕기 위해 그림을 이용해 설명해 드렸습니다.그런데, 지금 제가 준비하고 있는 강의는 네트워크 강의로 물리적인 장치의 이해까지 필요합니다.보통 전공 수업에선 이론적인 내용 위주로 설명하므로 여러분의 컴퓨터에서 데이터가 실제로 어떻게 이동하는지 직관적으로 알기는 어렵습니다.따라서 네트워크의 이론적인 내용과 물리적인 흐름을 모두 쉽게 이해할 수 있도록 강의 방식을 업그레이드 해보려 합니다.저로서도 새로운 도전이니 여러분들이 많이 응원해주시고 피드백 주시면 좋겠습니다. 😄(가정집 내에 있는 통신단자함 내부)저는 여러분이 인터넷을 사용할 때에 여러분의 집에 있는 통신단자함부터 건물의 통신실, 통신사, 서버까지로 데이터가 어떻게 이동하는지 시각화해 직관적으로 보여드리고 싶었습니다.하지만 기존의 강의 방식으로는 이러한 흐름을 보여드리기에 한계가 있었습니다.(사진과 그림만으로 이러한 것들을 설명하려니 만족스럽지 않았습니다)그래서 저는 여러분에게 직관적으로 전달할 수 있는 가장 좋은 방법이 뭘까 이리저리 고민하다가 3D 모델을 이용해 보기로 했습니다.(서울에는 내 빌딩이 없지만 3D세상에서는 구글빌딩이 내꺼🤗)3D 모델링을 하면서 굉장히 재밌게 준비했습니다.여러분들에게 가장 효율적으로 설명해 드릴 수 있다는 생각에 두근거리기도 해요!이제 준비한 내용으로 네트워크 강의를 열심히 만들어보겠습니다.많이 기대해주세요 😀 (시중에서 팔지 않는 제품도 3D 모델링이면 자세하게 소개할 수 있습니다)

개발 · 프로그래밍 기타네트워크3D모델링그림으로쉽게배우는컴퓨터공학CS컴퓨터공학

대롱대롱

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

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

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

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발자국

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발자국

빠타박스

[(Daily 빠타박스)인프런 워밍업 클럽 2기] - CS 전공지식을 시작하는 글_1일차

인프런 워밍업 클럽 CS얼마전 본 면접에 나는 그냥 딱히 신경 쓰지 않았다. 나의 실력이 이정도구나..이런 질문에 이런 것 밖에 답변을 하지 못하는구나. 너무 준비되지 못했고 기초가 부족하다 느꼈다... 그러다 우연치 않게 보게된 워밍업 클럽 처음엔 무료인줄 알았다..그러나 스터디 그룹에 초대되고 그런 과정이 무료라는 것이지 절대 세상에 무료라는 것은 없다. 그냥 40% 할인권을 주었고그것으로 구매하여 저렴하게 강의를 수강할 수 있었다. 감자라는 강의자 분은 정말 퀄리티 좋은 강의를 올리시고 계신다는 것을 일단 동영상에 노력이 어마어마 하게 들어갔음을 알 수 있었다. 감자강의자님 로드맵 CS일단 강의 자체는 좋아보였고, 리뷰도 정말 좋게 쓰여져 있다. 솔직히 믿을만 한가. 싶기도 했지만. 나는 좀 인강 스타일이 까다롭게 잘 안맞아서... 이 30대에 듣는 인강을 신중히 고르는 편이였다. 리뷰 내용도 일단 보고 고민을 많이했다. 널널한개발자 님의 강의를 볼지 이것을 할 지 그러나 그냥 해보자 싶었다.강의 커리큘럼을 비교해 보면서 들어오게 되었고,11월 1일 까지 마감이라. 딱 마침 내가 다시 학원에 가게 될 시기랑 겹치지 않아서.(갈지 안갈지 지금 쓰는 시점에서 아직 정하지는 않았다만..) 그렇게 초대된 디스코드를 통해서 OT도 진행하였고, 확실히 제대로 진행하는 스터디 클럽인 만큼 신중히 잘 하는 것 같았다.시간표도 주어지고 준비가 되어있는 듯 했다. 약 한달간의 커리큘럼과정이였으나.이것이 어쨋든 자기주도학습의 일환이다. 우리가 들어야 한다. 정보를 제공해주었으니. 그래서 시작해본다.내 스스로의 위치에서 발전할 수 있기를 어디서나 중요한건 복습이다. 복습되지 않으면 쉽지 않을 수 있다.내가 간과하는 것이 그런것이다. 반복학습을 싫어하기에. 힘들어한다.하지만 해야하만 한다... 한번 진행해보자... 9월 30일을 기점으로 1일차가 시작되고 그것을 해내기 위해 글을 써본다.또한 정보처리기사 실기가 잡혀있는데. 병행해서 해야만한다.

컴퓨터 구조인프런워밍업클럽스터디모임감자빠타박스언리얼엔진CS지식CS게임개발자

빠타박스

면접을 위한 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

suover

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

그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)만들면서 쉽게 배우는 컴퓨터 구조강의와 함께한 인프런 워밍업 클럽 스터디 4기 - CS 전공지식 (자료구조, 알고리즘, 컴퓨터구조)3주차 발자국 입니다.학습 내용 요약자료구조·알고리즘트라이(Trie)와 자동완성개념: 문자열 집합을 효율적으로 저장·탐색하기 위해, 각 노드가 문자 하나를 나타내며 공통 접두사를 공유하는 트리 구조입니다.학습: 삽입 및 탐색 로직의 흐름을 개념적으로 이해하였습니다.인사이트: 삽입·탐색이 문자열 길이에 비례하기 때문에, 대규모 단어 집합에서 접두사 검색이 빠르지만 메모리 사용이 커질 수 있음을 감안해야 함을 체감했습니다.그래프개념: 그래프는 정점과 간선으로 관계를 표현하는 자료구조로, 방향 여부나 가중치 유무에 따라 다르게 다루며 인접 리스트와 인접 행렬 방식으로 표현할 수 있습니다.학습: 간단한 예제 그래프를 구성해 보고, DFS는 재귀나 스택으로 깊이 우선 탐색하며 방문 체크로 순환을 막고, BFS는 큐로 레벨별 탐색해 비가중치 최단 경로에 유리함을 코드로 확인했습니다.인사이트: DFS는 깊이 탐색이 필요할 때, BFS는 단계별 탐색이 필요할 때 유용하며, 그래프 표현 방식도 데이터 크기와 목적에 맞춰 결정해야 한다는 점을 깨달았습니다.가중 그래프와 다익스트라 알고리즘개념: 가중치가 있는 그래프에서 시작 정점으로부터 다른 정점까지 최단 경로를 찾는 문제입니다.다익스트라 알고리즘원리: 현재까지 알려진 최단 거리 후보 정점을 선택해 인접 간선을 완화(relaxation)하며 거리 배열을 갱신합니다.인사이트: 그래프가 커질수록 일반 방식은 느려지고, 우선순위 큐(힙)를 쓰면 더 빠르게 최단 경로를 구할 수 있음을 느꼈습니다.컴퓨터 구조제어 장치 없는 컴퓨터 & 조립CPU 주요 구성 요소(CPU 레지스터, ALU, 프로그램 카운터, 스텝 카운터)를 복습하고, 실습을 통해 신호 흐름을 이해했습니다.CPU 만들기: 제어 장치(Control Unit)명령어 처리 흐름: 명령어 인출(fetch), 디코딩, 실행(execute) 단계의 제어 신호 타이밍을 확인했습니다.주요 명령어: NOP, LOADA, ADD, SUB, STOREA, LOADI, JMP/JMPC/JMPZ, OUT, HLT 등의 제어 신호와 ALU·레지스터·메모리 동작 방식을 이해했습니다. 제어 장치 조립: Logisim에서 각 단계별 신호를 조합해 제어 유닛을 완성하고, 시뮬레이션으로 신호 흐름과 분기 동작을 확인했습니다.미션🎯 자료구조·알고리즘 미션3: 허프만 코딩 구현목표주어진 문자열에 대해 HuffmanCoding.compress(str)를 호출했을 때, [ [문자, 코드], … ]형태의 배열을 출력하도록 허프만 코딩을 구현합니다.class Node { constructor(char = null, freq = 0, left = null, right = null) { this.char = char; this.freq = freq; this.left = left; this.right = right; } } class HuffmanCoding { compress(str) { if (!str) return []; // 빈도 계산 const freqMap = new Map(); for (const ch of str) { freqMap.set(ch, (freqMap.get(ch) || 0) + 1); } // 초기 노드 리스트 생성 const nodes = []; for (const [ch, f] of freqMap.entries()) { nodes.push(new Node(ch, f)); } // 허프만 트리 구성 while (nodes.length > 1) { nodes.sort((a, b) => a.freq - b.freq); const a = nodes.shift(); const b = nodes.shift(); nodes.push(new Node(null, a.freq + b.freq, a, b)); } const root = nodes[0]; // 코드 생성 const codes = {}; const build = (node, prefix) => { if (node.char !== null) { codes[node.char] = prefix || "0"; } else { build(node.left, prefix + "0"); build(node.right, prefix + "1"); } }; build(root, ""); // [문자, 코드] 쌍 배열 반환 return Object.entries(codes); } } const huffmanCoding = new HuffmanCoding(); const str = "Lorem ipsum dolor sit amet consectetur adipiscing elit. " + "Consectetur adipiscing elit quisque faucibus ex sapien vitae. " + "Ex sapien vitae pellentesque sem placerat in id. " + "Placerat in id cursus mi pretium tellus duis. " + "Pretium tellus duis convallis tempus leo eu aenean."; const result = huffmanCoding.compress(str); console.log(result);흐름 및 구현 요약빈도 계산문자열을 순회해 Map 또는 객체에 문자별 등장 빈도를 집계했습니다.코드 생성재귀 탐색으로 왼쪽 자식은 '0', 오른쪽 자식은 '1'을 prefix에 추가하며 리프에서 코드 할당. 단일 문자 입력 시 빈 prefix에 "0" 처리 로직도 반영했습니다.검증실행 결과에서 빈도가 높은 문자는 짧은 코드, 낮은 문자는 긴 코드가 할당되는지 확인했습니다.빈도와 코드 길이 관계가 적절한지, 모든 문자가 포함되었는지, 코드끼리 충돌이 없는지 점검했습니다. // 결과 [ [ 'i', '000' ], [ 'q', '001000' ], [ 'v', '001001' ], [ 'o', '00101' ], [ 'l', '0011' ], [ 'd', '01000' ], [ 'E', '0100100' ], [ 'g', '0100101' ], [ 'x', '0100110' ], [ 'P', '0100111' ], [ 'a', '0101' ], [ 'e', '011' ], [ 'm', '10000' ], [ 'r', '10001' ], [ 'u', '1001' ], [ 't', '1010' ], [ 'p', '10110' ], [ 'L', '10111000' ], [ 'C', '10111001' ], [ 'f', '10111010' ], [ 'b', '10111011' ], [ '.', '101111' ], [ ' ', '110' ], [ 's', '1110' ], [ 'c', '11110' ], [ 'n', '11111' ] ]느낀 점허프만 코딩의 "빈도 기반 병합 → 트리 구조 → 코드 생성" 흐름을 직접 구현하며 원리 습득이 명확해졌습니다. 결과 검증 과정에서 빈도와 코드 길이 관계, 프리픽스 성질 확인 등이 중요함을 체득했습니다. 🔗 자료구조·알고리즘 미션3 블로그 링크🎯 컴퓨터 구조 미션3: STOREB 명령어와 A·B 비교 어셈블리어 구현목표STOREB 명령어(OPcode 1001)를 추가해 레지스터 B의 값을 메모리 주소에 저장하도록 구현합니다.A와 B 값을 비교해 같으면 0, A>B면 1, A<B면 2를 출력 레지스터에 내보내는 어셈블리어를 작성하고 검증합니다.구현STOREB(1001) 명령어 추가기존 STOREA 처리 경로를 참고하여 opcode 1001 분기 로직을 제어 장치에 추가했습니다.스텝 카운터가 각 단계에 진입할 때, STOREB 신호와 연관된 핀들이 의도한 타이밍에 활성화되는지 확인했습니다.A·B 비교 어셈블리어메모리에 저장된 A와 B 값을 불러와 비교하는 순서LOADA addrA → SUB addrB (A = A - B, 플래그 설정)JMPC 분기로 A≥B 처리, 아닐 경우 LOADI 2로 A<B 결과 세팅 후 출력분기한 경우 ZF 검사: ZF=1일 때 A=B(LOADI 0), ZF=0일 때 A>B(LOADI 1)이후 OUT, HLT로 마무리주소 라벨 매핑과 분기 주소 계산을 꼼꼼히 검토했습니다.Logisim에서 다양한 A·B 조합 테스트를 통해 출력 레지스터가 기대값(0/1/2)을 잘 내보내는지 확인했습니다.LOADA 14 // A = RAM[14] SUB 15 // A -= RAM[15] JMPC 5 // CF = 1 → A ≥ B일 때 5번 주소로 점프 LOADI 2 // A < B → 결과 2 JMP 9 // 결과 출력으로 점프 JMPZ 8 // ZF = 1 → A = B일 때 8번 주소로 점프 LOADI 1 // A > B → 결과 1 JMP 9 // 결과 출력으로 점프 LOADI 0 // A = B → 결과 0 OUT // 결과 출력 HLT // 프로그램 종료 0 0 0 7 // A값 3 // B값느낀 점제어 장치에 새로운 명령어를 추가할 때, 기존 신호 경로와 타이밍 흐름을 정확히 이해해야 오류를 줄일 수 있음을 확인했습니다.분기 주소 계산이 미흡하면 예상치 못한 동작이 발생하므로, 어셈블리어 작성 시 라벨 관리가 중요함을 체감했습니다. 🔗 컴퓨터 구조 미션3 블로그 링크회고잘한 점단계적 접근: 컴퓨터 구조와 알고리즘 미션을 작은 단위로 나눠 핵심 로직과 흐름을 차근차근 구현하고 검증했습니다.디버깅 습관 강화: Logisim 시뮬레이션과 코드 실행 결과를 반복 확인하며, 문제 발생 시 신호 흐름이나 분기 주소 동작을 빠르게 점검했습니다.이론·실습 병행: 트라이, 그래프, 다익스트라 개념 학습 뒤 직접 구현 연습, 제어 유닛 명령어 설계 뒤 Logisim 실습, 허프만 코딩 이론 뒤 코드 작성으로 이론과 실습을 잘 연결했습니다. 아쉬웠던 점 & 보완테스트 부족 : 테스트가 부족해 다양한 상황을 확인하지 못했습니다. 다음에는 다양한 입력과 경계값을 더 많이 시도해 보겠습니다.성능 최적화 부족: 성능 최적화 연습이 부족했습니다. 시간이 된다면 구현했던 자료구조와 알고리즘을 재작성해보고, 다양한 시도를 통해 실행 시간을 비교해 보겠습니다. 마치며이번 주차에는 Trie, 그래프, 다익스트라 학습을 진행하고, 제어 장치 명령어 확장과 허프만 코딩 구현 미션을 병행하며 이론과 실습을 모두 경험했습니다. 단계별 실습을 통해 개념이 실제 코드나 회로로 연결되는 과정을 체감했고, 디버깅과 테스트 습관을 강화할 수 있었습니다. 다음주에는 추가 알고리즘 학습을 통해 더욱 탄탄한 이해를 쌓아가겠습니다. 감사합니다!

알고리즘 · 자료구조인프런워밍업클럽스터디CS전공지식자료구조컴퓨터구조발자국회고4기

suover

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

그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)만들면서 쉽게 배우는 컴퓨터 구조강의와 함께한 인프런 워밍업 클럽 스터디 4기 - CS 전공지식 (자료구조, 알고리즘, 컴퓨터구조)2주차 발자국 입니다.학습 내용 요약그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)이번 주에는 균형 이진 탐색 트리의 대표 주자인 Red-Black 트리의 삽입·삭제 개념과 실제 구현을 다뤘습니다.개념(삽입/제거) 단계에서 색상 규칙과 회전을 통해 균형을 유지하는 원리를 학습했고보조 함수(색 변경, 회전 함수), 삽입 로직, 삭제 로직을 차례로 완성하며, 각 단계마다 균형 인자가 올바르게 갱신되는지 확인했습니다.이어 우선순위 큐와 힙을 학습했습니다.힙(Heap) 의 개념과 완전 이진 트리 구조를 이해하고, 힙 삽입, 힙 제거 과정을 직접 구현해 보았습니다.이를 기반으로 미션에서 CpuScheduler 를 만들어, 실행 횟수 우선 & I/O 바운드 우선 정책을 Heap 비교 함수를 수정해 적용했으며마지막으로 힙 정렬(Heapsort) 알고리즘까지 학습했습니다.만들면서 쉽게 배우는 컴퓨터 구조지난주 불 대수·진리표·Logisim 기초를 다진 뒤, 이번 주에는MUX: 1비트 2입력부터 8비트 16입력까지 다양한 MUX 설계디코더: 3비트·4비트 디코더 설계컨트롤 버퍼(Buffer) 이해ALU: 반 가산기·전 가산기·ALU 제작메모리: SR/D/JK 래치, 플립플롭, 레지스터, RAM 구현까지 확장하며, 각 모듈을 직접 구현하고 테스트하며 신호 흐름을 검증했습니다.미션🎯 미션1. 자료구조와 알고리즘 미션: CPU 스케줄링목표프로세스의 executionCount(실행 횟수)와 cpuReturnCount(I/O 바운드 횟수)로 우선순위를 매기는 스케줄러 구현실행 횟수(executionCount)가 가장 작은 프로세스가 우선순위가 높다.실행 횟수가 같을 경우, I/O Bound 프로세스(cpuReturnCount가 큰 프로세스) 가 우선순위가 높다.구현 개요자료구조: 완전 이진 트리 기반의 Heap 활용비교 함수 재정의// CpuScheduler 생성자 내부 this.heap.isBigPriority = (first, second) => { if (first.executionCount !== second.executionCount) { // 실행 횟수가 적은 프로세스가 우선 return first.executionCount < second.executionCount; } // 실행 횟수가 같다면 I/O Bound 정도(cpuReturnCount)가 큰 쪽이 우선 return first.cpuReturnCount > second.cpuReturnCount; }; CpuScheduler 클래스import { Heap } from "../../heap/heap.mjs"; class Process { constructor(name, cpuReturnCount, executionCount) { this.name = name; this.cpuReturnCount = cpuReturnCount; this.executionCount = executionCount; } } class CpuScheduler { constructor() { this.heap = new Heap(); this.heap.isBigPriority = (first, second) => { if (first.executionCount !== second.executionCount) { return first.executionCount < second.executionCount; } return first.cpuReturnCount > second.cpuReturnCount; }; } enqueue(process) { this.heap.insert(process); } dequeue() { const node = this.heap.remove(); return node ? node.getData() : null; } } let cpuScheduler = new CpuScheduler(); cpuScheduler.enqueue(new Process("수치계산프로그램", 4, 0)); // cpu반납 4회, 실행횟수 0회 cpuScheduler.enqueue(new Process("뮤직플레이어", 11, 10)); // cpu반납 11회, 실행횟수 10회 cpuScheduler.enqueue(new Process("웹브라우저", 27, 25)); // cpu반납 27회, 실행횟수 25 cpuScheduler.enqueue(new Process("터미널1", 34, 2)); // cpu반납 34회, 실행횟수 2회 cpuScheduler.enqueue(new Process("터미널2", 93, 2)); // cpu반납 93회, 실행횟수 2회 console.log(cpuScheduler.dequeue()); // 수치계산프로그램 프로세스 출력 console.log(cpuScheduler.dequeue()); // 터미널2 프로세스 출력 console.log(cpuScheduler.dequeue()); // 터미널1 프로세스 출력 console.log(cpuScheduler.dequeue()); // 뮤직플레이어 프로세스 출력 console.log(cpuScheduler.dequeue()); // 웹브라우저 프로세스 출력테스트 결과Process { name: '수치계산프로그램', cpuReturnCount: 4, executionCount: 0 } Process { name: '터미널2', cpuReturnCount: 93, executionCount: 2 } Process { name: '터미널1', cpuReturnCount: 34, executionCount: 2 } Process { name: '뮤직플레이어', cpuReturnCount: 11, executionCount: 10 } Process { name: '웹브라우저', cpuReturnCount: 27, executionCount: 25 }O(log N) 삽입·삭제 성능으로 대규모 프로세스 관리 가능비교 함수만 바꿔 다양한 스케줄링 정책 가능🔗 자료구조·알고리즘 미션2 블로그 링크🎯 미션2. 컴퓨터 구조 미션: 터널 연결부터 32바이트 RAM까지미션 구성모든 회로 연결을 터널(Tunnel)로 대체8비트 32입력 MUX 제작10비트 입력 두 개(A, B)를 계산하는 ALU 설계32바이트 RAM 구현1) 모든 회로 연결을 터널(Tunnel)로 대체목표: Logisim의 Tunnel 컴포넌트를 사용해 복잡한 선 숨기기결과: 캔버스가 한눈에 들어오고, 라벨만으로 신호 흐름 파악 가능2) 8비트 32입력 MUX 제작목표: IN_0…IN_31 중 하나 선택하여 출력구현: Logisim 내장 32-to-1 MUX + 8비트 버스검증: SELECTION 값 변화 시 기대 출력 확인3) 10비트 입력 두 개(A, B)를 계산하는 ALU 설계목표: 덧셈(SU=0)/뺄셈(SU=1), Carry-in/Carry-out, Zero Flag구현:10개 Full Adder 체인B 입력 XOR + SU → 뺄셈 지원마지막 Adder의 Carry-out → CF, 출력 전 비트 OR·NOT → ZF검증: 다양한 A, B 조합 테스트, CF/ZF 정상 동작4) 32바이트 RAM 구현목표: 5비트 주소 + 8비트 데이터 입·출력, ENABLE_WRITE, ENABLE_OUT구현:5→32 디코더 + AND → 각 레지스터 Load읽기 MUX로 선택 출력검증: WRITE=1 시 해당 워드에 저장, OUT=1 시 올바른 데이터 읽기 🔗 컴퓨터 구조 미션2 블로그 링크회고잘한 점단계적 학습Red-Black 트리 개념 → 보조 함수 → 삽입 → 삭제까지 차근차근 구현하며 균형 유지 원리를 확실히 체득했습니다.힙 기반 스케줄러와 힙 정렬, 다양한 크기의 MUX·디코더 구현으로 자료구조·회로 설계 감각을 크게 확장했어요.모듈화 & 재사용성Heap 비교 함수만 바꿔 다양한 스케줄링 정책을 손쉽게 실험했고, Logisim 터널·버퍼 적용으로 회로 블록을 깔끔하게 재사용할 수 있었습니다.플래그·메모리 회로 반복 학습반·전 가산기, Zero/Carry Flag, 래치·플립플롭, 레지스터 파일, RAM까지 차례로 구현하며 신호 흐름과 제어 신호 이해가 깊어졌습니다.아쉬웠던 점 & 보완테스트 케이스 부족Red-Black 트리 삭제의 예외 케이스를 더 다양하게 검증하지 못했습니다.힙 스케줄러에도 executionCount·cpuReturnCount 동률 시나리오를 추가할 필요가 있습니다.시간 관리다양한 모듈 구현에 몰두하느라 후반부 학습이 빠듯했습니다. 마치며이번 주차에도 "작게 쪼개고 하나씩 검증하는" 학습 방식을 통해, 알고리즘과 회로 설계 모두에서 자신감을 많이 얻었습니다.다음 주에는 부족했던 것들을 보완해, 더 탄탄한 결과물을 만들어 보겠습니다. 감사합니다!

알고리즘 · 자료구조인프런워밍업클럽스터디CS전공지식자료구조컴퓨터구조발자국회고4기

gusdnchl7144

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 > 1주차 발자국

 ◼만들면서 쉽게 배우는 컴퓨터 구조Section1) 컴퓨터 구조 개요컴퓨터는 트랜지스터라는 반도체 소자로 만들어지고, 여러 트랜지스터로 NAND 게이트를 만들며, 이로부터 컴퓨터가 구성된다. 프로그램의 동작방식 (2가지)컴파일러전체 코드를 미리 번역해 실행 속도가 빠름컴파일 시 문법 오류 사전 발견 가능인터프리터한 줄씩 번역하며 실행, 실행 중 문법 오류 가능실행 속도는 컴파일러보다 느림 Section2) 컴퓨터 구성 요소CPU컴퓨터의 두뇌 역할을 하는 장치로, 산술연산장치(ALU), 제어장치 등으로 구성된다. 메모리RAM, ROM, 캐시 메모리 등이 있다. 주변 장치입력 장치 (키보드, 마우스 등), 출력 장치 (모니터, 프린터 등) 등이 있다. 8비트, 32비트, 64비트 컴퓨터가 표현할수 있는 데이터 차이8비트: 2^8 = 256개32비트: 약 42억개 (RAM 4GB 한계)64비트: 약 18경개 (RAM 한계없음, 거의 무한대)  Section3) 불 대수불 대수의 등장클로드 섀넌이 0과 1 (false, true)만으로 모든 논리 연산과 계이 가능함을 발견 주요 불 연산NOT: 입력의 반대값 출력AND: 둘 다 1일 때만 1 출력OR: 둘 중 하나 이상 1이면 1 출력NAND: AND의 결과를 반전NOR: OR의 결과를 반전XOR: 입력이 서로 다를 때 1 출력 (입력개수 2개일때), 1의 개수가 홀수이면 1, 아니면 0 (입력개수가 3개이상일때) 불 연산 우선순위 : NOT -> AND -> OR 불 대수의 성질과 법칙항등원 법칙, 교환법칙, 분배법칙, 동일법칙, 이중부정법칙, 흡수법칙, 드모르간 법칙 등이 있다 불 연산을 바탕으로 진리표 작성 가능방정식 -> 진리표 -> 논리회로로 변환 Section4) 비트10진법, 2진법, 16진법10진법은 0~9까지 10개의 숫자 사용2진법은 0과 1 두 가지 숫자만 사용16진법은 0~9, A~F(10~15)를 사용 바이트 저장 순서 방식리틀 엔디안: LSB(Least Significant Byte, 가장 낮은 자리 바이트)를 낮은 주소에 저장빅 엔디안: MSB(Most Significant Byte, 가장 높은 자리 바이트)를 낮은 주소에 저장  오버플로우표현할 수 있는 비트 수를 초과하는 계산 결과 발생 시 결과가 제대로 저장되지 못하는 현상 음수 표현MSB(Most Significant Bit, 최상위 비트)가 0이면 양수, 1이면 음수로 해석 2의 보수법음수를 표현하는 방법음수 = 1의 보수(모든 비트를 반전) + 1  Section5) 컴퓨터의 기초가 되는 하드웨어 만들기 Logisim-evolution 같은 시뮬레이터를 사용해 논리 회로를 직접 설계·실험 가능,설치하려면 JDK 필요, GitHub에서 최신 버전 다운로드 가 기본 논리 게이트NAND 게이트, NOT 게이트, AND 게이트, OR 게이트, XOR 게이트  Mission1)https://inf.run/wLEBH  ◼그림으로 쉽개 배우는 자료구조와 알고리즘Section1) 개요선형 자료구조 : 배열, 연결 리스트, 스택, 큐비선형 자료구조: 트리, 그래프, 힙 P-NP 문제 개념 이해빅오 표기법 (시간 복잡도)결정 문제와 최적화 문제P 문제 (Polynomial time 문제)NP 문제 (Nondeterministic Polynomial time 문제)NP-hard 문제P vs NP 문제   Section2) 트리와 이진트리트리노드(Node)와 간선(Edge)으로 구성된 계층적 자료구조 트리의 구성요소노드, 간선, 루트 노드, 자식 노드, 형제 노드, 리프 노드, 레벨, 높이 이진트리각 노드가 최대 2개의 자식 노드를 갖는 트리포화이진트리와 완전이진트리도 존  Section3) 이진 탐색트리각 노드가 값의 기준점 역할을 하며, 찾고자 하는 값이 현재 노드의 값보다 크면 오른쪽 서브트리를, 작으면 왼쪽 서브트리를 탐색하는 구조  Section4) AVL 트리높이 균형을 유지하는 이진 탐색 트리로, 각 노드의 왼쪽과 오른쪽 서브트리 높이 차이(균형 인수)가 최대 1 이내여야 한다.이 균형 조건을 벗어나면 회전 연산을 통해 트리의 균형을 맞춰 탐색, 삽입, 삭제 수행  🗒회고컴퓨터 구조와 자료구조(알고리즘) 강의를 동시에 완벽히 이해하기엔 시간적으로 무리가 있을 것 같아 컴퓨터 구조 심화 학습에 좀 더 집중해볼 예정이다.강의에서 Logisim-evolution을 활용해 AND, OR, NOT, XOR 등의 게이트를 직접 만들어보는 과정이 인상 깊었다. 회로를 하나하나를 쌓아가며 구조를 이해하는게 재미가 있어 몰입이 잘 되었다.강의를 완강할 즈음에는, 정말 작은 컴퓨터 하나쯤은 스스로 만들어 낼 수 있을 것 같은 기대감이 든다 🏷출처https://inf.run/y1hhdhttps://inf.run/7mNZ2https://inf.run/uHJ1a  

CS발자국

인프런 워밍업 클럽 4기 - CS 전공지식; 컴퓨터 구조 및 알고리즘

인프런 워밍업 클럽 4기 첫 주차!먼저 컴퓨터 구조 강의들을 수강하였다.각 강의들은 큰 주제를 나누어 섹션별로 구분되어있었는데첫 번째 섹션은 컴퓨터 구조 개론 이였다.이 섹션은 4강의로 나누어 이 강의를 들어야 하는 이유 및 컴퓨터의 역사를 배워보는 시간이였다.어릴 적 어딘가 들어봤던 용어들을 다시 떠올리는 기본 워밍업 느낌의 섹션이였다. 두 번째 섹션은 컴퓨터의 구성 요소!가장 중요한 CPU부터 메모리 및 주변 장치들에 대하여 공부하였고다양한 비트의 컴퓨터의 차이점을 배우며 앞으로 실습하게 될 8bit컴퓨터에 대해서 기본을 알 수 있는 강의였다. 다음 섹션은 불 대수에 대한 섹션이였다.6개의 강의로 나누어져 불 대수에 대해서 공부하는 시간이였는데.대학생때로 돌아가 가물가물한 기억들을 더듬어가며 한강의씩 수강해나갔고.첨부링크에 있는 드모르간 법칙의 정의 사이트로 이동하여 시간이 걸리더라도 하나씩 직접 종이에 써가며해당 정의에 대해 친숙함을 가지려고 하였다. 4번째 섹션은 비트에 대한 섹션이였는데.우리가 흔히 사용하는 10진법부터 2진법, 16진법에 대하여 공부하였고어떠한 숫자를 각 진법에 따라 변환하는 방법을 공부하였다.빅 엔디안 및 리틀 엔디안 방법에 대해서도 알게 되었고, 컴퓨터가 음수를 표현하는 방식에 대해서도 공부하였다. 5번째 섹션은 지금까지 기초를 공부했다면 실습에 돌입하는 섹션이였는데.직접 프로그램을 이용해서 NAND, NOT 등 다양한 회로들을 만들어 볼 수 있는 섹션이였다.프로그램을 처음써보다보니 신기하면서도 이렇게 프로그램으로 회로를 만들어 볼 수 있다는 것이 신기하였다.이번 1주차때는 XOR 게이트까지 직접 만들어보는 강의가 이어졌고 다음 2주차에는 비트별 입력회로를 공부하는 것 같았다. 컴퓨터 구조 강의를 듣고 나서는 자료구조와 알고리즘 강의를 수강하였는데.심화편이란걸 좀 더 미리 알았으면 이 워밍업 클럽이 시작되기전에 미리 기본편을 듣는건데너무 늦게 알아버린 바람에 기본편과 같이 조금씩 듣기로 마음먹었다. 알고리즘 강의의 첫 번째 섹션은 정말 기본적인 준비과정이였다.기본편을 듣지 못한 수강생들을 위해 기본 파일들을 다운받을 수 있었고또한 vs코드 프로그램 설치방법부터 시작할 수 있었다.이제 준비가 끝나고 나면 본강의 시작전 P-NP강의를 시작으로 이제 본격적으로 코스가 시작되는 느낌이였다. 두 번째 섹션은 트리와 이진트리 섹션이였는데기본적인 트리와 이진트리의 개념에 대하여 자세한 강의를 듣고 이제 그걸 직접 코드로 구현해보는 강의였다.처음한번 강의만 틀어서 한번 본뒤에 이제 vscode를 켜고 다시 강의를 따라가면서 하나씩 차근차근코드를 치며 이해를 해보려고 하였다. 세 번째 섹션은 이전 섹션에서 이진트리의 기본 개념을 이해했다~이제 심화를 가자 느낌으로두 가지 개념을 합친 이진 탐색 트리에 대한 개념강의가 이어졌고. 마찬가지로 개념 강의가 끝난 뒤에는 삽입의 구현과 제거의 구현이 이어졌다.역시 저번 섹션처럼 단 한번만 강의를 들어서는 무슨 내용인지 이해하기가 쉽지 않았고최대한 이해하려고 노력하며 이번 섹션을 마무리하였다. 몰아치듯 이어지는 다음 섹션은 AVL 트리!앞 섹션과 마찬가지로 개념설명 -> 구현의 형식으로 강의가 이어졌다.벌써부터 어질어질한걸봐선 다음 2주차 진행하기 전에 3~4섹션에 대해서 다시 복습이 필요할 것 같다 하는 생각이 들었다.기본편을 다 듣고 시작했다면 쉬웠을까? 하는 생각이 들어 다음 2주차 발자국을 작성할때에는 기본편을 마무리하고 작성해야겠다 하는 다짐을 하며 한 주 학습을 마무리하였다. 

알고리즘 · 자료구조인프런워밍업클럽CS컴퓨터구조알고리즘심화편

강동훈

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

📕 자료구조와 알고리즘(심화)✅ P-NP문제가 어려운 지, 쉬운 지 혹은 해결이 가능한 지 불가한 지 판단하는 것.결정 문제: 참 혹은 거짓을 대답할 수 있는 문제최적화 문제: 최적의 해를 찾을 수 있는 문제 (대부분의 최적화 문제는 결정 문제가 된다)결정론적 튜링 머신: 다음 상태가 유일한(오직 하나의) 상태로 결정되는 것비결정론적 튜링 머신: 현재 상태와 기호에 대해 여러 개의 가능한 다음 상태가 존재할 수 있는 것 (현실에는 존재 X 가정으로 상상)다항 시간: 어떤 문제의 해결 시간을 다항식으로 표현이 가능한 것다항 시간 내 1. 상수 시간: O(1) 2. 로그 시간: O(log n) 3. 선형 시간: O(n) 4. 로그-선형 시간: O(nlog n) 5. 다항 시간: O(n^k) 다항 시간 외 1. 지수 시간: O(k^n) 2. 팩토리얼 시간: O(n!) P 문제: 결정문제에 대해 결정론적 튜링 머신을 통해 다항 시간 내에 답을 구할 수 있는 문제NP 문제: 결정문제에 대해 비결정론적 튜링 머신을 사용하여 다항 시간 내에 답을 구할 수 있는 문제NP Hard: 모든 NP문제들을 다항 시간 내에 어떤 문제 A로 환원이 가능한 것NP Complete: NP-Hard이면서 NP에 포함되는 문제결정론적 / 비결정론적 문제ex) 완전 이진 트리 형태로 되어 있고 깊이가 k인 갈림길에 하나의 리프에만 보물이 있다고 가정결정론적: 한 번씩 모든 길을 거쳐서 보물을 확인 > 최악의 경우 2^k의 시간이 걸린다.비결정론적: 갈림길을 마주할 때마다 분신술을 사용하여 동시에 모든 리프 확인 > k의 시간이 걸린다.어떠한 힌트가 주어지게 된다면 비결정론적 문제들은 결정론적 문제로 검증이 가능모든 결정론적 문제들은 비결정론적 문제들에 속함 (P⊆NP) ✅ 트리와 이진 트리트리: 하나의 노드에서 점차 내려가는 자료구조Edge: 각 노드를 연결하는 선루트 노드: 트리에서 최상위 노드터미널 노드: 자식 노드가 없는 노드인터널 노드: 터미널 노드를 제외한 노드서브 트리: 트리 구조 내에 작은 트리 (터미널 노드 또한 루트 노드만 있는 트리라고 판단)레벨: 각트리의 높이이진 트리: 각 노드는 최대 2개의 자식 노드를 갖는 트리포화 이진 트리: 트리의 최대 레벨에 있는 모든 터미널 노드가 꽉 찬 트리완전 이진 트리: 최대 레벨을 제외한 나머지 레벨에는 모두 노드가 존재하고 최대 레벨의 노드는 왼쪽부터 채워진 트리순회: 트리의 노드들을 순회전위: 루트 노드 먼저 순회중위: 루트 노드를 중간에 순회후위: 루트 노드를 마지막에 순회 ✅ 이진 탐색 트리이진 탐색 알고리즘: 정렬되어 있는 배열에서 반씩 나눠 탐색을 해가며 범위를 줄여나가는 알고리즘이진 탐색 트리이진 탐색은 정렬된 상태에서만 가능하며 배열의 경우 데이터 삽입, 삭제가 비효율적이다.해시 테이블은 데이터 조회, 삽입, 제거가 빠르지만 해시 함수에 따라 성능이 달라지고 데이터를 저장할 메모리가 필요하다.이진 탐색 테이블은 데이터 조회, 삽입, 제거가 빠르고 해시 테이블에 비해 메모리 사용량이 적다규칙자식 노드는 모두 이진 트리여야 한다.중복된 노드의 데이터는 없어야 한다.A 노드의 왼쪽 자식 노드값은 A 노드값보다 작아야 한다.A 노드의 오른쪽 자식 노드값은 A 노드값보다 커야 한다.자식 트리도 상위 규칙을 따라야 한다.평가:트리가 만들어졌을 때 : O(logn)트리가 잘 만들어지지 않을 때 : O(n)이진 트리는 균형을 유지하는 것이 성능에 중요삽입, 삭제 시 트리의 균형이 깨질 가능성이 크다.✅ AVL 트리이진 트리에서는 균형을 유지하는 것이 중요하다.규칙:왼쪽과 오른쪽 자식트리의 높이가 최대 1까지만 차이가 날 수 있다.균형이 맞지 않는 트리는 회전을 통해 균형을 다시 맞출 수 있다.(못 맞추는 경우도 존재)회전LL회전: 오른쪽으로 뻗은 트리에 대해 적용 가능RR회전: 왼쪽으로 뻗은 트리에 대해 적용 가능LR회전: 왼쪽으로 꺾였다가 안쪽으로 꺾인 트리 적용 가능RL회전: 오른쪽으로 꺾였다가 안쪽으로 꺾인 트리 적용 가능📕 컴퓨터 구조✅ 컴퓨터 구조블랙박스: 내부 작동 원리는 모르더라도 입력에 따라 출력이 예측 가능한 것들모듈화: 큰 문제를 작은 문제로 분할하여 복잡함을 단순화 시키는 방법역사:수동식 계산기- 주판기계식 계산기- 계산봉, 파스칼린, 라이프니츠 휠자동 계산기- 차분 기관(톱니바퀴로 계산 결과 활용), 해석 기관(프로그래밍 가능)디지털 계산기- ENIAC- 폰노이만 구조(중앙 처리 장치, 메모리, 입출력 장치)- 트랜지스터 (진공관 대체)- 집척 회로- ,,, 동작방식컴퓨터는 0,1로 이루어진 명령어만 해석이 가능하다.기계어: 0,1로 이루어진 명령어컴파일러: 정적 코드를 기계어로 변환하는 과정에서 에러 발견 가능하고 실행속도가 매우 빠름 (c, C++) / 변환 과정이 오래 걸림인터프리터: 한 줄씩 기계어로 변환하기에 프로그램 실행 도중 문법 오류 발생 가능, 실행 속도가 느림✅ 컴퓨터 구성 요소CPU:프로그램 카운터: 다음 실행할 명령어 저장제어 유닛: 명령어 해석 및 실행산술 논리 연산장치: 산술, 논리 연산을 수행레지스터: 용량은 적지만 속도가 빠른 CPU 내장 메모리버스: 데이터 전송 통로Memory:RAM(Random Access Memory): 어떤 메모리에 접근하여도 접근 시간이 동일하며 휘발성ROM(Read Only Memory): 쓰기가 불가하며 비휘발성이기 때문에 컴퓨터 동작을 위한 BIOS가 저장  1. CPU가 프로그램 실행 시, 코드와 데이터를 RAM에서 가져온다. 2. 연산에 필요한 데이터 레지스터 저장 3. 연산 이후 결과를 RAM에 저장 4. 자주 사용되는 데이터 CPU 내부에 캐시 메모리 저장 (< 레지스터) / > RAM) 주변 장치:입출력 장치1. 키보드 / 마우스2. 모니터 / 스피커 / 프린터보조기억 장치1. HDD / SSD32, 64bit 컴퓨터:1bit (0,1 표현) = 21byte = 8bit = 2564byte = 32bit = 약 42억8byte = 64bit = 약 18경플리플롭: 1비트를 저장할 수 있는 회로컴퓨터 비트에 맞춰서 레지스터와 버스의 비트 수가 맞춰짐- 64비트 -> 64비트 레지스터 / 64개의 버스비트 수에 따라 저장할 수 있는, 계산할 수 있는 한계가 정해짐RAM이 여러개를 갖고 있더라도 CPU에서 처리할 수 있는 한계가 있음컴퓨터의 성능은 클럭, 명령어 최적화, 메모리, 레지스터 속도가 중요✅ 불 대수디지털 장치들은 불 대수 기반으로 작동한다.true: 1false: 0 불 연산:NOT: 입력값의 반대AND: A와 B가 같을 때만 1 (논리곱)OR: A와 B중 하나만 1이면 1 (논리합)NAND: AND 연산의 반대NOR: 하나라도 1이면 1XOR: 하나만 1일 경우에만 1 (두 입력이 다를 때)불 대수의 성질과 법칙항등원:원산 결과가 자기 자신이 되는 수AND (⋅) / A ⋅ 1 = AOR (+) / A + 0 = A교환법칙: 피연산자의 순서를 바꿔도 결과는 동일하다A ⋅ B = B ⋅ A결합법칙: 괄호의 위치를 바꿔도 결과 동일(A ⋅ B) ⋅ C = A ⋅ (B ⋅ C)분배법칙A ⋅ (B + C) = A⋅B + A⋅C동일법칙: 동일한 값을 두 번 연산해도 원래 값A ⋅ A = A이중 부정법칙: 두 번 부정하면 원래 값으로 돌아감흡수법칙A(A + B)= AA + AB ← 분배법칙= A + AB ← AA = A (동일법칙)= A(1 + B). ← A로 묶음 (결합법칙의 역)= A(1) ← 1 + B = 1 (항등원)= A 드모르간 법칙AND = NOT A OR NOT BA NOR B = NOT A AND NOT B불 함수함수: 입력 값에 따라 출력 값이 변하는 것불함수: 입력 값과 출력 값 모두 boolean 진리표 변환결과가 0인 행은 제외(Don't care 행)모든 행을 AND 연산으로 만들고결과값에 맞춰서 수정✅ 비트10진법과 2진법1개의 비트로 표현할 수 있는 수의 개수 = 2^1개2개의 비트로 표현할 수 있는 수의 개수 = 2^2개3개의 비트로 표현할 수 있는 수의 개수 = 2^3개,,, 10진법 > 2진법 변환10진수를 2로 나눌 수 있을 때까지 나누는 것ex) 9 > 9/2 = 4...1 > 4/2 > 2...0 > 2/2 > 1...09(10) = 1001(2) 16진법0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F16진법을 사용하는 이유는 2진수를 10진법으로 표현하는 것보다 더 간단하기 때문16은 2^4이기 때문에 간단히 변환 가능11111111(2) = FF(16)Ox1001 => 16진수 표기법 빅 엔디안과 리틀 엔디안MSB: 가장 왼쪽 비트LSB: 가장 오른쪽 비트 빅 엔디안: MSB를 가장 낮은 주소부터 채우는 방식리틀 엔디안: LSB를 가장 낮은 주소부터 채우는 방식하나의 방식으로 통일해서 사용해야 함. 오버플로우와 인터럽트오버플로우: 값이 데이터 타입(또는 레지스터)이 표현할 수 있는 범위를 초과했을 때 발생하는 현상인터럽트: CPU가 실행 중인 작업을 중단하고 인터럽트 서비스를 실행 음수- 부호없는 정수 (양수만 표현 가능)0000 ~ 1111 = 0 ~ 15까지 16개 값 표현- 부호있는 정수 (양수, 음수 표현 가능)0000 ~ 1111 = -8 ~ 7까지 16개 값 표현MSB가 부호를 표현(0이면 양수, 1이면 음수) > 나머지 3비트로만 값 표현 가능예: +5 → 00000101 (8비트 기준)음수 표현 만들기 (예: -5)① 비트를 반전 (1의 보수): 11111010② +1 더함: 11111010 + 1 = 11111011 00000101 ( +5 ) + 11111011 ( -5 ) ----------- 00000000 → 결과: 0 후기직접 프로그램을 통해 불 연산을 시각화해볼 수 있다는 것이 가장 인상깊었다. 기존에는 논리 연산을 통해서 조건문을 작성할 때를 제외하고는 생각해본 적이 없었는데, 더 하위 레벨에서 불대수, 불함수, 그리고 불 연산에서 자주 사용되는 수학적인 법칙까지 직접 공부해보고 이를 통해 간단한 프로그램을 만들어 보는 경험이 어렵지 않으면서 가장 크게 체감을 할 수 있었던 것 같다.  자료구조와 알고리즘 또한 트리가 나오게된 배경부터 AVL 트리가 탄생하게 된 계기까지 그 흐름을 잘 따라갈 수 있었고 AVL 트리만의 특징과 균형을 잡기 위한 여러 회전 원리에 대해서도 탄탄히 공부해볼 수 있었다.

컴퓨터 구조컴퓨터구조감자CS

suover

인프런 워밍업 클럽 스터디 4기 - CS 전공지식 1주차 발자국

그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)만들면서 쉽게 배우는 컴퓨터 구조강의와 함께한 인프런 워밍업 클럽 스터디 4기 - CS 전공지식 (자료구조, 알고리즘, 컴퓨터구조)1주차 발자국 입니다.학습 내용 요약이번 주에는 두 가지 강의를 통해 자료구조·알고리즘과 컴퓨터 구조의 큰 틀을 살펴보며, 이론과 실습을 병행했습니다.그림으로 쉽게 배우는 자료구조와 알고리즘 (심화편)크게 트리 구조와 이진 탐색 트리(BST), 그리고 그 위에 균형을 더한 AVL 트리를 다뤘습니다.초반에는 "트리와 이진 트리 개념"으로 부모·자식 노드 간 관계를 복습했고, 이어서 BST의 삽입·검색·삭제 과정을 훑어보았습니다.마지막으로 AVL 트리 개념과 구현(보조 함수, 삽입, 삭제)을 익히며, "왜 균형 인자가 중요한지"와 "삽입/삭제 후 어떻게 회전으로 높이를 조정하는지"를 이해했습니다.만들면서 쉽게 배우는 컴퓨터 구조컴퓨터 구조 전반(블랙박스 관점, CPU·메모리·주변 장치)과 함께, 불 대수 및 논리 게이트 설계로 넘어가 간단한 하드웨어 시뮬레이션을 해보았습니다.먼저 "컴퓨터 구조를 배우는 이유"와 명령어가 메모리→CPU→다시 메모리로 흐르는 과정을 개념적으로 파악했고, CPU 내부와 메모리 계층도 간단히 살펴봤습니다.이어서 불 대수 기본 연산과 성질을 학습한 뒤, 직접 Logisim을 설치해 NAND/NOT/AND/OR/XOR 게이트를 조합해 보는 실습을 경험했습니다.또 10진수↔2진수 변환, 16진법, 빅·리틀 엔디안, 2의 보수 음수 표현 같은 비트 단위 개념을 짚으며, 디지털 회로의 밑바탕이 되는 이진 표현 방식을 정리했습니다.미션🎯 자료구조·알고리즘 미션1: GarbageCollector 클래스 구현목표: AVL 트리로 빈 메모리 블록을 관리해, 요청 크기와 정확히 일치하는 블록이나 그보다 큰 값 중 최소값을 찾아 반환·삭제하도록 한다.코드import { AVLTree } from "../../avlTree/avlTree.mjs"; class GabageCollector { constructor() { this.avlTree = new AVLTree(); } // 빈 메모리 블록 삽입 insertFreeMemory(size) { this.avlTree.root = this.avlTree.insert(this.avlTree.root, size); } // 요청 크기 이상인 블록 검색 searchFreeMemory(requestSize) { let current = this.avlTree.root; let candidate = null; while (current) { const nodeSize = current.getData(); if (nodeSize === requestSize) { // 정확히 같은 크기를 찾으면 즉시 반환 candidate = current; break; } if (nodeSize > requestSize) { // 후보로 저장한 뒤, 더 작은 후보를 찾기 위해 왼쪽 서브트리 탐색 candidate = current; current = current.getLeftSubTree(); } else { current = current.getRightSubTree(); } } return candidate; } // 반환된 블록(크기) 삭제 releaseFreeMemory(size) { this.avlTree.root = this.avlTree.remove(this.avlTree.root, size); } } // 실행 const gc = new GabageCollector(); console.log("========== 빈 메모리 영역 초기화 =========="); gc.insertFreeMemory(64); // 빈 64바이트 삽입 gc.insertFreeMemory(48); // 빈 48바이트 삽입 gc.insertFreeMemory(87); // 빈 87바이트 삽입 gc.insertFreeMemory(13); // 빈 13바이트 삽입 gc.insertFreeMemory(102); // 빈 102바이트 삽입 gc.insertFreeMemory(34); // 빈 34바이트 삽입 gc.insertFreeMemory(61); // 빈 61바이트 삽입 gc.insertFreeMemory(40); // 빈 40바이트 삽입 gc.insertFreeMemory(6); // 빈 6바이트 삽입 let freeMemory1 = gc.searchFreeMemory(64); // 64바이트 메모리 console.log(freeMemory1); if (freeMemory1) { gc.releaseFreeMemory(freeMemory1.data); } let freeMemory2 = gc.searchFreeMemory(42); // 48바이트 메모리 획득 console.log(freeMemory2); if (freeMemory2) { gc.releaseFreeMemory(freeMemory2.data); }실행 요약const gc = new GarbageCollector(); 빈 블록 [64, 48, 87, 13, 102, 34, 61, 40, 6]을 insertFreeMemory(...)로 순차 삽입 searchFreeMemory(64) → 정확히 64 노드를 찾아 반환 → releaseFreeMemory(64) 삭제 searchFreeMemory(42) → 42와 동일한 값이 없어 “42보다 큰 값 중 최소(48)” 반환 → releaseFreeMemory(48) 삭제 회고AVL 트리의 삽입·삭제 시 "LL·RR·LR·RL 회전"이 실제로 동작하는 것을 확인하며, 균형 인자의 중요성을 체감했습니다. 삽입, 삭제, 검색이 모두 로그 시간에 동작하기 때문에, 빈 메모리 블록이 많아질 때도 성능을 보장할 수 있다는 점을 체감했습니다. "정확히 같은 크기가 없을 때, 그보다 큰 값 중 최소값을 찾는 후보(candidate)" 로직을 루트부터 내려가며 올바르게 업데이트해야 합니다.    🔗자료구조·알고리즘 미션1 블로그 링크🎯 컴퓨터 구조 미션1 (총 5개)미션 1. 4입력 논리 연산 진리표 작성내용: 4개의 입력(A, B, C, D)에 대한 AND, OR, NAND, NOR, XOR 진리표를 총 16조합으로 작성실행A B C D를 0000 → 0001 → … → 1111 순서로 나열 각 연산(AND, OR, NAND, NOR, XOR)의 출력(Q)을 직접 채워 넣음느낀 점2진수 순서대로 입력 조합을 정리하니 빠짐없이 작성할 수 있었고, XOR처럼 "1 개수 홀짝 판정" 연산은 중간에 헷갈려도 정리 순서를 엄수하면 실수를 줄일 수 있었다.미션 2. 불 방정식 간략화내용: 아래 네 개의 불 방정식을 단계별로 법칙(아이디엠포턴트, 드모르간, 흡수 등)을 적용해 간략화했다.A( (BB)’ + 0A) + (CC)’ = (AB’) + C’ (B’B’) + (AD’ + (CA)’)D = B’ + (DC’) + (DA’) (A’B) + B(B1 + BC) = B B’(1C + BD) + DB = (B’C) + (DB) 느낀 점드모르간·흡수법칙을 차례로 적용하며 "복잡해 보이던 식이 단번에 간결해지는 과정"이 인상적이었다.단계별로 어떤 법칙을 먼저 적용해야 가장 효율적으로 축약되는지 아직 직관이 부족해, 다음주엔 다양한 예제를 풀어 보며 연습할 예정이다.미션 3. 2진수를 10진수로 변환내용: 다음 네 개의 2진수를 10진수로 바꿔 보았다.110111₂ = 55₁₀ 10000001₂ = 129₁₀ 11111100000₂ = 2016₁₀ 101010₂ = 42₁₀실행 각 2진수를 우측 끝 비트부터 자리값(2⁰, 2¹, 2², …)을 곱해 합산 예: 11111100000₂ = 1·2¹⁰ + 1·2⁹ + … + 1·2⁵ + 0·… = 1024 + 512 + 256 + 128 + 64 + 32 = 2016느낀 점자릿값을 일일이 계산하는 것은 번거롭지만, "가장 큰 2의 거듭제곱부터 차례로 빼 나가는 방식"으로 익히니 긴 이진수도 비교적 빠르게 변환할 수 있었다.미션 4. 10진수를 2진수로 변환내용: 다음 네 개의 10진수를 2진수로 바꿔 보았다.10₁₀ = 1010₂ 27₁₀ = 11011₂ 86₁₀ = 1010110₂ 516₁₀ = 1000000100₂실행 나눗셈→나머지 반복: 예를 들어 86 ÷ 2 = 43, 나머지 0 → 43 ÷ 2 = 21, 나머지 1 → … → 최종 이진수 역순 또는 "가장 큰 2의 거듭제곱(2⁶=64)부터 빼 나가기" 방식으로 빠르게 도출느낀 점처음엔 헷갈렸지만, "2ⁿ 이하 최대값을 찾아서 빼고, 나머지로 또 반복"하는 방식이 머릿속에 각인되자 더 긴 수도 금방 변환할 수 있었다.미션 5. 불 방정식을 Logisim으로 회로 구현내용: 불 방정식을 logisim을 이용해 회로 만들기 실행(B′·C) + (D·B)B → NOT → B′AND1: (B′, C)AND2: (D, B)OR: (AND1, AND2) → 출력(A·B′) + CB → NOT → B′AND: (A, B′)OR: (AND, C) → 출력B′ + (D·C′) + (D·A′)B → NOT → B′ (첫 OR 입력)C → NOT → C′, A → NOT → A′AND1: (D, C′)AND2: (D, A′)OR( B′, AND1, AND2 ) → 출력대표 입력별 검증(B′·C)+(D·B) → B=0,C=1,D=0 → OUT=1, B=1,C=0,D=1 → OUT=1, B=1,C=1,D=0 → OUT=0(A·B′)+C → A=0,B=0,C=1 → OUT=1, A=1,B=1,C=0 → OUT=0B′+(D·C′)+(D·A′) → A=0,B=0,C=0,D=0 → OUT=1, A=1,B=1,C=0,D=1 → OUT=1느낀 점Logisim을 통해 "진리표상의 연산이 실제 게이트 단위 회로에서 어떻게 동작하는지"를 직접 눈으로 확인할 수 있었다.회로가 복잡해질수록 배선이 겹치는 문제가 있었으나, 다음에는 모듈 단위(예: (B′·C) 회로 → (D·B) 회로 → OR)로 나눠서 단계별로 검증하려 한다. 🔗컴퓨터 구조 미션1 블로그 링크회고이번 주에는 AVL 트리와 논리 회로 설계를 함께 학습했습니다.AVL 트리 구현: 삽입·삭제 시 LL·RR·LR·RL 회전을 거쳐 균형을 유지하는 과정을 직접 코드로 확인했습니다. "정확히 같은 값이 없으면 그보다 큰 값 중 최소값을 찾는 로직"을 구현하면서, 균형 인자를 어떻게 업데이트해야 하는지 확실히 알게 되었습니다.논리 회로 설계: 4입력 진리표 작성부터 불 방정식 간략화, Logisim 회로 구성까지 순서대로 진행했습니다. 직접 회로를 만들어 입력을 바꿔 볼 때마다 결과가 즉시 바뀌는 모습을 보면서, 이론이 실제 게이트 동작으로 이어진다는 점이 와닿았습니다.스스로 칭찬하는 점이론과 실습 병행AVL 트리 코드와 Logisim 회로를 동시에 구현하며, 배운 내용을 손으로 직접 확인한 점이 좋았습니다.진리표 정리법 습득2진수 순서대로 진리표를 빠짐없이 작성하면서, 체계적인 정리 방법을 제대로 익혔습니다.아쉬웠던 점 & 보완회로 배선 정리 부족Logisim에서 선이 겹치다 보니 가끔 헷갈렸습니다.→ 다음에는 작은 모듈로 나눠 단계별로 검증하고, 마지막에 합치는 방식을 사용하겠습니다. 개념 정리 자료 부족AVL 트리나 불 대수 법칙을 공부할 때, 머릿속으로만 이해하고 따로 요약해 두지 않아 복습할 때 헷갈리는 부분이 있었습니다.→ 학습 중에는 핵심 개념을 노트에 간단히 정리하여, 부족한 부분을 바로 찾아볼 수 있도록 하겠습니다.마치며이번 주차는 이론을 코드와 회로로 연결해 보는 경험을 했습니다. 다음 주에도 부족했던 부분을 보완하며 차근차근 학습을 이어가겠습니다! 감사합니다!

알고리즘 · 자료구조인프런워밍업클럽스터디CS전공지식자료구조컴퓨터구조발자국회고4기

동동

[인프런 워밍업 클럽_3기 CS] 세번째 발자국 🐾🐾🐾

📌 이 글은 워밍업 클럽 3기 감자님의 CS 강의인 ‘그림으로 쉽게 배우는 자료구조와 알고리즘’과 ‘그림으로 쉽게 배우는 운영체제’를 학습하며 정리한 내용을 담고있습니다. 🙇‍♂1⃣ 자료구조와 알고리즘📌 1. 정렬 알고리즘📌 2. 동적 프로그래밍2⃣ 운영체제📌 1. 메모리 관리경계 레지스터 (Base + Limit Register): 사용자 프로세스가 OS 영역 침범 못하도록 보호가변 분할 (세그멘테이션): 코드/데이터/스택 분리 가능, 유연 외부 단편화 발생고정 분할 (페이징): 일정 크기의 페이지 단위 관리 내부 단편화 발생 가능디맨드 페이징: 필요한 페이지만 메모리에 로드 (지연 적재) 초기 로딩 빠름, 페이지 폴트 주의 📌 2. 페이지 교체 알고리즘FIFO : 먼저 들어온 페이지 제거OPT : 가장 나중에 사용할 페이지 제거LRU : 가장 오래 사용되지 않은 페이지 제거클락 알고리즘 : 접근 비트 이용한 LRU 근사 빌레이디의 역설 프레임 수를 늘렸는데도 페이지 폴트가 증가하는 현상 스레싱 페이지 교체 과도 -> CPU 사용률 급감 워킹셋 자주 쓰이는 페이지 집합, 컨텍스트 스위칭 시 활용 📌 3. 파일 시스템파일 시스템 기능 : 생성, 수정, 삭제, 권한 관리, 백업, 무결성, 암호화파일 디스크립터 : 운영체제가 파일을 관리하기 위해 정보를 보관하는 파일제어블록파일 구조 파일 할당 방식  파일 삭제 : 실제 데이터를 삭제하지 않고 헤더만 제거. 블록은 Free Block List에 추가 -> 복구 가능3⃣ 회고완강을 했지만, 뭔가 찝찝한 부분들이 많다.특히, 병합 정렬과 퀵 정렬은 개념은 알겠지만, 흐름이나 코드 구현 방식이 아직 완전히 이해가 되지 않아 다시 복습이 필요할 것 같다. 이번 워밍업 클럽 3기 CS를 통해 막연하게만 알고 있던 컴퓨터 지식들을 정리할 수 있었고, 자료구조와 운영체제에 대한 기반이 조금씩 쌓이는 느낌을 받았습니다. 🥲 🐾🐾🐾

인프런워밍업클럽CS

찬우 이

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

3주차 학습 내용 - 발자국자료구조 & 알고리즘 삽입정렬function InsertionSort(arr) { for (let i = 1; i < arr.length; i++) { let cnt = arr[i]; let j; for (j = i - 1; j >= 0; j--) { if (arr[j] > cnt) { arr[j + 1] = arr[j]; } else { break; } } arr[j + 1] = cnt; } return arr; } console.log(InsertionSort([4, 1, 5, 3, 6, 2])); 시간복잡도: O(N²)이해와 구현이 간단하고 직관적,하지만 성능은 좋지 않아서 작은 데이터나 거의 정렬된 데이터에 적합병합정렬function MergeSort(arr, leftIndex, rightIndex) { if (leftIndex < rightIndex) { let midIndex = Math.floor((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 = new Array(arr.length).fill(0); let tempArrIndex = leftIndex; while (leftAreaIndex <= midIndex && rightAreaIndex <= rightIndex) { if (arr[leftAreaIndex] <= arr[rightAreaIndex]) { tempArr[tempArrIndex++] = arr[leftAreaIndex++]; } else { tempArr[tempArrIndex++] = arr[rightAreaIndex++]; } } while (leftAreaIndex <= midIndex) { tempArr[tempArrIndex++] = arr[leftAreaIndex++]; } while (rightAreaIndex <= rightIndex) { tempArr[tempArrIndex++] = arr[rightAreaIndex++]; } for (let i = leftIndex; i <= rightIndex; i++) { arr[i] = tempArr[i]; } } let arr = [3, 5, 2, 4, 1, 7, 8, 6]; console.log("==== 정렬 전 ===="); console.log(arr); MergeSort(arr, 0, arr.length - 1); console.log("==== 정렬 후 ===="); console.log(arr); 시간복잡도: O(n log n)재귀 기반 정렬이라 이해와 구현은 조금 어렵지만, 성능은 안정적이고 좋다. 퀵정렬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 && arr[leftStartIndex] <= pivot) { leftStartIndex++; } while (rightStartIndex >= left + 1 && arr[rightStartIndex] >= pivot) { rightStartIndex--; } if (leftStartIndex < rightStartIndex) { swap(arr, leftStartIndex, rightStartIndex); } } swap(arr, left, rightStartIndex); return rightStartIndex; } function swap(arr, index1, index2) { let temp = arr[index1]; 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); 시간복잡도: 평균적으로 Θ(n log n)재귀 기반 정렬이라 이해와 구현은 어렵게 느껴질 수 있지만, 실제로는 굉장히 빠르고 효율적인 정렬 알고리즘이다.  메모이제이션function fibonacci2(n, memo) { if (n == 0 || n == 1) return n; // ✅ 기본 조건(Base Case) if (memo[n] == null) { // ✅ 이전에 계산된 값이 없으면 계산 memo[n] = fibonacci2(n - 2, memo) + fibonacci2(n - 1, memo); } return memo[n]; // ✅ 저장된 값이 있으면 재사용 } console.log(fibonacci2(5, {})); // ✅ 초기 memo 객체를 전달한 번 계산한 값을 저장해두고, 같은 계산이 필요할 때는 다시 계산하지 않고 저장된 값을 재사용하는 기법중복 계산을 줄여 알고리즘 속도를 최적화 함.예제에서는 피보니치를 재귀로 구현하고 있음, 하지만 일반 재귀로는 불필요한 중복계산이 많아 효율이 좋지 않음.그래서 n의 값에 따라 그 값을 기억하는 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]; } console.log(fibonacci3(5));타뷸레이션은 하향식인 재귀 방식이 아니라, 상향식으로 배열을 채워나가는 방식이다.아무래도 재귀보다 코드가 직관적이고, 이해하기 쉽다. 타뷸레이션은 재귀 없이도 효율적인 풀이가 가능한 방식이라, 초보자에게 훨씬 부담이 적고 실전에서도 유용하다고 느꼈다. 운영체제 가상 메모리운영체제가 물리적 메모리(RAM)가 부족할 때, 하드디스크(또는 SSD)를 이용하여 추가적인 메모리를 제공하는 기술RAM이 부족하면 일부 데이터를 디스크(하드디스크, SSD)에 저장했다가 필요할 때 다시 불러오는 방식페이지 폴트: 프로그램이 필요한 데이터를 RAM에서 찾지 못할 때 발생하는 현상 -> 운영체제가 디스크에서 해당 데이터를 RAM으로 불러오는 작업을 수행스왑 영역: 물리 RAM이 부족할 때, 디스크의 일부를 메모리처럼 사용하는 영역 세그멘테이션프로그램을 논리적인 단위(세그먼트)로 나누어 메모리를 할당하는 방식동작 방식프로그램이 메모리를 요청하면 운영체제는 세그먼트 번호를 할당함.세그먼트 테이블을 참고하여, 해당 세그먼트의 시작 주소를 찾음.세그먼트 시작 주소 + 오프셋(offset)을 더하여 실제 메모리 주소를 계산함.장점: 내부 단편화 X, 메모리를 논리적 단위로 관리 가능단점: 외부 단편화O페이징메모리를 "고정된 크기(페이지 단위)"로 나누어 관리하는 메모리 할당 기법프로세스를 작은 단위(페이지)로 나누어 메모리에 배치동작 방식프로그램이 실행되면, 프로세스를 동일한 크기의 페이지로 나눔.메모리도 같은 크기의 프레임으로 나누고, 각 페이지를 빈 프레임에 적재.CPU가 메모리에 접근할 때, 페이지 테이블을 이용하여 페이지 번호 → 프레임 번호로 변환.장점: 외부 단편화 없음, 메모리를 효율적으로 사용 가능단점: 내부 단편화 발생, 페이지 테이블을 계속 참조해야 해서 오버헤드 존재 세그멘테이션 vs 페이징둘 중에 뭐가 더 좋다, 이렇게 단정 짓긴 어려움. 결국 사용 목적과 상황에 따라 선택하면 됨.세그멘테이션프로그램이 서로 다른 크기의 논리적 블록(세그먼트)으로 나뉘어 있을 때 유리함함수, 배열, 변수 등 논리 단위로 나뉘는 구조에 적합유연하게 메모리를 할당하고 싶을 때 사용하기 좋음페이징메모리를 고정된 크기(페이지 단위)로 균등하게 나눔운영체제에서 일괄적으로 메모리를 관리하고 싶을 때 적합외부 단편화가 더 신경 쓰이는 경우 페이징이 더 효과적임ㅍ페이지 세그멘테이션세그멘테이션 + 페이징의 장점을 섞은 방식세그먼트마다 다시 페이지 단위로 쪼갬논리적으로는 세그먼트로 구분하고, 물리적으로는 페이지처럼 관리함단점도 줄이고, 장점도 살리는 구조 디맨드 페이징실제로 필요한 페이지만 메모리에 올리는 방식프로그램 실행 시, 전체를 메모리에 올리지 않고 조만간 필요할 것 같은 페이지만 로딩나머지 페이지는 스왑 영역(보조 기억장치)에 남겨둠실제 사용될 때만 메모리에 적재 → 효율적인 메모리 사용 지역성 이론프로그램이 실행될 때 특정 메모리 영역에 집중적으로 접근하는 성질을 지역성이라고 한다. 공간의 지역성: 현재 위치와 가까운 데이터에 접근할 확률이 높음ex) 배열이나 함수 코드처럼 서로 인접한 메모리 위치를 차례로 접근하는 경우이 특성을 기반으로, 근처 데이터까지 한 번에 메모리에 올려두고, 필요 없어 보이는 데이터는 스왑 영역으로 보내서 성능을 높이는 방식이 사용됨 시간의 지역성: 최근 접근했던 데이터가 오래 전에 접근했던 데이터보다 접근할 확률이 높음ex) 방금 쓴 변수나 반복문에서 쓰인 코드들이 다시 사용되는 경우이 특성을 활용해서, 캐시나 페이지 교체 알고리즘에서 최근 사용 여부를 판단하는 데 쓰임 페이지 교체 정책프로세스가 어떤 데이터를 사용하려고 할 때, 그 데이터가 메모리에 없다면 스왑 영역(디스크)에서 가져와야 한다.근데 메모리 공간이 꽉 차 있다면, 기존에 있던 데이터를 하나 꺼내고, 새 데이터를 그 자리에 넣어야 함.이때 어떤 데이터를 꺼낼지 정하는 기준이 바로 페이지 교체 정책이다.1. 무작위로 선택하는 방법지역성을 전혀 고려하지 않기 때문에, 자주 쓰는 데이터가 교체될 수 있어서 성능이 안 좋음하지만 구현은 제일 간단함2. 메모리에서 가장 오래된 페이지를 선택하는 방법(FIFO)자주 쓰는 페이지라도 먼저 들어왔다는 이유로 교체될 수 있음단점은 있지만, 구현이 쉬워서 변형을 거쳐 실제로 많이 사용됨3. 앞으로 가장 오랫동안 쓰이지 않을 페이지를 선택하는 방법(Optimum)이론적으로 가장 완벽한 방식이지만,미래를 예측할 수 없기 때문에 실제 구현은 불가능함다른 알고리즘과 성능 비교할 때 기준점으로 사용함4. 최근에 가장 사용이 적은 페이지를 선택하는 방법(LRU)최근에 사용된 데이터를 우선적으로 보존하는 방식이라 지역성에 잘 맞음단점은, 언제 사용됐는지를 추적하기 위해 시간 정보나 카운터, 비트 등이 필요함 → 구현이 복잡하고 성능 부담이 생길 수 있음시간이 지나면 오버플로우 문제도 발생 가능5. Clock AlgorithmLRU의 단점을 보완한 방식각 페이지에 참조 비트를 붙이고,일정 시간마다 비트를 확인하며 시계 방향으로 스캔참조되지 않은 페이지를 교체하고, 참조된 페이지는 기회를 한 번 더 줌구조는 단순하고 성능도 괜찮아서 실제 운영체제에서 자주 사용됨 6. 2차 기회 페이지 교체 알고리즘FIFO의 단점을 개선한 방식FIFO는 자주 쓰는 페이지라도 먼저 들어왔으면 교체됨 → 이걸 해결함페이지가 교체 대상이 되었는데 최근 사용된 페이지라면, 그 페이지를 맨 뒤로 보내고 한 번 더 기회를 주는 방식간단하면서도 성능이 괜찮은 알고리즘 스레싱프로세스들이 계속 스왑만 하느라 정작 일은 못 하는 상태멀티프로그래밍 수준을 너무 높이면, 한정된 메모리를 너무 많은 프로세스가 나눠 쓰게 된다.이때 필요한 페이지가 자꾸 메모리에 없어서, 운영체제는 디스크와 메모리 사이에서 페이지를 계속 교체(스왑) 하게 된다.결과적으로 CPU는 일은 안 하고, I/O 대기만 계속하면서 놀게 된다.주변 장치그래픽 카드, HDD, SDD, 키보드, 마우스 등 컴퓨터 외부와 연결되는 장치들을 말함.캐릭터 디바이스마우스, 키보드, 사운드카드 등데이터 전송 단위가 '문자 단위(캐릭터)'로 상대적인 크기가 작다블록 디바이스HDD, SSD, 그래픽카드 등데이터 전송 단위가 '블록 단위(범위)'로 상대적인 크기가 크다입출력 제어기예전에는 주변 장치를 CPU가 직접 관리했기 때문에, I/O 명령을 만나면 CPU가 멈춰버리고 입출력이 끝날 때까지 기다려야 했음 → 비효율적이걸 보완하기 위해 입출력 제어기가 생김.이제는 I/O 명령을 만나면, 제어기가 입출력 작업을 대신 맡고, CPU는 다른 작업을 계속 실행할 수 있게 됨 → CPU 사용률이 올라감 3주차 회고벌써 3주차가 되어버렸다..이번 주는 뭔가 유독 어렵게 느껴졌다.아무래도 점점 이전 강의 위에 지식이 쌓여가다 보니, 강의를 봐도 이해가 잘 안 되는 순간들이 많았다.그래서 같은 영상을 계속 반복해서 보면서 겨우겨우 따라갔던 것 같다.특히 재귀는 진짜 어렵다.자주 보려고는 하지만, 어렵다 보니 손이 잘 안 간다… 하하(타뷸레이션 짱😀)3주 전, 아무것도 모르던 나는 그냥 "CS 한 번 배워보자!"는 마음으로 신청했었다.그런데 막상 3주 동안 공부하면서 내가 몰랐던 걸 많이 알게 됐고,동시에 더 꾸준히 공부해야겠다는 자극도 받았다.코드를 직접 치고, 프레임워크나 기술을 익히는 것도 물론 중요하지만,이런 이론적인 부분(CS)도 기초 체력을 길러주는 느낌이라 꼭 필요하다고 생각하게 됐다.아마 완주 포인트를 받으면… 감자님의 알고리즘 상버전을 결제하러 가지 않을까 싶다 😎이 강의를 듣고 싶거나, 워밍업 클럽에 참여할까 고민 중이라면 망설이지 말고 그냥 해보는 걸 추천한다.나는 CS 강의는 처음이라 다른 강의랑 비교할 순 없지만,지금까지는 충분히 만족이다.그리고 솔직히 말해서, 워밍업 클럽이 아니었다면 3주 동안 완강 못 했을 거다.혼자였다면 진작에 놓았을지도…   마지막으로 우리 모두 파이팅! 🔥🔥 

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

찬우 이

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

2주차 학습 내용 - 발자국자료구조 & 알고리즘재귀함수function sum(n) { if (n === 1) return 1; // ✅ 기본 조건(Base Case): n이 1이면 재귀 종료 return n + sum(n - 1); // 🔁 재귀 호출(Recursive Case): sum(n-1) 호출 } console.log(sum(5)); // 5 + 4 + 3 + 2 + 1 = 15함수 내부에서 자기 자신을 다시 호출하는 구조를 가진 함수기본조건재귀 함수가 계속 반복되지 않도록 종료 조건(기저 조건)을 설정해야 함.없으면 무한 루프가 발생하여 Stack Overflow(스택 오버플로우) 오류가 발생함.재귀 호출재귀 호출을 통해 문제를 점점 더 단순하게 만들어 Base Case에 도달하도록 함. 하노이 탑(재귀)function hanoi(count, from, to, temp) { if (count === 0) return; hanoi(count - 1, from, temp, to); console.log(`원반${count}를 ${from}에서 ${to}로 이동했습니다.`); hanoi(count - 1, temp, to, from); } hanoi(3, "A", "C", "B"); 재귀문제의 기본으로 알려진 하노이탑 문제의 원리큰 원반을 옮기기 전에, 그 위에 있는 원반들을 다른 기둥으로 옮긴다.가장 아래에 있는 큰 원반을 목표 기둥으로 이동한다.다른 기둥에 옮겨둔 원반들을 다시 목표 기둥으로 옮긴다.hanoi 함수의 매개변수는 (원반개수, 시작위치, 도착위치, 거치는위치)4개로 구성된다.   버블정렬function bubbleSort(arr) { let n = arr.length; for (let i = 0; i < n - 1; i++) { // 전체 반복 횟수 for (let j = 0; j < n - 1 - i; j++) { // 점점 줄어드는 비교 범위 if (arr[j] > arr[j + 1]) { // 오름차순 정렬 [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // Swap (교환) } } } return arr; } let arr = [5, 3, 8, 4, 2]; console.log(bubbleSort(arr)); // [2, 3, 4, 5, 8] 배열을 반복하면서 인접한 두 요소를 비교하고 조건에 따라 서로의 위치를 바꿈구현하기는 쉽지만 성능면(O(n²))에서는 그렇게 좋지 않음.  선택정렬function selectionSort(arr) { let n = arr.length; for (let i = 0; i < n - 1; i++) { let minIndex = i; // 현재 정렬된 부분 이후에서 가장 작은 값의 인덱스 저장 for (let j = i + 1; j < n; j++) { // i 이후 요소들과 비교 if (arr[j] < arr[minIndex]) { minIndex = j; // 더 작은 값이 발견되면 minIndex 갱신 } } // 최소값을 현재 위치(i)와 교환 (swap) if (minIndex !== i) { [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]; } } return arr; } let arr = [5, 3, 8, 4, 2]; console.log(selectionSort(arr)); // [2, 3, 4, 5, 8] 배열영역의 첫 번째 원소를 시작으로 마지막 원소까지 비교 후 가장 작은 값을 첫 번째 원소로 가져온다.버블정렬과 같은 경우로 구현하기는 쉽지만 성능면(O(n²))에서는 그렇게 좋지 않음. 운영체제 프로세스 간 통신한 컴퓨터내에 있는 다른 프로세스와 통신하는 방법 ex) 파일, 파이프파일: 프로세스 간 데이터를 저장하고 읽을 수 있음.파이프: 한 프로세스의 출력이 다른 프로세스의 입력이 되는 방식.네트워크로 연결된 다른 컴퓨터에 있는 프로세스와 통신을 하는 방법 ex) 소켓통신, RPC소켓통신: 네트워크를 통해 데이터를 주고받는 방식RPC: 원격 프로시저 호출을 이용하여 다른 컴퓨터에서 실행되는 함수 호출.쓰레드 간 통신같은 프로세스 내에서 실행되는 여러 개의 쓰레드 간의 통신 방법쓰레드는 코드, 데이터, 힙을 공유하며, 각자의 스택만 별도로 가짐.전역 변수(Global Variable)나 힙(Heap)을 이용하면 쓰레드 간 데이터 공유 가능. 공유자원프로세스나 쓰레드 간의 통신에서 공동으로 사용하는 변수나 파일을 의미한다.임계구역여러 프로세스가 동시에 접근하면 안 되는 공유 자원의 영역세마포어공유자원을 함께 쓰는 프로세스 간의 충돌을 막기 위해 프로세스가 사용하는 동안 다른 프로세스는 동작하지 않고 기다리는 것모니터세마포어의 단점을 개선한 방법운영체제(OS) 차원이 아니라, 프로그래밍 언어에서 제공하는 동기화 방법내부적으로 뮤텍스(Mutex)와 조건 변수(Condition Variable)를 사용하여 동기화 수행여기부터교착상태(데드락)프로세스들이 서로가 가진 자원을 기다리면서 아무것도 실행되지 않는 상태각 프로세스가 다른 프로세스의 작업이 끝나기를 기다리지만, 아무도 자원을 해제하지 않음교착상태가 발생하려면 다음 4가지 조건이 모두 충족되어야 한다.상호배제: 자원은 한 번에 하나의 프로세스만 사용할 수 있어야 한다.비선점: 점유한 자원을 강제로 빼앗을 수 없다.점유와 대기: 이미 자원을 점유한 상태에서 추가적인 자원을 기다려야 한다.원형 대기: 프로세스들이 서로 다음 프로세스의 자원을 기다리는 원형 구조가 형성되어야 한다.하지만 필요조건을 지켜도 교착상태는 발생한다는 것을 깨달았고, 교착상태를 예방하기보단 교착상태가 발생했을때 해결하는 방법을 찾으려고 했다.교착상태 해결방안교착상태 회피프로세스들에게 자원을 할당할 때 어느정도 자원을 제공해야 교착상태가 발생하는지 파악해서 교착상태가 발생하지 않는 선에서 할당해주는 것전체 자원의 수와 할당된 자원의 수를 비교해서 안정상태와 불안정 상태로 나눔시스템의 총 자원과 각 프로세스간의 최대 요구자원을 계산해서 여유분의 자원을 남기고 프로세스에게 제공해야 안정상태를 유지할 수 있다.교착상태 검출가벼운 교착 상태 검출: 타이머를 이용해 프로세스가 일정시간 동안 작업을 진행하지 않으면 교착상태가 일어났다고 생각하고 해결함(해결 방법은 주기적으로 상황을 업데이트해서 만약 교착이라고 느끼면 롤백해서 이전으로 되돌아감)무거운 교착 상태 검출: 자원 할당 그래프를 이용하며, 교착 상태를 발견하면(발견은 자원이 순환하면 교착상태임) 해결함.해결방법은 교착상태를 인지하면 교착을 일으킨 프로세스를 강제종료하고 다시 실행할때 이전 업데이트로 롤백함.컴파일 언어소스 코드 전체를 한 번에 기계어(0과 1)로 변환한 후 실행하는 언어속도가 빠름.언어: C, C++, C# 등컴파일에서 실행파일로 변환 과정test.c -> 전처리기 -> test.i -> 컴파일러 -> test.s -> 어셈블리 -> test.o -> 링커 -> test.exe1⃣ test.c → 전처리기(Preprocessor) → test.i (주석 제거, 매크로 처리 등)2⃣ test.i → 컴파일러(Compiler) → test.s (어셈블리 코드 생성)3⃣ test.s → 어셈블러(Assembler) → test.o (목적 파일 생성)4⃣ test.o → 링커(Linker) → test.exe (최종 실행 파일 생성) 인터프리터 언어코드를 한 줄씩 읽고 실행하는 방식의 언어컴파일 과정 없이 즉시 실행되지만, 실행 속도는 컴파일 언어보다 느림언어: JS, Python, Ruby 등 메모리 종류 레지스터CPU 내부에 존재하는 가장 빠른 기억장소매우 빠른 연산을 위해 사용되며, CPU가 직접 접근할 수 있음휘발성(Volatile) 메모리 → 전원이 꺼지면 데이터가 사라짐 캐시메인 메모리(RAM)와 CPU(레지스터) 사이에 위치하는 고속 메모리CPU가 자주 사용하는 데이터를 미리 저장하여 접근 속도를 높임 메인메모리(RAM)운영체제(OS)와 실행 중인 프로그램이 올라가는 공간휘발성 메모리가격이 비싸기 때문에, 데이터 저장보다는 실행 중인 프로그램을 로드하는 용도로 사용HDD(하드디스크)나 SSD보다 훨씬 빠르지만, 레지스터나 캐시보다는 느림 보조저장장치(HDD,SSD)가격이 저렴하며, 데이터를 영구적으로 저장하는 용도로 사용됨비휘발성(Non-Volatile) 메모리 → 전원이 꺼져도 데이터가 유지됨 메모리 할당 방식 메모리 오버레이프로그램이 메모리보다 클 경우, 실행에 필요한 부분만 메모리에 로드하는 방식나머지 코드는 하드디스크에 저장되며, 필요할 때만 메모리에 불러옴가변 분할 방식프로세스 크기에 맞춰 메모리를 동적으로 분할하는 방식외부단편화 발생: 여러 개의 작은 빈 공간이 생겨 새로운 프로세스를 할당하기 어려운 문제고정 분할 방식프로세스 크기와 상관없이 미리 정해진 크기로 메모리를 나누는 방식장점: 구현이 간단하고 오버헤드가 적음단점: 작은 프로세스는 큰 영역에 할당되서 공간이 낭비되는 내부단편화 발생버디 세스템가변 분할 방식과 고정 분할 방식을 혼합하여 단점을 최소화한 메모리 할당 방식메모리를 2의 승수 크기로 분할하여 할당2주차 회고재귀가 너무 어렵다.. 정렬은 그래도 예전에 공부해본적이 있어서 한두번 더 보니까 이해가 되는데 재귀는 봐도봐도 이해가 어려움..특히 하노이ㅋㅋㅋㅋ 새로운 벽이였다. 그래도 자주 보다보니 적응이 되는것 같기도 하고 아닌거 같기도하고,,,그렇다 보니 미션 3번째 문제는 도무지 이해가 쉽지 않았다. 그래서 GPT의 도움과 함께 계속 이해해려하고 있고 지금도 하고있다,,ㅎ그리고 2주차때는 중간점검을 통해 다같이 구글밋을 했다. 주 내용은 운영체제같은 CS지식이 있으면 다른 프레임워크나 컴퓨터 쪽의 지식을 쌓고 배울때 지식이 없는사람에 비해 더 빠르게 습득할 수 있고, 흡수하는게 빠르다고 했다. 벌써 다음주가 3주차라서 CS는 마지막 주 인데 마무리 잘해서 수료하고, 수료 이후에도 강의 반복해서 듣고 자료구조 & 알고리즘은 심화버전이 있어서 그걸 들어야 할 것 같다.

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

동동

[인프런 워밍업 클럽_3기 CS] 두번째 발자국 🐾🐾

📌 이 글은 워밍업 클럽 3기 감자님의 CS 강의인 ‘그림으로 쉽게 배우는 자료구조와 알고리즘’과 ‘그림으로 쉽게 배우는 운영체제’를 학습하며 정리한 내용을 담고있습니다. 🙇‍♂1⃣ 자료구조와 알고리즘📌 1. 재귀 (Recursion)재귀 개념재귀란, 자기 자신을 호출하는 방식으로 문제를 해결하는 기법콜 스택 (Call Stack)을 사용하여 함수 호출을 관리대표적인 예 : 팩토리얼 계산, 하노이 탑 문제 하노이 탑 (Tower of Hanoi)원반을 규칙에 맞게 기둥 사이로 이동시키는 문제재귀 호출을 활용하여 해결 가능const hanoi = (count, from, to, temp) => { if (count == 0) return; hanoi(count - 1, from, temp, to); console.log(`원반 ${count}를 ${from}에서 ${to}로 이동`); hanoi(count - 1, temp, to, from); }; hanoi(3, 'A', 'C', 'B');재귀적으로 생각하는 두 가지 패턴단순히 반복 실행하는 방식하위 문제의 결과를 기반으로 현재 문제를 계산하는 방식 (하향식 계산) 📌 2. 정렬 알고리즘버블 정렬 (Bubble Sort)인접한 두 데이터를 비교하며 정렬하는 방식시간 복잡도 : O(n²) (비효율적)장점 : 이해하기 쉽고 구현이 간단함단점 : 성능이 좋지 않음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; } } } 선택 정렬 (Selection Sort)가장 작은 값을 선택하여 앞으로 이동시간 복잡도 : O(n²)장점 : 이해하기 쉽고 구현이 간단함단점 : 성능이 좋지 않음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; } 2⃣ 운영체제📌 1. 운영체제 개요운영체제의 역할프로세스 관리 : CPU 스케줄링, 멀티태스킹메모리 관리 : 프로세스 메모리 할당파일 및 입출력 관리 : 파일 시스템, 장치 드라이버 제어컴파일 과정test.c -> 전처리기 -> test.i -> 컴파일러 -> test.s -> 어셈블러 -> test.o -> 링커 -> test.exe전처리기 : #include, #define 등을 처리컴파일러 : C 코드를 어셈블리 코드로 변환어셈블러 : 어셈블리 코드를 기계어로 변환링커 : 실행 가능한 바이너리 파일 생성 📌 2. 프로세스 스케줄링FIFO (First In First Out)도착 순서대로 CPU를 할당장점 : 구현이 간단하고 공정함단점 : 실행 시간이 긴 프로세스가 먼저 도착하면 대기 시간이 증가 SJF (Shortest Job First)실행 시간이 짧은 프로세스를 우선 실행단점 : 프로세스의 실행 시간을 미리 예측하기 어려움 RR (Round Robin)타임 슬라이스(Time Slice)를 사용하여 프로세스를 순환 실행타임 슬라이스가 너무 작으면 문맥 전환 비용이 증가하여 비효율적 MLFQ (Multi-Level Feedback Queue)CPU Bound Process와 I/O Bound Process를 구분하여 처리CPU Bound Process : CPU 사용 시간이 길면 낮은 우선순위 큐로 이동I/O Bound Process : CPU를 짧게 사용하며 높은 우선순위 큐 유지 📌 3. 프로세스 간 통신공유 자원과 임계 구역공유 자원 : 여러 프로세스가 공동으로 사용하는 변수, 메모리, 파일임계 구역 (Critical Section) : 한 번에 하나의 프로세스만 접근해야 하는 구역 임계 구역 문제 해결을 위한 3가지 조건하나의 프로세스만 접근 가능여러 요청이 있을 경우 순차적으로 접근 허용임계 구역에 들어간 프로세스는 빠르게 종료해야 함 세마포어 (Semaphore)동기화 기법으로 공유 자원에 대한 접근을 제한 모니터 (Monitor)세마포어의 단점을 보완한 기법프로그래밍 언어 수준에서 지원 (synchronized 키워드 사용) 📌 4. 데드락 (교착 상태)여러 프로세스가 서로 자원을 기다리며 작업이 멈추는 상태 데드락 발생 조건 (4가지)상호 배제 (Mutual Exclusion) : 한 번에 하나의 프로세스만 자원 사용 가능비선점 (No Preemption) : 자원을 강제로 빼앗을 수 없음점유와 대기 (Hold and Wait) : 자원을 점유한 상태에서 추가 자원을 기다림원형 대기 (Circular Wait) : 프로세스들이 서로 자원을 기다리며 원형 구조 형성 데드락 해결 방법교착 상태 회피 (Deadlock Avoidance) 자원 할당 시 교착 상태 발생 여부를 예측은행원 알고리즘 (Banker’s Algorithm) 사용하여 안전 상태 유지교착 상태 검출 및 해결가벼운 교착 상태 검출 : 일정 시간 동안 프로세스가 멈춰 있으면 강제 종료무거운 교착 상태 검출 : 운영체제가 직접 프로세스의 자원 사용을 모니터링 후 해결 📌 5. 메모리 관리메모리 종류레지스터 : CPU 내부의 가장 빠른 기억 장치 (휘발성)캐시 메모리 : CPU가 미리 가져온 데이터를 저장하는 고속 메모리메인 메모리 (RAM) : 실제 운영체제와 프로세스가 올라가는 공간 (휘발성)보조 저장 장치 (HDD, SSD) : 비휘발성 메모리 메모리 할당 방식가변 분할 방식 (Segmentation) : 프로세스 크기에 맞게 메모리를 할당고정 분할 방식 (Paging) : 프로세스 크기와 관계없이 일정한 크기로 할당 버디 시스템 (Buddy System)2의 승수 단위로 메모리를 분할하여 할당내부 단편화 최소화 & 프로세스 크기에 따라 유동적 할당 가능 3⃣ 회고첫 주차에 듣지 못했던 강의를 들으면서 다시 정상적으로 강의를 듣기 시작했다. 🙇‍♂ 재귀함수 강의 중 하노이 탑 내용은 혼자서 시도를 해보면 절대 구현을 못해낼 거 같다... 이 부분을 다시 공부해야할 것 같습니다 ㅠㅠ.. 이번 2주차 강의를 들으면서 자료구조와 알고리즘은 되게 묵직한 그런 느낌이고, 운영체제는 뭔가 이 컴퓨터란 존재에 대해서 다시 생각해보는 강의였던 것 같습니다..! 🐾🐾

인프런워밍업클럽CS

강동훈

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

💻 CPU 스케줄링📌 CPU 스케줄링 개요1. 프로그램들이 실행되면 메모리에 올라가 프로세서가 되고2. 프로세서들은 1개 이상의 쓰레드가 있으며3. CPU를 차지하기 위해 운영체제의 명령을 기다린다. ✅ CPU 스케줄링 고려사항1. 어떤 프로세스에게 CPU 사용권을 줘야 하나?2. CPU를 할당받은 프로세스가 얼마의 시간동안 CPU를 사용할 수 있는가?CPU Burst: 프로세스가 CPU를 할당받아 연속적으로 실행하는 구간I/O Burst: 프로세스가 입출력(I/O) 작업을 수행하는 구간 📌 다중큐✅ 프로세스 실행 과정1. 프로세스가 생성되면 준비 상태로 전환2. 준비 상태에서 CPU 사용권을 받으면 실행 상태3. 실행 중 I/O 요청은 대기 상태, 할당시간을 초과하면 준비 상태4. 작업이 끝난다면 완료 상태로 전환된다. ✅ 준비 & 대기 상태 관리1. PCB 정보 내에 우선순위 정보를 탐색하여 준비 상태 다중 큐(Ready Queue) 에 넣는다.2. 준비 상태 다중 큐에서 운영체제는 적당한 PCB를 선택하여 실행 상태로 전환시킨다. (적당한 - 스케쥴링 정책에 따라)3. I/O 요청으로 대기 상태가 된다면 I/O 작업에 따라 분류된 큐에 들어간다.4. I/O 작업이 마무리되면 인터럽트를 발생시켜 실행 상태로 전환한다.준비 & 대기 상태 -> Queue로 관리 📌 스케줄링 목표1. 리소스 사용률- CPU, I/O device2. 오버헤드 최소화- 스케쥴링 계산, 컨텍스트 스위칭의 빈도3. 공평성- 모든 프로세스 공평하게 할당- 프로세스의 중요도에 따라 상대적으로 공평하게 할당4. 처리량- 같은 시간 내 더 많은 처리5. 대기 시간- 작업 요청부터 작업 실행 전까지 대기 시간을 짧게6. 응답 시간- 작업 응답 시간을 짧게모든 목표를 동시에 달성할 수는 없다.사용자가 사용하는 시스템에 따라 목표를 다르게 설정한다.- 터치 스크린 -> 응답시간이 중요- 과학 계산 -> 처리량이 중요- 일반 목족 -> 밸런스 유지 📌 FIFOFIFO(First In First Out): 스케줄링 큐에 들어온 프로세스 순서대로 먼저 실행된다. ✅ 특징1. 한 프로세스가 완전히 끝나야 다른 프로세스가 시작함.2. 짧은 작업의 프로세스가 긴 작업의 프로세스를 대기할 수도 있음.3. I/O 작업을 대기하는 동안 CPU는 다른 작업을 하지 않음 => CPU 사용률 저하 ✅ 평균대기시간프로세스가 여러 개 실행될 때 모두가 실행되기까지의 평균 대기 시간- 프로세스_1 (Burst Time: 25초) - 대기 시간: 0초- 프로세스_2 (5초) - 대기 시간: 25초- 프로세스_3 (4초) - 대기 시간: 30초❗평균 대기 시간: 55 / 3 = 18.3초- 프로세스_3 (4초) - 대기 시간: 0초- 프로세스_2 (5초) - 대기 시간: 4초- 프로세스_1 (Burst Time: 25초) - 대기 시간: 9초❗ 평균 대기 시간: 13 / 3 = 4.3초프로세스 실행 순서에 따라 평균 대기 시간의 편차가 크기 때문에, 현대 운영체제에서는 사용 X일괄처리시스템에서 주로 사용 📌 SJFSJF(Shortest Job First): Burst Time이 가장 짧은 작업부터 우선 실행 ✅ 특징1. FIFO의 단점이었던 '실행 순서에 따른 평균 대기 시간 차이'를 극복하기 위해 설계2. 프로세스의 종료 시간를 예측하기 어려움 (Burst Time 파악이 힘듦)3. Burst Time이 긴 프로세스는 계속 뒤로 밀려가서 대기 시간이 점차 길어진다.4. 2,3 의 문제점으로 CPU 스케쥴링으로 채택되지 않음. 📌 RRRR(Round Robin): 일정 시간동안만 프로세스를 실행하고 다음 프로세스를 실행 ✅ 특징1. 타임 슬라이스(`Time Slice`) : CPU가 할당되는 일정한 시간 ✅ 평균대기시간타임 슬라이스 : 10s- 프로세스\_1 (Burst Time: 25초) - 대기 시간: 0 + 14 + 0초- 프로세스\_2 (4초) - 대기 시간: 10초- 프로세스\_3 (10초) - 대기 시간: 14초❗평균 대기 시간: 38 / 3 = 12.67초 FIFO 알고리즘과 평균 대기 시간이 비슷하다면 RR 알고리즘이 더 비효율적RR 알고리즘은 Context Switching이 일어나기 때문에 자원의 사용이 더 필요.- 타임 슬라이스가 큰 경우- 먼저 들어온 프로세스가 실행되니 FIFO 알고리즘과 동일 (타임 슬라이스: 무한대)- 웹 브라우저, 음악 플레이어가 5초마다 끊김(타임 슬라이스: 5s)- 타임 슬라이스가 작은 경우- 여러 프로세스가 동일하게 실행되는 것처럼되지만 Context Switching 처리량의 증가로 오버헤드가 너무 크다(1ms) 최적의 타임 슬라이스1. 여러 프로세스가 버벅이지 않고 동시에 실행하는 것 같은2. 오버헤드가 너무 크지 않은 운영체제 타임 슬라이스1. Windows: 20ms2. Unix: 100ms 📌 MLFQMLFQ(Multi Level Feedback Queue):✅ 가정- CPU Bound Prcess(P1): CPU 연산만 하는 프로세스 - CPU 사용률, 처리량 중요- I/O BOund Process(P2): 대부분 I/O 작업만 진행 - 응답 속도1. Time Slice가 100초일 때P2 (1초) 작업 후 I/O 작업 요청P1 (100초) 실행P1 10초 정도 작업 중, P2의 작업이 완료되어 인터럽트 발생 후 준비 큐에 삽입P1 90초 나머지 실행P2 1초 실행 I/O 작업...2. Time Slice가 1초일 때P2 (1초) 작업 후 I/O 작업 요청P1 (1초) 실행P2 I/O 작업이 마무리되지 않았기 때문에 P1 준비 큐에 삽입되었다가 바로 실행10 번 과정P2 I/O 작업 완료 후, 인터럽트 실행, 준비 큐 삽입P2 1초 실행 후 I/O작업 - 1번 CPU 사용률을 100% 지만 I/O 사용률은 10/101 (I/O 작업 시간 / 두 프로세스 총 실행시간) = 약 10%- 2번 CPU 사용률을 100% 지만 I/O 사용률은 10/11 (I/O 작업 시간 / 두 프로세스 총 실행시간) = 약 90%- 1번에 비해서 CPU와 I/O 이용률이 높아 효율적이지만- 컨텍스트 스위칭을 자주하기 때문에 P1은 손해- P2는 이득 ✅ 특징- MLFQ는 기본적으로 CPU 사용률과 I/O 사용률이 좋게 나오는 타임 슬라이스를 가진다.- CPU Bound Process는 큰 타임슬라이스를 준다.- 주어진 타임 슬라이스 내에 작업이 완료되면 I/O Bound Process, 초과하면 CPU Bound Process로 추측- 우선순위가 매겨진 여러 큐를 준비하여 우선순위가 높을 수록 타임 슬라이스가 크게 설정한다.- 타임슬라이스가 초과될수록 점처 우선순위가 낮은 큐로 이동- 결국 FIFO처럼 프로세스 연속적으로 작업이 가능 📌 더 찾아본 점❓선점형(preemptive) VS 비선점형(non-preemptive)?✅ 선점형 스케쥴링은 하나의 프로세스가 현재 사용중인 CPU의 사용권을 점유할 수 있다.반대로 비선점형 스케쥴링은 하나의 프로세스가 마무리되어야 CPU의 사용권을 할당받을 수 있다. ❓추가적인 스케쥴링 방식?✅1. SRTF(Shortest-Remaining-Time First)- SJF의 단점 "100초짜리 A가 실행 중에 1초, 2초의 B,C 프로세서가 준비 상태라면, 100 초를 기다려야 한다"- SJF는 비선점형이기 때문에 작업을 기다려야 하지만, STCF는 큐의 남아있는 작업 시간을 계산하여 CPU의 점유를 뺏는 선점형이다.- 100초 A작업 도중 2초 작업 B가 도착하면, A의 남은 작업 시간과 비교하여 짧은 B가 먼저 실행된다.2. Priority- 비선점형: 도착한 프로세스마다 우선순위가 부여되고 동시에 도착한 프로세스의 경우 우선순위로 실행- 만약 우선순위가 낮더라도 먼저 실행 중이라면 작업이 종료될 때까지 대기- 선점형: 도착한 순서가 다르더라도 프로세스의 priority에 따라 높은 우선순위 별로 CPU 점유3. MLQ(Multi-Level Queue)- 여러 개의 우선순위가 부여된 큐로 관리되며 프로세스의 우선순위에 따라 각 큐에 삽입- 프로세스의 타입, 특징, 중요도에 따라 우선순위가 부여 - I/O 작업은 백업과 같은 배치 작업보다 높은 우선순위를 갖는다.- 각 큐의 요구조건마다 다른 CPU 스케쥴링 알고리즘을 사용한다.1. 고정 우선순위 선점 스케쥴링 (선점형)- 큐별로 우선순위가 고정되어 있고, 가장 하위 큐는 상위 큐에 프로세스가 없을 때만 동작이 가능하다.- 하위 큐의 프로세스가 동작하는 도중, 상위 큐의 프로세스가 들어오면 CPU 사용권을 빼앗긴다.2. 타임 슬라이싱 (비선점형)- 큐의 우선순위 별로 CPU 사용 시간의 점유율을 산출한다. > 1순위 50% / 2순위 30% / 3순위 20%- 프로세스의 큐 간 이동이 불가하여 유연성이 떨어진다.- 특정 큐에 프로세스가 몰리거나 우선순위 큐에 의해 하위 우선순위의 프로세스 대기 시간이 길어질 수 있음(기아 현상)4. MFLQ(Multi-Level Feedback Queue)- MLQ에서 큐 간 이동이 불가하여 유연성이 부족한 문제 극복- 우선순위에 따른 여러 큐가 존재하며 프로세스의 우선순위는 동적으로 변경된다.- CPU 점유 시간을 초과하면 우선 순위가 낮아지며, 점유 시간 이내에 작업이 마무리된다면 우선 순위 유지- 에이징 - 모든 프로세스를 일정 주기마다 최상위 큐로 이동 / 오래 기다린 프로세스 상위 큐로 승격 (기아 현상 방지) 📔 회고블로그 글을 통해 "인프런 워밍업 클럽"에 대해 알게 되었고 마침 CS 공부를 계획하였던 나는 새로운 기수가 시작되자마자 바로 신청하였다.이번에 CS 로드맵에 참여하면서 목적없이 강의를 듣고 공부하기 보다는이 로드맵을 통해 어떤 것을 얻고 싶고 클럽이 진행하는 동안 어떤 것을 꾸준히 지켜나갈 것인지 정하여 공부하는 것이 나의 성장을 더 효율적으로 끌어올려 줄 것 같아, 미리 선정하고 수업에 임하였다. 🚀 최종 목표 : 더 효율적인 백엔드 개발을 위해 기본적인 운영체제 지식들을 확실히 잡아가기🚀 매주 규칙:각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분강의를 듣고 최대한 이쁘게 (?) 정리해놓기매 강의를 듣고 궁금하거나 이해가 안가는 부분은 추가적으로 더 찾아서 정리해두기 강의를 듣고 정리하는 것이 손에 익지 않아, 초반에는 공부하는 시간보다 틀을 잡는데 시간이 더 소요되었지만점차 강의를 듣고 정리하는 방법이 손에 익으면서 정리하는 시간이 많이 줄었고 요약에 대한 아웃라인도 대강 잡혀나갔다. 다만 회고를 하다보니 목표는 "백엔드 관점에서의 운영체제"로 설정하였는데, 1주차는 운영체제에 대해서만 공부를 한 것 같아서 다음 주부터는 각 강의를 듣고 백엔드 관점에서 고민해보는 시간을 가져보고 다양한 의견을 GPT와 주고 받으며 정리해보면 좋을 것 같다. 매 강의 내용을 백엔드 관점에서 고민해보고 GPT와 대화를 통해 정리    

시스템 · 운영체제운영체제워밍업클럽감자CS

강동훈

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

💻 프로세스와 쓰레드 📌 프로그램과 프로세스 프로그램: 저장장치에 저장된 명령문의 집합체 (Application, .exe,,,) 프로세스: 실행 중인 프로그램. "실행 중"은 하드디스크에 저장된 프로그램이 메모리에 올라갔을 때를 의미한다. 프로그램은 저장장치에 저장만 되는 수동적인 존재이지만, 프로세스는 메모리, CPU 스케줄링 알고리즘, 입/출력도 사용하는 능동적인 존재.  ✅ 프로세스의 구조1. 코드 영역 - 자신을 실행한는 코드가 저장2. 데이터 영역 - 스태틱 변수와 전역 변수 저장3. 스택 영역 - 지역 변수와 함수 호출을 위한 정보 저장4. 힙 영역 - 프로그래머가 동적으로 메모리를 할당 - free(), malloc()을 통해 메모리 관리 ✅ 컴파일 과정1. 전처리기를 통해 매크로로 정의한 숫자를 치환하고 필요한 파일을 불러온다.2. 파일의 확장자(.i)3. 컴파일 (C언어 > 어셈블리어)4. 파일의 확장자(.s)5. 어셈블리어 > 기계어6. 파일의 확장자(.o)7. 링킹을 통해 파일의 확장자(.exe)로 변경 ✅ 프로세스 실행 과정1. 두 숫자를 더하는 코드를 작성2. 컴파일3. .exe 파일을 실행4. 메모리에 파일이 올라감 (프로세스)5. CPU 내 제어장치가 파일을 읽어가며 레지스터 저장 및 연산6. 결과 메모리 저장  📌 멀티프로그래밍과 멀티프로세싱 ✅ 유니 프로그래밍(메모리 관점) 메모리에 오직 하나의 프로세스가 올라온 것 (I/O 작업이 일어나면 대기) ✅ 멀티 프로그래밍(메모리 관점) 메모리에 여러 개의 프로세스가 올라온 것 (I/O 작업 대기 시, 다른 프로세스 실행) ✅ 멀티 테스킹메모리에 올라온 여러 프로세스들을 번갈아가며 짧게 실행시키며 동시에 실행시키는 체감 ✅ 멀티 프로세싱(CPU 관점) CPU가 여러 개 있는 것을 멀티 프로세서 라고 하며, 멀티 프로세서로 작업하는 것을 멀티 프로세싱 이라고 한다. 과거-> 유니 프로그래밍 + 스와핑 방식1. 메모리에 하나의 프로세스를 올려 처리 한 후, 저장장치에 저장2. 다른 저장장치의 프로세스를 메모리에 올려 CPU 처리3. 스와핑이란 하나의 프로세스가 마무리되면 저장장치로 내리고 새로운 프로세스 메모리에 올리는 기법 현재-> 멀티 프로그래밍 + 멀티 프로세싱 방식1. 메모리에 여러 프로세스가 올라오고2. 시분할 처리를 통해 각각의 프로세스 짧은 시간동안 교대로 처리  📌 PCB운영체제는 여러 개의 프로세스를 전부 관리하고 공평하게 실행해야 한다.프로세스 관리는 PCB(Proccess Control Block) 를 생성하여 연결리스트의 자료구조로 관리한다. 프로세스 종료 시에는 연결리스트에서 해당 PCB를 제거한다.  ✅ PCB 구조1. 포인터: 부모, 자식 프로세스에 대한 포인터를 저장 - 프로세스 계층 구조 파악 및 프로세스 종료 시, 프로세스 상태 추적 가능2. 프로세스 상태: 현재 어떤 상태에 있는지 나타내는 정보 (생성, 준비, 실행, 대기, 완료)3. 프로세스 ID: 프로세스 식별자 저장 - 프로세스는 고유한 PID를 가짐 - 프로세스 구분하는데 사용되며 시스템 내에 유일해야 함4. 프로그램 카운터: 다음에 실행될 명령어의 주소를 저장 - 현재 실행 중인 명령어의 다음 주소를 저장 - Context Switch가 발생하면, 해당 프로세스가 진행해야 할 명령어의 주소로 복구5. 레지스터 정보: 프로세스가 실행될 때 사용된 레저스터 정보 - 프로세스 중단, 전환 시, PCB에 레지스터 값 저장한 후, 다시 실행될 때 복구6. 메모리 관련 정보: 프로세스가 메모리에 저장된 위치 정보 - 프로세스가 사용하는 메모리 영역(코드, 데이터, 스택, 힙,,)과 주소를 관리 - 가상 메모리 시스템에서 중요 - 프로세스 간 메모리 영역 분리7. CPU 스케줄링 정보: 우선순위, 최종 실행시간, 점유 시간 등 CPU를 얼마나 효율적으로 사용할 지에 대한 정보8. I/O 상태 정보 : 프로세스가 현재 어떤 입출력 작업을 수행 중인지에 대한 정보9. 열린 파일 목록(Open File List) : 현재 열고 있는 파일들의 목록 관리  📌 프로세스 상태1. 생성 (New): 메모리에 프로그램 적재 요청 - PCB 생성2. 준비 (Ready): CPU 자원 할당을 위해 기다리는 상태3. 대기 (Waiting): 입출력 요청 시, 입출력이 완료될 때까지 대기하는 상태 - 입출력 완료까지 CPU 대기는 비효율적 - 입출력을 기다리는 것은 대기 상태로 두고 CPU는 다른 작업 (시스템 자원 낭비 최소화) - 입출력이 완료되면 준비 상태로 전환4. 실행 (Running): 스케쥴러에 의해 CPU를 할당받아, 부여된 시간만큼 실행되는 상태 - CPU 개수만큼 실행 프로세스가 생성 - 부여된 시간을 초과하면 CPU를 강제로 빼앗으며 준비 상태로 전환. - 실행 도중, 입출력 요청을 하면 다시 준비 상태로 전환5. 완료 (Terminated): 프로세스 종료 - 메모리에서 데이터 제거 및 PCB 제거  📌 컨텍스트 스위칭프로세스를 실행 중인 상태에서 다른 프로세스를 실행하기 위해 실행중인 프로세스 상태를 저장하고 교체운영체제에 의해 실행 중인 프로세스의 내용이 PCB에 수정되고, 다음 프로세스의 PCB 내용대로 CPU가 세팅 됨.  ✅ 과정1. 프로세스 A의 CPU 점유 시간 초과2. 인터럽트 발생3. CPU의 레지스터 값 등을 PCB A에 저장4. PCB B를 참조해서 이전 프로세스 B의 작업을 이어감 - 프로그램 카운터(다음에 실행될 명령어 주소)를 통해 이어서 명령어 실행 가능5. 프로세스 B의 CPU 점유 시간 초과6. 인터럽트 발생7. CPU의 레지스터 값 등을 PCB B에 저장  📌 프로세스 생성과 종료 프로세스 생성1. .exe 실행2. 코드 영역, 데이터 영역를 메모리에 올려 스택과 힙 구조의 공간을 확보.3. PCB를 만들어서 값을 초기화컴퓨터 부팅 시에 0번 프로세스가 한번만 생성되며, 나머지 실행되는 모든 프로세스는 fork()로 복사하여 자식프로세스를 생성한다.exec()함수를 통해 자식 프로세스의 코드를 복사된 부모 프로세스의 코드에 덮어쓸 수 있다. #include <stdio.h> #include <unistd.h> int main() { int pid; pid = fork(); // 부모 프로세스는 pid = 1; // 자식 프로세스는 pid > 1; // 실패 시 -1 리턴 if(pid == 0){ // 자식 execlp("InternetBrowser", "0", NULL); exit(0); } else { // 부모 wait(NULL); printf("인터넷 브라우저 닫힘"); exit(0); } }1. 해당 프로세스를 fork()를 통해 부모와 자식 프로세스는 동일한 코드를 갖고 있는다. (pid는 서로 다름)2. CPU 스케쥴링에 따라 프로세스가 실행된다.3. 만약 부모 프로세스가 먼저 실행되면, 조건문에 의해 else절이 실행4. wait() 함수는 exit() 신호가 오기 전까지 하위 코드를 실행하지 않음5. 스케쥴링에 의해 자식 프로세스로 스위칭6. if절이 실행되어 execlp()를 통해 InternetBrowser 프로세스가 실행7. 인터넷 브라우저 실행에 실패할 경우, exit() 함수가 실행 (성공 시, InternetBrowser 프로세스 실행)8. 스케쥴링에 의해 부모 프로세스로 스위칭9. 자식 프로세스의 exit() 신호로 wait() 함수를 통과하여 하위 코드가 실행exit(): 자식 프로세스가 부모 프로세스에게 정상 종료를 알리는 함수부모 프로세스는 자식 프로세스의 exit status를 읽고 자식 프로세스를 정리❗ 부모 프로세스가 자식 프로세스보다 먼저 종료되거나, 자식 프로세스의 비정상 종료 시 좀비 프로세스라고 부른다.  📌 쓰레드프로세스가 생성될 때마다 PCB와 메모리(코드, 데이터, 스택, 힙 등)영역을 만들어줘야 한다. 웹브라우저의 탭이 추가될 때마다 프로세스의 복사가 계속해서 이루어진다면 시스템 자원의 낭비가 점차 늘어난다.=> 하나의 프로세스 안에 1개 이상의 쓰레드를 생성.운영체제는 프로세스 내 쓰레드 단위로 관리 비교1. 안정성: 프로세스는 독립적이기 때문에 다른 프로세스의 영향을 받지 않지만 쓰레드는 자원을 공유하기에 프로세스에 문제가 생기면 모든 프로세스에 영향을 끼친다.2. 속도와 자원: 각 프로세스는 IPC를 통해 다른 프로세스와 통신을 해야하니 오버헤드가 크다. 쓰레드간에 통신은 자원이 공유되니 오버헤드가 적다.  📌 더 찾아본 점❓프로그래밍 개념 구분?❓멀티 프로그래밍과 멀티 태스킹의 차이?✅ 멀티 프로그래밍은 메모리 관점에서 여러 프로그램을 메모리에 올려두고 CPU가 필요할 때마다 실행멀티 테스킹은 CPU 관점에서 여러 작업을 빠르게 전환(시분할)하며 동시에 작업하는 것처럼 보임 ❓`exec()`함수는 무엇인가?✅ 자식 프로세스가 새로운 프로그램을 실행할 때, 자식 프로세스의 코드, 데이터, 힙, 스택 등을 새로운 프로그램으로 덮어쓰는 함수.- 자식 프로세스의 메모리 공간을 새로운 프로그램으로 대체하며 exec() 이후에는 자식 프로세스 코드가 실행되지 않음.- execl(), execp(), execv(), execvp(), execlp() 등이 exec()함수의 계열에 속한다.- 예제 코드에서 execlp("InternetBrowser", "0", NULL); 가 성공적으로 실행되면 자식 프로세스 코드가 새로운 프로세스로 대체되었기에, 하위 exit(0) 코드는 영영 실행되지 못하지만 실패 시에는 하위 코드가 실행된다. ❓좀비 프로세스는 무엇인가?✅ 부모 프로세스가 자식 프로세스의 종료 상태를 수거하지 않아 남아있는 프로세스- 실행되지 않은 채로 PCB만 남아있음- 메모리를 계속 점유하고 있어, 시스템 자원을 낭비함 ❓쓰레드는 어떤 정보를 포함하고 있는가?✅ TCB(Thread Control Block)에 쓰레드의 상태 및 제어 정보를 저장1. TID & PID: 쓰레드 식별 고유 ID, 쓰레드가 속한 프로세스 ID2. State: 쓰레드의 실행 상태 (`Running`, Waiting, Ready, Terminated)3. Register Contents: 스위칭 복원을 위한 CPU 레지스터 정보4. Program Counter: 쓰레드 마지막 명령어 주소5. Stack Pointer: 쓰레드 스택에서 현재 실행 중인 함수 위치 포인터6. Priority : 여러 쓰레드 동시 실행 시, 우선순위 

시스템 · 운영체제운영체제'워밍업클럽CS감자

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

채널톡 아이콘