0. 재귀 자기자신을 호출하는 절차 (함수) JSON()의 파싱이나, DOM getElementById 등의 내부 코드가 재귀로 구성되어 있음 물론 반복문만으로도 구현이 가능하지만, 재귀를 사용함으로써 직관적이고 간결하게 구현할 수 있음 1. 필수 요소 중단점 (Base Case) 재귀가 중단되는 시점, 즉 종료 조건과 마지막으로 반환할 Return을 지정해주어야 한다. 다른 입력값 (Different Input) 매번 같은 함수를 호출하면서 다른 출력을 반환할 수 있게 하기 위해선 입력값 또한 달라져야 한다. 2. 예시 예시 반복문을 이용한 팩토리얼 구현 function loopFactorial(num){ let total = 1; for(let i = num;i>0;i--){ total *= i } ..
지난 게시글 문제 해결 접근법과 이어지는 글입니다. 문제 해결 패턴 1. 빈도 카운터 (Frequency Counter) 자바스크립트 객체의 키-값 제어를 통해 다양한 값과 빈도를 수집 문제1 두 배열이 주어졌을 때, 한 배열 원소값들의 제곱을 담고 있는 다른 배열로 이루어진 경우 참을 반환하는 "Same" 함수를 작성하시오. (원소의 순서는 상관 없음) 해결1 이중 루프를 이용한 일반적인 해법, O(N^2) function same(arr1,arr2){ // 두 배열의 길이가 다른 경우 1차적으로 필터링 if(arr1.length !== arr2.length){ return false } for (let i=0;i
문제를 해결하기 위한 일련의 단계. 정답이 없음. 해답만이 존재할 뿐 문제 해결 접근법 0. 톺아보기 문제 이해 구제척 예시 탐색 문제 세분화 문제 해결 및 단순화 복기 및 재구성 1. 문제 이해 (Understand Problem) 코드를 입력하거나 보드에 작성하기 전 한 걸음 물러서서 직면한 과제를 확실히 이해하는 것. 당연하다고 들릴 수 있겠지만 굉장히 중요하다. 주어진 과제나 질문을 그대로 생각하는 게 아닌, 스스로의 방식으로 치환하여 이해하는 것 문제의 입력과, 내가 도출해내야 할 출력값은 무엇인가? 입력에 의해서만 출력값이 결정되는가? 문제 내부의 중요 데이터는 어떻게 레이블링하는가? 2. 구체적 사례 탐색 (Explore Examples) 앞선 문제 이해 과정을 마치고, 입력값과 출력값의 순..
지난 강의 내용인 프로세스 충돌 해결 1과 이어집니다. 0. 복습 Critical Section 코드들이 Race Condition을 발생하지 않게 하기 위해서는 Critcal Section 전후에 Entry Section, Exit Section로 울타리를 두어 Mutual Exclusion을 만족시켜야 한다. 이 때 Entry Section은 울타리 영역 내부에 다른 프로세스가 실행 중인지 체크하고 비어 있는 경우 프로세스의 접근을 허용하는 역할을 하고, Exit Section은 울타리 영역 밖 다른 프로세스가 대기하고 있는 경우 영역 내부로 들어가도 되는지의 여부를 전달하는 역할을 한다. 지난 시간 말미에 소프트웨어적으로 이를 구현해보았으나 애로사항이 다소 발생하였고, 이를 하드웨어 지원을 받아 M..
1. 빅오 표기법 1-1. 무수한 알고리즘 해결책에 대한 평가 기준 performance.now()를 통한 시간 차이 측정 컴퓨터의 연산 갯수 측정 1-2. 빅오 시간 복잡도 입력에 따른 연산 시간의 관계성 측정, 다소 추상적인 말이지만 '큰 흐름'에 집중 상수곱, 합의 연산은 단순화 1-3. 빅오 공간 복잡도 입력에 따라 차지하는 메모리의 관계성 측정 (공간 할당) Boolean, Numbers, undefiend, null은 상수 복잡도 O(1) (단순화 가능) String, Array, Object는 선형 복잡도 O(N) 1-4. 로그 지수함수의 역 대부분의 정렬, 탐색 알고리즘과 같이 로그 복잡도를 갖는 알고리즘들이 존재 2. 배열과 오브젝트의 성능 평가 2-1. 자바스크립트 기본 요소들의 성능 ..
1. 프로세스 충돌 컴퓨터 시스템 내부에서는 다양한 이벤트(쓰레드)들이 컴퓨터 자원을 사이에 두고 동시다발적으로 발생한다. 이들이 실행되며 충돌하는 경우가 빈번히 발생한다. Race condition 두 개 이상의 프로세스가 거의 동시에 접근하여 처리된 순서를 가릴 수 없는 상황을 말한다. Mutual exclusion 두 개 이상의 프로세스가 같은 메모리에 접근하는 상황에서 (공유 자원을 할당받아 사용할 떄) 한 번에 한 프로세스씩 액세스하도록 하는 성질. (상호배제) Race condition을 방지하기 위해선 Mutial Exclusion 성질이 만족되도록 프로그래밍되어야 한다. Critical section 공유 영역에서 값을 변경시키는 행위 Starvation 요청한 자원이 오랜 기간 동안 배정..
1. 프로세스 종료 절차 실행(running)을 끝마친 프로세스는 바로 컴퓨터 시스템에서 사라지는 것이 아니라, 일련의 과정 (exit - terminated - wait)을 거친다. 프로세스 종료 조건 exit() 시스템 콜을 호출받은 경우 처리할 수 없는 (non-handling) 시그널을 받은 경우 CPU 내부 프로그램 에러가 발생한 경우 부모 프로세스가 하위 프로세스의 종료를 요청할 경우 Exit (release) 과정 실행이 끝난 직후 처리되는 시스템 콜. 메인 메모리 중 커널 내의 PCB를 제외한 코드, 데이터, 스택 등을 회수한다. Terminated(zombie) 상태 Exit() 처리를 통해 프로세스는 Terminated 상태로 진입한다. 부모 프로세스에 의해 Wait() 시스템 콜이 호..
1. 프로세스 컨텍스트 프로세스가 실행되는 데 필요한 컴퓨터 내의 정보 및 구성 요소 자원 집합. 유저 컨텍스트와 시스템 컨텍스트로 세분화된다. 유저 컨텍스트 프로그램 작성자(사람)에 의해 결정되는 컨텍스트 프로그램을 구성하는 코드, 데이터, User Stack의 집합을 지칭한다. 시스템 컨텍스트 운영체제에 의해 결정되는 컨텍스트 커널 코드 내의 함수 호출을 위한 커널 스택 (Kernel Stack) 프로세스 관련 정보를 저장하는 자료구조인 PCB로 구성되어 있다. fork() (하위 프로세스를 생성하는 System Call)을 통해 생성된 하위 프로세스의 식별 ID를 Pid에 할당한다. 이에 유효한 값이 할당된 경우 Delay를 주어 Pid의 스케쥴링 (CPU 할당)을 기다린다. 하위 프로세스는 부모 ..
1. 프로세스 상태 모델 Running or Not Running (Ready State + Blocked State) 프로세스가 실행중이지 않을 경우 (Not Running) 두 가지 상태로 분류할 수 있다. 준비 상태 : 프로세서가 주어진 경우 실행 가능한 상태 (Multi Processing에서 Time Out등으로 후순위로 밀려나간 경우 등) 블럭 상태 : 프로세서가 주어져도 실행되지 못하는 상태. I/O 등의 이벤트를 기다리는 상태들. 이벤트가 완료되면 Running State로 돌아가는 것이 아닌 Ready State로 넘어가 Ready queue에서 순서를 기다린다. 결론적으로 Ready queue, Blocked queue의 두 가지 큐가 존재한다. 블럭 상태로 편입되는 경우가 다양한데, ..
1. 운영체제의 소프트웨어 구조 1-1. 모노리씩 커널 구조 (Monolithic Kernel) '단일체'라는 의미로, 커널 SW가 한 덩어리로 모여 있는 것을 의미한다. 내부에서 내부 함수 콜을 호출하고 결과를 받기 때문에, 실행 속도가 빠르다. Unix, Linux 1-2. 마이크로 커널 구조 (Micro Kernel) 운영체제의 기능들이 외부에서 구현되는 아키텍쳐를 의미한다. 프로세스의 형태를 띄며 운영체제 위에서 응용프로그램이 실행되는 것처럼 커널이 실행된다. 실행속도는 상대적으로 느리지만, 유지보수가 편리하다. 파일 관리, 통신 프로토콜, 입출력 디바이스 제어와 같은 기능들이 커널 외부에서 실행된다. 그러나 하드웨어 종속적인 코드들과 메모리 영역을 보호하는 프로세스, 기본적인 스케줄링 기능들은 ..