본문 바로가기

728x90

ComputerScience

(329)
Github Guide 1. Branch Strategy - git flow master/main branch는 CICD로 바로 test를 거치고 배포와 연동 될 수 있기 때문에 직접 push는 위험하다. develop branch가 현재 개발중인 branch이다. 여기서 브랜치를 파서 나의 작업(task, 해결해야 할 issue 등)을 진행한다. branch를 팔 때 branch이름에 prefix를 사용할 수 있다. feat(새 기능 개발), refactor, fix, docs등이 있다. release branch는 배포 직전 dev에서 따와서 QA를 진행하는 branch이다. 발견된 bug를 수정하고 dev에 지속적으로 merge해준다. test가 끝나면 master/main 으로 병합된다. hotfix branch는 ma..
PL8. Names, Bindings and Scopes dynamic binding : local variable이 runtime(execution)에 메모리와 binding되고 언제든 할당된 주소가 바뀔 수 있다. static binding : static variable이 load time(before runtime)에 binding되고 프로그램 실행 중에 할당 주소가 바뀌지 않는다. explicit declaration : int a 처럼 명시적으로 타입과 변수를 선언하는 것 implicit declaration : explicit declaration 없이 변수를 사용 dynamic type binding : my_list = [1,2,3], 명시적인 타입 선언 없이 컴파일러/인터프리터가 value를 보고 알아서 추론 stack-dynamic : 메모..
Linux 11. Synchronization (2) 1. Spinlock spinlock은 linux에서 가장 많이 사용하는 lock중 하나이다. thread는 lock을 aquire하기 위해 loop안에서 계속 spin하면서 기다린다. lock이 available한지 계속해서 검사한다. spinlock은 context switching없이 busy watiting 하는 동안 계속해서 cpu cycle을 낭비한다. 그래서 보통은 short time내에 lock을 얻을 수 있는 task에 많이 쓴다. io 같이 hdd에서 읽기, 쓰기 작업이 많은 경우는 busy waiting이 상대적으로 길다. 이렇게 긴 시간을 기다려야 하는 경우는 보통 spinlock 대신 mutex등을 사용한다. 반면 자료구조에 삽입 삭제하는 경우는 상대적으로 busy waiting하..
PL7. Syntax Analysis - bottom up parsing 1. bottom up parsing LL parsing에서는 여러 문제점이 있었고 결국엔 모든 문법을 검사할 수 없었다. 반면 bottom up parsing은 훨신 효율적으로 "모든 문법"을 검사할 수 있다. syntax error도 backtracking이 없기 때문에 훨씬 빠르게 검사할 수 있다. 게다가 top down 에서는 EBNF를 사용했지만 bottom up 은 the larger class of grammar인 BNF로도 충분하다. bottom up 에서는 right sentential form에서 RHS 부분을 찾아서 그 이전 right sentential form으로 바꾸는 방식으로 reduce한다. right most derivation의 역순으로 전개해나간다. 다시말해 curren..
Linux 10. Synchronization 1. Synchronization 여러 쓰레드가 shared resource에 동시에 접근하려는 상황에 한 순간에 한명만 점유할 수 있도록 보장해야 한다. critial section은 한번에 한명만 실행하고 있음을 보장하는 code segment이다. 대게 critical section은 shared variable에 접근하는 부분이다. critical section이 보호되지 않는 상태에서 여러 쓰레드가 자원에 접근하는 상황에 결과를 장담할 수 없다 이를 race condition이라고 한다. critical section을 보호하기 위해 entry에 lock을 잡고 들어가서 exit에서 Lock을 해제한다. i의 값을 증가시는 함수를 호출하는 두 thread가 있다고 하자. 운이 좋으면 예상하는대로..
Linux 9. Thread 1. Thread thread는 cpu 자원을 utilize하는 가장 기본 단위이다. 각 thread는 각 core에 할당된다. Process안에서 execution의 단위가 된다.그래서 lightweight process라고도 불린다. program counter, stack, tread ID를 포함한다. 프로세스는 여러개의 쓰레드를 가질 수 있다. 따라서 쓰레드들을 여러 작업에 잘 분배함으로써 병렬 효과를 볼 수 있다. 예를들어 크롬 브라우저에 여러 탭을 띄워 놓는 것이 있다. 쓰레드 들은 같은 프로그램 내에서 same data, same address space를 share하며 concurrent하게 실행된다. Right diagram shows that in a single thread, thre..
Linux8. Process 1. program and process program은 instruction, data, metadata등으로 구성된 disk에 저장되어 있는 파일이다. program이 execute되면 memory에 이 코드들이 올라간다. memory에 올라와 있는, 실행 중인 running program을 process라고 한다. 예를들어 pwd라는 명령어를 치면 저장된 pwd program이 실행되고 pwd를 실행하는 process가 생성된다. linux는 process마다 PID를 부여해서 관리한다. 2. fork() user-level code에서도 fork() system call을 활용하면 우리도 process를 생성할 수 있다. fork()를 호출하면 현재 parent process의 state를 그대로..
PL6. Syntax Analysis - top down parsing Syntax analysis는 lexical analyzer (based on regular grammar), syntax analyzer(or parser (based on CFG, BNF)) 두 부분으로 구성된다. BNF(context free grammar)에 기반해서 특정 string이 해당 문법으로 생성될 수 있음을 검사한다. 두 부분으로 나누었을 때 장점이 세가지가 있다. 1. lexical analysis는 상대적으로 syntax analyzer보다 간결하기 때문에 따로 분리해서 단순함을 제공한다. 2. 분리하게되면 각각 최적화가 가능해서 효율성을 제공한다. 3. 어떤 lexical analyzer는 machine에 dependent하므로 분리해서 portability를 제공한다. 1. le..

728x90