블로그
전체 32025. 03. 14.
0
[워밍업클럽3기] CS전공지식 2주차
기본편 - Section 03 알고리즘재귀 (recursion)사전적 정의: 어떠한 것을 정의할 때 자기 자신을 참조하는 것.탈출조건(=기저조건)이 필수적으로 있어야함.콜스택함수가 호출되면서 올라가는 메모리 영역FILO의 조건을 가짐스택자료구조를 잘 활용한 대표적 사례재귀함수는, 호출할 때마다 콜스택영역을 차지함탈출조건이 없으면 콜스택에 계속 쌓이기만함-> 메모리부족->자동stopfor문 대신 사용하기보다는, 팩토리얼과 같이 더 쉽게 함수구현을 위한것임.재귀함수내에서 자기자신을 호출할때, 이미 함수가 구현되어있다고 가정함.재귀함수: 나 자신을 호출, 구현할때는 이미 구현된 것을 부르는 것처럼 구현하면 쉬움 재귀적으로 생각하기pattern 01:단순 반복실행반복문으로 구현했을때보다 성능이 떨어짐pattern 02:하위 문제 결과를 기반으로 현재문제 계산팩토리얼을 예를 들으면, return number*factorial(number -1);여기에서 하위문제(=factorial(number-1);)를 기반으로, 현재문제(number*factorial(number-1);)를 해결함for문이용은 상향식 계산, 재귀함수를 이용하는 것은 하향식 계산모든 재귀가 하향식은 아님상향식: for문, 재귀함수 구현가능(상향식에서 재귀함수는 매리트없음)하향식: only 재귀함수만 가능 재귀 - 하노이탑재귀함수의 대표적인 예하향식 계산법의 대표적인 예임!순서대로 예상 스택을 쌓아보면 알수 있음1st stack원반 3 -> 기둥 C원반 2, 1 -> 기둥 B원반 1 -> 기둥 C위에서 1번째를 스택 제일 아래에 놓으면,원반 1 -> 기둥 C 부터 실행하게됨2nd stack원반 2 -> 기둥 C원반 1 -> 기둥 A버블정렬(Bubble sort)배열에 무작위로 섞인 숫자 정렬 방법 중 1개그 중 가장 쉽게 생각 할 수 있는 알고리즘구현 쉬움, but 성능 안좋음[4,2,3,1] -> [2,4,3,1] ->[2,3,4,1]->[2,3,1,4]->[2,3,1,4]->[2,1,3,4]->[2,1,3,4]->[1,2,3,4]버블정렬의 성능알고리즘의 빅오 표기법으로 할때, 숫자로 바꾸어보면 쉬움버블 정렬은 (n-1)+(n-2) ... +2+1 = n(n-1)/2 =(n^2-n)/2b 결과적으로 O(n^2)for문 두개가 중첩되어있으니 O(n^2)이라고 예측이 가능하기도함.버블 정렬의 장단점장점: 이해와 구현이 간단함단점: 성능이 O(n^2)으로 좋지만은 않음. 선택정렬(Selection Sort)버블정렬처럼 간단한 정렬에 속함정렬되지 않은 영역의 첫번째 원소를 시작으로 마지막 원소까지 비교후 가장 작은값을 첫번째 원소로 가져옴정렬이 되지 않은 영역에서 가장 작은수와 가장 큰수 위치 바꿔치기!선택정렬의 성능바깥 for문이 실행될수록 안쪽 for문이 줄어듦 -> 선택 정렬의 성능도 버블정렬과 동일한 O(n^2)선택정렬의 장단점은 버블정렬의 장단점과 동일함.그림으로 배우는 운영체제 Section 04프로세스간 통신프로세스: 독립적이기도 데이터를 주고받기도함한 컴퓨터내의 다른 프로세스 or 네트워크로 연결된 다른 프로세스와 데이터를 주고받기도함종류한컴퓨터 내에서 데이터 주고받음파일을 이용: 여러개의 프로세스가 하나의 파일을 읽고씀파이프 이용: 운영체제가 생성한 파이프를 이용함쓰레드를 이용함: 한프로세스내에서 쓰레드가 주고받음네트워크를 이용함소켓통신RPC(원격 프로시져호출)공유자원: 프로세스가 통신할때 공동으로 이용하는 파일이나 변수각프로세스의 접근 순서에 따라 결과가 달라질 수 있음.컨텍스트 스위칭으로 시분할 처리: 어떤 프로세스가 먼저 실행되는지 예측어려움연산결과 예측 어려움 -> 동기화 문컨텍스트 스위칭(Context Switching): 운영체제(OS)가 여러 개의 프로세스를 실행해야 할 때, 현재 실행 중인 작업을 멈추고 다른 작업으로 전환하는 과정임계구역(Critical Section): 여러 프로세스가 동시에 사용하면 안되는 구역!임계구역 문제 해결을 위한 조건상호배제 메커니즘: 임계영역엔 동시에 하나의 프로세스만 접근, 여러 요청에 도 하나의 프로세스 접근만 허용, 임계구역에 들어간 프로세스는 빠르게 나와야함.세마포어: 상호배제 메커니즘 중 한가지경쟁조건(Race Condition): 공유자원을 차지하기 위한 프로세스의 경쟁?동기화에서 가장 중요한 개념프로세스가 공유자원에 접근하기 위해서 운영체제가 세마포어를 우선순위가 높은 프로세스에게 먼저주고, 프로세스가 일을 다하면 운영체제에게 세마포어를 주고, 다시 운영체제는 세마포어를 대기큐에있던 다른 프로세스에게 전달해주는 식임.쉽게 생각해서 은행줄 같은느낌?손님 = 프로세스, 은행원 = 공유자원, 번호표 기계 = 운영체제, 세마포어 = 번호표세마포어를 이용하면, 공유자원에 여러 프로세스가 동시에 접근하지 않기 때문에 동기화문제가 일어나지 않음.세마포어: 정수형 변수임단점: 함수 순서가 중요함 (모니터를 통해 커버가능) 모니터: 세마포어의 단점을 해결하기 위한 상호배제메카니점프로그래밍 언어 차원에서 지원하는 방법synchronized: 자바에서 이것이 붙으면 동시에 여러 프로세스에서 실행할 수 없음!상호배제가 완벽하게 이루어짐이런 것을 제지해주는 것이 모니터의 역할임실제 모니터아니고 지켜본다의 모니터인듯?Section 05 데드락(교착상태)여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무 작업이 이루어지지않는 상태약간 고집센 상태?교착상태 발생이유: 공유자원을 서로 차지하려다 발생함.교착상태의 필요조건상호배제: 먼저 차지하면 다른 프로세스가 사용할 수 없는 리소스임.비선점: 프로세스가 이미 사용하고 있는 것을 다른 프로세스가 뺒을 수 없음.점유와 대기: 프로세스가 다른 리소스를 기다리는 상태원형대기: 점유와 대기를 하는 프로세스의 관계가 원형을 이룸예로 프로세스 A는 프로세스 B의 리소스를, 프로세스 B는 프로세스 C의 리소스를, 프로세스 C는 프로세스 A 의 리소스를 원하는 상태.교착상태 해결교착상태 회피(Deadlock avoidance)프로세스에 자원을 할당할 때 교착상태가 발생하지 않는 수준의 자원을 할당하는 것.전체 자원과 할당된 자원을 기반으로 안정상태를 유지하려 하는것.불안정 상태 =/= 교착상태. 그저 가능성이 높을 뿐.은행원 알고리즘: 전체자원의 수를 알고 있지 않은 채로 자원을 잘못나눠주면 교착상태가됨최대요구자원: 프로세스가 원하는 자원의 수교착상태 검출 방법가벼운 교착상태 검출: 타이머이용일정시간동안 프로세스가 일을 안함 = 교착상태해결법: 중간저장해서 교착상태되면 중간저장한데로 가는것무거운 교착상태 검출: 자원할당 그래프 이용운영체제가 어떠한 자원을 프로세스가 사용하는지 관찰순환구조가 생기는 그래프 = 교착상태교착상태 발생 -> 강제종료강제 종료된 프로세스를 체크포인트에서 롤업오버헤드가 발생하기도함. Section 06컴파일과 프로세스프로그래밍언어컴파일 언어: 개발자가 코드작성 -> 컴파일을 이용하여 기계어로 변환컴파일 과정: 문법 오류 검증 및 기계어로 변환함.C, C++, C#등이 이에 속함인터프리터언어: 개발자가 작성한 코드를 한줄씩 해석해 기계어로 변환미리 검사하지 않아 실행 시 오류가 발생할 수 있음.컴파일 대비 느림JS, Python, Ruby가 이에 속함프로세스: code, data, stack, heap영역code: 말그대로 코드가 들어감data: 전역변수 or 배열stack: 지역변수나 함수 매개변수, 함수의 리턴 주소저장.heap: 동적 메모리 할당.test.c: 개발자가 C언어로 코딩함.전처리기: 개발자 코딩보고, 전처리부분(C언어에서 #부분)을 코드에 치환시킨 후 주석제거test.i: 전처리 된것 저장컴파일러: C언어 파일을 어셈블리어로 저장함.test.s: 어셈블리어 파일어셈블러: 어셈블리어를 오브젝트 파일로 변환test.o: 0과 1로 된 기계어로 구성된 오브젝트 파일 (코드영역과 데이터 영역이 나누어있음)링커: 오브젝트 파일을 실행파일로 변환.모든 오브젝트 파일을 하나의 데이터영역과 코드영역으로 바꿈실제 실행될 주소 매핑test.exe: 운영체제가 프로세스를 만들어줌. 완벽한 상태의 코드영역과 데이터 영역으로 나누어짐.이후...운영체제 ->exe파일의 코드영역과 데이터영역을 프로세스의 코드영역과 데이터영역에 넣어줌-> 빈상태의 스택과 힙을 할당 ->PCB를 만들어 관리가 가능하게 만들어줌 -> 프로그램 카운터(다음 실행할 명령어의 주소를 생성한 프로세스의 코드를 첫번째 주소로 설정) -> CPU 스케줄링에 맞추어 프로세스 실행후 작업을 마침Section 07메모리의 종류 (1번이 가장 속도가 빠르고 용량이 작으며 비쌈)레지스터: 가장빠른 기억장소, CPU내에 존재휘발성 메모리레지스터의 크기= 32bit, 64 bit메인메모리의 값을 레지스터로 가져와 계산 후 메인 메모리로 옮김캐시: 메인메모리에서 레지스터로 옮길때 미리 가져오는 데이터를 캐시에 옮겨둔다.캐시는 여러개를 둠. 가장 빠른 캐시 = L1.RAM(매인 메모리): 실제 운영체제와 여러 프로세스를 사용실행중인 프로그램만 돌림보조저장장치(HDD, SSD)비휘발성 메모리 메인메모리폰노이만 구조는 모든 프로그램을 메모리에서 실행시킴멀티프로그래밍 환경에서 여러개가 한번에 진행하여야 하기 때문에 복잡하고 어려워짐운영체제 : 1바이트 크기의 주소를 만들어 관리32bit= 레지스터, ALU, 데이터 이동버스 , 사용가능 메모리도 2^34=4Gb64bit = 레지스터, ALU, 데이터 이동버스, 사용가능 메모리는 2^64로 거의 무한대즉, 32bit보다 64bit ram이 더빠름 메모리에는 운영체제 영역이 따로있음.악의적이 프로그램이 운영체제를 침범하면 위험하기 때문에 경계레지스터( CPU내에 존재)를 통하여 보호함.절대주소: 실제 프로그램이 올라가는 주소, 물리 주소공간이라고도함.상대주소: 사용자가 바라보는 주소, 논리 주소라고 하기도함.메모리 할당방식메모리보다 더큰 프로그램은!!!프로그램을 메모리만큼 자른뒤 필요한거 일부 실행, 나머지 일부는 하드디스크내 스왑영역에 두었다가 사용함. = memory overlay멀티 프로그램 환경에서는,가변분할 방식 사용프로세스 크기에 따라 메모리는 나눔한프로세스가 메모리의 연속된 공간에 할당: 연속 메모리 할당단점: 외부단편화 발생장점: 빈공간 없음.고정 분할 방식프로세스 크기 상관없이 메모리 나눔 비연속 메모리할당: 메모리가 잘라서 나누어 들어가기도 하기때문장점: 구현이 간단하고 오버헤드가 적음단점: 내부단편화 발생외부단편화세그멘테이션 = 가변분할방식일부 프로세스가 종료되어 그만큼의 메모리(50+10MB)를 다른 프로세스(60MB필요)가 사용할때, 메모리가 연속으로 붙어있지 않으면 다른 프로세스에 할당이 어려운 것을 외부단편화라 함.해결방법: 조각모음,단점: 사용중 메모리 전부 중단, 메모리 이동해야함 -> 오버헤드 발생내부단편화페이징 = 고정분할 방식일정하게 분할된 메모리(20MB)이지만, 프로세스가 더 많은 메모리(50MB)가 필요하면 불할된 메모리를 프로세스가 필요한 메모리보다 많은 메모리(60MB)를 제공함버디시스템2의 승스로 메모리 분할해 할당함내부단편화가 발생하지만, 크기가작음동일하게 나누었기 때문에 조립하기 쉬움 (조각모음보다 간단함) 2주차 후 소감...확실히, 한글로 배우니까 너무 좋음.자세히 그림으로 설명해주시는것도 너무 좋음...이해 쏙쏙되어서 너무 좋다.학기 시작할때 알고 시작했으면 더 좋았을걸 하는 아쉬움남은 2주 화이팅 :)
cs
・
전공지식
2025. 03. 09.
0
[워밍업클럽3기] CS전공지식 1주차
그림으로 쉽게 배우는 자료구조와 알고리즘 (기본편)Section01. 개요자료구조var (variable, 변수)arr (Array, 배열)index를 이용하여 해당 data에 접근함자료 구조에 따라 배열을 사용하는 것이 편할 수 있음. Algorithm.확실한 방법을 의미함시키는대로 했을 때 답이 나와야함.모호한 방법은 안됨자료구조에 따라 알고리즘이 달라짐특정 자료구조 =/= 하나의 알고리즘시간복잡도더 좋은 알고리즘이란?사용자의 니즈에 따라 다름depend on the memory size, speed or both일반적으로 알고리즘 속도 = 성능속도 = 시간 복잡도시간 복잡도: 특정 알고리즘이 어떤 문제를 해결하는데 걸리는 시간사용자마다 컴퓨터 사양이 다르기 때문에 실행시간이 무조건 같지는 않음.알고리즘의 평가는 코드에서 성능에 많은 영향을 주는 부분을 찾아 실행시간을 예측하는 것임.코드에서 성능에 많은 영향을 주는 부분 = 반복문빅오 표기법 빅오 표기법이 성능을 정확하게 표현하지 못하는 이유: 단순히 해당알고리즘의 입력이 늘어날 때, 계산량이 얼마나 늘어나는지를 표현하는 방법이기 때문O(n) : 선형시간 알고리즘O(1): 상수시간 알고리즘O(1) > O(logn) > O(n) > O(nlogn) > O(n^2) > O(2^n) > O(n!)계산에 가장 많이 영향을 미치는 차수만 표시함Section02. 자료구조배열 [array]기본적으로 제공하는 자료구조일반적인 배열: 선언시 배열의 크기를 알려줌읽기/쓰기/참조에서 좋은 성능을 보임삽입/ 삭제에서 좋지 않은 성능을 보임이유: 이미 연속된 메모리공간을 선언하였기 때문에 배열의 끝에 새로운 메모리로의 추가가 어렵기 때문에 새로운 사이즈의 배열을 추가할 수 있는 메모리를 찾아야함. (삭제도 같은 이유)배열을 너무 크게할경우, 일시적으로 해결 되는 것처럼 보이지만, 결국 제한적이고 배열의 크기와 메모리의 크기가 비례하기 때문에, 너무 큰 배열은 너무 많은 메모리를 차지하게됨.연결리스트 [linked list]배열의 단점을 해결해줌연결은 노드를 이용함node는 data의 위치 + next node number위와 같은 이유로 node = linked list장점열의 초기 크기를 알아야하는 단점이 없음.삽입과 삭제가 용의함단점데이터들이 떨어져 있어서(노드번호에 따라 위치가 다름) 특정 순서의 데이터로 바로 갈 수 없음.각 노드의 다음노드를 무조건 알아야 하기때문에 O(n)의 성능을 가짐.array의 성능은 O(1)데이터의 참조가 많이 일어나는 경우에는 배열이,데이터의 삽입과 삭제가 많이 일어나는 경우에는 연결리스트가 도움이 됨.스택(Stack)Stack의 사전적의미: 더미, 무더기 인것처럼 무작정 쌓는 개념FILO(First in Last Out)그냥 물건 쌓아두는 개념선입선출과 반대됨 큐(Queue)FIFO (First In First Out)선입선출의 개념임질서를 위해 서는 줄head에 삽입, 제거연결리스트로 구현함.O(n)의 성능이 나옴그렇기 때문에 head는 가장 앞의 노드, tail은 가장 뒤의 노드로 tail 변수추가로 O(1)의 성능이 나오게함일반 연결리스트 아닌 이중 연결리스트 사용. (양방향 연결리스트임)tail의 이전노드를 할당함.enqueue : insert datadequeue : delete datafront : 데이터 참조isEmpty : 비어있는가 확인스택은 위로 쌓아 올려서 위에서 꺼내는 느낌이면큐의 경우 왼쪽에서 데이터 넣고 오른쪽에서 데이터 빼내는 느낌?덱(Deque)삽입과 제거를 head와 tail모두에서 가능하기 때문에 스텍과 큐의 형태 모두 구현가능추상자료형printAll: 모든 데이터 출력addFirst: head에 데이터 삽입removeFirst: head에서 데이터 제거addLast: tail에 데이터 삽입removeLast: tail에서 데이터 제거isEmpty: 리스트가 비어있는지 확인해시테이블(hash Table)해시테이블 (hash table)hash, map, hashmap, dictionary라고도 불림표를 저장하는 가장쉬운방법 = array에 저장index로 접근하다보니 빈공간이 많아지고, 낭비되는 공간이있음메모리 절약을 위해 어떠한 계산을 거쳐 인덱스로 치환함: 어떠한 계산이 해시함수임삽입, 수정, 삭제까지 O(1)의 성능을 가짐문제: 충돌이 발생하기도함해당인덱스를 연결리스트로 구현해 저장함: O(n)의 성능을 가짐이렇기 때문에 해시테이블은 해시함수의 선정이 매우 중요함.장점: 빠른 데이터 읽기, 삽입, 삭제단점: 메모리를 많이 차지함.셋(Set)데이터의 중복을 허용하지 않는 자료구조해시테이블을 이용함hash set이라고도 부름hash table의 key만 사용추상자료형add(data) 데이터 삽입isContain(data) 데이터 체크(boolean)remove(data) 데이터 제거clear() 셋비우기isEmpty() 셋이 비었는지 체크printAll() 모든 데이터 출력 그림으로 쉽게 배우는 운영체제Section1. 운영체제 들어가기운영체제가 하는일프로세스관리멀테가가능하게해줌예시) 게임하는중, 백그라운드로 노래나 인터넷 브라우저를 틀어놓을 수 있음메모리 관리모든 프로그램은 메모리를 사용하드웨어관리운영체제가 판단하여 적절한데 저장하드디스크에 중요한 것이 저장 될 수 있기 때문파일 시스템 관리하드디스크의 효율적인 저장과 관리를 위함운영체제의 구조커널: 프로레스와 메모리, 저장장치를 관리하는 핵심적인 기능사용자는 인터페이스를 통해서만 접근가능함GUI (Graphic user interface)ex. window더블클릭으로 디렉토리 이동 CLI (Command-Line Interface)ex. 리눅스텍스트로 입력해야지만 이동 어플리케이션은 시스템콜을 이용해서 커널에 접근가능하드웨어와 커널의 인터페이스는 드라이버임각각의 하드웨어에 맞는 프로그램을 커널이 다 가질수 없기 때문에, 복잡한 장치는 디바이스 드라이버를 설치해야 사용가능함. 인터럽트입출력작업이 들어오면 관리자에게 오더함주기적으로 확인해야함: polling방식주기적인 확인으로 성능이 좋지 않음cpu가 명령내리고, 입출력 관리자가 다 되었을 때 cpu에 알려줌: 인터럽트방식비동기적임하드웨어입출력등과 같은것소프트웨어방식유효하지 않은 메모리접근과 같은 것.Section2. 프로세스와 쓰레드프로그램명령문의 집합체저장장치만 사용하는 수동적 존재프로세스실행중인 프로그램하드디스크에 저장된 파일이 메모리에 올라갔을때 프로세스라함메모리도 사용하고, cpu도 사용하고, 필요에 따라 입출력도 사용하기에 능동적인 존재임code: 실행코드data: 전역변수와 static(정적) 변수가 저장stack: 지역변수와 함수호출했을 때의 정보가 저장heap영역: 프로그래머가 동적으로 메모리를 할당하는데 쓰임PCB(Process Control Block)운영체제는 프로세스를 공평하게 해야함PCB: linked list라는 자료구조로 저장됨PCB포인터: 효율적인 접근을 위해사용프로세스상태: 생성, 준비, 실행, 대기, 완료를 나타냄프로세스 ID: 프로세스를 실행하기 위한 숫자프로그램 카운터: 다음에 실행될 명령어 주소를 포함레지스터 정보: 프로세스가 실행될때 사용된 레지스터 번호메모리 관련정보: 메모리 위치, 메모리 침범을 막기위한 정보CPU스케줄링 정보: 우선순위, 점유시간 등이 저장됨더 많은 정보가 저장됨컨텍스트 스위칭(context switching)프로세스를 실행하는 중에 다른 프로세스를 실행하기 위해 실행중인 프로세스 상태를 저장, 다른 프로세스 상태로 교체하는 것.PCB에 상태 저장PCB: 프로세스상태, 프로그램 카운터 ,각종 레지스터 정보가 변경됨CPU점유시간이 초과할경우: 인터럽트 실행레지스터값을 저장해둠발생이유cpu 점유시간 초과입출력요청다른 종류의 인터럽트의 발생쓰레드: 프로세스 내에 존재함1개의 프로세스안에 여러개에 존재함code, data, heap영역을 공유하고, stack은 하나씩 가지고 있음.ID도 부여하고 , TCB부여함으로써 운영체제가 구분할 수 있게됨.프로세스장/단점안전성: 다른 프로세스가 영향을 미치지 않음오버헤드가 큼쓰레드 장/단점안전성이 떨어짐 (일부공유하기 때문)오버헤드가 작음Section3. CPU 스케줄링cpu스케줄링이 고려할 점 (컴퓨터의 성능에 많은 영향을 줌)어떤 프로세스에 cpu 사용권을 주어야 하는가 cpu 할당받은 프로세스에 얼만큼의 시간을 주어야 하는가다중큐준비상태와 대기상태는 큐의 자료구조로 관리됨운영체제는 프로세스의 우선순위를 정해서 할당해줌 스케줄링 목표리소스 사용률: cpu사용율 or I/O 디바이스 사용률을 높임오버헤드 최소화: 계산이 너무 복잡하거나, 컨테스트 스위칭을 너무 자주하면 오버헤드 심해짐공평성: 모든 프로세스에게 공평하게 cpu할당을 위함.단 시스템에 따라 달라질 수 있음.예를들어, 자율주행 자동차에서는 안전관련이 제일 중요, 음악재생은 덜함.처리량: 같은 시간내 더 많은 처리를 하는 것을 목표로 삼음대기시간: 최소화를 목표로함응답시간: 짧은 것을 목표로함목표간의 상반되는 것이 있음.처리량과 응답시간의 목표를 동시에 이룰 수 없을 때는 사용자의 시스템에 따라 초점을 맞추어줌.특정한 경우아니고서는 발란스를 이루는 것이 중요. FIFO (First In First Out)장점: 단순, 직관적단점: 순차적이여서 늦게오면 대기시간이 길어짐, I/O시간동안 cpu가 쉬고있기 때문에 cpu사용률이 떨어짐. 스케쥴링 성능은 평균 대기시간으로 평가함!*burst time 계산시에는 대기시간을 총더한값에 프로세스 갯수 나누기이기 때문에, 프로세스 시간이 짧은 것을 먼저 할 경우 대기시간이 짧아짐.SJF(Shortest Job First)FIFO의 단점을 해결하기 위해 고안됨.실제 고안에서 발생 되었던 문제프로세스 종료시간이 어느정도인지 예측어려움burst time이 긴 프로세스는 언제 진행이 될지 모르게됨 = 불공평해짐.RR(Round Robin)FIFO -> SJF -> RRfifo의 단점 해결을 위해 한 프로세스에 일정시간(=할당시간)을 부여하고, 시간이 초과하면 다른 프로세스로 가게 만듬프로세스에게 할당하는 일정시간 = 타임퀀텀, 타임 슬라이스RR algorithm은 컨텍스트 스위칭이 포함됨.타임슬라이스를 너무 작게하면, 컨텍스트 스위칭이 너무 많이 일어나게됨 = 오버헤드가 너무크다.사용자가 버벅거리게 느끼지 않고, 오버헤드가 너무 크지 않고, 동시에 실행되는 것처럼 느끼게하기..MLFQ (Multi Level Feedback Queue)기본적으로 작은 타임슬라이스를 가지지만, cpu작업이 비교적 작은 (ex. I/O bound process) 프로세스가 작은 타임 슬라이스를 가지고, cpu작업이 비교적 큰 프로세스가 타임 슬라이스가 크게 됨.타임슬라이스 기준으로, 우선순위를 정하게됨.
cs
・
전공기초
2025. 03. 09.
0
[워밍업클럽3기] Backend 1주차 발자국
Section 02. 추상추상: 뽑을 추 & 코끼리 상(형상 상)구체적 정보에서 어떠한 이미지를 뽑아냄wiki정의 : 사물을 정확하게 이해하기 위해서 사물이 지니고 있는 여러가지 측면 가운데서 특정한 측면만을 가려내어 포착하는 것이다. 어떤 일면만을 추상하는 것은 다른 측면을 버린다는 것과 같다.추상은 항상 구체적인 실재에서 시작해야한다..추상화 과정.. 빅뱅이론에서 쉘든은 추상화가 덜되었고, 보통사람은 추상화가 잘된느낌??추상화가 덜되어서 자꾸 뭐든 설명하려들고, 나머지사람들은 추상화가 잘되어 그렇게까지 디테일하게 말하지 않는 느낌? 예시) 추상: 너 만나기 전에 배가 고파서 먼저 밥먹었는데, 너는 밥 먹었니? 구제: 너와 00시에 만나기로 하였는데, 00시부터 나의 위에서 아무것도 없기 때문에 내 뇌로 배고프다는 신호를 보내주었기 때문에 나의 뇌가 무언가를 먹어야 한다는 신호를 보내어 집안의 냉장도를 열어서 음식을 찾아서 내 입에서 저작작용을 거쳐 식도를 지나 위로 넘어가는 일(=밥먹음)을 하고 왔는데, 너도 그런 일(=너도 먹음?)을 하고 왔니?추상: 심플, 구제: 구구절절 ?추상: 핵심만 담아 짧고 간결하게 표현하는 것. (효율 극대화)구제: 하나하나 풀어서 최대한 자세하게 설명하는 것. (비효율적)Method: 두개이상의 일을 하지 않도록 노력할 것!! 생략할 정보와 의미를 부여하고 드러낼 정보 구분해야함반환 타입 매서드명 (파라미터) {매서드구현부}추상화된 구체를 유추할 수 있는, 적절한 의미가 담긴 이름파라미터와 연결지어 더 풍부한 의미를 전달 할 수도 있음.파라미터의 타입, 개수, 순서를 통해 의미 전달외부세계와 소통하는 창임!외부세계로 method를 작성한 사람이 읽는 사람, 사용하는 사람으로 하여금 내가 뭘 할지 보여주는 것.method signature에 납득이 가는, 적절한 타입의 반환값 돌려주기.반환타입이 boolean의 경우 참거짓임.void 대신 충분히 반환할 만한 값이 있는지 생각해 볼것.반환값이 있다면 테스트가 용이해짐.void = 반환값이 없음을 의미. "값을 반환하지 않는다"의 의미.추상화는 코드의 양이 중요하다기 보다는 의미가 중요함!!! Section 03. 논리, 사고의 흐름사고의 depth 줄이기보이는 depth를 줄이는 것이 아니라 "사고과정의 depth"를 줄이는 것이 중요함.사고과정에 도움이 되면 여러 depth가 있어도 굳이 분리할 필요 없음 선언한 변수와 실제 사용되는 코드 사이에 쓸데없는(=연관되어있지 않은) 코드를 많이 넣지말것쉽게 생각해서 친한친구끼리 붙여두는것. 친한 친구 두명사이에 여러명이 있으면 둘의 대화가 하기 힘들어짐. 공백라인: 라인의 공백을 잘 주면 코드 읽기가 쉬워짐아무거나 붙여놓고, 떨어뜨려놓으면 가독성이 떨어지기 때문에, 의미단위로 자르는 것이 좋음 부정어: 최대한 부정서 사용을 자제할 것.부정의 의미를 담은 다른 단어 유무 확인부정연산자는 가독성이 떨어지기 때문. Section 04. 객체 지향 패러다임추상의 관점으로 보는 객체지향 절차지향: 정해진 순서대로(절차) 처리 객체지향: 객체간의 협력 함수형: 순수함수를 기반으로함.관심사의 분리관심사를 모음 = 유지보수가 쉬워짐높은 응집도 = 낮은 결합도 객체 설계객체가 제공하는것절차지향에서 잘 보이지 않았던 개념을 가시화함관심사 모음캡슐화되어 높은 추상화레벨에서 domain logic을 다룰 수 있음새로운 객체를 만들때 주의할점1개의 관심사인가외부세계와 어떠한 소통을 하려는지 생각할 것생성자, 정적 factory method에서 유효성 검증가능domain에 특화된 검증 로직이 들어갈 수 있음setter and getter 사용자제데이터는 불변이 최고임변하는 데이터라도 객체가 handling할 수 있어야함.객체 내부에서 자체적으로 변경/ 가공으로 처리 할 수 있는가네이밍은 의도를 드러내는 네이밍이 중요함field의 수는 적을 수록 좋음불필요한 데이터가 많다 = 복잡도가 높다 = 대응할 변화가 많다 = 코드가 골치아파진다미리 제공하는 것이 성능상의 이점이 있다 = 필드로 가지고 있는 것이 좋을 수 있음.SOILDSRP: Single Responsibility Principle하나의 클라스 = 하나의 변경이유(= 책임)객체가 가진 공개 메서드, 필드, 상수 등은 해당 객체의 단일 책임에 의해서만 변경됨관심사의 분리높은 응집도, 낮은 결합도SRP를 잘지킴 = 겹합도 낮음 = individual workingOCP: Open-Closed Principle개방-폐쇄 원칙확장(=open)과 수정(=closed)즉, 확장은 가능, 수정은 불가능추상화와 다형성을 활용하여 지킬 수 있음.LSP: Liskov Substitution Principleparent class의 instance는 child-class의 instance로 치환가능자식클라스는 부모클라스기능 +aLSP를 위반하면 상속 클라스를 사용할 때 오동작, 예상밖의 예외가 발생하거나 이를 방지하기 위하여 불필요한 타입체크가 동반될 수 있음.ISP: Interface Segregation Principle클라이언트는 사용하지 않는 인터페이스에 의존하면 안됨interface를 잘게 쪼개기!ISP위반 = 불필요한 의존성 = 결합도 높아짐 = 특정 기능의 변경이 여러 클래스에 영향을 미침DIP: Dependency Inversion Principle상위수준의 모듈은 하위 수준모듈에 의존해서는 안됨둘 모두 추상화에 의존의존성의 순방향은 고수준이 저수준 모델을 참조하는것, 역방향은 고수준 저수준 모두 추상화에 의존하는것직접적으로 의존하지 않게 설계됨. Section 05. 객체 지향 적용하기상속과 조합상속 상속은 수정이 어려움조합 and interface를 활용하는 것이 유연한 구조임상속을 통한 코드의 중복제제가 주는 이점보다, 중복이 생겨도 유연한 구조가 주는 설계적 이점이 더 큼.즉 중복도 상황보며 잘 이용해야함 중복이 무조건 나쁜건 아님Value Object (VO)식별자 없이 내부의 모든 값이 다 같아야 동등한 객체로 취급함. 개념적으로 전체 필드가 다같이 식별자 역할을 한다고 생각해도됨\ 기본 타입을 객체로 감싸서 추상화 값으로 취급하기 위해서 불변성, 동등성, 유효성 검증등을 보장해야함.불변성: final field, setter금지동등성: 서로다른 인스턴스여도(동일성이 달라도), 내부의 값이 같이면 같은 값 객체로 취급유효성 검증: 객체가 생성되는 시점에 값에 대한 유효성을 보장하기.Entity식별자가 같음 = 동등한 객체같은 식별자, 필드의 값이 다른 두 인스턴스 = entity가 시간이 지남에 따라 변화할 것으로 예측가능일급 컬렉션일급: 다른 요소에게 가능한 모든 연산자를 지원하는 요소변수할당가능파라미터 전달가능함수의 결과로 반환 가능 일급함수: 함수는 변수에 할당될 수 있고, 인자로 전달가능, 함수의 결과로 함수가 반환될 수 있음일급 컬렉션: 컬렉션만을 유일하게 필드로 가지는 객체다른 객체와 동등한 레벨로 다루기 위함collection 추상화: 의미담을 수 있고, 가공로직의 보금자리가 생기고 테스트 작성도 가능 Enum 특성: 상수의 집함, 상수와 관련된 로직을 담을 수 있는 공간특정 도메인 개념에 대해 그 종류와 기능 표현가능변정이 잦은 개념= DB로 관리하는 것이 나을 수 있음다형성활용변화하는것 : 조건 & 행위 = 구체변화하지 않는것: 조건을 만족하는가? 행위를 수행하는가? = 추상화OCP를 지키기 위해서 a,b는 구별해야함.숨겨져 있는 도메인 개념 도출도메인 지식은 만드는 것이아니라 발견하는것!!!객체지향 = 흉내내는 도구설계할 때는 근시적, 거시적 관점에 따라 최대한 미래를 예측틀렸다는 것을 인지할 경우 돌아올 수 있도록 코드를 짜야함. Day02.미션추상: 핵심만 담아 짧고 간결하게 표현하는 것. (효율 극대화) 구체: 하나하나 풀어서 최대한 자세하게 설명하는 것. (비효율적) 예시) 추상: 너 만나기 전에 배가 고파서 먼저 밥먹었는데, 너는 밥 먹었니? 구체: 너와 00시에 만나기로 하였는데, 00시부터 나의 위에 아무것도 없었기 때문에, 내 뇌로 배고프다는 신호를 보낸 결과 나의 뇌가 무언가를 먹어야 한다는 신호를 보내어 집안의 냉장고에서 찾은 음식이 내 입에서 저작작용을 거쳐 식도를 지나 위로 넘어가는 일을 하고 왔는데, 너도 그런 일을 하고 왔니? 즉, 보통 사람이 이야기하는 것은 추상화 된 개념이고, 이를 하기 위한 코딩을 하는 것이 구체가 되는 것이 아닐까 생각하게 되었습니다. Josh Darnit 유튜버의 Exact instructions challenge영상에서 아빠는 구체화 된 상태이고 아이들이 추상화 된 방법으로 이야기하는 것이라 생각하게 되었습니다. Day04. 미션 // ; Original public boolean validateOrder(Order order) { if (order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } else { if (order.getTotalPrice() > 0) { if (!order.hasCustomerInfo()) { log.info("사용자 정보가 없습니다."); return false; } else { return true; } } else if (!(order.getTotalPrice() > 0)) { log.info("올바르지 않은 총 가격입니다."); return false; } } return true; }//ordering public boolean validateOrder(Order order) { if (order.getItems().isEmpty()) { log.info("주문 항목이 없습니다."); return false; } if (order.getTotalPrice() // 캡슐화 public class Order { public boolean isValid() { return !getItems().isEmpty() && getTotalPrice() > 0 && hasCustomerInfo(); } public String getValidaionMessage { if(getItems().isEmpty()) return "No order list"; if(getTotalPrice() // 부정문 제거 public class Order { public boolean isValid() { return hasItems() && getTotalPrice() > 0 && hasCustomerInfo(); } public String getValidationMessage() { if(!hasItems()) return "No order list"; if(getTotalPrice() SRP: Single Responsibility Principle 하나의 클래스, 하나의 책임 예시) 필름카메라: 필름카메라는 카메라라는 목적에 맞게 사진을 찍는 하나의 기능만을 가지고 있음. OCP: Open-Closed Principle 확장에 대해 열려있고, 수정에 닫혀있음. 예시) 디지털 카메라: 사진을 찍는 목적은 있지만, 여러 렌즈를 교체하며 zoom정도의차이(확장)의 기능을 가지고 있지만, 사진 자체를 수정할 수는 없음. LSP: Liskov Substitution Principle 자식 클라스는 부모 클라스를 대체할 수 있어야 한다. 예시) 스마트폰에 대해 이야기 할 수 있음. 초창기 핸드폰(부모클라스)의 경우 전화와 문자의 기본적인 기능만 있었으나 현재의 스마트폰(자식클라스)는 거기에 추가적으로 카메라, 인터넷접속등의 추가적인 기능이 있어 자식이 부모 클라스를 대체할 수 있다. ISP: Interface segregation Principle 하나의 커다란 인터페이스보다 작고 구체적인 인터페이스가 좋다. 예시) 카메라 기능: 실제 카메라는 사진을 찍는 기술을 가지고 있고, 그 사진을 편집하는 다른 프로그램이 동시에 존재한다. 이 두개를 모두 할 수 있는 것이 스마트폰인데, 이마저도 스마트 폰안의 다른 작은 인터페이스가 구체적이기 때문에 가능한것이다. DIP: Dependency Inversion Principle 고수준 모듈은 저수준 모듈에 의존해서는 안되고, 둘다 추상화된 인터페이스에 의존해야함. 예시) C type의 충전선은 여러 기기를 충전할 수 있음. C type 충전 cable로아이폰, 아이패드, 노트북 모두 충전이 가능함. 즉 추상화된 인터페이스(C type cable)에 각각의 인터페이스(아이폰, 아이패드, 갤럭시, 노트북등)는 각자 구현하는 것임. 마치며...3개 스터디를 한번에 하려는건 역시 무모한 일인가싶어 우선순위를 정했다.FE는 물론 중요하지만 코딩에 시간을 생각보다 많이 써야해서 내 배움 속도에 맞게 하기로 하였다.그래서 BE-CS-FE 순으로 초점을 두기로 하였다. BE야말로 내가 잘 모르는 분야인데 와 Java로 하려니 더 머리가 복잡쓰하다그래도 C#을 배웠던 짬바덕일까, 생각보다 코드 부분에서 나쁘지 않았다.그래도 개념적인 부분에 많은 것이 부족하다 느꼈기 때문에 그런 부분을 다시 review할 수 있는 것이 너무 좋음.특히, solid라는 개념은 대충알고 있었는데 다시한번 짚을 수 있어서 너무 좋음.아 뭐 이런거는 이렇겠지 싶었던 부분도 다시집고 넘어 갈 수 있어서 너무 좋지만 남은 3주가 너무 걱정됨.내가 왜 세개를 했냐고 이렇게 안하면 난 안할테니까...이번주 고생한 나에게 상따윈 없다 담주 더 고생해라!
백엔드
・
백엔드
・
BE
・
발자국1주차