블로그

감자

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

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

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

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

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

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

대롱대롱

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

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

cs자료구조운영체제미션

대롱대롱

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

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

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

강동훈

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

💻 운영체제 들어가기📌 개요개인용 컴퓨터: Windows / MacOS대형 컴퓨터, 서버: Unix / Linux스마트폰, 테블릿: Android / IOS스마트워치, 냉장고, 세탁기: Embeded OS ❓컴퓨터는 운영체제가 있어야 동작하는가?✅ 없어도 동작은 가능하지만 처음 설계를 제외한 다른 기능 추가가 불가(유연성 X) - 전화기(통화만 가능) / 스마트폰(업데이트 및 설치) 운영체제가 하는 일1⃣ 프로세스 관리 (CPU)→ 여러 프로그램을 동시에 실행하고, CPU 자원을 효율적으로 배분2⃣ 메모리 관리 (메모리)→ 실행 중인 프로그램이 필요한 메모리를 할당하고 관리3⃣ 하드웨어 관리 (하드웨어)→ 키보드, 마우스, 프린터 등 장치를 제어하고 하드디스크 특정 영역의 데이터 저장관리4⃣ 파일 시스템 관리 (파일)→ 하드디스크의 효율적인 파일 저장과 관리 📌 역사🗓 1940년대- 미국 펜실베니아 대학교에서 미국 탄도 계산을 위해 30톤 무게의 전자 디지털 계산기 발명- 종이에 수기로 작성하여 테스트 진행 후, 수동으로 스위치와 배선을 연결하여 프로그래밍- 펀치 카드를 이용한 입출력은 속도가 느리며 진공관의 유지 보수 비용도 크다.- 하드웨어의 비용이 비싸기에, CPU의 효율적인 활용이 중요해진다. 🗓 1950년대- 아주 작은 크기의 직접회로 개발.- 컴퓨터가 삽입된 펀치카드를 직접 읽어 계산하고 프린터로 출력.- 기존 과정 (오버헤드 과다 발생)1. 프로그래머가 오퍼레이터에게 펀치카드 전달.2. 펀치카드를 컴퓨터에 삽입 후, 결과 도출.3. 오퍼레이터가 결과를 프로그래머에게 전달.- 싱글 스트림 배치 시스템 (Single-stream Batch Processing Systems)1. 오퍼레이터에게 여러개의 펀치카드를 전달.2. 컴퓨터는 다수의 펀치카드를 한 번에 하나씩 읽어가며 결과를 도출- 입출력 관리자(I/O Device Controller) 를 개발하여 입출력 중에도 CPU 계산 가능- 입출력이 끝나면 CPU에게 인터럽트 신호를 주고, CPU는 신호를 받아 처리- 출력은 CPU와 입출력 관리자 분리가 가능하지만, 입력은 작업이 완료되어야지만 처리가 가능하여 어쩔 수 없이 CPU의 대기가 필요해짐. 🗓 1960년대- 시분할 시스템(Time Sharing System)- CPU 시간을 여러 개의 프로그램에 분배하여 동시에 실행되는 것 같은 효과 제공- 하나의 컴퓨터에 다수의 터미널을 연결시켜, 여러 사용자의 작업이 가능해짐.- 벨 연구소에서 유닉스(UNIX) 운영체제 개발- 멀티 프로그래밍: 여러 개의 프로그램 동시 실행 가능- 다중 사용자: 여러 사용자가 한 대의 컴퓨터를 공유하여 사용- 트리구조 파일 시스템: 루트("/")를 기준으로 파일과 디렉터리가 계층형 구조로 정리- 보안 및 접근 권한: 파일, 디렉터리에 대한 권한('r', 'w', 'x') 설정 가능- 높은 이식성: 다양한 하드웨어에 쉽게 적용 가능- 쉡 기반 CLI 제공: GUI가 아닌 CLI를 통해 운영- 여러 프로그래밍 간 메모리 영역을 침범하는 문제 발생 🗓 1970 ~ 1980년대- 개인용 컴퓨터의 등장(애플 맥킨토시, MS DOS)- GUI(Graphic User Interface)의 등장 🗓 1990 년대- GUI 환경의 개인용 컴퓨터의 보급으로 다양한 응용 프로그램 등장- Excel, Word - Winow 운영체제의 대중화- UNIX를 기반으로 한 오픈소스 LINUX 운영체제의 등장➡ CPU의 효율성과 오버헤드의 감소를 위한 고민이 끊임없이 이루어짐. 📌 구조1. 사용자는 인터페이스를 통해 커널에 접근- GUI: 그래픽으로 커널과 상호작용으로 일반 사용자도 접근 가능- CLI: 텍스트 형태의 명령어로 커널과 상호작용 2. 어플리케이션을 시스템 콜을 통해 커널 접근어플리케이션이 직접 커널에 접근하여 하드 디스크에 파일을 저장할 경우, 중요한 데이터의 손실이 발생할 수 있다. 이를 방지하기 위해 시스템 콜을 이용하여 운영체제를 통해 하드디스크의 빈 공간에 데이터를 저장한다. 3. 커널이 하드웨어에 접근드라이버를 통해 커널은 하드웨어에 접근할 수 있다. 커널이 모든 하드웨어에 대한 드라이버를 저장할 수는 없으니, 하드웨어의 제조사에서 드라이버를 만들어 제공하고 커널이 이를 설치하면 접근 가능하다. 📌 컴퓨터 하드웨어와 구조기존에는 하드웨어로 프로그램을 만들었기에, 프로그램의 수정마다 배선와 스위치를 수동으로 변경해야 한다. ✅ 폰 노이만 구조 (Von Neumann Architecture)1. 프로그램 내장 방식- 프로그램과 데이터가 같은 메모리에 저장- 실행한 명령어를 CPU가 메모리에서 읽어와 수행2. 순차적 명령 실행- CPU는 한 번에 하나의 명령어를 순차적으로 실행3. 메모리, CPU, 입출력 장치로 구성- CPU(Central Pocessing Unit)1. 산술논리 연산장치: 실제로 데이터 연산을 담당2. 제어장치: 모든 장치들의 동작을 제어하고 지시3. 레지스터: CPU내에 계산을 위해 임시적으로 저장하는 공간- Memory1. RAM: 랜덤으로 데이터를 읽어도 속도는 일정, 휘발성2. ROM: 전력이 끊겨도 데이터 저장이 되지만 수정 불가 (BIOS)- 입출력 장치: 사용자와 컴퓨터 간 데이터 입/출력 관리 📌 컴퓨터 부팅 과정1. 컴퓨터의 전원을 누름2. ROM에 저장된 BIOS 실행1. CPU, RAM, 하드웨어에 이상 여부를 확인2. 이상이 없다면 하드디스크에 저장된 마스터 부트 레코드를 메모리로 올림3. 운영체제 동작3. 모니터에 운영체제의 동작을 실행 ✅ 마스터 부트 레코드(Master Boot Record, MBR)하드디스크, SSD, USB등 저장장치에서 부팅과 파티션 정보를 관리하는 0번 섹터1. 부트 로더(bootloader) 저장 - BIOS가 MBR을 읽고 부트 로더를 실행하여 운영체제로 부팅2. 파티션 정보 저장- 디스크의 파티션 구조를 관리 (최대 4개의 파티션)3. 디스크 식별- 디스크의 고유한 식별 정보를 포함 📌 인터럽트✅ 폴링(Polling)CPU가 지속적으로 장치나 하드웨어의 상태를 확인하여 필요한 작업을 처리하는 방식.- CPU의 비효율적인 자원 소모- 다수의 장치를 관리할 수록 CPU는 주기적으로 다수의 장치를 확인해야 하므로 다른 중요한 작업의 처리 속도가 느려질 수 있다.- 상태 확인 주기와 타이밍- 처리가 완료되어도 다음 폴링 주기까지 기다려야 하며 사용자 응답 또한 지연된다. ✅ 인터럽트(Interupt)프로세서가 현재 실행 중인 작업을 중단하고, 중요한 작업이나 이벤트를 즉시 처리- 하드웨어 인터럽트 - 시스템 외부의 하드웨어 장치에서 발생한 이벤트에 반응- 소프트웨어 인터럽트 - 소프트웨어, 프로그램에 의해 발생   

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

rhkdtjd_12

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

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

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

rhkdtjd_12

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

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

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

rhkdtjd_12

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

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

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

빠타박스

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

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

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

수뼈

인프런 워밍업 클럽 스터디 3기 - CS 전공지식 <셋째 주 발자국>

[Day 11~13]Algorithm정렬 알고리즘(Sorting Algorithm)개요데이터셋이 주어졌을 때, 이를 사용자가 지정한 기준에 맞게 정렬하여 출력하는 알고리즘.참고: 정렬 알고리즘은 왜 배워야 할까?대표적인 정렬 알고리즘버블 정렬(Bubble Sort) (Day 09 참고)선택 정렬(Selection Sort) (Day 09 참고)삽입 정렬(Insertion Sort)개요 및 특징자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교해, 자신의 위치를 찾아 삽입하는 알고리즘(참고).구현이 쉬운 편에 속하나 성능은 O(n^2)로 매우 낮음.구현하기첫 번째 구현: 강의 보며 구현 (Done)두 번째 구현: 강의 안 보고 구현하다 기억 안 나면 강의 확인하며 구현 (Done)세 번째 구현: 강의 안 보고 구현하다 기억 안 나면 과거에 내가 짠 코드 확인하며 구현 (Done)네 번째 구현: 아무것도 안 보고 구현 (Done)마지막 구현: 익숙한 파이썬으로 구현(+리팩토링(비파괴적 연산, 예외처리)) (Done)병합 정렬(Merge Sort)개요 및 특징Array를 정렬의 최소 단위(=1개)로 쪼개 정렬한 결과를 병합하여 정렬하는 알고리즘.Devide and Conquer 기법과 재귀 함수를 이용해 정렬함(참고).참고: 여기서 설명하는 건 mergeSort()가 아니라 merge()다. 저걸 누가 헷갈리냐고? NADA재귀적으로 구현해야 하므로 이해와 구현이 어려우나, 성능(O(nlogn))이 매우 높음.구현하기첫 번째 구현: 강의 보며 구현 (Done)두 번째 구현: 강의 안 보고 구현하다 기억 안 나면 강의 확인하며 구현 (Done)세 번째 구현: 강의 안 보고 구현하다 기억 안 나면 과거에 내가 짠 코드 확인하며 구현 네 번째 구현: 아무것도 안 보고 구현 마지막 구현: 익숙한 파이썬으로 구현(+ 리팩토링) 퀵 정렬(Quick Sort)개요 및 특징피벗(Pivot)을 기준으로 작은 값과 큰 값을 분할하며 정렬하는 알고리즘.Devide and Conquer 기법과 재귀 함수를 이용해 정렬함(참고).pivot에 따라 Θ(nlogn), O(n^2)로, 안정적으로 O(nlogn)의 성능을 뽑아내는 병합 정렬이 더 좋음.하지만, 같은 O(nlogn)이라면 Locality of Reference 원리 때문에 더 빠름.구현하기첫 번째 구현: 강의 보며 구현 (Done)두 번째 구현: 강의 안 보고 구현하다 기억 안 나면 강의 확인하며 구현 세 번째 구현: 강의 안 보고 구현하다 기억 안 나면 과거에 내가 짠 코드 확인하며 구현 네 번째 구현: 아무것도 안 보고 구현 마지막 구현: 익숙한 파이썬으로 구현(+ 리팩토링) Operating System가상 메모리(Virtual Memory)개요실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술(혼공컴운 402p.)가상 메모리 시스템에서 MMU는 동적 주소 변환(Dynamic Address Translation; DAT)을 통해 RAM의 물리 주소와 스왑 영역을 하나의 가상 주소로 보고 관리함(참고).가상 주소-물리 주소쌍은 매핑 테이블로 관리됨(참고).프로세스 입장에서 관리 편의성 향상을 위해 생성된 가상의 공간이므로 이론상 크기는 ∞이자만, 실제로는 CPU 비트 수에 따라 OS에 의해 적정 크기로 결정됨(참고).하지만 사용자의 성향에 따라 수동 조정도 가능함(참고).OS가 실행할 프로세스 외 프로세스를 스와핑(Swapping)하는 방식으로 구현되어 있음.주소 공간 분할 방식세그멘테이션(Segmentation) 개요 및 특징프로세스를 세그멘트(Segment)로 잘라서 메모리에 배치하는 방법.MMU는 Segment Table을 통해 DAT하여 각 프로세스의 논리 주소를 물리 주소로 변환함(참고: 1, 2).Segmentation Table이 아님!메모리의 가변적 분할+프로세스 내 각 영역의 메모리 접근 보호 용이성 vs. 외부 단편화DAT 과정 (참고: 1, 2, 3)프로세스가 코드를 실행해 필요한 명령어와 데이터의 가상 주소를 CPU에 전달함.CPU가 MMU에게 특정 논리 주소의 물리 주소 정보를 요청함.MMU가 Segment Table의 Base Address와 Bound Address를 통해 해당 가상 주소와 연결된 물리 주소를 찾음.MMU가 가진 STBR을 통해 S.T.의 물리 메모리상 시작 위치를 찾음.S.T.상 해당 프로세스의 가상 주소가 몇 번째 세그먼트에 위치해 있는지 찾음.세그먼트 테이블의 해당 인덱스로부터 찾은 Base Address와 Bound Address 값을 참고해 진행.가상 주소 값 < Bound Address 값이라면 Base Address 값+가상 주소 값으로 물리 주소 값을 알아냄.가상 주소 값 > Bound Address 값이라면 프로세스를 종료시킴.페이징(Paging) (참고: 1, 2, 3, 4)개요 및 특징프로세스의 논리 주소 공간을 페이지(Page) 단위로, 물리 주소 공간을 프레임(Frame)으로 자른 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법(혼공컴운 403p.)페이지 테이블의 크기가 너무 커져서 메모리를 낭비하지 않도록 주의하는 것이 관건.메모리의 효율적 관리 vs. 내부 단편화DAT 과정 (참고: 1, 2, 3)프로세스 코드 실행 ... CPU의 특정 논리 주소의 물리 주소 정보 요청까지는 동일함.MMU가 Page Table을 통해 해당 가상 주소와 연결된 물리 주소를 찾음.해당 가상 주소의 Page Number 및 Offset을 통해 고유 Page Table에 접근함.Page Number = 가상 주소 / 페이지 크기, Offset = 가상 주소 % 페이지 크기PTBR을 통해 P.T.의 물리 메모리상 시작 위치를 찾음.S.T.상 페이지 번호로 프레임 번호를 찾고, 해당 프레임의 시작 주소에 Offset을 더해 변환함.페이지드 세그멘테이션(Paged Segmentation)개요 및 특징프로그램을 Segment로 나누고, 이를 Page들의 집합으로 구성하는 방식(참고).DAT 시 외부의 세그먼트 테이블과 내부의 페이지 테이블로 이루어진 두 단계 테이블을 이용함(참고).세그먼트 테이블 변경 사항보호 비트(Protection Bit) 추가(참고).Base Address -> Page NumberBound Address -> 해당 세그먼트의 페이지 개수Paging과 Segmentation의 장점 vs. 페이지 이중 참조로 인한 Overhead따라서, 현대 OS에서는 페이징과 페이지드 세그멘테이션을 혼용하여 사용함.DAT 과정 (참고: 1, 2, 3)프로세스 코드 실행 ... CPU의 특정 논리 주소의 물리 주소 정보 요청까지는 동일함.S.T.상 해당 프로세스의 가상 주소가 몇 번째 세그먼트에 위치해 있는지 찾음.영상에서 "0x12300 번지이니 1번 세그먼트구만!"이라는 설명은 예시일 뿐, 번지 수와 세그먼트 번호 간의 관계는 없음(참고).해당 세그먼트의 접근 권한 위반 여부 확인위반이라면 해당 요청을 한 프로세스를 Shutdown시킴.페이지 넘버를 통해 프레임 넘버를 가져 온 후, 해당 프레임으로 접근함.Invalid라면 Swap 영역에서 가져옴.해당 프레임의 시작 주소로부터 offset을 더해 원하는 데이터에 접근함(참고: 1, 2).  [Day 14]Algorithm메모이제이션(Memoization) (참고: 1, 2, 3)정의 및 특징함수 호출의 결과를 캐싱하고 동일한 입력이 다시 발생할 때 캐싱된 결과를 반환하는 하향식 접근(참고).공간 복잡도-시간 효율성 간 Trade-off 관계에 있음.계산 결과를 저장하기 위한 추가 메모리가 필요하지만, 일반적으로 중복 계산 제거로 얻는 시간 효율성(Time Effeciency)이 훨씬 높으므로 자주 활용됨.메모이제이션 예제: 피보나치 수열(참고).메모이제이션 없이 구현메모이제이션 활용해 구현Operating System입출력 장치(I/O Device)개요새로운 데이터를 받아들여서 중앙 처리기로 보내고 다시 처리 결과를 받아 알아볼 수 있는 형태로 바꾸어 주는 장치(참고).CPU와 메모리 버스에 직접 연결되지 않고, 간접적으로 연결되면 전부 I/O Device!(참고)유저가 시스템과 소통할 수 있게 하는 장치로, 다른 장치에 비해 처리 속도(=전송률)가 매우 느림.이를 보완하는 기술로 Buffering과 Spooling이 존재함(참고: 1, 2, 3).각 장치는 각자의 Device Controller를 통해 데이터를 보내고, I/O Bus를 통해 CPU를 거쳐 RAM에 도달함.DMA(Direct Memory Access)를 추가해 CPU 없이 I/O Controller가 Event 등 데이터를 RAM에 직접 전달하는 입출력 방식, 즉 Memory Mapped I/O로 확장됨(참고).각 Device의 공통 내부 구조 (※ I/O Device는 종류별, 브랜드별, 제품별로 내부 구조가 천차만별임)Device Controller (참고: 1, 2, 3)System Bus와 장치 사이에서 데이터를 송수신할 수 있도록 Interface 역할을 하는 장치.'해당 I/O 장치를 전담으로 처리하는 작은 전용 CPU 같은 존재'라 이해하면 좋음!(참고)CPU와 I/O Device 간 통신 중개, 오류 검출, 데이터 버퍼링 등의 역할을 수행함.장치 종류에 따라 장치 내부에 있을 수도, 외부(본체)에 있을 수도, 둘 모두에 분산되어 있을 수도 있음.장치의 위치보다 장치의 기능을 위주로 기억하는 것이 핵심!Buffer입출력 장치와 응용 프로그램 사이의 데이터를 임시로 저장하는 메모리 공간.일반적으로 이중 버퍼링, 즉 입력 버퍼와 출력 버퍼를 사용하는 방식이 일반적임.RegistersCPU가 장치 상태를 확인하거나 명령을 보낼 때 사용하는 메모리 공간.데이터 레지스터, 상태 레지스터, 제어 레지스터로 이루어져 있음(참고).데이터 전송 단위에 따른 분류 (※ 한 장치에서도 기능별로 달리 작동하는 기기도 있음) (참고: 1, 2, 3)캐릭터 디바이스(Character Device)정의 및 특징Fixed Size Block로 정보를 기록하는 장치로, Event의 순서가 상관없는 장치에 사용함.B.D.에 비해 데이터 전송 단위가 작음종류마우스(Mouse)정의 및 특징2차원 평면에서의 움직임을 컴퓨터에 전송하는 포인팅 디바이스의 일종.일반적으로 2차원 평면상에서 위치 정보(x, y)와 버튼 클릭 정보, 스크롤 동작 등을 전달함.현대 GUI 기반 OS에서 가장 대중적인 입력장치로 쓰이고 있음.Event 처리 및 전달 과정 (※ 커서 이동 기준)Ball Mouse사용자로부터 Event 발생Optical Mouse 키보드(Keyboard)블록 디바이스(Block Device)개요 및 특징C.D.에 비해 데이터 전송 단위가 큼종류HDD(Hard Disk Drive)정의 및 특징비휘발성, 순차접근이 가능한 컴퓨터의 보조 기억 장치(참고).여러 개의 플래터(Platter)가 회전하며 데이터를 저장하고 읽는 자기식 저장장치임.Flash MemoryCPU와 I/O Device 간 통신 과정MMID (※ 강의에 소개된 방식) PMID  [Day 15]Algorithm타뷸레이션(Tabulation) (참고: 1, 2, 3)정의 및 특징문제를 하위문제로 나눠 계산한 결과를 테이블에 저장한 후, 해당 테이블을 연산에 활용하는 상향식 접근(참고).메모이제이션은 계산 및 저장, 호출을 그때그때 하고, 타뷸레이션은 계산 및 저장을 먼저 해두고 나중에 한꺼번에 호출한다는 게 가장 큰 차이!재귀 호출을 하지 않으므로 공간 복잡도도 낮고, Call Stack 생성/제거 Overhead가 없어 T.E도 높음.반복문의 Overhead는 Loop Unrolling 등의 추가 최적화 여지가 있어 시간 효율성 측면에서는 반복문이 효율적임!단, 일부 상황(예: TSP)에서는 메모이제이션의 시간 효율성이 더 높을 수 있음.재귀적 풀이 과정이 더 가독성이 좋을 때, 계산 가능한 경우의 수에 비해 실제 연산에 쓰이는 연산값은 매우 적을 때 등구현하기타뷸레이션 예제: 피보나치 수열 Operating SystemFile System개요 및 특징 컴퓨터에서 파일이나 자료를 쉽게 발견 및 접근할 수 있도록 보관 또는 조직하는 체제(참고).파일 관리자가 Block 단위로 저장된 Block Device에 Byte 단위로 접근할 수 있도록 변환함. 파일 시스템의 기능파일 및 폴더 생성, 수정, 삭제파일 권한 관리무결성 보장백업 및 복구암호화(Encryption)File Descriptor개요 및 특징Process가 특정 파일에 접근할 때 사용하는 추상적인 값(참고).  [Week Review]일주일 동안 공부하면서 배우고 느낀 점독학으로 CS 공부를 하는 나름의 습관에 감이 잡힌 것 같다.마지막 주 시작을 지난주에 미처 다 이해하지 못한 메모리 분할 방식에 대해 공부하면서 시작했다. 처음엔 정말 이해가 가지 않았지만, 강의를 계속 반복 학습하고, 관련 자료를 찾아보고, 이해가 안 되면 ChatGPT와 충분한 질답을 주고받으면서 공부했다.위 일련의 과정에서 파편화된 지식을 계층적으로 재구성해 정리하는 방법, Hallucination이라는 태생적 한계를 지닌 LLM을 공부에 활용할 때 어느 정도로 참고해야 하는지, 신용할 만한 정보는 어디에 많이 있는지 등에 관한 감이 잡혔다.어려웠던 점강약 조절이 너무 어렵다...감자님 강의를 보면 해당 주제에 대한 감은 오지만 지식이 체계적으로 쌓이는 느낌은 들지 않는다. 이건 감자님 강의가 입문자들을 위한 쉬운 설명에 주안점을 두고 있어서 그런 거지 단점이 아니다. 오히려 나 같은 비전공자들로 하여금 '뭘 공부해야 하지?'에 대한 가이드를 준다는 점에서 최고다.근데 내 성격과 몸이 문제다. 지식을 대충 말고 제대로 정리하다 보니 끝이 없다. 이러다간 이번 주는 발자국을 제때 완성 못하고 스터디도 준비 못할 것 같다.어찌저찌 마무리했다... 휴... 원래 내 방식은 노트 정리를 탑다운으로 틀만 잡고 그 후부터는 바텀업으로 디테일을 계속 파고드는 스타일이었는데, 탑다운으로 강의 내용을 어느 정도(한 60% 정도?) 머릿속에 집어넣기 전까진 정리라는 행위를 하지 않기로 했다. 그 후에 머릿속에 있는 내용을 최대한 있는 대로 정리한 후에 바텀업으로 디테일을 파고들었다. 시간상 정리하지 못한 부분도 있긴 하나 머릿속엔 있기 때문에 반쯤 성공이라고 자축해 본다.향후 목표나만의 CS 완전 정복 로드맵 마스터하기이번 워밍업 클럽은 내 첫 CS 공부였다. 이전까지는 주먹구구식으로 그때그때 필요한 정보만 공부하다 보니 지식이 계속 휘발되는 느낌이었다. 그런데 이번 CS 공부를 하면서 오직 CS 하나만을 집중적으로 공부했다 보니 왜 CS 공부를 해야 하는지 그 이유가 분명해졌다.나는 언젠가 창업을 하고자 한다. 창업해서 서비스를 운영하려면 모르긴 몰라도 아득히 높은 수준의 갖은 능력이 필요하리라 여겨진다. 그러나 요즘은 K-MOOC나 KOCW, edX 등을 통해 전공 강의조차도 무료로 들을 수 있는 시대이니 느리더라도 꾸준히 멈추지 않고 나아간다면 분명 승산이 있다고 생각한다.워밍업 클럽 마무리 관련 소감워밍업 클럽 전반 관련네트워킹이 제대로 이뤄지지 못하고 각자도생하는 느낌이어서 아쉬웠다. 워밍업 클럽이 '특정 목표를 가진 사람들을 모아놓자' 딱 거기에 의의가 있는 프로그램이라면 할 말 없지만, 운영 쪽에서 개별 스터디를 장려하는 유인(스터디 과정 제출 시 가산점, 놀러 와서 커피 쿠폰 뿌리고 가기 등)이 있었다면 훨씬 좋았을 것 같다.감자님 강의 관련 (※ 대문자 T 주의해 주세요 감자님 ㅠㅠㅠ 나쁜 마음은 없습니다ㅠㅠㅠㅠㅠㅠㅠ)자료구조 및 알고리즘 강의는 만점을 줘도 아깝지 않은 강의였다고 생각한다. 자료구조이나 알고리즘 모두 시각화가 정말 중요하다고 생각하는데, 단순히 달달 외우는 게 아니라 생각할 수 있는 힘을 기르게 해주신 훌륭한 강의였던 것 같다.운영체제 강의는 아쉬움이 남는다. (내게 이런 평가를 내릴 만큼의 지식이 있기는커녕 그 1%도 안 되지만) 내용상 잘못 설명하신 부분이나 실제로는 다르지만 같다고 퉁치고 넘어가는 내용들이 가끔 있었다. 나만 해도 지난 3주 동안 강의의 큰 오류를 2개나 찾았다. 강의 수강 대상자가 입문자라면 쉬운 설명만큼이나 내용의 정확성도 중요하다고 생각한다. 초보들은 처음 배운 지식을 수정하기가 매우 어렵기 때문이다.스터디 관련1주차부터 2주차, 그리고 오늘까지 CS 스터디를 모집해 운영해 왔다. 매주 일요일 2시에, 워밍업 클럽 일정대로 공부한 내용을 공유하는 스터디였는데 이탈률도 높고 남은 사람들의 참여율도 저조했다. 더 이상 말은 안 하겠지만... 많이 실망스러웠다.그래도 공유해야 할 내용이 있는 만큼 내가 이해한 내용을 하나라도 더 매끄럽게 설명할 수 있게 노력한다든지, 정확한 내용이 맞는지 더블, 트리플, 쿼드러플 체크를 반복했던 점은 좋았다. 혼자 공부할 때도 늘 그렇게 하고 있었다는 게 문제지만.나 자신 관련우선 나 자신에게 고생했다고 말하고 싶다. 어찌 됐건 수료를 했으니까. 얻은 것들도 무수히 많고. 무엇보다 막연하기만 했던 'CS란 뭘까?'에 대한 해답과 '비전공자인 내가 CS를 감히 도전해도 될까?'에 대한 해답을 얻은 게 긍정적이다.하지만, 개인적으로 내가 나에게 느꼈으면 하는 감정은 답답함과 공포였다. 근데 둘 모두 전혀 없다. '비전공자여도 전공자들을 찍어누를 만큼의 지식과 경험, 능력을 갖고 싶다'는 다소 허황된 꿈이 여기서 현실로 다가왔어야 했는데... 아쉽다.

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

채채

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

학습 내용운영체제프로세스는 메모리 관리자를 통해 메모리에 접근 메모리 관리자: 프로세스 요청이 있을 때 그에 맞는 물리 메모리로 연결시켜줌가상 메모리 운영체제(0x0) 영역을 제외한 나머지 영역을 일정한 크기로 분리가변 분할 방식 (세그멘테이션)단점: 외부 단편화고정 분할 방식 (페이징)단점: 내부 단편화단점 보완: 세그멘테이션-페이징 혼용 기법 사용세그멘테이션 장점: 메모리를 가변적으로 분할할 수 있음, 각 영역에대한 편리한 메모리 접근 보호 단점:내부 단편화 발생 변환 과정 CPU에서 논리 주소 전달 메모리 관리자가 이 주소가 몇 번째 값인 확인 베이스 레지스터를 이용해 물리 메모리 내 세그멘테이션 테이블 탐색 세그멘테이션 번호를 인덱스로 베이스 어드레스와 바운드 어드레스 검색 페이징외부 단편화 문제를 해결하기 위해 고안메모리 할당 시 정해진 크기로 나눔장점:관리 쉬움,외부 단편화 현상이 일어나지 않음세그멘테이션 vs 페이징대표 차이점: 페이지 크기가 다름세그멘테이션은 논리 영역별로 나눔. 코드, 데이터, 스택, 힙 영역을 나눌 수 있음각 영역에 대한 공유 쉬움, 메모리 접근 보호 쉬움페이징은 페이지로 나눔. 특정 영역만 공유 및 권한 부여 어려움,오버헤드가 적음 메모리 접근 권한메모리 접근 권한: 메모리의 특정 번지에 부여된 권환 (rwx)코드 영역은 프로그램 그 자체 ⇒ r-x데이터 영역은 일반, 전역, 상수로 선언한 변수 포함 ⇒ rw?x스택/힙 영역 ⇒ rx-페이지드 세그멘테이션 기법세그멘테이션 테이블에 권한 비트 추가 (RW, R, RWE 등) 과정 가상 주소로 몇 번 세그먼트인지 탐색 세그먼테이션 테이블에서 해당 세그먼트의 인덱스 참조 해당 세그먼트가 메모리 접근 권한을 위반하는 지 검사 접근 권한 위반 시 프로세스 종료 위반하지 않으면 페이지 넘버와 페이지 개수를 가져옴 페이지 넘버로 페이지 테이블 접근, 프레임 번호 가져옴 물리 메모리 내 해당 프레임에 접근 그 위치에 페이지 개수를 더해 물리 주소 구함 물리메모리에 해당 프레임이 없다면 스왑 영역에서 물리메모리로 가져옴 지역성 이론공간의 지역성: 현재 위치에서 가까운 데이터에 접근할 확률이 높음시간의 지역성: 최근 접근했던 데이터가 오래 전에 접근했던 데이터보다 접근할 확률이 높음 디멘드 페이징: 조만간 필요할 것 같은 데이터를 메모리로 가져오고 쓰이지 않을 것 같은 데이터는 스왑영역으로 이동함메모리 계층 구조 (CPU 접근 순):레지스터 -> 캐시 -> 메인 메모리 -> 보조 저장 장치스왑가상 메모리 크기 = 물리 메모리 크기 + 스왑 영역스왑 인: 스왑 영역 → 물리 메모리스왑 아웃: 물리 메모리 → 스왑 영역페이지 테이블 기반하여 물리 메모리에서 프레임을 찾을 때 없으면 Page Fault 인터럽트 발생스왑이 필요없는 경우프로세스가 페이지 요청 → 인덱스로 유효 비트와 프레임 넘버 확인 ⇒ 이를 기반으로 물리 메모리 확인 ⇒ 물리 메모리의 프레임 접근 ⇒ 데이터 참조스왑 영역에 있는 데이터 참조프로세스가 페이지 요청 → 인덱스로 유효 비트와 프레임 넘버 확인 → 이를 기반으로 스왑 영역 확인 →물리 메모리에서 빈 공간 확인 → 스왑 영역에 저장된 데이터를 물리 메모리의 빈 프레임에 저장 → 페이지 테이블에서 해당 엔트리의 유효 비트와 프레임 업데이트 → 프로세스에게 데이터 참조 가능하게 함물리 메모리에 빈 공간 없음 → 물리 메모리에서 필요 없는 영역을 스왑 영역으로 이동 → 필요 없는 영역의 페이지 테이블의 유효 비트와 프레임 업데이트 → 물리 메모리에 공간 생김 → 스왑 영역에서 데이터를 물리 메모리로 이동 → 페이지 테이블의 유효 비트와 프레임 업데이트 → 프로세스에게 데이터 참조 가능하게 함페이지 교체 정책메모리가 꽉 찼을 때 어떤 페이지를 스왑 영역으로 보낼 지 결정하는 정책방법1: 무작위로 선택지역성을 고려하지 않아 자주 사용되는 페이지가 선택될 수도 있다성능이 좋지 않다FIFO 방법2: 메모리에 들어온 가장 오래된 페이지 선택FIFO는 공평하지 않음 → 변형해서 쓰임구현 간단, 성능 꽤 괜찮다OPT 방법3: 앞으로 가장 오랫동안 쓰이지 않을 페이지 선택구현이 불가능한 이론적인 방법, 다른 알고리즘과의 성능 비교 시 사용LRU 방법4: 최근 사용이 가장 적은 페이지 선택시간 지역성에 따라 선택,OPT 알고리즘에 근접한 성능 실제 구현 시 접근 비트를 이용해서 LRU에 근접하게 구현빌레이디의 역설: Page Fault를 줄이려고 메모리를 늘려서 프레임 수도 늘렸는데 오히려 Page Fault가 더 많이 발생하는 현상Clock AlgorithmLRU와 가장 비슷하게 구현하는 알고리즘일정 시간마다 모든 페이지의 접근 비트 초기화 (0), 페이지 참조 시 (1)일정 시간마다 페이지의 참조 여부 확인Enhanced Clock Algorithm접근 비트 + 변경 비트까지 사용2차 기획 페이지 교체 알고리즘: 자주 사용되는 페이지에게 기회를 주는 것Page Fault 없이 접근했다면 페이지를 큐의 맨 뒤로 이동시켜 수명을 연장 시켜 줌 (한번만)스레싱: CPU 사용률을 높이려 했지만 오히려 더 떨어지는 상황워킹셋: 메모리에 올라온 페이지는 다시 사용할 가능성 많음 → 하나의 세트로 묶어서 메모리에 올림캐릭터 디바이스 vs 블록 디바이스 캐릭터 디바이스마우스, 키보드, 사운드카드, 직렬/병렬 포트 등데이터 전송 단위: 캐릭터상대적으로 크기가 작음블록 디바이스하드디스크, SSD, 그래픽 카드 등데이터 전송 단위: 블록 (범위)상대적으로 크기가 큼입출력 제어기I/O 명령 → 입출력 제어기에 입출력 작업 맡김, 다른 작업 시버스시스템 버스: 고속으로 작동 (CPU, 메모리 등)입출력 버스: 주변 창지 사용 (고속 입출력 버스 & 저속 입출력 버스 → 속도 차이로 인한 병목 현상 해결)DMA 제어기 Direct Memory Access: 입출력 제어기가 메모리에 접근하기 위해 필요데이터를 직접 메모리 저장, 가져옴Memory Mapped I/O: CPU가 사용하는 메모리 영역과 DMA가 사용하는 메모리 영역을 나누는 것하드디스크구성요소스핀들: 원판(플래터)을 회전시키는 축플래터: 데이터를 저장하는 자기 원판 (2개 이상 존재)헤드: 데이터를 읽고 쓰는 장치, 플래터 표면과 가까이 위치디스크함: 플래터와 헤드가 들어 있는 본체동작 원리플래터는 자성을 이용해 데이터를 0과 1로 저장헤드는 디스크함과 함께 움직이며 데이터를 읽고 씀데이터를 읽기 위해서는:헤드를 원하는 실린더로 이동회전하면서 해당 섹터에 도달하면 데이터 접근플래시 메모리: 블록 디바이스의 또 다른 종류로, 하드디스크보다 더 자주 사용됨장점: 전기적 처리(조용함), 자석에 영향 없음, 내구성 좋음단점: 특정 지점에 데이터 덮어쓰기 불가, 데이터 덮어쓰려면 데이터를 지워야함, 지우기 가능 횟수 제한 등등 파일 시스템파일은 저장장치에 저장됨파일 관리를 위해 파일 시스템이라는 파일 관리자를 둠파일 시스템 기능파일/디렉토리 생성, 파일/디렉토리 수정/삭제,파일 권한 관리,무결성 보장,백업과 복구,암호화데이터 집합 구성에 따른 분류순차 파일 구조, 직접 파일 구조, 인덱스 파일 구조파일 내 블록의 연결에 따른 분류연속 할당:블록들을 디스크에 연속적으로 저장 (실제 사용 X)불연속 할당:디스크의 비어있는 공간에 데이터를 분산 저장 연결 할당:파일의 데이터를 연결 리스트로 관리 인덱스 할당:테이블의 블록 포인터가 인덱스 블록을 연결 (i-node)   자료구조 & 알고리즘삽입 정렬: 정렬되지 않은 영역에서 가장 앞에 있는 데이터를 꺼내 영역에 삽입하는 것 복잡하지는 않지만 성능이 좋지 않음 class InsertionSort(arr) { for (let i = 1; i < arr.length; i++) { let insertingDdata = arr[i] for (let j = i - 1; j >= 0; j--) { if (arr[j] > insertingData) { arr[j + 1] = arr[j] } else { break; } } } } const arr = [4, 1, 5, 3, 6, 2] console.log(arr) // [4, 1, 5, 3, 6, 2] console.log(InsertionSort(arr)) // [1, 2, 3, 4, 5, 6]병합 정렬: 분할 정복 divide and conquer: 큰 문제를 작은 문제로 나누어서 해결재귀와 비슷한 모양 function mergeSort(arr, left, right) { if (left < right) { const mid = parseInt((left + right) / 2) mergeSort(arr, left, mid) mergeSort(arr, mid + 1, right) merge(arr, left, mid, right) } } function merge(arr, left, mid, right) { const leftArea = left; const rightArea = mid + 1 const tmp = [] tmp.length = right + 1 tmp.fill(0, 0, right + 1) const tmpIndex = left; while (leftArea <= mid && rightArea <= right) { if (arr[leftArea] <= arr[rightArea]) { tmp[tmpIndex] = arr[leftArea++] } else { tmp[tmpIndex] = arr[rightArea++] } tmpIndex++ } }퀵 정렬: 분할 정복 알고리즘의 일종성능: O(NlogN), 최악의 경우 O(N^2)더 적은 비교와 적은 메모리 공간을 차지하지 때문에 병합 정렬보다 좋음 function quickSort(arr, left, right) { if (left <= right) { const pivot = divide(arr, left, right) quickSort(arr, left, pivot - 1) quickSort(arr, pivot + 1, right) } } function divide(arr, left, right) { const pivot = arr[left] let leftStartIndex = left + 1; let rightStartIndex = right; while(leftStartIndex <= rightStartIndex) { while(leftStartIndex <= right && pivo >= arr[leftStartIndex]) { leftStartIndex++ } while(rightStartIndex >= left + 1 && pivot <= arr[rightStartIndex]) { rightStartIndex-- } if (leftStartIndex <= rightStartIndex) { swap(arr, leftStartIndex, rightStartIndex) } } swap(arr, left, rightStartIndex) return rightStartIndex; } function swap(arr, index1, index2) { const tmp = arr[index1] arr[index1] = arr[index2] arr[index2] = tmp } const arr = [5, 3, 7, 2, 6, 4, 9, 1, 8] // 정렬 전 console.log(arr) // 정렬 후 quickSort(arr, 0, arr.length - 1) console.log(arr) // [1, 2, 3, 4, 5, 6, 7, 8, 9]다이나믹 프로그래밍 - 메모이제이션하향식 계산, 계산하려는 데이터가 없으면 값을 저장하고 있다면 가져다쓰는 방식일반 재귀 시간복잡도: O(N^2), 다이나믹 프로그래밍 시간복잡도: O(N)메모이제이션 장점: 재귀적 기법으로 단순히 풀 수 있음, 재사용으로 속도가 빠름메모이제이션 단점: 재귀, 오버헤드 큼 function fibonacci2(n, memo) { if (n <= 1) return n; if (memo[n] == null) { memo[n] = fibonacci2(n - 2, memo) + fibonacci2(n - 1, memo) } return memo[n] }다이나믹 프로그래밍 - 타뷸레이션상향식 계산, 사용하지 않아도 계산에 필요한 모든 값을 테이블에 저장하고 가져다 쓰는 방식일반 재귀 > 메모이제이션 > 타뷸레이션 순으로 타뷸레이션 방식이 가장 좋음 function fibonacci3(n) { if (n <= 1) return n; const table = [0, 1] for (let i = 2; i <= n; i++) { table.push(table[i - 2] + table[i - 1]) } return table[n] }  회고지난 3주를 생각해보니 마지막 주에는 조금 해이해지지는 않았는지 아쉬움이 든다. 그래도 혼자 공부할 때는 제대로 공부하고 있는 게 맞는 지 고민했었는데, 다른 사람들과 같이 학습하고 또 미션도 풀면서 한 주를 마무리하니까 정말 참여하기 잘했다는 생각이 들었다.3주 동안 학습한 내용을 바탕으로 감자님의 알고리즘/네트워크 강의도 들으면서 부족한 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] - 3주차 발자국(운영체제)

💻 가상메모리📌 개요32bit CPU 를 사용한다면 약 4GB(2^32)의 메모리, 가상 메모리를 가진다. ❓그러면 가상 메모리의 용량을 뛰어넘는 프로세스들을 어떻게 실행되는 것인가?✅ 물리 메모리 내용의 일부를 스왑 영역에 저장하고 필요 시에만 물리 메모리로 스왑 메모리 관리자(MMU Memory Management Unit)은 물리 메모리 + 스왑 영역을 전체 메모리 공간으로 보고 가상 주소를 물리 주소로 변환시킨다 (동적 주소 변환 DAT) ❓메모리 관리자는 어떻게 메모리 공간을 관리하나?✅ 물리 메모리의 0번지는 운영체제의 영역이며 나머지 영역에 대해 "가변 분할 방식(세그멘테이션)"과 "고정 분할 방식(페이징)"으로 구분하여 나눈다. 또한 매핑 테이블을 관리하여 가상주소를 물리주소로 전환이 가능하다. 📌 세그멘테이션(배치정책)세그멘테이션(Segmentation): 함수, 모듈 등으로 세그먼트를 분할(코드, 힙, 데이테, 스택,,)프로그램 입장에서는 각 세그먼트는 모듈 별로 분리되어 있다고 판단프로세스 입장에서는 각 세그먼트는 인접하게 판단각 세그멘테이션이 모듈로 처리되어 역할에 맞게 분할되어 관리가 가능하다외부 단편화가 발생할 수 있다. 세그멘테이션 테이블 : 세그멘테이션에서 사용되는 매핑 테이블Base Address : 세그멘테이션 메모리 시작 주소Bound Address: 세그멘테이션 크기, 접근 가능 최대 범위 물리 주소 변환 과정1. CPU가 논리주소, 세그멘트 번호 전달2. 메모리 관리자는 Segment Table Base Register 를 통해 물리 메모리 n 번지에 저장된 세그먼테이션 테이블 로드3. 세그멘트 번호를 인덱스로 테이블에서 Base Address, Bound Address 조회4. Bound Address(메모리 크기)와 논리 주소를 비교1. Bound Address > 논리 주소 = Base Address + 논리 주소 = 물리 주소2. Bound Address < 논리 주소 = 메모리 침범 -> 에러 발생- 컨텍스트 스위칭마다 해당 세그멘테이션 테이블에 프로세스의 데이터를 수정해야 함으로 비용이 큰 작업이다. 📌 페이징(배치정책)고정 분할 방식: 메모리를 정해진 크기의 페이지로 나누어 관리프로세스는 같은 크기의 페이지로 분할되며, 메인 메모리는 같은 크기의 프레임으로 분할된다. 페이지 테이블page number: 조회할 페이지 번호frame number: 물리메모리 프레임 번호물리 주소 변환 과정1. CPU 논리주소 전달2. 메모리 관리자는 Page Table Base Register을 통해 물리메모리 n번지에서 페이지 테이블 로드3. 페이지 번호 = 논리주소 / 페이지 크기4. 오프셋은 논리주소 % 페이지 크기5. 페이지 테이블에서 페이지 번호를 인덱스로 프레임, 오프셋를 알아냄6. 만약 프레임에 invalid로 저장되면 스왑영역에 저장 세그멘테이션 VS 페이징1. 세그멘테이션은 Base Address가 필요하지만 페이징은 각 페이지 영역이 동일하여 필요 없음2. 세그멘테이션 외부 단편화 발생, 페이징 내부 단편화 발생3. 세그멘테이션 논리적 영역별로 구분, 페이징은 고정된 페이지에 저장하여야 하니 논리적으로 구분 불가4. 각 프로세스마다 페이지 테이블을 갖고 있기에, 페이지 테이블의 크기 관리가 중요하다. 📌 페이지드 세그멘테이션페이지 + 세그멘테이션 프로세스 접근 권한- 코드: RE- 데이터: RW(o)- 힙: RW- 스택: RW세그멘테이션 테이블권한 비트Page Number페이지 개수물리 주소 변환 과정CPU가 0x12300번지 접근 요청메모리 관리자가 메모리에서 세그멘테이션 테이블이랑 페이지 테이블 로드세그먼트 번호를 통해 인덱스를 확인 후, 접근 권한 위반 여부를 파악페이지 크기와 비교하여 메모리 침범 여부를 확인페이지 넘버를 통해 페이지 테이블의 프레임 확인물리 메모리의 프레임 번호 + 접근 요청된 메모리 오프셋 = 물리 주소단점1. 물리메모리에서 데이터를 가져오기 위해서는 메모리 접근 두 번 해야함 (세그멘테이션 테이블, 페이지 테이블) 📌 디멘드 페이징(가져오기 정책)지역성 이론1. 공간의 지역성: 현재 위치에서 가까운 데이터에 접근 확률이 높음2. 시간의 지역성: 현재 시간에서 가까운 데이터에 접근 확률이 높음(최근) 디멘드 페이징: 필요한 데이터만 메모리에 올리고 사용하지 않는 데이터는 스왑 영역으로 이동보조저장장치에서 데이터를 가져오는 것은 레지스터보다 몇 배는 더 많은 시간이 소요스왑영역이 보조저장장치에 있기에, 스왑영역에 데이터를 저장하는 것을 최소화해야 함. 스왑 인(swap in): 스왑 영역 -> 물리 메모리스왑 아웃(swap out): 물리 메모리 -> 스왑 영역 페이지 테이블 엔트리(PTE)1. 접근 비트: 데이터 접근 여부(읽기, 실행 작업 시, 1)2. 변경 비트: 데이터 쓰기 여부(쓰기 작업 시, 1)3. 유효 비트: 페이지가 물리 메모리에 있는지(있음 0)4. WRE 비트: 접근 권한 비트5. 프레임: 프레임 번호 저장 디멘드 페이징 과정1. 페이지 테이블에서 유효비트와 프레임 번호를 확인2. 유효비트가 0일 경우, 물리 메모리에서 해당 프레임 번호로 데이터 반환3. 1일 경우, 스왑영역에서 프레임 번호로 데이터 추출4. 물리 메모리에서 빈 프레임을 확인5. 빈 프레임이 있으면 물리 메모리로 데이터를 적재하고 페이지 테이블 수정6. 빈 프레임이 없으면 물리 메모리에서 필요하지 않은 데이터를 스왑 영역으로 이동 후, 빈 프레임으로 이동 📌 페이지 교체정책페이지 교체정책: 가득찬 메모리에서 스왑영역으로 보낼 페이지를 고르는 기법1. 무작위 선택(Random): 지역성을 고려하지 않아, 자주 사용되는 페이지가 교체될 수 있음2. 가장 오래된 페이지 교체(FIFO): 가장 오래된 페이지가 자주 사용될 수도 있음3. 가장 오랫동안 사용하지 않을 페이지 교체(Optimum): 사실상 구현이 불가(이론상)4. 최근 사용이 가장 적은 페이지 교체(Least Recently Used)1. 지역성 이론에 따라, 최근 사용이 적은 페이지는 앞으로도 사용이 적을 것이다는 추정2. optimum 알고리즘과 근접한 성능을 갖지만, 지역성 이론에 따르지 않는다면 성능이 안좋아짐3. 시간을 기록하는 비트 수가 많아짐 Belady의 역설: 페이지 폴트를 줄이기 위해 메모리를 늘려 프레임을 늘렸더니 페이지 폴트가 더 많이 발생(FIFO에서 발생) LRU 알고리즘의 성능은 좋지만 구현이 어렵고 시간을 기록할 비트가 많이 필요하며 시간이 오래 지나면 오버 플로우가 발생한다. 클락 알고리즘(clokc algorithm)접근 비트를 하나만 이용일정시간마다 접근 비트를 0으로 초기화페이지 조회 시, 접근 비트 1로 수정페이지를 원형으로 연결페이지 폴트 발생 시, 클락 핸드(원형 페이지를 순회하는 포인터)를 시계방향으로 돌려접근 비트가 1이면 0으로 수정하고접근 비트가 0이면 교체할 페이지로 선택향상된 클락 알고리즘접근 비트와 변경 비트 모두 확인접근 비트 0 / 변경 비트 0접근 비트 0 / 변경 비트 1접근 비트 1 / 변경 비트 0접근 비트 1 / 변경 비트 1순서대로 페이지 교체 우선 순위 선정 하드웨어적으로 접근비트를 지원하지 않는 시스템에서 FIFO를 사용해야 함.(FIFO 최적화 필요)2차 기회 페이지 교체 알고리즘- FIFO와 동일하게 동작- 만약 페이지 폴트없이 페이지 접근이 성공하면, 가장 첫 체이지를 큐의 가장 뒤로 이동 📌 스레싱과 워킹셋스레싱: CPU 사용률을 높이기 위해 더 많은 프로세스를 실행하지만 물리 메모리의 공간 초과로 스왑에 더 많은 시간이 할당되어 CPU 사용률이 낮아지는 것- 물리메모리의 크기가 부족하여 스레싱 발생- 물리적으로 메모리의 성능을 늘리는 것은 한계가 있음(스레싱이 발생하지 않는다면 업그레이드에 대한 효율이 없음)- 페이지를 적게 할당하면 page fault가 많이 발생 / 페이지를 많이 할당하면 다른 프로세스가 사용할 페이지가 적음- 프로세스를 실행하며 page fault가 많이 발생하면 페이지를 더 할당- page fault가 적게 발생하면 페이지를 조금 할당- 적절한 페이지 수가 결정되어 지역성 이론에 따라 유지할 페이지들을 골라야 함. 워킹셋: 현재 메모리에 올라온 페이지는 다시 사용할 확률이 높기 때문에 하나의 세트로 묶어서 메모리에 저장- 프로세스 준비 -> 실행 상태로 컨텍스트 스위칭할 때 사용된다. 💻 입출력장치📌 주변장치(I/O 디바이스, 저장장치)I/O Device하드웨어완 연결할 수 있는 외부 인터페이스I/O 데이터 전달을 위한 버스 인터페이스(address, data, control 버스 3개)장치 상태 및 데이터 저장을 위한 레지스터(C메모리로 전달되기도 함)컨트롤러, 로직I/O 처리 과정CPU는 I/O 작업을 입출력 제어기에게 맡기고 다른 작업CPU, 메모리, 그래픽 카드(입출력 장치지만 대용량 데이터를 다룸)는 시스템 버스를 이용하고 (고속으로 이용)입출력 제어기는 고속 입출력 버스를 통해 빠른 장치(HDD 등)데이터 전송과 저속 입출력 버스를 통해 느린 장치(마우스 키보드 등)입출력 제어기는 입출력 두 개의 버스에서 온 데이터를 시스템 버스를 통해 메모리로 옮김입출력 제어기가 메모리에 접근하려면 CPU가 필요한데, 효율성이 떨어지니 DMA(Direct Meomry Access)를 통해 메모리에 저장CPU와 DMA 메모리 공간을 분리 - Memory Mapped I/O 📌 마우스 / 키보드마우스과거는 볼을 사용하여 마우스 움직임 계산현재는 카메라로 초당 1500회의 사진을 찍어 DPS를 통해 마우스 좌표를 계산DPS 입력 감지 시, 디바이스 컨트롤러가 인터럽트 발생마우스 드라이버가 데이터를 운영체제에 이벤트 전달 > Foreground 애플리케이션 전달 > 애플리케이션 데이터 처리키보드디바이스 컨트롤러 입력 감지 및 인터럽트 발생키보드 드라이버 이벤트 전달 > 운영체제 Foreground 애플리케이션 전달 > 애플리케이션 데이터 처리📌 하드디스크/Flash Memory(SSD) 하드디스크의 구조sector: track에서 여러개의 sector로 나뉘고 하드디스크의 가장 작은 단위 track: platter에 여러개의 track이 존재하고 표면의 자성으로 N극은 0, S극은 1platter: 원판 형태로 데이터 저장cylinder: 모든 헤드는 같이 움직이고 여러개의 헤드가 가리키는 트랙의 집합spindle: platter를 지지하는 막대read/write head: disk arm에 달려있어, platter의 표면을 읽음 과정cylinder C로 가서 track B에 있는 sector D를 읽어라disk arm은 헤드를 cylinder C로 이동시키고(seek, seek time < 하드 디스크가 느린 이유)track B에 Sector D가 head에 닿을때까지 spindle을 회전Flash Memory하드디스크기계적으로 움직여 소음도 일어나고 속도가 느림자기적으로 처리 -> 고장 가능성이 높음충격에 약함flash memory전기적으로 데이터를 읽기 때문에 조용하고 속도가 빠름안전함덮어쓰기가 불가능지우기 가능한 횟수가 정해져있어서, 지우고 쓰기가 여러번 쓰일 수 없음 💻 파일시스템📌 파일과 파일 시스템파일 시스템 기능파일, 디렉토리 생성, 수정, 삭제접근 권한 관리무결성 보장백업과 복구암호화파일 -> 블록 단위로 저장 -> 메모리 관리자가 바이트로 변환 -> 사용자가 접근운영체제는 File Descriptor를 갖고 있으며 파일마다 독립적인 File Descriptor가 존재하여 파일이 오픈되면 메모리에 올라간다. 사용자가 파일을 실행하면 운영체제가 file descriptor를 전달하여 파일을 찾아온다. 파일 구조순차파일구조: 파일 내용이 연속적으로 이어져있음직접파일구조: 해시 함수를 통해 해시 테이블에 데이터 저장인덱스파일구조: 순차 + 직접 파일구조 📌 디렉토리Root Directory: 최상위 디렉토리디렉토리 헤더는 디렉토리 정보가 시작하는 위치를 가리킨다.다단계 디렉토리: 하나의 디렉토리에 하위의 디렉토리를 만들 수 있는 트리 구조 📌 파일과 디스크블록: 디스크 공간을 일정한 크기로 나누고 주소를 할당(1 ~ 8KB)연속할당: 파일 구성 블록들을 디스크에 연속적으로 할당시작주소만 알면 파일을 읽을 수 있음내부 단편화 발생불연속할당: 데이터를 분산하여 저장연결할당: 시작 블록 주소만 알고 있으며, 연결리스트를 통해 블록 저장인덱스할당: 인덱스 블록의 주소를 저장하고, 인덱스 블록에 저장된 데이터 블록 인덱스들로 데이터 블록을 읽어옴 📌 더 찾아본 점 ❓ 페이징, 세그멘테이션, 페이지드 세그멘테이션페이징 테이블 구성: 페이지 번호 / 프레임 번호 / 유효/무효 비트페이징 테이블 엔트리: 페이지 테이블에서 페이지에 대한 위치 정보를 담은 각 행CPU가 (p, d) 전달페이징 테이블에서 p에 대한 f를 찾고 반환물리 주소에서 f 번 프레임의 d 번째 위치 (페이지 크기 * f + d)세그멘테이션 테이블 구성: 세그멘테이션 번호 / Base Address / Bound AddressCPU가 (s,d) 논리주소 전달세그먼트 테이블에서 s에 대한 base address와 limit 확인d가 limit 보다 크면 에러물리 주소 = base address + d페이지드 세그멘테이션: 프로세스를 각 세그멘테이션으로 구분하고 세그멘테이션을 고정 크기의 페이지로 분할CPU는 (s,p,d) 논리주소 전달세그먼트 번호를 통해 p를 확인하고 d와 페이지 개수를 비교하여 메모리 침범인지 확인p를 통해 페이지 테이블에서 인덱스를 확인하고 프레임 번호를 확인물리 주소: 프레임 번호 시작 주소 + d = f \* 페이지 크기 + d ❓ 메모리에 없는(invalid)데이터를 어떻게 저장장치에서 가져올까?Demand Paging: 프로그램 실행 중에 필요한 페이지만 물리 메모리에 저장하고, 실행 중에 요구되는 페이지에 대해서는 저장장치에서 로드Page Fault: 페이지 테이블에서 가져오려는 데이터가 invalid 한 상황. 운영체제에게 trap을 발동시키고 이를 통해 요구되는 페이지를 메모리로 로드 1. 페이지 테이블에서 찾으려난 데이터가 valid인지 invalid인지 확인2. invalid일 경우, page fault가 발생되고 운영체제의 trap에 걸림(프로세스 대기).3. 물리 메모리에서 비어있는 frame 주소를 찾음4. 제 2 저장장치에서 요구되는 페이지를 찾고 해당 프레임에 할당5. 물리 주소 프레임 위치를 페이지 테이블에 매핑6. 인터럽트가 끝나고 프로세스 중단된 명령어부터 다시 실행 ❓ Second-Chance Algorithm?FIFO 알고리즘에 접근 비트(reference bit)를 추가하여 접근 여부를 파악0이면 해당 페이지를 교체, 1이면 0으로 수정한 후 다음 FIFO page로 이동향상된 Second-Change Algorithm(clock algorithm)원형 큐로 생성포인터가 각 큐를 순회하며 접근 비트가 0인 것을 발견.최악의 경우(모든 접근 비트가 1), 모든 접근 비트를 0으로 수정하고 FIFO와 동일하게 가장 앞에 페이지를 교체 ❓ Thrashing, Working set?프로세스가 page in, page out으로 너무 많은 swapping을 하는 현상많은 프로세스를 메모리에 올려(멀티 프로그래밍) 실행 시키면, 어느 순간 CPU 효율성이 떨어지는 현상프로세스 실행 > page fault > process wait queue > page in > next page > page fault ...Working Set지역성 이론에 따라서 최근에 가장 많이 조회된 페이지들의 집합working set안에 있다 - 자주 참조되는 페이지 / 없다 - 교체 대상 페이지t1 시간에는 {1,2,5,6,7} 로 워킹셋 생성, t2에 {3,4} 로 워킹셋 수정Δ (델타) 를 통해 working set window를 생성하고 그 사이즈를 적절히 정하는게 중요운영체제는 각 프로세스의 working set을 모니터링하면서 사이즈에 맞게 frame을 할당충분한 프레임이 남는다면 프로세스를 더 실행 / 각 프로세스의 워킹셋 총합이 사용가능한 프레임의 수가 초과되면 프로세스 중지이를 통해 멀티 프로그래밍 정도를 높이면서 CPU 효율성을 유지❓ 입출력 장치의 I/O 인터럽트가 발생해도 끊김이 없는 이유?interrupt-request line을 통해 CPU는 명령어를 실행한 후 인터럽트가 발생하였는지 감지현재 실행 중인 프로세스의 데이터, 상태를 저장인터럽트 핸들러를 실행인터럽트의 원인을 확인하고 필요한 작업을 수행수행 후, 상태값을 복원하여 이전 작업으로 복귀아무런 작업이 없는 컴퓨터에서 10초 동안 23,000개의 인터럽트가 발생 - 초당 수백개의 인터럽트를 처리해야 함. 현재 운영체제에서는 조금 더 정교한 interrupt handling 특징들이 있음1. 중요한 프로세스 작업 중 인터럽트 핸들링을 지연시킬 능력이 필요하다2. polling을 통한 인터럽트 발생 확인이 아닌, 적절한 인터럽트 핸들러를 통해 효율적으로 인터럽트 관리3. multilevel interrupt를 통해 상위 - 하위 우선순위의 인터럽트를 구분하고 여러 인터럽트 동발생 시, 긴급성에 따라 응답4. 운영체제의 attention을 바로 받을 수 있을 만한 명령어가 필요 (page fault는 trap) 📌 백엔드 면접 질문✏ 페이지 폴트(Page Fault)는 언제 발생하며, 운영체제는 이를 어떻게 처리하는가??✅ 페이지 폴트란 프로세스가 논리 주소로 데이터를 요청할 때, 메인 메모리에 데이터가 없는 경우 발생하는 인터럽트이다.스왑 영역에 저장되어 있는 페이지를 가져오기 위해 프로세스를 대기 상태로 변경 시켜, 운영체제에 트랩을 발생시키고스왑 영억에서 데이터를 가져와 메인 메모리에 저장하고 페이지 테이블을 다시 변경해서 프로세스를 이어서 실행시킵니다. ✏ Node.js에서 가상메모리는 어떻게 관리되는가?V8 엔진은 JS코드가 저장되는 Code segment, 함수 호출과 실행 컨텍스트를 저장하는 Call Stack, 객체와 데이터를 저장하는 Heap Memory로 구분된다. V8에서는 페이징 기법을 통해 힙 영역을 가상 메모리로 관리한다. 힙 영역에 각각의 space(new space, old space, large object space,,)들은 페이지로 구성되어 있으며 각 페이지는 large object space를 제외하고는 1MB정도이다. 또한 가비지 컬렉터를 통해 단편화가 많이 일어난 페이지에 대해 메모리 압축을 진행한다. - 살아있는 객체들을 한 곳으로 이동시키고 포인터 갱신 ✏ Node.js에서 파일을 읽는 방법은?- Node.js는 싱글스레드에서 동작하지만 내부적으로 멀티 쓰레드(Worker Pool)에서 작업을 한 후에 이벤트 루프를 통해 결과를 반환한다. 이벤트 루프는 비동기 작업에 대해 작업이 완료되면 콜백함수를 task queue에 저장하고 콜스택이 비어있으면 task queue에서 콜백함수 실행. readFile 메서드는 비동기로 실행되며 콜백 함수를 통해 파일 읽기 작업이 마무리되면 콜백이 실행되며 readFileSync는 동기적으로 실행되고 blocking 상태가 되어, 파일을 읽을 때까지 작업이 대기된다. 📔 회고🚀 최종 목표 : 더 효율적인 백엔드 개발을 위해 기본적인 운영체제 지식들을 확실히 잡아가기🚀 매주 규칙:각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분강의를 듣고 최대한 이쁘게 (?) 정리해놓기 매 강의 듣고 해당 내용 공룡책 & 강의 1회 정독 및 수강매 강의에 대한 내용 백엔드 면접 질문을 추려서 답변하고 개념 구체화하기이번 인프런 워밍업 클럽을 진행하면서 커리큘럼에 맞춰 매일 강의를 듣고 지키려고 하였던 나의 목표 및 규칙이다.규칙부터 살펴보자면,각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분 : 10 / 10강의를 듣고 최대한 이쁘게 (?) 정리해놓기 : 8 / 10매 강의 듣고 해당 내용 공룡책 & 강의 1회 정독 및 수강 : 7 / 10매 강의에 대한 내용 백엔드 면접 질문을 추려서 답변하고 개념 구체화하기 : 7 / 10매 강의를 듣고 섹션별, 유닛별로 모든 내용을 정리하여 저장하였으니 10점을 주었다.강의를 듣고 최대한 이쁘게 정리를 하려고 노력하였지만 2점이 감점된 이유는 시간이 지날 수록 점점 이모지 사용이 줄고 글간, 행간과 같은 사소한 부분을 신경쓰지 않게 된 것같다,, 그래도 이 노력을 통해서 일관된 템플릿을 형성할 수 있었다는 점, md파일로 매일 정리해보며 파일 정리에 조금 익숙해진 것 같다.매 강의를 듣고 관련된 내용을 공룡책에서 찾아서 읽어보고 어려운 내용에 대해서는 공룡책 관련 강의와 함께 수강하려고 노력하였다. 2주차까지는 강의에서 나온 내용과 공룡책이 챕터 별로 일치하여 찾아보기가 편하여 공룡책에 나온 내용을 읽어보고 스스로 정리해보며 부족한 부분을 기록하였다면, 이번 주차부터는 공룡책에 안나오는 내용들이 점차 등장하여 미리 궁금한 내용들은 정리해두고 다른 블로그나 공식문서들을 참고하여 지식을 채워갔다. 7점을 준 이유는 아무래도 공룡책 챕터 별로 범위가 넓고 깊이 있게 다루기 때문에 정독의 수준에는 미치지 못한 것 같다. 또한 이해가지 않은 부분은 쉽게 넘어가고 전체적인 흐름만 파악하려 하였기에 아쉬운 점이 조금 남은 것 같다.매 강의를 듣고 GPT를 이용하여 관련된 강의 내용에 관련된 백엔드 면접 질문들을 추려서 스스로 답변하면서 정리해보았다. 관심이 많던 Node.js 를 기반으로 더 깊이있게 공부해봤던 것 같고 CS 지식들을 실무에 적용시켜서 생각해보려고 노력하였다. 하지만 Node.js 프롬프트를 이용한 질문은 유료라 한도가 항상 잡혀서 아쉬운 점이 컸던 것 같다. 무료 프롬프트는 어딘가 의심이 드는 답변들이 많아 두번 세번 더 찾아봐야하는 문제점이 있어, 한정된 질문들에 대해 소중하게 답변했던 것 같다. 7점을 주었던 이유는 면접 질문을 정리하고 스스로 공부해봤던 개념들을 따로 정리해놓지는 않아서 부족하게 진행되었던 것 같고 이번 기회에 매일 면접 질문들을 답변해보면서 공부를 한 것들을 기록하여 정리해보려 한다.그래서 최종적으로 내가 설정하였던 목표에 대해서는더 효율적인 백엔드 개발을 위해 기본적인 운영체제 지식들을 확실히 잡아가기 : 8/10나름 높은 점수를 주었지만 이 점수는 나의 과정에 대한 점수이지 결과에 대한 점수는 아닌 것 같다. CS에 대해서는 아직 부족한 부분이 많지만 이번 로드맵을 통해 CS가 더 흥미로워졌고 더 깊이 공부해보고 싶은 생각이 들었다.무엇보다 가장 좋았던 부분은 CS에 대한 전반적인 틀을 잡을 수 있었고 공부 해야할 방향성이 조금씩 잡혀나가는 것 같다는 느낌이 들었다. 이를 기반으로 더 깊이 있게 공부하면서 실무적으로 계속 연결하여 생각해보고 백엔드 개발에서 더 효율적이고 올바른 판단을 하기 위해 꾸준히 노력해 볼 생각이다.     

시스템 · 운영체제운영체제인프런워밍업감자

수뼈

인프런 워밍업 클럽 스터디 3기 - CS 전공지식 <둘째 주 발자국>

[Day 06]Algorithm재귀(Recursion): 어떠한 것을 정의하는 과정에서 자기 자신을 참조하는 것.재귀함수(Recursive Function)을 구현할 때 탈출 조건(기저 조건)을 정의해놓지 않으면 콜 스택(Call Stack)에 스택 프레임(Stack Frame)이 무제한으로 쌓이게 되어 사용이 불가능함.Stack Overflow: Call Stack이 메모리의 잉여 용량을 초과하여 프로세스가 OS에 의해 강제 종료되는 현상.재귀함수를 사용할 때 쉽게 해결 가능한 문제: Factorial(n)재귀함수를 사용할 때 쉽게 해결 가능한 문제: 깊이 우선 탐색(Depth-First Search; DFS)(참고: 1, 2, 3)Operating System 프로세스 간 / 프로세스 내 통신프로세스 간 통신(Inter-process Communication; IPC) (참고: 1, 2, 3)개요운영체제가 주체가 되어 프로세스 간 통신​ 프로세스들끼리 서로 데이터를 주고받는 것.기본적으로 각 프로세스는 독립적이기에 명시적으로 통신 매개체를 만들어주지 않으면 통신이 불가능함.파일, 파이프, 메세지, 네트워크 등 다양한 매개체를 통해 통신하는 다양한 방식이 있음.여러 프로세스가 공유 자원에 접근한다면 동기화 문제가 생길 수 있으므로 해결이 필요함.정보 공유,계산 가속화,모듈성,편의성 등을 도모하기 위해 활용되는 기술임.통신 방식에 따른 분류공유 메모리(Shared Memory) 방식 (참고: 1, 2, 3)개요여러 프로세스가 공동으로 사용할 수 있는 가상 메모리 영역을 활용해 통신하는 방식.모든 IPC 방식 중 가장 통신 속도가 빠르다는 장점과 동기화 문제가 생기기 쉽다는 단점이 있음.대표적인 활용 예시로 복붙이 있음(예: 워드의 텍스트를 인터넷 창에 가져오기).일반적인 순서UNIX 계열부모 프로세스 생성 및 가상메모리 영역 할당.부모 프로세스가 자신에게 할당된 메모리 영역 중 일부를 공유 메모리로 사용하겠다고 커널에 요청.커널이 프로세스가 접근 가능한 고정 길이의 공유 메모리 영역을 생성 및 할당해 줌.고정 길이라는 점을 왜 강조하신 걸까? -> 왜 용량 할당 기준이 다른 걸까?(참고) 메모리 할당 방식과 동기화 문제 발생 가능성의 차이 때문임.fork() 함수로 자식 프로세스 복제(이때 공유 메모리 주소도 복사됨).프로세스 동기화(Process Synchronization) (※ 병형 제어(Concurrency Control)라고 부르기도 함) (참고: 1, 2, 3)정의 및 특징프로세스 접근 순서 및 방식을 OS의 동기화 메커니즘을 사용하여 조정하는 것.각 프로세스가 공유 자원에 접근하는 순서는 시분할 CPU 스케줄링을 하는 OS만 알고 있으므로, OS 단위로 해결할 수밖에 없음.대부분의 프로세스 동기화 방법은 상호 배제(Mutual Exclusion) 메커니즘의 일부 또는 전부에 기반함.공유 메모리 방식에서 가장 발생하기 쉬운 문제지만, 다른 방식에서도 얼마든지 발생할 수 있는 문제.동기화 문제 해결 방법 (Deadlock 해결 방법은 Day 07 참조)Race Condition 해결 방법뮤텍스(Mutex) (참고: 1, 2, 3)추가 예정.세마포어(Semaphore) (참고: 1, 2, 3)개요 및 특징멀티프로그래밍 환경에서 Critical Section에 동시에 접근할 수 있는 프로세스의 최대 개수를 제한하기 위해 사용되는 정수형 변수(링크 내 정의를 참고해 보강함).뮤텍스와 달리 Critical Section에 접근 가능한 프로세스 개수를 2개 이상으로 지정할 수 있다는 게 차이점!뮤텍스=열쇠(잠긴 동안 누구도 못 감), 세마포어=미리 발급된 n개의 출입증(다 떨어진 순간 못 들어감)이 더 좋은 비유라고 생각함.사용법 자체는 쉽지만 wait() 함수와 signal() 함수를 잘못 사용하면 꼬일 수 있음(참고).활용 방법wait() 함수로 세마포어의 수를 1 줄여 프로세스 하나가 Critical Section에 들어갔음을 OS에 전달함.이때 이미 세마포어가 0이라면 이후 코드는 실행되지 않음.코드를 진행하다 signal() 함수를 만나면 세마포어의 수를 1 늘려 프로세스 하나가 Critical Section에서 나갔음을 OS에 전달함.모니터(Monitor) (참고: 1, 2, 3)개요 및 특징공유 자원에 대한 동시 접근을 안전하게 제어하기 위해 상호 배제와 조건 변수를 결합한 고수준의 동기화 기법(by ChatGPT o3-mini-high)프로그래밍 언어 차원에서 여러 프로세스에서 동시에 실행될 수 없는 함수를 만드는 방식으로 구현함.파이프(Pipe) 방식개요OS가 각 프로세스와 연결된 단방향 통신용 메모리 공간(=Circular Buffer)을 생성해 데이터를 전달함.기본적으로는 바이트스트림(Bytestream) 데이터만 전달 가능하며(참고: 1, 2, 3), 다른 데이터타입을 전달하려면 직렬화(Serialization)해야 함. Anonymous Pipe부모-자식, 형제 등 통신 대상이 정해진 두 프로세스가 단방향 통신(Half Duplex)할 때 사용함(예: fork()).양방향 통신(Full duplex)을 위해선 익명 파이프가 두 개 필요한데, 이는 구현이 복잡함.Named PipeAnonymous Pipe가 확장된 형태로, 파일 시스템에 이름이 부여된 파이프를 말함.FIFO라는 통신을 위한 파일을 만들고, 그걸 통해 양방향 통신(Full duplex)이 가능함.메세지 큐(Message Queue)네트워크 방식소켓RPC스레드 간 통신(Inter-thread Communication; ITC)데이터 영역에 있는 전역 변수(=공유 메모리)나 힙을 이용해 통신함."전역 변수보단 공유 메모리라는 명칭을 선호한다." - 곰책으로 쉽게 배우는 최소한의 운영체제론  [Day 07]Algorithm Recursive Thinking재귀라는 테크닉을 제대로 활용하려면 하향식(Top-down) 계산식으로 문제를 변형할 수 있어야 함.하향식 계산 활용 1: 배열 각 원소의 총합 구하기하위 문제: arr.length === n-1인 배열 각 원소의 총합 구하기 + 마지막 원소하향식 계산 활용 2: 문자열 길이 계산하기하위 문제: str.length === n-1인 문자열의 갯수 구하기 + 1하향식 계산 활용 3: 지수함수 계산하기하위 문제: n^m-1 * nOperating System교착 상태 제어(Deadlock Control)Deadlock: 두 개 이상의 프로세스가 서로가 가진 자원의 해제를 기다리며 무한 대기하는 상태.Deadlock의 필요조건 (넷 중 하나라도 빠지면 Deadlock이 발생·유지되지 못함)상호 배제(Mutual Exclusion), 비선점(No Pre-emption),점유와 대기(Hold and Wait),원형 대기(Circular Wait)Deadlock 해결 방안 (참고: 1, 2, 3)Deadlock Prevention (참고: 1, 2, 3)교착상태가 애초에 일어나지 않도록 Deadlock 필요조건 중 하나를 제거하는 것.이론적으로만 가능하고 현실적으로 불가능하거나(상호 배제 및 비선점), 유저 사용성과 시스템 유연성을 해치게 되므로(점유와 대기,원형 대기) 현실적으로 적용 불가함.Deadlock AvoidenceOS가 시스템 자원과 프로세스들의 현재 할당 자원 및 최대 요구 자원을 종합적으로 고려해 시스템이 되도록 안정 상태(Safe State)를 유지할 수 있는 만큼만 시스템 자원을 할당하는 것.각 메모리의 최대 요구 CPU 리소스는 어떻게 아는 걸까?(참고) 추정치가 아니라 상한선이다!비용이 비싸고, 비효율적이라는 단점교착상태 검출가벼운 교착상태 검출프로세스가 정해진 시간 동안 작업을 진행하지 않는다면 OS가 이를 교착상태로 판단함.교착상태가 되면 가장 최근의 Checkpoint로 프로세스 상태를 되돌림.오버헤드가 적지만 멀쩡한 프로세스를 롤백해버릴 수 있음.무거운 교착상태 검출OS가 자원 할당 그래프를 지속적으로 관찰하다가 원형 대기 상태를 발견하면 이를 교착상태로 판단함.교착상태가 되면 가장 최근의 Checkpoint로 프로세스 상태를 되돌림.멀쩡한 프로세스를 롤백할 일이 없지만 오버헤드가 큼. [Day 08]Algorithm 하노이의 탑(The Tower of Hanoi) 1883년 프랑스의 수학자 Édouard Lucas가 처음으로 발표한 게임으로, 재귀함수 예제로 활용됨.하향식(Top-down) 접근가장 큰 원반을 기둥 3으로 옮기기 -> 나머지 원반을 기둥 2로 옮겨야 함그보다 작은 원반을 기둥 3으로 옮기기 -> 더 작은 나머지 원반을 기둥 2로 옮겨야 함 (이게 하위문제!)구현하기첫 번째 구현: 강의 보며 구현 (Done) 두 번째 구현: 강의 안 보고 구현하다 기억 안 나면 과거에 내가 짠 코드 확인하며 구현 (Done) 세 번째 구현: 리팩토링 (원반 이동 횟수 출력, 원반 이동 On/Off 기능 추가) (Done) 마지막 구현: 익숙한 파이썬으로 구현(+리팩토링) (Done) Operating System컴파일과 프로세스Compile: 소스코드가 실행파일(=프로그램)이 되는 과정 (※ 아래 과정은 C 기준) (참고: 1, 2)Preprocessing,Compile, Assembly, Linking 순으로 진행하여 .exe 파일, 즉 실행 파일이 생성됨.코드 영역과 데이터 영역으로 이루어진 .exe 파일 실행 시 프로세스 생성됨. [Day 09]Algorithm정렬 알고리즘(Sorting Algorithm)개요데이터셋이 주어졌을 때, 이를 사용자가 지정한 기준에 맞게 정렬하여 출력하는 알고리즘.참고: 정렬 알고리즘은 왜 배워야 할까?대표적인 정렬 알고리즘버블 정렬(Bubble Sort) (※ Sinking Sort라고도 함)배열의 정렬되지 않은 영역에서 서로 인접한 두 원소 크기가 순서대로 되어 있지 않으면 서로 교환하는 방식으로 모든 원소를 정렬하는 알고리즘.최악의 경우, O(n^2)의 시간복잡도를 가짐.구현하기첫 번째 구현: 강의 보며 구현 (Done)두 번째 구현: 강의 안 보고 구현하다 기억 안 나면 강의 확인하며 구현 세 번째 구현: 강의 안 보고 구현하다 기억 안 나면 과거에 내가 짠 코드 확인하며 구현 네 번째 구현: 아무것도 안 보고 구현 마지막 구현: 익숙한 파이썬으로 구현(+ 리팩토링) 선택 정렬(Selection Sort)배열의 정렬되지 않은 영역의 첫 번째 원소를 시작으로 마지막 원소까지 비교 후 가장 작은 값을 첫 번째 원소로 가져오는 알고리즘.최악의 경우, O(n^2)의 시간복잡도를 가짐.구현하기첫 번째 구현: 강의 보며 구현 (Done)두 번째 구현: 강의 안 보고 구현하다 기억 안 나면 강의 확인하며 구현 세 번째 구현: 강의 안 보고 구현하다 기억 안 나면 과거에 내가 짠 코드 확인하며 구현 네 번째 구현: 아무것도 안 보고 구현 마지막 구현: 익숙한 파이썬으로 구현(+ 리팩토링) Operating System메모리의 종류휘발성 메모리(Volatile Memory)종류 및 특징Register (참고: 1, 2, 3)개요 및 특징CPU 내부에서 처리할 명령어나 연산의 중간 결과값 등을 일시 저장하는 임시 기억장치.CPU 내부에는 다양한 종류의 레지스터가 있음(각 레지스터의 종류와 특징은 후술).CPU가 연산해야 할 데이터를 RAM에서 가져와 여기에 저장한 후에 연산을 시작함.Register의 크기가 32bit인지 64bit인지에 따라 CPU 종류가 달라짐.종류와 특징재배치 레지스터(Relocation Register)논리 주소를 물리 주소로 변환하는 데 사용되는 레지스터.프로그램을 다른 메모리 위치로 이동해도 주소 수정 없이 실행 가능함.Cache Memory (참고: 1, 2, 3)CPU와 메인 메모리 간 데이터 접근 속도의 차이를 최소화하기 위해 사용되는 CPU 내 고속 임시 저장소(by ChatGPT-o3-mini-high).속도와 용량에 따라 Level 1, Level 2, Level 3 Cache로 세분화되어 탑재되어 있음(시스템마다 다름).CPU가 자주 사용할 만한 데이터를 RAM에서 미리 가져와놓고(=Caching), CPU가 필요할 때 RAM보다 우선적으로 접근함.Cache Hit이 많으면 시스템의 성능이 올라가겠지만 Cache Miss가 많으면 추가 Latency가 발생해 오히려 Cache Memory가 없는 시스템보다도 시스템의 성능이 떨어질 수 있음.따라서 Cache Hit Ratio를 향상시키는 게 중요함(향상 기법 설명).RAM(Random Access Memory) (참고: 1, 2, 3, 4)개요 및 특징CPU가 즉각적으로 접근할 수 있으며, 프로그램 실행과 데이터 처리를 위해 일시적으로 명령어나 데이터를 저장하는 휘발성 메모리 장치(by ChatGPT 4.5).Stack, Heap, Code, Data 영역으로 구성되어 있어 각 영역이 가상 메모리(Virtual Memory)를 통해 각 프로세스에 할당됨.CPU에서 직접 접근이 가능한 유일한 저장 장치임.RAM의 종류RAM의 구성요소OS의 RAM 관리 방법메모리의 주소 공간(Address Space) (참고: 1, 2, 3, 4)관리의 최소 단위를 주소(Address)라 하며, 1 byte(8 bits)의 크기를 가짐.1 byte 단위마다 지정된 각 주소는 편의상 0x??????(16진수)로 표시됨(참고).RAM에서는 논리(가상) 주소와 물리(절대) 주소로 주소 공간을 분리하여 관리함.왜 이렇게 구분? OS 영역 침범 방지 + 메모리 관리의 편의성물리 주소(Physical Address) (※ 절대 주소(Absolute Address)라고도 함) (참고)CPU 관점에서 바라 본 실제 HW상 주소 공간으로, CPU 속 MMU가 논리 주소를 물리 주소로 변환하여 접근함(참고).경계 레지스터(Boundary Register)가 유저 프로세스가 RAM의 커널 영역을 침범하는지 감시하다가, 침범했다면 강제 Shutdown시킴(참고).논리 주소(Logical Address) (※ 가상 주소(Virtual Address)라고도 함)각 유저 프로세스 관점에서 바라 본 주소 공간으로, 각 주소마다 0x0부터 시작함.각 프로세스마다 새로 할당되므로 시스템 전체(OS) 관점에서 보면 같은 주소가 여러 개 존재할 수 있음.OS 영역과 유저 영역으로 구분되어 있음.OS는 프로세스 생성 및 메모리 할당 시 가상 주소-물리 주소쌍이 담긴 페이지 테이블(Page Table)을 만들어 RAM에 저장함(참고).프로세스 실행 시 CPU는 P.T의 맵핑 정보를 참고하여 명령어나 데이터를 참조함.상대 주소(Relative Address)는 프로세스 내에서 특정 주소 기준으로 얼마 떨어진 주소를 가리킬 때 사용하는 개념으로, 강의에서의 설명과는 소폭 다름(참고).메모리 할당 방식 (참고: 1, 2, 3)개요RAM의 빈 물리 주소 공간에 각 프로세스의 가상 주소 공간을 할당·관리하는 방법.연속적인 Swapping, Context Switching 상황에서도 최소한의 빈 공간과 Overhead를 유지하는 것이 메모리 할당 방식 연구의 목표.메모리 오버레이(Memory Overlay) (참고: 혼공컴운 391p., 2, 3, 4, 5)프로그램을 여러 개의 독립된 모듈로 나누고, 한 번에 필요한 모듈만 메모리에 적재하여 실행하는 방식(참고).Manual Overlay에서 Dynamic Loading과 Dynamic Linking으로 발전함.위 기술들은종류가변 분할각 프로세스에 메모리를 프로세스 크기만큼 연속 할당하는 방식.외부 단편화로 인한 Overhead 발생고정 분할각 프로세스에 메모리를 특정 크기만큼 연속 할당하는 방식.구현이 쉽고 오버헤드가 적다 vs. 내부 단편화 발생버디 시스템짬뽕비휘발성 메모리(Non-volatile Memory)Secondary Memory (참고: 1, 2, 3)  [Day 10]데이터 지향 설계(Data-Oriented Design) (참고: 1, 2, 3)소프트웨어를 설계할 때 데이터 자체와 그 흐름에 초점을 맞추어, 프로그램의 성능과 메모리 사용 효율을 극대화하는 방법론(by ChatGPT-o3-mini-high).프로세서 캐시(cache) 효율을 높이고, 불필요한 메모리 접근 오버헤드를 줄이며, 데이터 처리 속도를 극대화하는 것이 목표.데이터를 배열에 담아 특정 인덱스 데이터를 호출하면 Cache Locality에 따라 해당 인덱스와 인접한 데이터들이 캐시 메모리에 올라감.CS를 공부하면 새로운 라이브러리/프레임워크를 배우기 쉽다.https://dev.epicgames.com/community/fortnite/getting-started/uefn [Week Review]일주일 동안 공부하면서 배우고 느낀 점감자님의 운영체제 강의는 너무 좋다. 눈에 쏙 들어오고 이해도 잘 된다. 하지만 엉성하게 감이 잡힌 상태에서 그 이상을 궁금해하기 시작하면 지옥이 펼쳐진다....예를 들어 (이후에 나오는지는 모르겠지만) IPC는 강의에서 주로 다룬 공유 메모리 방식 말고도 파이프 방식도 있는데, 이에 대해 검색하니 뭐 데이터스트림이라느니 Message Passing 방식이라느니 알 수 없는 내용들이 쏟아진다.이 강의(워밍업 클럽)로 큰 줄기를 그린 다음 오랜 기간에 걸쳐 꾸준히 학습하며 디테일을 채워 나가야겠다. 나는 비전공자인데다, 머리도 나쁘고, 근육병에, 기초수급자에다, 남들은 당분간 알아주지 않을 길을 오래 걸어가야 하니까.자료구조 및 알고리즘을 공부하니 프로그램 설계 능력 향상에도 도움이 되는 것 같다.잡식으로 필요한 것 혹은 필요해 보이는 기술 같은 것들만 공부하며 버텨온 시간들을 뒤로 하고 내실을 다지고자 별 기대 없이 시작한 워밍업 클럽인데, 의외로 소프트웨어 설계에 큰 도움이 되는 듯하다.이번 주 중간점검 때는 질문할 게 별로 없었다. 궁금한 게 없어서가 아니라 뭐부터 질문해야 할지 모를 정도로 머릿속이 혼란스러운 게 첫째, 궁금한 것들이 대부분 감자님 강의에 없는 내용들이라는 점이다.어제 중간점검 때 감자님께서 "강의 내용 정도면 컴공 전공자들이 배우는 지식과 크게 다르지 않다."고 말씀하셨는데, 내가 전공자가 되어보진 않았어도 "그건 아니다."라고 단언할 수 있다. 내 목표가 전공ㅈ어려웠던 점(참고) IPC 부분을 조금 깊이 파고들다 보니 강의에 설명되지 않은 부분이 정말 많아서 혼란이 심했다.특히 Process Synchronization 문제와 그 해결 방식들에 대해 공부한 후에, "그래서 저 수많은 IPC 방법들 중 Process Synchronization 문제는 어떤 방법을 쓸 때 발생하는 거지?"가 헷갈렸다.감자님 답변으로 "어떤 방법을 쓰는가보다는 공유자원의 존재 유무로 동기화 이슈가 발생할 수 있다"는 걸로 대강 이해했다.(참고) 동기화 부분을 정리하면서 강사님께서 말씀하시는 동기화 문제가 공유 메모리 방식에서 주로 발생하는 것 같다고 이해했다. 근데 다른 강사님의 강의에서 "파일 기반 IPC는 OS가 필요한 용량을 할당해줄 때 기준이 느슨한데, 메모리 기반 IPC는 OS가 필요한 용량을 할당해줄 때 기준이 엄청 깐깐하다."는 말이 나왔고, 왜 그런 차이가 나는지 궁금해져서 질문을 올렸다.답변에 틀린 부분은 없었지만 뭔가 명쾌한 느낌도 아니었다. 그래서 챗지피티에게 물어보니 메모리 할당 방식과 동기화 문제 발생 가능성을 이유로 설명했다. 이 답변을 바탕으로 정리에 두었더니 훨씬 명확해졌다.IPC를 공부할 때 통신 과정을 순서대로 정리해두니 확 이해도 되고 머릿속에 남는 것 같다!앞으로 개선할 점아무리 열심히 공부하기 위한 목적이라지만... 이거 공부 및 정리에 너무 많은 시간을 쓰고 있다. 기본적인 걸 무조건 끝내놓고 남는 시간에 내용 보충을 해야겠다. 기타 잡담강의 보면서 웃겼던 부분ㅋㅋㅋㅋㅋㅋ 빌린 돈도 안 갚아놓고 더 빌려 달라니 뭔 심보여

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

찬우 이

인프런 워밍업 클럽 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] - 2주차 발자국(운영체제)

💻 운영체제📌 프로세스 동기화프로세스는 다른 프로세스와 데이터를 주고 받으며 통신한다.여러 프로세스가 공유자원에 접근하여 데이터를 수정하고 읽을 경우, 동기화 문제가 발생할 수 있다.공유 자원 : 프로세스 간 공유되는 변수나 파일임계 구역: 여러 프로세스가 동시에 사용하면 안되는 구역경쟁 조건: 공유 자원을 서로 사용하기 위해 경쟁하는 것상호배제의 요구사항임계 구역에는 하나의 프로세스만 접근할 수 있다여러 요청에도 하나의 프로세스만 접근 가능하다임계 구역에 들어간 프로세스는 최대한 빠르게 나와야 한다.상호배제 메커니즘세마포어세마포어 변수를 갖고있는 프로세스가 먼저 실행되고 작업이 완료되면 signal()을 통해 변수 반환세마포어 변수가 없는 프로세스는 대기 wait()세마포어 변수를 할당받으면 프로세스 실행 가능공유 자원 수에 따라 세마포어의 수 증가모니터운영체제의 차원이 아닌 프로그래밍 언어에서 처리자바에서 synchronized가 붙은 함수가 실행되면 다른 프로세스가 접근 불가함수를 임계 구역에 감싸지 않아도 되어 편리하게 구현 가능 📌 데드락교착상태(데드락): 여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무도 작업을 진행하지 못하는 상태필요조건1. 상호배제: 한 프로세스가 리소스를 점유하였다면 다른 프로세스 접근 불가2. 비선점: 점유중인 프로세스의 리소스를 뺏어갈 수 없음3. 점유와 대기: 한 프로세스는 리소스를 점유하고 있는 상태에서 다른 프로세스의 리소스 점유를 대기해야 함4. 원형대기: 점유와 대기를 하는 프로세스들의 관계가 원형이어야 함.회피교착상태는 발생할 수 밖에 없다 > 발생의 원인을 줄이거나 빠르게 해결 안정상태 (시스템 총 자원이 14라 가정)현재 총 12개의 작업이 할당되었다.P1이 4개의 자원을 요청하면 사용 가능한 자원이 2(14-12)개 남아있기에 거절P2가 2개의 자원 요청하면 사용 가능한 자원 2개 할당P2의 작업이 마무리되면 사용 가능한 자원 6개로 증가나머지 프로세스들의 요청 예상 자원 커버 가능 불안정상태현재 사용 가능 자원은 1(14-13)개이다.모든 프로세스들의 요청 예상 자원을 할당해줄 수 없다.모든 프로세스들이 최대 자원을 요구하지 않는다면 교착 상태에 빠지지 않을 수 있지만가능성이 높다 가벼운 교착상태 검출 : 타이머 이용. 프로세스가 일정 시간동안 작업을 진행하지 않는다면 교착상태로 검출 일정시간마다 체크포인트 생성, 교착상태 예상 시에 롤백무거운 교착상태 검출: '자원 할당 그래프'를 통해 프로세스에 할당된 자원을 모니터링교착상태를 일으킨 프로세스 강제종료체크포인트로 롤백  📌 메모리1. 레지스터: 가장 빠른 기억 저장소이자 휘발성 메모리. 메인 메모리 데이터를 CPU레지스터를 가져와 연산 후 계산 결과를 다시 메인 메모리에 저장2. 캐시: 메인 메모리에서 필요할 것 같은 데이터를 미리 캐시에 저장3. 메인메모리(RAM): 실제 운영체제와 프로세스들이 저장되는 휘발성 메모리4. 보조저장장치: 비휘발성 메모리이며 프로그램, 파일을 저장 물리 주소(절대 주소): 메모리 공간의 실제 주소논리 주소(상대 주소): 사용자가 다루는 메모리 주소1. 사용자가 프로그램 실행 - 사용자 입장에서는 0x0000 메모리로 작업2. 프로세스는 실제 물리주소 0x4000 주소에 저장3. 사용자가 0x0100 주소의 데이터 요청 (논리 주소)4. 논리 주소(0x0100)와 재배치 레지스터(실행 중인 프로세스의 물리주소 - 0x4000)을 더해서 0x4100의 값을 전달 메모리 할당 방식❓ 유니 프로그래밍 환경에서는 하나의 프로세스만 메모리에서 동작이 가능하다. 만약 메모리의 용량을 초과한 프로그램을 실행시키려면?✅ 스왑 과정이 존재하기 때문에 실제 메모리에 전체 프로세스가 올라가있는 것에 비하면 속도가 느리다.메모리 오버레이: 실행시킬 프로세스를 분할시켜, 사용되는 부분을 메모리에 올리고 나머지는 하드디스크 스왑 영역에 저장 ❓ 멀티 프로그래밍 환경에서는 어떻게 동작?1. 가변 분할 방식(세그멘테이션): 프로세스가 크기에 따라 메모리를 분리- 연속된 메모리 공간에 할당되기에 내부 단편화 현상 없음- 외부 단편화 발생: 연속된 공간에 할당을 해야하니 5MB 프로그램을 3MB와 2MB 공간에 할당이 불가하다.2. 고정 분할 방식(페이징): 프로세스 크기 상관없이 메모리 분리 (만약 5MB 프로그램을 2MB 고정 분할 메모리에 저장시키려면 2 / 2 / 1로 분리) -> 비연속 메모리 할당- 구현이 간단하고 오버헤드가 적음- 내부 단편화 발생: 위 예시에서 2MB 분할 공간에 1MB만 사용3. 버디 시스템(가변 + 고정): 2의 승수로 메모리를 분할하여 할당- 전체 메모리 영역을 하나의 프로세스가 올라갈 수 있을 정도로 2의 승수로 나눠서 분할- 최소한의 내부 단편화, 간단한 메모리 합치기 조각 모음 : 외부 단편화에서 분리된 메모리 공간을 합치는 작업 - 실행 중인 프로세스를 일시적으로 멈춰야 해서 오버헤드 발생 📌 더 찾아본 점IPC(Interprocess Communication)란?프로세스 간 협업을 위해 데이터를 공유하기 위해서는 IPC 기술이 필요하다 공유 메모리(Shared Memory): 공유 메모리 지역을 지정하고 프로세스들은 공유 메모리에 접근하여 데이터를 공유한다. (producer-consumer problem)메세지 패싱(Message Passing): 협력하는 프로세스 간 메세지 전달을 통해 데이터 동기화(communication link)를 통해서 각 프로세스가 소통한다. race condition이란?다수의 프로세스(혹은 쓰레드)가 같은 데이터를 동시에 접근하거나 처리하면, 실행되는 순서에 따라서 결과가 달라진다.이를 해결하려면 특정 시간에 하나의 프로세스만 공유 자원을 다뤄야 한다. 즉, 프로세스는 동기적으로 실행되어야 한다.1. 상호배제(Mutual Exclusion)을 보장해주어야 한다.- 한 프로세스가 "임계영역(citical section)"을 실행 중일 때, 다른 프로세스는 임계 영역을 실행할 수 없다.2. 데드락(deadlock)을 회피(진행)- 임계 영역에 들어갈 프로세스를 정하는 건, 임계 영역에 들어가야하는 프로세스들만 참여할 수 있다. - 영역에 들어가는 과정이 무한정 지연되는 것을 방지3. 유한 대기(Bounded Waiting) (starving 기아 상태 방지)- 임계 영역에 들어가기를 요청한 프로세스는 무한정 기다리면 안된다. 상호배제 메커니즘Mutex Locks: 임계 영역에 진입하면 lock을 acquire()와 release()를 통해 주고 받음Semaphore: 공유자원 수용가능 수에 따라 정수형 변수 s 변수를 초기화. wait(s)와 signal(s)를 통해 각 작업에서 s값을 중가, 차감 자원할당 그래프(Resource0Allocation Graph)운영체제에서 자원이 할당되어 있는 상태를 그래프로 그려, 시각적으로 데드락의 여부를 판단- T = {T1, T2, ..., Tn}: 실행 중인 쓰레드- R = {R1, R2, ..., Rm}: 할당될 자원 타입- T_i → R_j: i 쓰레드가 j 자원을 요청한다- R_j → T_i: j 자원을 i 쓰레드에 할당되어 있다.위 예제에서는 3개의 쓰레드와 4개의 자원이 있으며 2개의 순환 구조를 갖고 있다.T1 → R1 → T2 → R3 → T3 → R2 → T1T2 → R3 → T3 → R2 → T2모든 쓰레드는 하나의 자원을 점유 중인 상태에서 다음 자원을 점유하기 위해 대기 상태에 있고, 이러한 상태가 원형을 이루어지고 있기 때문에 데드락에 빠질 확률이 높다고 판단한다. 메모리 주소 바인딩1. symbolic address: 소스 프로그램에 변수와 같이 메모리 주소를 상징적으로 저장2. relocatable address: 실제 메모리 주소가 결정될 수 있는 재배치 가능 주소3. absolute address: 컴파일 타임에 결정되는 메모리 주소 1. compile time: 컴파일 시점에 물리 주소가 결정 (`absolute address`로 결정)2. load time: 컴파일 시점에 메모리 위치가 확정나지 않았다면, relocatable code로 변환. 프로세스가 로드되어 메모리에 올라갈 때 물리 주소가 결정3. execution time: 프로그램 실행 도중에 메모리 주소가 변경될 수 있다면 런타임까지 바인딩 지연. MMU에 의해서 논리 주소를 물리 주소 결정 📌 백엔드 면접 질문해보기데드락과 라이브락의 차이점?데드락은 두 개 이상의 쓰레드가 자원을 점유하고 있지만 다른 자원을 점유하기 위해 대기 중인 교착 상태를 의미합니다. 라이브락이란 두 개 이상의 쓰레드가 충돌을 회피하기 위해 실패 작업을 반복하지만 진전이 없는 상태를 의미합니다.데드락은 교착 상태에서 모든 프로세스가 멈춰버리지만 라이브락은 실패 작업을 계속 시도하기 때문에 멈추지는 않습니다. 락 기반 동기화와 락 프리 알고리즘이란?락 기반 동기화란 하나의 프로세스만 공유자원을 사용하도록 강제하여 동기화시키는 방법입니다. 뮤텍스나 세마포어가 락 기반 동기화에 해당됩니다. 락 기반 기법은 두 개 이상의 스레드가 서로 상대방의 락의 해제를 기다린다면 데드락이 발생할 수 있으며, 낮은 우선순위의 스레드가 자원을 먼저 점유하면 높은 우선순위의 스레드가 대기를 해야하는 우선순위 역전 등의 문제가 있습니다.락 프리 알고리즘이란 락을 사용하지 않고도 동기화를 유지시킬 수 있는 알고리즘입니다. 해당 알고리즘은 CAS(Compare And Swap) 같은 원자적 연산을 통해 동기화를 보장하는데, 원자적 연산이란 연산이 중간에 중단없이 시작되지 않거나 완전히 수행되는 것(all or nothing)을 의미하며 CAS는 해당 원자적 연산을 기반으로 현재값을 읽고 예상했던 값과 일치할 경우에만 값을 변경하며 일치하지 않는다면(다른 쓰레드의 개입) 업데이트하지 않는 방식입니다. Node.js에서 데드락이 발생할 수 있을까? 공식 문서에 따르면 Node.js에는 락이 존재하지 않아서 데드락이 발생될 확률이 매우 적다고 적혀있습니다. 다만 libuv에서 제공하는 동기적인 메서드를 실행할 때, js파일에 대해 대기 상태가 발생할 수 있는데 이는 데드락이라기 보다는 Blocking에 해당합니다. 또한 이러한 동기 I/O 메서드에 대해서도 콜백을 포함한 비동기 처리 함수가 함께 제공됩니다. (readFileSync / readFile) V8 엔진 메모리 관리 방식은? V8 엔진은 node.js의 실행 엔진이며 컴파일과 GC를 포함하고 있다.V8 메모리 구조(Resident set)은 크게 Heap과 Stack 메모리로 구분된다.Heap에는 크게 New Space와 Old Space가 존재하며 New Space는 짧은 생명주기를 갖는 새로 생성된 객체들이 저장되며 2번의 minor GC에도 제거되지 않은 객체는 Old Space로 이동되어 저장된다. New Space는 minor GC, Old Space는 Major GC로 참조되지 않는 변수들을 가비지 컬렉팅 한다. Buffer와 Stream의 메모리 사용 방식 차이? Buffer: 데이터를 조각(chunk)내어 buffer에 다 차우면(buffering) 일괄로 데이터를 전송. - 메모리의 사용 비율이 크지만 데이터 처리 속도가 크게 향상Stream: 데이터 청크와 버퍼의 크기를 작게하여 지속적으로 데이터를 전달하는 방식 - 메모리 사용이 적지만 데이터 실시간 효율성이 높아짐 📔 회고🚀 최종 목표 : 더 효율적인 백엔드 개발을 위해 기본적인 운영체제 지식들을 확실히 잡아가기🚀 매주 규칙:각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분강의를 듣고 최대한 이쁘게 (?) 정리해놓기 매 강의를 듣고 궁금하거나 이해가 안가는 부분은 추가적으로 더 찾아서 정리해두기매 강의 내용을 백엔드 관점에서 고민해보고 GPT와 대화를 통해 정리첫 주차 발자국과 미션을 수행한 후에 이번 주에는 더 구체적이고 집중적으로 강의를 듣고 복습할 수 있게 방식을 수정하였다.규칙 3번에서 매 강의를 듣고 궁금하거나 이해가 안가는 부분에 대해서는 보통 검색을 통해 블로그를 찾아보고 정리하였었다. 하지만 블로그에 적혀있는 글마다 내용이 다르기도 하고 궁금증이 해소되지 않는 부분들이 있어, 더 찾아보던 도중 CS로 유명한 공룡책(Operating Systerm Concepts) 무료 영문 pdf파일을 발견하였고 그 날 강의에 해당하는 주제에 맞춰 공룡책을 공부하고 개념을 탄탄히 하는 것에 집중하였다. 추가적으로 인프런 강의 중에 무료로 공룡책에 대한 내용을 설명해주는 강의도 있어 함께 공부를 하니 더 깊이 있고 쉽게 개념을 잡아갈 수 있었던 것 같다.규칙 4번에서 처음에는 백엔드 관점으로 강의 내용을 살펴보려 하였는데, 생각보다 모호하고 막연하다고 생각하여 규칙을 조금 변경하였다. GPT에는 Node.js 전문가 프롬프트가 제공되어 있어서, 해당 프롬프트를 이용하여 오늘 배운 내용에 대해 이야기하고 백엔드 면접 질문을 리스트로 달라고 요청하면 기초부터 고급 그리고 node.js를 활용한 심화 질문까지 리스트업해준다. 해당 부분에 대해서 스스로 답변해보고 답변하지 못한 부분이나 설명이 부족한 부분은 다시 AI와 대화하면서 지식을 채울 수 있었던 것 같다.결과적으로 3. 매 강의 듣고 해당 내용 공룡책 & 강의 1회 정독 및 수강 / 4. 매 강의에 대한 내용 백엔드 면접 질문을 추려서 답변하고 개념 구체화하기 이렇게 수정하여 2주차를 진행하였다. 기존 독학으로 CS를 공부하였을 때는, 그 범위가 너무 넓어 어떤 부분을 공부하고 있는지도, 어디까지 공부해야할 지도 전혀 감을 잡을 수 없었는데 이렇게 강의를 수강하고 그 강의의 깊이있는 개념까지 찾아가며 공부하다보니 확실히 체계가 잡히고 개념도 탄탄히 공부해 볼 수 있는 것 같다. 해당 방식으로 공부하면 딱 몰입할 수 있을만큼 적당히 공부하는 것 같아서 다음 주에는 추가적인 규칙을 넣기보다 기존 규칙을 유지해보려고 한다. 

시스템 · 운영체제인프런워밍업운영체제발자국

채채

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

학습 내용운영체제프로세스 동기화컴퓨터 내 프로세스 간 통신동일 프로세스 내 통신: 운영체제가 생성한 파이프로 데이터를 읽고 씀스레드 간 통신: 데이터 영역이나 힙 영역 사용 시 통신 가능동일 네트워크 내 프로세스 간 통신소켓 통신, RPC(원격 프로시저 호출)공유 자원: 프로세스 통신 시 공동으로 이용하는 변수나 파일임계구역 (Critical Section): 여러 프로세스가 동시에 사용하는 영역해결책: 상호 배제의 매커니즘경쟁 조건 (Race Condition): 공유 자원을 서로 사용하기 위해 경쟁하는 것상호 배제의 요구사항임계 영역에는 동시에 하나의 프로세스만 접근여러 요청에도 하나의 프로세스의 접근만 허용임 영역에 들어간 프로세스는 빠르게 나와야함.세마포어공유자원이 하나 이상일 때 처리하는 동기화 방법예) 프린터 실을 예시로 들때직원: 프로세스기존 프린터: 공유자원프린터실: 임계구역대기줄: 대기큐열쇠 관리자: 운영체제열쇠: 세마포어자바스크립트는 멀티 스레드 환경이 아니라서 비동기 코드에서 적용할 수 있음모니터:세마포어의 단점을 해결한 상호배제 매커니즘교착 상태 (데드락)여러 프로세스가 서로 다른 프로세스의 작업을 기다리다가 아무도 작업을 진행하지 못하는 상태필요 조건 (모두 충족 시 교착 상태 발생)상호 배제: A가 리소스 점유 시 B에게 공유될 수 없음 (즉, 한 번에 하나의 프로세스만 특정 자원을 사용할 수 있음)비선점: A 프로세스는 B가 점유한 리소스를 뺏을 수 없음점유와 대기: 리소스 A를 가지고 있는 상태에서 리소스 B를 원하는 상태 (무한정 대기)원형 대기: 점유와 대기를 하는 프로세스가 원형을 이룸 (서로 교차해서 자원을 기다리고 있는 상태, 모든 프로세스가 영원히 자원을 획득할 수 없음)회피 방법은행원 알고리즘: 교착 상태를 피하기 위해 상태 확인 뒤 실행안정 상태: 자원 요청을 했으나 사용 가능한 자원이 더 적을 경우 요청 거부불안정 상태: 모든 프로세스에 자원을 공급할 수 없는 경우교착상태 검출가벼운 교착 상태 검출: 일정시간동안 작업하지 않을 시 교착 상태 발생으로 간주과정: 일정 시간마다 체크포인트 생성 -> 작업 저장 -> 타임 아웃으로 교착 상태 발생 시 마지막 지점으로 롤백무거운 교착 상태 검출: 운영체제가 자원 사용 여부를 지켜보고 교착 상태 발생 시 해결과정: 자원 할당 그래프 사용 -> 교착 상태 발생 시 순환 구조 형성 -> 교착 상태 해결을 위해 순환 구조 단절 -> 해결 후 재실행 시 체크포인트 롤백컴파일 과정: 문법 오류 확인, CPU에서 처리 가능한 기계어로 실행 파일 생성 => 속도 빠름대표 언어: C, C++, C#인터프리터 과정: 코드를 한 줄씩 해석 후 변환 (미리 검사하지 않음) => 속도 느림, 오류 발생 가능성 높음대표 언어: JavaScript, Python, Ruby1. test.c → 전처리기 → 전처리 구문 처리 → test.i → 컴파일러로 어셈블리어로 변환 → test.s → 어셈블러로 오브젝트 파일 변환 → test.o → 링커에서 실행 파일로 생성 → test.exe2. test.exe 프로그램 실행 → 운영체제가 프로세스 생성 → PCB 생성 → 프로그램 카운터를 코드 영역의 첫번째 주소로 설정 → CPU 스케줄링에 따라 프로세스 실행 → 종료메모리 종류: 레지스터, 캐시, 메인메모리(RAM), 보조저장장치(HDD, SSD)레지스터가장 빠른 기억장소, CPU 내 존재, 휘발성 메모리, 빠름RAM의 값을 레지스터로 가져와서 계산 -> 계산 결과는 다시 RAM에 저장캐시레지스터에서 쓸 법한 데이터를 RAM에서 미리 가져와서 저장, 사용 완료 후 다시 RAM에 저장보조 저장장치: 가격 저렴, 비휘발성 메모리휘발성 메모리: 전원 공급이 없으면 데이터가 사라짐비휘발성 메모리: 전원 공급이 없어도 데이터가 사라지지 않음메인 메모리 RAM운영체제에 프로세스가 올라가는 공간, 휘발성 메모리, 가격 비쌈멀티 프로그래밍 환경에서 여러 프로그램을 올리다 보니 복잡해짐운영체제는 메모리 관리를 위해 1바이트 구역으로 나누고 숫자(주소)를 매김32bit 메모리레지스터 크기, 산술논리연산장치, 데이터 이동 버스 === 32bit가능한 메모리: 2³² ⇒ 4GB64bit 메모리레지스터 크기, 산술논리연산장치, 데이터 이동 버스 === 64bit가능한 메모리: 2⁶⁴ ⇒ 거의 무한대32bit에 비해 한 번에 처리할 수 있는 양이 많음 → 속도가 더 빠름물리주소 공간(절대 주소): 0x0번지부터 시작하는 주소공간메모리 관리자가 바라본 실제 주소논리 주소 공간(상대 주소): 사용자 관점에서 바라본 주소, 물리주소를 몰라도 접근 가능메모리 어디선가 실행되겠지~~하고 컴파일러는 0번지에서 실행한다고 가정하고 컴파일함경계 레지스터: 하드웨어적으로 운영체제 공간과 사용자 공간 분리CPU 내 존재사용자 프로세스가 경계 레지스터의 값을 벗어났는지 감시 (메모리 관리자)벗어났을 경우 프로세스 종료유니 프로그래밍에서의 메모리 분리당장 실행해야하는 부분만 잘라서 메모리에 올리고 나머지는 하드디스크의 스왑 영역에 저장스왑: 스왑영역에 있는 데이터 일부를 메모리로 가져오고 메모리에 있는 데이터를 스왑영역으로 이동멀티 프로그래밍에서의 메모리 분리가변 분할 방식 (Segmentation)프로세스의 크기에 따라 메모리를 나누는 방식연속 메모리 할당: 프로세스가 연속된 메모리 공간에 할당장점: 낭비 공간인 내부 단편화가 없음단점: 외부 단편화 발생고정 분할 방식 (Paging)메모리를 정해진 크기로 나누는 방식예) 고정 크기가 2MB인 경우 5MB인 프로세스는 2MB + 2MB + 1MB + 낭비 공간 1MB비연속 메모리 할당: 프로세스가 여러 개로 쪼개어 여러 곳에 할당됨장점: 구현 간단, 오버헤드 적음단점: 낭비 공간 내부 단편화 발생현대 운영체제는 가변 분할 방식과 고정 분할 방식을 혼합함외부 단편화메모리의 공간보다 프로세스의 크기가 더 큰 경우해결책: 조각 모음단점: 현재 사용 중인 프로세스 전체 일시 중지, 메모리 공간을 이동시키는 작업을 해야함 ⇒ 오버헤드 발생내부 단편화메모리 공간보다 프로세스의 크기가 더 작은 경우해결책: 없음버디 시스템: 2의 승수로 메모리 분할 및 할당방법2의 승수로 프로세스 크기보다 작은 값이 나올때 까지 분리 (예: 1024 - 1024(512 - 512(256 - 256)))비슷한 크기의 프로세스에 할당 (예: 512byte에 할당 (내부 단편화가 적게 발생, 실행이 끝나고 근접한 메모리와 합치기 쉬움))2의 승수로 분할했기 때문에 조립만 하면 큰 공간이 만들어짐 (조각모음보다 간단함)장점가변 분할: 프로세스 크기에 따라 할당되는 메모리 크기가 다름외부 단편화 방지를 위해 메모리 공간 확보가 간단함내부 단편화가 발생하나 많은 공간이 낭비되지 않음  자료구조 & 알고리즘재귀 함수: 자기 자신을 호출하여 문제를 해결하는 함수필수: 기저 조건기저 조건이 없으면 반복되는 출력으로 호출 스택의 메모리 공간이 가득 차서 자동으로 종료됨기본 패턴단순 반복 계산 (예: 누적합, 누적곱, DFS 등)하위 문제의 결과를 기반으로 현재 문제 계산 (예: 팩토리얼, 피보나치 등)상향식 계산: for문, 재귀 함수하향식 계산: 재귀 함수만 가능호출 스택함수가 호출되면서 올라가는 메모리 영역, FILO재귀함수는 모든 호출이 콜 스택에 올라가고 for문은 1개만 올라감예) 팩토리얼function factorial(number) { if (number <= 1) return 1; return number * factorial(number - 1) } console.log(factorial(4)) // 4 * 3 * 2 * 1예) 모든 원소의 합function sumArray(arr){ if (arr.length == 1) return arr[0]; return sumArray(arr.slice(0, -1)) + arr[arr.length - 1] } const arr = [1,2,3,4,5] const sum = sumArray(arr); console.log(sum)예) 하노이 탑규칙1. 한 번에 하나의 원반을 움직일 수 있다.2. 가장 위에 있는 원반만 옮길 수 있다3. 아래에 작은 원반이 올 수 있다.function hanoi(count, start, target, tmp) { if (count === 0) return; hanoi(count - 1, start, tmp, target) hanoi(count - 1, tmp, target, start) } hanoi(3, 'A', 'C', 'B')1. count - 1개의 작은 원반을 start → tmp로 옮긴다. (임시: target)2. 가장 큰 원반을 start → target으로 옮긴다.3. count - 1개의 작은 원반을 tmp → target으로 옮긴다 (임시: start)4. 이전 과정을 반복하며 모든 원반을 start에서 target으로 옮긴다.5. 모든 원반을 옮겨 count가 0이 되면 재귀를 종료한다.버블 정렬장점: 구현하기 쉬움단점: 성능이 좋지 않음방법: 근접한 두 개의 숫자를 비교하여 정렬되어있지 않다면 오름차/내림차 순으로 정렬한다.시간 복잡도: O(n²)버블 정렬 구현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 } } } } const arr = [4, 2, 3, 1] // ===== 정렬 전 ===== console.log(arr) // ==== 정렬 후 ===== console.log(bubbleSort(arr)선택 정렬장점: 구현하기 쉬움단점: 성능이 좋지 않음방법: 정렬되지 않은 영역의 첫번째 원소와 가장 작은 값의 위치 교환시간 복잡도: O(n²)선택 정렬 구현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; } }  회고Keep시간표에 따라 매일 CS 지식을 학습했다. 뿌듯나머지 한 주를 잘 마무리하면 좋겠다.Problem없다Try재귀를 구현할 때 더 작은 문제로 나누는 연습을 해야할 것 같다. 기저 조건과 점화식은 바로 이해되는데 나머지가 약간 알쏭달쏭하다.

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

강동훈

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

운영체제

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

운영체제워밍업클럽CS

elly

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

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

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

elly

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

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

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

minme9055

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

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

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

minme9055

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

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

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

유선아

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

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

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

채널톡 아이콘