-
About Process (2) : Process Scheduling
멀티프로그래밍의 목적은 항시 돌아가는 여러개의 프로세스를 가짐으로써, CPU 성능을 최대화 하는데에 목적이 있다고 할 수 있을 것이다. (멀티 코어까지 안가도, 싱글 코어 CPU에서 프로세스 하나가 쭉 파업하느라 다른 프로세스가 일을 못하면 손해 아닐 것인가?) 쨋든 프로세스의 생애 과정을 보면서 이게 어떻게 되는지 보도록 하자. Scheduling Queues 프로세스가 시스템에서 돌려질 것이라면, 일단은 (통상적으로는) Linked List로 구현된 ready queue에 집어넣어지게 된다.그리고 좀 대기를 타다가 CPU에서 돌게 되는데.. I/O 대기를 타던, 아니면 쫑나던, 특정 이벤트를 기다리던 하는 상황이 올것 아닌가? 이런 얘들은 CPU에서 돌다가 wait queue로 넘어가게 된다. ..
-
About Process (1) : Memory, and State
Process, and Memory정말 단적으로 말하자면, Process는 프로그램이 실행되서 메모리의 영역을 차지한 것을 의미한다. (그리고 이러한 Process의 활동 상태는 Program Counter(not a political correctness)에 저장되게 된다.) 쨋든 프로세스가 정복하는 메모리에는 크게 4가지 영역이 있는데, 이는 다음과 같다.Text Section : 실행 가능한 코드가 저장되는 영역이다. 그냥 말그대로 print("Hello world") 같은 거다.Data Section : Global Variable(전역 변수)가 저장되는 영역이다.Heap Section : DS/ADT의 Heap과는 다른 영역이긴 하나.... 어쨋든 Dynamic allocation을 통해 저장되..
-
Trigger
Trigger는 DB에 대한 수정이 일어나면 자동으로 실행되는 프로시저다. 이를 위해서는 반드시 "언제 트리거가 실행될 지", 그리고 "트리거가 실행되고 나서의 Action을 어떻게 할지" 반드시 명세하여야 한다. 트리거의 사용 이유와 사용법Trigger는 SQL의 평범한 제약만으로는 명세하지 못하는 거시기(?)를 실행하는데 사용할 수 있다. 또한 어떤 조건이 충족되면 자동적으로 메커니즘을 실행시키는 데에 사용될 수 있다. 물론 DB 외부의 것을 건드릴 수 없는것은 당연할 것이다. (다만 일부 DBMS의 경우에는 쿼리가 업데이트 되면 이메일을 쏴준다거나 하는 기능을 지원하기는 한다.) create trigger timeslot_check1 after insert on sectionreferenci..
-
System Calls
System calls는 Operating System에 의해 사용 가능한 서비스에 대한 Interface를 제공한다. 물론 이런 친구들은 대게 C나 CPP를 통해서 접근 가능하다. 정작 그 내용물은 로우레벨로 짜여있는게 함정이긴 한데. 쨋든 프로그램이 OS위에서 돌아가면서 당연하게도 System Call을 호출할 일이 많으며, 얘를 들어서 파일 생성/IO 등등이 있겠다. Application Programming Interface쨋든 보다시피 매우 간단한 프로그램이더라 하더라도 OS를 매우 사용하게 된다. 물론 여러분들이 프로그램을 짤 때에는 - 당연하게도 OS랑 통신하지 않고 API를 이용하게 된다. API는 application programmer가 사용 가능한 함수들을 명세하며, 대표적으로는 ..
-
Join, View, Transaction....
Join Expression앞에서는 정보들을 결합할 때 Cartesian Product를 사용했긴 했는데, 사실 Join을 이용하는 방법이 있다. 참고로 join이 튀어나온 이유는 딱 한가지, Cartesian Product 만으로는 다루기 매우 지랄맞은 경우가 있기 때문이다. ▶ Natural Join쨋든 정보의 결합에 join이 사용되게 되며, 이에 대한 대표적인 경우로 natural join이 있겠다. natural join은 두 릴레이션 사이의 Cartesian Product와는 다르게, 양쪽 공통 attribute의 value가 같은 튜플들 만을 뱉어낸다. select name, course_idfrom student, takeswhere student.ID = takes.ID;select na..
-
기초적인 SQL 문법 (DML)
SQL 언어는 크게 세가지로 나눌 수 있다.Data-definition language (DDL) : Schema, Relation등에 대해 관리한다.Data-manipulation language (DML) : select, insert, delete from....Data-control lagnuage (DCL) : save point, rollback, commit.....그리고 그중에서 정말 죽어라 줄창 쓸 DML 분법에 대해서 좀 알아보도록 하자. Queries on Multiple Relationsselect namefrom friendswhere dept_name = 'medical' and salary > 70000;Select-From-Where은 단일 릴레이션에 대한 쿼리에서는 사실..
-
Sorting in Linear Time
Merge/Heap/Quick Sort같이 Comparsion을 이용한 Sorting의 경우 최저 하한선이 O(NLogN)가 된다. (Decision Tree를 통해 시각화 하면 -> n개 element에 대해서 Decision Tree의 Height 만큼인 LogN번 Comparision 해야 되기 때문.) 하지만 Counting/radix/bucket Sort의 경우 저러한 하한선을 깨고 (경우에 따라서) O(N) 안에 정렬을 마무리 할 수 있다! 이는 정수의 범위 제한/분포 같은 추가 정보를 이용한 것이다. Counting Sort Counting Sort는 n개의 요소들이 0 to k의 정수라고 가정할 때 작동한다. 그럼 한번씩 순회하면서 0 to k의 element가 각각 몇개인지 세고, 그 ..
-
QuickSort
Quick Sort는 Merge Sort와 비슷하게, 아래와 같이 분할 정복을 사용한다.Divide : 배열 A[p..r]을 A[p..q-1]과 A[q+1..r]로 나눈다.Conquer : 재귀를 이용해서 배열A[p..r]과 A[q+1..r]에 대해서 Quick Sort를 시행한다.Combine : 서브 배열들이 이미 정렬된 관계로 딱히 합칠 필요는 없다. 그리고 이는 아래와 같은 의사 코드로 표현해 낼 수 있다.// Let A -> matrix and p,r -> indexPartition(A, p, r) x = A[r] i = p-1 for j = p to r-1 if A[j] 대충 하나를 Pivot으로 잡아서 서브어레이를 만들어 내고, 정렬을 때린 다음 다시 서브 어레이를 돌린다고..