Computer Science

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Linking

Linking? 메모리에 로드(복사)하고 실행할 수 있는 단일 파일로 다양한 코드와 데이터를 수집하고 결합하는 프로세스 Memory에 Load하고 실행할 수 있는 단일 파일로, 다양한 코드와 데이터를 수집하고 결합하는 Process Compile time, Load time, Run time에 Linking이 수행된다. Linking은 최신 시스템에서 Linker라고 하는 프로그램에 의해 자동으로 수행된다. Why we have to learn about linking? build large programs Linker가 reference를 해결하는 방법, Library가 무엇인지, 그리고 Linker가 reference를 해결하기 위해 Library를 사용하는 방법을 이해하지 않는 한, 이러한 종류의 ..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Garbage collection

Garbage collection void foo() { int *p = malloc(128); return; /* p block is now garbage */ } 위 코드에서 p는 stack에 할당되어있고, malloc(128)은 heap에 할당되어 있다. 이 함수가 return 되면 heap에 할당되어 있는 malloc(128)은 어느 변수도 참조하지 못하는 Garbage가 된다. 이러한 Garbage를 자동으로 free 시켜주는 것을 Garbage collection이 한다. C에서 Garbage Collection을 구현하려면 몇 가지 어려움이 존재한다. memory가 언제 free 되는가? 조건에 따라 달라지기 때문에 일반적으로 미래에 어떤 것이 사용될지 알 수 없다. 그러나 특정 Block에..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Dynamic Memory Allocation

Dynamic Memory Allocation 프로그래머들은 일반적으로 런타임에 추가적인 가상 메모리를 획득해야 할 때 Dynamic Memory Allocator를 사용 하는 것이 더 편리하다고 생각한다. Dynamic Memory Allocator(mallc)는 Heap이라는 가상 메모리 영역을 관리한다. 세부 정보는 시스템마다 다르지만 일반성의 손실 없이 Heap은 초기화되지 않은 Data 영역 전후에서 시작되어 위로 확장되는 demand-zero memory라고 가정한다. 각 프로세스에 대해 Kernel은 Heap의 상단을 가리키는 변수 brk("break")를 유지한다. Allocator는 Heap을 다양한 크기의 Block들의 모음으로 유지한다. 각 Blcok은 할당되거나 사용 가능한 가상 메..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Thread Safety

Crucial concept: Thread Safety 함수가 여러 Concurrent Thread에서 반복적으로 호출될 때 항상 올바른 결과를 생성하는 경우에만 Thread-safe라고 한다. Thread-unsafe 함수의 Class Class 1: 공유 변수를 보호하지 않는 함수 Class 2: 여러 호출에 걸쳐 상태를 유지하는 함수 Class 3: static 변수의 pointer를 반환하는 함수 Class 4: thread-unsafe 함수라 불리는 함수 Thread-Unsafe Functions (Class 1) 공유 변수를 보호하지 못한 함수 FIx: P와 V Semapore 연산을 사용한다. Example: goocnt.c 문제점: 동기화 연산은 코드 실행 속도를 저하시킨다. Thread-..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Thread-Level Parallelism

Using Threads for Parallelism 현대 기계들은 대부분 Multi Core Processor를 가지고 있다. Multi Core Processor의 기계들은 운영 체제 Kernel이 Single Core에 순차적으로 배치되는 것이 아니라 여러 Core에 Parallel로 Concurrent Thread를 Scheduling하기 대문에 이러한 기계에서 Concurrent 프로그램이 더 빨리 실행되는 경우가 많다. 이러한 Parallelism을 이용하는 것은 웹 서버, 데이터베이스 서버, 대형 과학 코드와 같은 응용 프로그램에서 매우 중요하며 웹 브라우저, 스프레드시트, 문서 프로세서와 같은 주류 응용 프로그램에서 점점 더 유용해지고 있다. Exploiting parallel execut..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Synchronizing Threads with Semaphores

Improper Synchronization 공유 변수는 편리할 수 있지만 심각한 동기화 오류가 발생할 수 있다. Example /* WARNING: This code is buggy! */ #include "csapp.h" void *thread(void *vargp); /* Thread routine prototype */ /* Global shared variable */ volatile long cnt = 0; /* Counter */ int main(int argc, char **argv) { long niters; pthread_t tid1, tid2; /* Check input argument */ if (argc != 2) { printf("usage: %s \n", argv[0]); ex..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Shared Variables in Threaded Programs

Shared Variables in Threaded Programs Concurrent Programming 접근법을 3가지 배웠다. Process Process는 자신만의 주소 공간이 있기 때문에 공유 메모리가 없다. IPC를 통해서 공유 메모리나 메시지 패싱을 OS의 도움을 받아 Process 간 통신이 가능하다. Event (I/O Multiplexing) Epoll이나 Select같은 시스템 콜을 사용해서 Process 하나에 File Descriptor Socket을 배열로 만들어서 Socket에 메시지가 오면 이벤트가 발생했다는 것을 확인할 수 있다. 단일 주소 공간을 가지고 있지만, 공유가 용이했다. Thread Thread는 Process내에서 생성 소멸된다. Context Switch 오..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Concurrent Programming with Threads

Threads thread는 프로세스의 context에서 실행되는 logical flow다. 현대의 시스템은 하나의 프로세스에서 동시에 실행되는 여러 스레드를 가진 프로그램을 작성할 수 있게 해 준다. 스레드는 커널에 의해 자동으로 schedule 된다. 각 스레드는 고유한 정수 스레드 ID(TID), 스택, 스택 포인터, 프로그램 카운터, 범용 레지스터, 조건 코드를 포함한 자체 thread context를 가지고 있다. 프로세스에서 실행되는 모든 스레드는 해당 프로세스의 전체 가상 주소 공간을 공유한다. 스레드에 기반한 logical flow는 프로세스 및 I/O multiplexing의 flow에 기반한다. 프로세스와 마찬가지로 스레드는 커널에 의해 자동으로 schedule 되며 정수 ID에 의해 ..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Concurrent Programming with I/O Multiplexing

Concurrent Programming with I/O Multiplexing 사용자가 표준 입력에 입력하는 대화형 명령에 응답할 수 있는 echo server를 작성하도록 요청받았다고 가정한다. 이 경우 server는 connection request를 하는 network client와 키보드에서 command line을 입력하는 사용자 등 두 가지 독립적인 I/O 이벤트에 응답해야 한다. 어떤 이벤트를 먼저 기다려야 할까? 어느 쪽도 이상적이지 않다. connection request이 accept되기를 기다리는 경우 입력 명령에 응답할 수 없다. 마찬가지로, read에서 명령 입력을 기다리는 경우 connection request를 응답할 수 없다. 이 딜레마에 대한 한 가지 해결책은 I/O mu..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Concurrent Programming with Processes

Concurrent Programming with Processes client1에서 connect를 호출하여 connection request를 server에 전송한다. server는 accept한 순간에 바로 return하고 fork를 호출하여 자식 프로세스를 생성한다. fork를 호출하기 전에 client2에서 보낸 connection request가 왔다면 client2를 kernel의 TCP manager에 queue된다. client1의 request로 호출한 fork에서 자식 프로세스(child1)가 connectedfd로 client1과 통신한다. 부모 프로세스는 connection이 있다면 accept하여 fork를 하고 자식 프로세스(child2)에서 client2와 통신한다. Proc..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Concurrent Programming

Concurrent Programming 지금까지, concurreny를 주로 운영 체제 kernel이 여러 응용 프로그램을 실행하기 위해 사용하는 메커니즘을 다뤘다. 그러나, concurreny는 kernel에만 국한되지 않는다. 응용 프로그램에서도 중요한 역할을 할 수 있다. 응용 프로그램 수준의 concurreny는 다음과 같은 방법에서도 유용하다. Accessing slow I/O devices Application이 디스크와 같이 느린 I/O 장치로부터 데이터가 도착하기를 기다릴 때, kernel은 다른 프로세스를 실행함으로써 CPU를 busy 상태로 유지한다. application은 유용한 작업을 I/O 요청과 겹치게 함으로써 유사한 방식으로 concurreny를 이용할 수 있다. Intera..

Computer Science/시스템 프로그래밍

[시스템 프로그래밍] Socket Interface Functions

server server에서 getaddrinfo 함수를 호출하면 IP 주소와 Port에 대한 정보를 가져와서 socket을 만든다. socket을 만들고 bind를 통해서 만들어진 socket을 가지고 listen을 한다. listen은 server가 client로부터 오는 요청을 받겠다는 상황이다. client가 connection request를 하게 되면 accept 함수를 통해서 connection을 설정한다. accept을 하면 coonection이 설정된다. client와 connection이 만들어져서 메시지를 주고받을 수 있다. client client는 getaddrinfo를 통해서 IP 주소와 Port에 대한 정보로 socket을 만들고, connect 함수를 통해서 만든 socket..

또 고민 중
'Computer Science' 카테고리의 글 목록