Chapter 10 Thread Synchronization POSIX.1c 규격은짧은면에서의잠금 (short-term locking) 을위한뮤텍스 (mutex) 라는동기화메커니즘 (synchronization mechanism) 과무한정 (unbounded durat
|
|
- 수천 목
- 5 years ago
- Views:
Transcription
1 Chapter 10 Thread Synchronization POSIX.1c 규격은짧은면에서의잠금 (short-term locking) 을위한뮤텍스 (mutex) 라는동기화메커니즘 (synchronization mechanism) 과무한정 (unbounded duration) 이벤트를기다리게하기위하여 condition variable을제공한다. 여기에, 멀티쓰레드 (Multithread) 프로그램은동기화를위해 POSIX.1b 세마포어를사용할수있다. 쓰레드프로그램에서시그널제어 (signal handling) 는시그널핸들러를전용으로사용하고있던쓰레드가바뀌었을경우바뀔수있는부가적인복잡한문제를제공한다. 이장은생산자-소비자 (producer-consumer) 문제의변형을통해서쓰레드동기화에대하여설명한다. 쓰레드는프로세스의어드레스공간 (space) 안에서생성되며정적변수 (static variable) 이나열려있는파일기술자 (open file descriptor) 등과같은자원들을공유한다. 쓰레드가이런공유된자원을사용할때, 제대로된결과를얻기위하여쓰레드간의상호작용사이에동기화가이루어져야한다. 동기화에는다른두가지종류가있다 - 잠금 (locking) 과대기 (waiting). 잠금 (locking) 은일반적으로짧은기간의자원을잡는것을말하고, 무한으로실행될수있는대기 (waiting) 는어떤이벤트가일어날때까지 condition variable을대기상태로놔두는것을말한다 (block). POSIX.1c는멀티쓰레드프로그램에서이러한동기화방법의두가지를사용할수있도록뮤텍스 (mutex) 와조건변수 (condition variable) 를제공한다. 또, 멀티쓰레드프로그램을위해세마포어도사용이가능하다. 이장은생산자-소비자 (producer-consumer) 문제측면에서쓰레드동기화의개념을설명한다. 생산자쓰레드혹은프로세스는데이터 ( 메시지같은 ) 를생성하고, 생성된데이터를 FIFO 큐에쌓아놓는다. 소비자 (consumer) 쓰레드는큐로부터데이터아이템을제거한다. 큐의크기가지정되었을경우생산자-소비자문제는제한-버퍼문제 (bounded-buffer problem) 로불린다. 생산자-소비자문제의한예로네트워크프린터매니저가있다. 여기서생산자는사용자가생성하는프린트요청이고소비자는프린터가된다. 다른예로는멀티프로세서 (multiprocessor) 시스템에서큐를스케쥴링하는것이나, WAN(wide-area network) 의중계점 (node) 에서메시지를라우팅 (routing) 하는데사용되는네트워크메시지버퍼등이있다. producers queue consumers 그림 10.1: 생산자 - 소비자문제의모형도 그림 10.1은생산자-소비자문제의모형도이다. 생산자-소비자쓰레드는큐를공유하고아이템을집어넣거나제거할때이자원 ( 큐 ) 에락 (lock) 을걸어야한다. 생산자는아이템을집어넣을경우만락을요구하여야하고아이템을집어넣는작업을할동안만락을걸고있어야한다. 비슷하게소비자는큐에서아이템을제거할때만락을걸어야하고제거한아이템을작업하기전에야락을풀어야한다. 게다가제한된크기의큐를사용한다면생산자는더많은데이터를생성하기에앞서사용가능한방 ( 큐 ) 가생길때까지기다려야한다. 잠금 (locking) 은일반적으로짧은기간 (short duration) 에대해사용을하고반면에대기 (waiting) 은긴기간에대해사용을한다. 다음은생산자-소비자를프로그래밍에있어피해야되는몇가지문제를설명한다. 생산자가버퍼에데이터를쓰는동안소비자가아이템을제거한다 (locking). 소비자가없는아이템을가져간다 (waiting). 소비자가이미가져간아이템을가져간다 (locking). 생산자가빈슬롯 ( 큐 ) 가없을때버퍼안에무엇인가를써넣는다 (waiting). 생산자가제거가되지않은아이템에덮어쓰려고한다 (locking).
2 더욱복잡한생산자-소비자흐름제어 (flow control) 가최고수위 (high-water) 최저수위 (low-water) 점을포함한다 (?). 큐가어떤크기에도달했을때 (high-water mark), 생산자는큐가최저수위점 (low-water mark) 에도달해빈상태가될때까지대기한다 (block). 뮤텍스, condition variable, 세마포어는다양한문제를조절하는데사용될수있다. 다음의세절은이러한기본적인것을가지고생산자와소비자를제어하고, 동기화하는방법을설명한다. 10.1절은 POSIX.1c 뮤텍스락을소개하고, 이것을이용하여생산자-소비자큐에상호배타적으로접근하는것을구현한다. 10.2절은아이템의숫자가정해졌을때생산자-소비자쓰레드를동기화시키는데세마포어를사용하고 10.3절은 POSIX.1c condition variable을설명하고, 이를이용해더욱복잡한제거조건 (requirement) 을가진생산자-소비자동기화를구현한다 절에서는쓰레드안에서의시그널핸들링을다루고, 10.5절은쓰레드를이용한프린터서버애플리케이션을설명한다 Mutexes 뮤텍스 (mutex) 혹은뮤텍스락 (mutex lock) 은가장간단하고효과적인쓰레드동기화메커니즘이다. 프로그램은임계영역 (critical section) 을보존하기위해뮤텍스를사용하여공유자원에대한배타적인접근을얻을수있다. 이함수를사용하기위하여프로그램은 pthread_mutex_t 타입의변수를선언해야하고, 동기화를위해이변수를사용하기전에초기화하여야한다. 일반적으로뮤텍스변수는프로세스에있는모든쓰레드가접근할수있는정적변수 (static variable) 이다. 뮤텍스는 pthread_mutex_init 함수를이용하거나 static initializer PTHREAD_MUTEX_INITIALIZER를이용해초기화된다. 예제 10.1 다음은뮤텍스 my_lock을기본속성 (default attribute) 으로초기화하는코드이다. my_lock 변수는모든쓰레드에서사용할수있어야한다. #include <stdio.h> #include <string.h> #include <errno.h> pthread_mutex_t my_lock; if (pthread_mutex_init(&my_lock, NULL)) fprintf(stderr,"could not initialize my_lock"); static initializer 방법은뮤텍스락을초기화하는데있어 pthread_mutex_init보다두가지좋은점이있다 - 일반적으로더효과적이고, 어떤쓰레드가실행되기전에정확하게한번수행되는것을보장한다. 예제 10.2 다음은뮤텍스 my_lock을 static initializer를이용해기본속성으로초기화하는코드이다. pthread_mutex_t my_lock = PTHREAD_MUTEX_INITIALIZER; 쓰레드는 pthread_mutex_lock을이용해임계영역을보호할수있다. 임계영역이라는의미로남아있기위해서 ( 서로공유하는영역이므로다른쓰레드에서사용할수있어야함 ) 뮤텍스는다른쓰레드나혹은자기쓰레드가그영역을다시얻게하기위해 mutex를풀어줘야한다. 이말은한쓰레드가
3 pthread_mutex_lock을이용해락을걸고다른쓰레드에서그락을풀어서는 (pthread_mutex_unlock) 안된다는것이다. 한쓰레드가 mutex를이용해 lock을걸었다면그쓰레드는짧은동안만뮤텍스를잡고있어야한다. 쓰레드가예측할수없을정도의기간동안이벤트를기다려야한다면세마포어나 condition variable과같은다른동기화메커니즘을이용해야한다. 예제 10.3 다음은 mutex를이용하여임계영역을보호한다. pthread_mutex_t my_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&my_lock); /* critical section */ pthread_mutex_unlock(&my_lock); 잠금 (locking) 과해제 (unlocking) 는어느정도모든쓰레드가임계영역으로들어가기전에뮤텍스를정확하게락을함으로써만상호배타성이얻어진다는점에서어느정도자발적인것이된다.(?) 서로연관성이없는쓰레드들이락을걸지않고임계영역으로들어가는것을막을방법이없다. 어떤오브젝트에대해확실하게배타적으로접근하는방법중하나는잘정의된 (well-defined) 함수를통해서만접근을하고, 그함수안에서잠금 (locking) 을호출하는것이다. 이렇게하면잠금 (locking) 메커니즘은함수를호출하는쓰레드에대해투명하게될것이다.( 잘동작할걸!) bufin bufout 그림 10.2: 생산자 - 소비자문제에대한제한된큐의원형 - 버퍼구현 그림 10.2는 8개의슬롯을가진원형버퍼 (circular buffer) 로서큐를구현한것이고, 세개의데이터아이템이현재들어있는상황이다. bufout값은다음에꺼내져야할데이터아이템의슬롯넘버를가리키고 bufin값은다음채워져야할슬롯의넘버를가리킨다. 만일생산자와소비자쓰레드가상호배타적인방법으로 bufout과 bufin을다루지않으면생산자가아직꺼내지지않은아이템을덮어쓰거나소비자가이미사용되었던 ( 꺼냈던 ) 아이템을가져가게될것이다. 프로그램 10.1은공유된오브젝트로원형버퍼를구현한코드이다. 버퍼에서사용되는데이터구조는그영역이한정된 static 변수를이용한다 (2.1절의 internal linkage). 이코드는프로그램이 get_item과 put_item함수만이용해버퍼에접근할수있도록다른파일에작성되어있다. 프로그램 10.1 mutex lock을이용해보호된원형버퍼 #define BUFSIZE 8 static int buffer[bufsize];
4 static int bufin = 0; static int bufout = 0; static pthread_mutex_t buffer_lock = PTHREAD_MUTEX_INITIALIZER; /* Get the next item from buffer and put it in *itemp. */ void get_item(int *itemp) pthread_mutex_lock(&buffer_lock); *itemp = buffer[bufout]; bufout = (bufout + 1) % BUFSIZE; pthread_mutex_unlock(&buffer_lock); return; /* Put item into buffer at position bufin and update bufin. */ void put_item(int item) pthread_mutex_lock(&buffer_lock); buffer[bufin] = item; bufin = (bufin + 1) % BUFSIZE; pthread_mutex_unlock(&buffer_lock); return; 프로그램 10.2는생산자쓰레드는원형버퍼에 1부터 100까지그숫자의제곱을쓰고, 소비자는그값을꺼내고꺼낸값을더하는프로그램이다. 버퍼가 mutex lock을이용하여보호가되었다고하지만생산자-소비자간의동기는정확하게이루어지지않는다. 소비자가빈슬롯으로부터데이터를꺼내거나, 생산자가슬롯이꽉찬상태에서덮어쓰기가될것이다. 프로그램 10.2 생산자-소비자문제의부적절한구현. 생산자와소비자쓰레드는동기화되지않았다. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #define SUMSIZE 100 int sum = 0; void put_item(int); void get_item(int *); void *producer(void * arg1)
5 int i; for (i = 1; i <= SUMSIZE; i++) put_item(i*i); void *consumer(void *arg2) int i, myitem; for (i = 1; i <= SUMSIZE; i++) get_item(&myitem); sum += myitem; void main(void) pthread_t prodtid; pthread_t constid; int i, total; /* check value */ total = 0; for (i = 1; i <= SUMSIZE; i++) total += i*i; printf("the actual sum should be %d\n", total); /* create threads */ if (pthread_create(&constid, NULL, consumer, NULL)) fprintf(stderr,"could not create consumer"); else if (pthread_create(&prodtid, NULL, producer, NULL)) fprintf(stderr,"could not create producer"); /* wait for the threads to finish */ pthread_join(prodtid, NULL); pthread_join(constid, NULL); printf("the threads produced the sum %d\n", sum); exit(0); 연습 10.1 프로그램 10.2에서정확하지않은답을만드는시나리오를제공하라. 오직한쓰레드만이한시점에실행이될수있고선점우위의스케쥴링 ( 선점한놈이우선순위가된다?) 이사용되었다.
6 답 : 오직한쓰레드만이한시점에실행이된다고생각하자. 소비자와생산자는같은우선순위를가지고생성이된다. 그러므로이러한 compute-bound thread에서는선점이없다 (?). 소비자쓰레드가먼저시작하고실행을끝냈다. 그러나생산자가아무것도생산을하지않았기때문에버퍼로부터아무것도소비하지않게된다. 나중에생산자가자기차례가되어우선권을획득하고, 값을생성한다해도아무소용이없게된다. 연습 10.2 프로그램 10.2의코드를수정하기위하여생산자와소비자의생성을서로바꾸고생산자를먼저실행시켰다. 무슨일이일어나겠는가? 답 : 이번에는생산자가실행을끝낸다. 버퍼가 8개의슬롯만을갖고있기때문에소비자가시작되었을때버퍼안에는93부터 100까지의값만남아있게된다. 실행되고있는쓰레드혹은프로세스는 sched_yield를실행함으로써자신이다시스케쥴링리스트의맨처음이될때까지양보를한다. 선점우위 (preemptive priority) 에의해설정된 (scheduled) 쓰레드에서 sched_yield를호출한쓰레드는자기보다우선순위가높은모든쓰레드에게양보를하고, 우선순위가높은모든쓰레드가실행이되고각각이양보하거나대기상태 (block) 가될때까지양보를한다. SYNOPSIS #include <sched.h> int sched_yield(void); POSIX.1b sched_yield함수는성공했을때 0을리턴하고, 실패시 -1을리턴, errno를 set한다. 프로그램 10.2의문제점은생산자와소비자쓰레드에서로양보를하게강요함으로써부분적으로수정될수있다. 예제 10.4 프로그램 10.2에대한다음수정은생산자와소비자쓰레드에게루프를한번돌때마다양보를하도록한다. #include <sched.h> #define SUMSIZE 100 int sum = 0; void put_item(int); void get_item(int *); void *producer(void *arg1) int i; for (i = 1; i <= SUMSIZE; i++)
7 put_item(i*i); sched_yield(); void *consumer(void *arg2) int i, myitem; for (i = 1; i <= SUMSIZE; i++) get_item(&myitem); sum += myitem; sched_yield(); 예제 10.4에서사용된 sched_yield는생산자와소비자중오직한쓰레드만한시점에수행할수있도록엄격하게교대로동작한다. 프로그램이정확하게동작하게하기위해생산자쓰레드가먼저시작이되어야하고소비자는생산자가먼저시간을양보했을때동작해야한다. 이러한엄격한교대의방법은정해지지않은생산자와소비자의경우문제를풀수없다. sched_yield함수는 POSIX.1b의규격이고, 쓰레드는 POSIX.1c의규격이다. 그러므로, sched_yield를사용할때는 sched_yield를포함한라이브러리를검색해야한다. Sun Solaris2에서는이라이브러리를 libposix4라고부른다. man page를사용하면필요한라이브러리를알수있다. 이절에서, 예제의동작은정확하게얼마나많은쓰레드가동시에동작하느냐와그쓰레드가실행되는순서가무엇이냐에달려있다. 멀티쓰레드 (Multithreaded) 프로그램은실행순서나동시동작의레벨 (level of parallelism: 우선순위?) 에관계없이정확하게수행되어야한다. 생산자-소비자문제에서아이템과슬롯은동기를맞춰서동작해야하고프로그램은쓰레드의실행순서에독립적이어야한다. 다음절은전형적인동기화방법인 POSIX.1b 세마포어의사용에대해서설명한다 세마포어들 (Semaphores) 생산자-소비자문제에대한전통적인세마포어솔루션은자원을나타내기위해카운트세마포어를사용한다 ( 예 : 8.3절의 POSIX.1b 세마포어 ). 생산자-소비자문제에서자원이란놈은큐안에있는아이템과 ( 제한된버퍼일경우의 ) 비어있는슬롯을말한다. 이러한자원 (resource type) 의각각은세마포어로서표현이된다. 쓰레드가특정타입의자원을필요로하였을때일치하는형태의세마포어는감소된다 (sem_wait). 쓰레드가자원을풀었을경우적절한세마포어는증가된다 (sem_post). 세마포어변수가 0 밑으로절대떨어지지않기때문에쓰레드는없는자원을사용할수없다. 항상카운팅세마포어는초기에사용이가능한리소스의수에맞게초기화된다. 프로그램 10.2은 POSIX named semaphore를이용해제한된 (bounded: 크기가 ) 생산자-소비자문제에대해정확하게동기를맞춘다. BUFSIZE로초기화된 slots 세마포어는사용이가능한빈슬롯의수를말하는것이고, 생산자에의해감소되고소비자에의해증가된다. 0으로초기화된 items 세마포어는버퍼안의아이템숫자를나타낸다. 소비자에의해감소가되고, 생산자에의해증가된다.
8 프로그램 10.3 세마포어에의해쓰레드동기화된생산자-소비자프로그램 #include <stdio.h> #include <string.h> #include <errno.h> #include <semaphore.h> #define SUMSIZE 100 #define BUFSIZE 8 int sum = 0; sem_t items; sem_t slots; void put_item(int); void get_item(int *); static void *producer(void *arg1) int i; for (i = 1; i <= SUMSIZE; i++) sem_wait(&slots); put_item(i*i); sem_post(&items); static void *consumer(void *arg2) int i, myitem; for (i = 1; i <= SUMSIZE; i++) sem_wait(&items); get_item(&myitem); sem_post(&slots); sum += myitem;
9 void main(void) pthread_t prodtid; pthread_t constid; int i, total; /* check value */ total = 0; for (i = 1; i <= SUMSIZE; i++) total += i*i; printf("the checksum is %d\n", total); /* initialize the semaphores */ sem_init(&items, 0, 0); sem_init(&slots, 0, BUFSIZE); /* create threads */ pthread_create(&prodtid, NULL, producer, NULL); pthread_create(&constid, NULL, consumer, NULL); /* wait for the threads to finish */ pthread_join(prodtid, NULL); pthread_join(constid, NULL); printf("the threads produced the sum %d\n", sum); 연습 10.3 BUFSIZE가 8이고생산자가먼저시작하는경우, 프로그램 10.3이하나의프로세서 (CPU) 만있는기계에서동작을한다면무슨일이일어나겠는가?, 선점우위의스케쥴링 (preemptive priority scheduling) 상황에서아이템을어떤순서로실행을해야하는가? 답 : 허가된동시성 (concurrency) 의레벨에달려있다. 오직한쓰레드만이한시점에동작할수있다고생각하자. 생산자가 8개의아이템을생산하고, 대기상태 (block) 에있다. 그후에소비자가처음으로아이템을얻을수있게한다. 소비자는처음 8개의아이템을얻을수있다. 그런다음생산자는그다음의 8개의아이템을생산한다, 그리고... 대기상태 (block) 가바뀌는상황은선점우위의스케쥴링의결과때문이다. 만일대기상태가바뀌지않는다면한쓰레드는제어권을포기하지않게된다. 두쓰레드가한시점에동작할수있도록한다면실행순서는커널스케쥴링메카니즘에달려있다. 연습 10.4 만일 2개의소비자쓰레드가생성이된다면프로그램 10.3은제대로동작할것인가? 답 : 아니. 하나이상의소비자쓰레드가있다면보호되어야할임계영역은 sum을수정하는일이된다. 또한두소비자가 SUMSIZE 아이템에대해작업하길시도할것이고, 생산자는 SUMSIZE 아이템모두를생성한다음빠져나가기때문에결국은대기상태 (block) 가된다.
10 세마포어는생산자와소비자루프가무한일때나정해진아이템개수만큼루프를돌때생산자-소비자문제를푼다. 생산자나소비자가더복잡한탈출조건에의해제어되는것은쉬운일이아니다. 생산자-소비자문제의변형인 producer-driven에서는생산자는하나이고정해지지않은개수의소비자쓰레드가존재한다. 생산자는어떤개수의아이템을큐에집어넣고빠져나간다 (exit). 소비자는아이템이다소비가되고, 생산자가빠져나갈 (exit) 때까지계속된다. 여기서가능한접근방법은생산자가동작을다끝마쳤을때플래그를설정하는것이다. 프로그램 10.4는이상황을조절하는데왜세마포어를이용하는게어려운가를보여준다. 프로그램 10.4는생산자-소비자문제에있어 producer-driven 탈출조건 (exit condition) 에관한적절하지않은해답을보여준다. 생산자는큐에 SUMSIZE 만큼의아이템을집어넣지만소비자는생산자가다끝날때까지빠져나가지않는다. 버퍼가비어있고, 생산자는 items 세마포어를기다리는상황을생각해보자. 만일생산자가다되었다고결정을하고 producer_done 플래그를설정했다고하면소비자는마지막아이템이생성되기를무한정으로기다리는상태로남아있게된다. 프로그램 10.4 producer-driven 생산자-소비자문제에대한안좋은솔루션 #include <stdio.h> #include <string.h> #include <errno.h> #include <semaphore.h> #define BUFSIZE 8 #define SUMSIZE 100 int producer_done = 0; int sum = 0; sem_t items; sem_t slots; pthread_mutex_t my_lock = PTHREAD_MUTEX_INITIALIZER; void put_item(int); void get_item(int *); void *producer(void *arg1) int i; for (i = 1; i <= SUMSIZE; i++) sem_wait(&slots); put_item(i*i); sem_post(&items); pthread_mutex_lock(&my_lock); producer_done = 1;
11 pthread_mutex_unlock(&my_lock); void *consumer(void *arg2) int myitem; for ( ; ; ) pthread_mutex_lock(&my_lock); if (producer_done) pthread_mutex_unlock(&my_lock); if (sem_trywait(&items)) break; else pthread_mutex_unlock(&my_lock); sem_wait(&items); get_item(&myitem); sem_post(&slots); sum += myitem; 세마포어를이용한방법의문제점은소비자가세마포어를기다릴때가발생한다는점이다. 이렇게되면소비자는 sem_post에의해세마포어가증가되는방법외에대기상태 (block) 가되지않는방법이없다 ( 세마포어가증가하지않으면대기상태가된다.). 동작을끝낸생산자는소비자가아이템을사용할수있다고생각하게만들지않는 sem_post를할수없다 (?: 더이상아이템을사용할수없다고 sem_post를이용해알려줄수없다.). 생산자는 sem_destroy를시도할수있으나불행하게도 POSIX는세마포어가파괴되었을때세마포어를기다리는쓰레드가대기상태가되지않도록 (unblock) 하는것을보장해주지않는다. 연습 10.5 프로그램 10.5는위에서설명한문제를고치기위한프로그램이다. 무엇이잘못되었는가? 답 : 만일생산자가소비자쪽에서남아있는모든아이템을사용하기전에 producer_done 플래그를설정해버린다면, 소비자는마지막아이템을사용하지않고루프를빠져나와버린다. 프로그램 10.5 producer-driven 생산자-소비자문제에대한안좋은두번째솔루션 #include <stdio.h> #include <string.h> #include <errno.h>
12 #include <semaphore.h> #define BUFSIZE 8 #define MAXCONSUMERS 1 #define SUMSIZE 100 int producer_done = 0; int sum = 0; sem_t items; sem_t slots; pthread_mutex_t my_lock = PTHREAD_MUTEX_INITIALIZER; void put_item(int); void get_item(int *); void *producer(void *arg1) int i; for (i = 1; i <= SUMSIZE; i++) sem_wait(&slots); put_item(i*i); sem_post(&items); pthread_mutex_lock(&my_lock); producer_done = 1; for (i = 0; i < MAXCONSUMERS; i++) sem_post(&items); pthread_mutex_unlock(&my_lock); void *consumer(void *arg2) int myitem; for ( ; ; ) sem_wait(&items); pthread_mutex_lock(&my_lock); if (!producer_done) pthread_mutex_unlock(&my_lock); get_item(&myitem); sem_post(&slots); sum += myitem; else
13 pthread_mutex_unlock(&my_lock); break; Note: 이책이인쇄될때쯤에는 POSIX.1b 세마포어의구현이이루어지지않았다. 이절의예제는 8.6과 8.7절에서설명된함수를구현하여시험하였다. 다음절은 condition variable의측면에서 shutdown 문제에대한해결점을제시한다 Condition Variables 세마포어변수 (S) 에대한 sem_wait는 S > 0인상태에서원자적으로 (atomically) 대기를한다. 조건변수 (condition variable) 는정해지지않은속성을가진상태에서원자적으로대기하고, 이벤트의연결 (combination) 이일어날때까지대기상태로남아있게하는아주좋은메카니즘이다. Condition variable은원자적인동작을하는 waiting과 signaling(cond_wait과 cond_signal) 을갖는다. 이 wating과 signaling은세마포어오퍼레이션인 sem_wait와 sem_post와비슷하나같지는않다. 세마포어에있어서속성 S > 0을테스트하는것은 sem_wait가담당하는부분이고, 쓰레드는속성이 false일경우만대기상태 (block) 가된다. 여기서의주안점 (key point) 는테스팅과블록킹이원자적으로이루어진다는것이다. 다음의두단락을천천히그리고자세히읽어봐라. condition variable은처음읽을때는이해하기힘들다. 이두개의단락에있는정보는이절에서여러번반복된다. 한번이해가되면 condition variable은사용하기어렵지않은놈이다. 쓰레드가공유된변수의집합을포함하는어떤속성을기다리는게필요하다고생각하자. 여기서공유된변수의어떤특정쌍이같다고보자. 이변수를사용하는모든코드는임계영역의일부분이기때문에이런공유된변수는뮤텍스락 (mutex lock) 으로보호된다. 부가적인 (addtional) condition variable은쓰레드에이러한변수를포함하는속성을기다리게하는메카니즘을제공한다. 쓰레드가이공유변수중하나를바꿀때마다, 변화가일어났다고 condition variable에시그널을보낸다 (signal). 이시그널은속성이만족된다면보기위하여체크하고있는대기중인쓰레드를깨운다. 대기중인쓰레드가시그널되었을때 ( 신호를받았을때 ) 그속성 ( 변수상태 ) 를테스팅하기전에반드시 mutex를이용해락을걸어야한다. 만일속성이 false라면락을풀고다시대기상태로들어간다 (block). 뮤텍스는쓰레드가대기상태로들어가기전에해제되어야한다. 왜냐하면다른쓰레드가뮤텍스를얻을수있고, 보호가되고이쓴변수를바꿀수있게해야한다. 뮤텍스의해제와블록킹 (blocking) 은이두동작이일어나는사이다른쓰레드가변수를바꾸지않게하기위해원자적 (atomic) 으로동작을해야한다. 시그널은변수를바꿀수있고속성 ( 변수의상태 ) 가아직 true가아니라는 (?) 것을알수있는유일한수단이기때문에대기상태 (blocked) 로빠진쓰레드는시그널이왔을때마다속성을재검사해야한다. 임의의속성 ( 변수상태 ) 을동기화하기위한 condition variable을사용할때다음의단계를이용하라. a) 뮤텍스를얻어라. b) 속성 ( 변수상태 ) 를테스트하라. c) 속성이 true이면어떤일을하고뮤텍스를해제하라. d) 속성이 false이면 cond_wait를호출하고, return 될때b) 로가라.
14 cond_wait는원자적으로호출한쓰레드를대기상태 (block) 로만들고뮤텍스를풀어준다. 뮤텍스는속성이 true이면명시적으로 ( 즉, 코드를써서 ) 풀어줘야하고, 속성이 false이면묵시적으로 ( 자동으로 ) 풀어준다. condition variable을기다리는쓰레드가대기상태가해제되었을때 (unbloked), 대기상태해제프로세스의일부분으로써자동적으로뮤텍스를얻게된다. 만일필요하다면대기상태해제프로세스는 condition variable를기다리는것부터뮤텍스를기다리는것까지의상태를바꾼다. 항상특정한 condition variable과함께같은뮤텍스를사용해라. 예제 10.5 다음의의사코드는 condition variable, v의사용법과변수 x와 y가같은값을가질때까지쓰레드가대기하도록만드는 v와관련된뮤텍스락 m의사용을보여준다. a: lock_mutex(&m); b: while( x!= y ) c: cond_wait(&v, &m); d: /* do stuff related to x and y */ e: unlock_mutex(&m); 예제 10.5에서속성 ( 변수상태 ) 혹은쓰레드가더진행하기위해참이되어야하는조건은 x==y이다 ( 이것은 while loop안에서나타나는실제적인테스트의부정이다 ). 쓰레드는 x!=y를테스트하기전에뮤텍스, m에락을건다. 이코드를실행한쓰레드는 x가 y와같아지기전까지 d코드를실행하지못한다. 테스트는원하는속성 ( 변수상태 ) 가실제적으로 true가되는것을확실하게알수있게하기위하여딸랑 if문하나를쓰는것보다 while 루프를이용해서수행된다. 쓰레드가단순하게세마포어 S 가깨어나기만을기다릴때, 대기상태가 signal에의해인터럽트되지않는다면 S > 0이되는것이보장된다. condition variable은어떤특정한속성과연결이되어있지않다. 그래서프로그램은속성이 true인지알지못하게된다. 하지만어떤쓰레드가그 condition variable에시그널을준다면알수있게된다. 예제 10.6 다음의사코드는 condition variable에관계된시그널을보내는것 (signaling) 을보여준다. f: lock_mutex(&m); g: x++; h: cond_signal(&v); i: unlock_mutex(&m); 예제 10.6의쓰레드는 x의값을변화시키고, 대기하고있는쓰레드가속성을검사할수있도록 v에시그널을보낸다. 예제 10.5와 10.6의의사코드에서의서로톱니바퀴처럼물려있는상황은코드 ( 구문 ) 가뮤텍스락이되어있는동안실행된다는것을보여준다. 블록킹에대한실제적은메카니즘은약간복잡하다. 만일쓰레드가코드 c의 cond_wait에서대기상태가되었을때락을계속유지한상태에있다면다른프로세스는 condition variable에시그널을보내기위한코드 f에서뮤텍스락을얻을수없을것이고, 쓰레드를대기상태로부터해제할수없게된다. deadlock이발생하게된다. 이문제를해결하기위하여 condition variable의구현은쓰레드가 condition variable을대기상태로만들었을경우 cond_wait 는자동적으로뮤텍스를풀고대기상태로들어가도록보장하고있다. 이러한동작은원자적으로이루어지기때문에다른쓰레드는이쓰레드가대기상태로되기전에공유된변수를수정하거나시그널을수정할수없게된다. 쓰레드가대기상태에서해제되었을때다른것을실행하기전에뮤텍스락을다시획득해야한다. cond_wait의두번째인자는쓰레드의코드가진행되기전에얻어야될것중하나로
15 뮤텍스락이있다는것을말한다. 연습 10.6 쓰레드 1이예제 10.5의코드를실행하고쓰레드 2가예제 10.6의코드를실행한다고생각해보자. x와 y의초기값은각각 0과 2이다. 두쓰레드가다음과같이코드를섞어서실행을했을때무슨일이일어나겠는가?: a1, b1, c1, f2, g2, h2, i2. 어떤코드가쓰레드 1이다음에실행할코드인가? 답 : 이섞인코드에서쓰레드 1은뮤텍스락 m을얻고 x!=y를테스트한다. x가 0이고 y가 2이기때문에테스트는성공을하고쓰레드 1은 condition variable을대기상태 (block) 로만들고뮤텍스락 m을푼다. 그러면쓰레드 2는뮤텍스락을얻게되고, x의값을증가시키고 condition variable v에시그널을보내고, 뮤텍스 m을푼다. 시그널은쓰레드 1을대기상태에서해제하고코드 i2에서해제된뮤텍스락을다시얻는다. 그리고다시속성 ( 변수상태 ) 를테스트한다. 여전히 x!= y가참이기때문에쓰레드 1은 cond_wait를실행하고다시대기상태 (block) 로들어간다. 쓰레드 1에의해실행이되는다음코드는 b1과 c1이다. 이러한코드는다른쓰레드의코드에의해섞일수있다. 연습 10.7 예제 10.5와 10.6의의사코드로부터다음과같은순서의코드섞기가가능한가? a1, b1, c1, f2, g2, h2, b1, c1, i2 a1, b1, f2, g2, c1, h2 답 : 코드섞기는불가능둘다불가능하다. 처음의코드섞기에서쓰레드 1은 cond_wait로부터깨어나고, 코드진행을계속하기전에뮤텍스락을다시얻어야한다. 쓰레드 2는시그널을보낼때락을건상태이다. 그러므로섞인코드에서두번째 b1전에 i2코드가와야한다. 두번째코드섞기는쓰레드 1이코드 c1에있는 cond_wait를호출하기전까지는뮤텍스를풀지않기때문에불가능하다. 그러므로, 쓰레드 2는 c1에서뮤텍스가풀리기전에 f2 코드에서락을얻을수없다. cond_signal은속성 ( 변수상태 ) 가참이되는것을보장하지않는다. 시그널을보내는것은단지속성에포함된변수가변화되었다는것과, 속성을다시테스트하라는것을대기상태에있는프로세스에게알려주는방법일뿐이다. 예제 10.5의 b코드에있는 while 루프는속성 ( 변수상태 ) 가실질적으로참이라는것을확인하는데필요하다. 만일 while 루프테스트가성공한다면 ( 속성이 false: 루프를테스트한결과가참이라면 ), 쓰레드는 cond_wait를실행함으로써다시대기상태로들어간다. 다른쓰레드가속성에포함된변수 (x와 y) 를수정했을때, 이쓰레드는다시 cond_signal을호출함으로써대기상태에잇는쓰레드를깨울수있다 Condition Variables for POSIX.1c Threads POSIX.1c 쓰레드는이절의처음에설명한것과비슷한방법의 condition variable 동기화 (synchronization) 방법을제공한다. 정적인초기화 (static initializer) 방법을이용하거나, pthread_cond_init 를호출함으로써 condition variable을초기화할수있다. 만일 attr이 NULL이면 pthread_cond_init는기본적인 (default) condition variable attribute를사용한다.
16 SYNOPSIS int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime); int pthread_cond_signal(pthread_cond_t *cond); int pthread_cond_broadcast(pthread_cond_t *cond); POSIX.1c Condition variable은이변수가항상조건 ( 이것이속성이다 ) 과함께사용되는데서유래가되었다. 쓰레드는속성을테스트하고속성이 false(while문에대해서는참이겠지?) 이면 pthread_cond_wait를호출한다. 다른쓰레드가속성이참이 (while문에대해서는거짓 ) 되도록변수를변화시켰을때, 이쓰레드는 pthread_cond_signal을실행하여대기상태에있는쓰레드를깨운다. 또한 UNIX 시그널의전달과같은다른행동도대기상태에있는쓰레드를 pthread_cond_wait로부터돌아올수있게만들수있다. 이전에대기상태에빠졌던쓰레드는다시속성을검사하고, 속성이여전히 false라면다시 pthread_cond_wait를호출한다. 속성의검사와기다림 (wait: 대기 ) 가원자적으로동작하는것을보장해주기위해함수를호출하는쓰레드는속성을테스트하기전에반드시뮤텍스를얻어야한다. 이러한것은만일쓰레드가 condition variable에서대기상태가된다면 pthread_cond_wait는원자적으로뮤텍스를풀어주고대기상태로들어가도록구현이되었다. 다른쓰레드는이쓰레드가대기상태가되기전에는시그널을발생시킬수없다. 예제 10.7 v를 condition variable로 m을뮤텍스락이라고하자. 다음은 test_condition() 이라고정의된속성이참이면자원에접근할수있도록하는 condition variable의적절한사용법을보여준다. pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t v = PTHREAD_COND_INITIALIZER; pthread_mutex_lock(&m); while (!test_condition()) pthread_cond_wait(&v, &m); /* get resource (make test_condition return false) */ pthread_mutex_unlock(&m); /* do stuff */ pthread_mutex_lock(&m);
17 /* release resource (make test_condition return true) */ pthread_cond_signal(&v); pthread_mutex_unlock(&m); 예제 10.7에서쓰레드는반드시 pthread_cond_wait를호출하기전에 pthread_cond_wait함수에지정이된뮤텍스 m에락을걸어야한다. test_condition이 false를리턴하면쓰레드는 pthread_cond_wait를실행하고, 뮤텍스 m을풀고, condition variable v를대기상태 (block) 로만든다. 예제 10.7에서쓰레드가 pthread_cond_wait를실행했을때, 이쓰레드는뮤텍스 m을획득한상태이다. 쓰레드는원자적으로대기상태가되고뮤텍스를풀어주고, 다른쓰레드가뮤텍스을얻고, 속성에관계된변수를수정할수있도록만든다. 쓰레드가 pthread_cond_wait로부터성공적으로리턴했을때 ( 시그널을받았을때 ), 쓰레드는뮤텍스를얻게되고, 명시적으로뮤텍스를다시획득하는것없이속성을재시험할수있다. 만일프로그램이어떤속성이참일때만특정 condition variable에시그널을보내더라고, 대기하고있는쓰레드는반드시속성을재시험한다. pthread_cond_wait(pthread_cond_signal 이어야될거같은데?) 는 condition variable을기다리는하나의쓰레드를깨운다. 하나이상의쓰레드가대기하고있다면스케쥴링알고리즘에일치되는방법으로그중하나를선택할수있다. pthread_cond_broadcast는 condition variable을기다리고있는모든쓰레드를깨운다. 대기상태에서깨어난이런쓰데르는 pthread_cond_wait로부터리턴하기전에뮤텍스락을얻기위해서로경쟁한다. 다음은 condition variable을사용하는데필요한약간의규칙을설명한다 : 속성을시험하기전에뮤텍스를얻어라. pthread_cond_wait로부터리턴한후에속성을재시험하라. 왜냐하면 pthread_cond_wait로부터리턴된것은어떤관계없는이벤트때문이거나, 아직속성이참이아닌상태에서변수가변화되었다는나타내는 pthread_cond_signal에의한것일수있기때문이다. 속성이나타나는모든변수를바꾸기전에뮤텍스를얻어라. pthread_cond_signal 혹은 pthread_cond_broadcast를호출하기전에뮤텍스를얻어라. 짧은시간동안만뮤텍스를잡고있어라-일반적으로속성을테스트하는동안만. 뮤텍스를명시적 (pthread_mutex_unlock) 혹은묵시적 (pthread_cond_wait) 방법중하나를이용해서가능한빨리풀어라. 프로그램 10.6은 producer-driven 제한된버퍼문제에대한 condition variable을이용한해결방안을보여준다. 생산자는고정된개수의아이템을생산한후빠져나간다. 소비자는모든아이템을사용하고, 생산자가빠져나갔다는것을알때까지동작한다. 프로그램 10.6 producer-driven방식의제한버퍼문제에대한condition variable을이용한해결방안 #include <stdio.h> #include <stdlib.h> #define SUMSIZE 100 #define BUFSIZE 8 int sum = 0; pthread_cond_t slots = PTHREAD_COND_INITIALIZER;
18 pthread_cond_t items = PTHREAD_COND_INITIALIZER; pthread_mutex_t slot_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t item_lock = PTHREAD_MUTEX_INITIALIZER; int nslots = BUFSIZE; int producer_done = 0; int nitems = 0; void get_item(int *itemp); void put_item(int item); void *producer(void * arg1) int i; for (i = 1; i <= SUMSIZE; i++) pthread_mutex_lock(&slot_lock); /* acquire right to a slot */ while (nslots <= 0) pthread_cond_wait (&slots, &slot_lock); nslots--; pthread_mutex_unlock(&slot_lock); put_item(i*i); pthread_mutex_lock(&item_lock); /* release right to an item */ nitems++; pthread_cond_signal(&items); pthread_mutex_unlock(&item_lock); pthread_mutex_lock(&item_lock); producer_done = 1; pthread_cond_broadcast(&items); pthread_mutex_unlock(&item_lock); void *consumer(void *arg2) int myitem; for ( ; ; ) pthread_mutex_lock(&item_lock); /* acquire right to an item */ while ((nitems <=0) &&!producer_done) pthread_cond_wait(&items, &item_lock); if ((nitems <= 0) && producer_done) pthread_mutex_unlock(&item_lock);
19 break; nitems--; pthread_mutex_unlock(&item_lock); get_item(&myitem); sum += myitem; pthread_mutex_lock(&slot_lock); /* release right to a slot */ nslots++; pthread_cond_signal(&slots); pthread_mutex_unlock(&slot_lock); void main(void) pthread_t prodtid; pthread_t constid; int i, total; /* check value */ total = 0; for (i = 1; i <= SUMSIZE; i++) total += i*i; printf("the checksum is %d\n", total); /* create threads */ pthread_create(&prodtid, NULL, producer, NULL); pthread_create(&constid, NULL, consumer, NULL); /* wait for the threads to finish */ pthread_join(prodtid, NULL); pthread_join(constid, NULL); printf("the threads produced the sum %d\n", sum); exit(0); 프로그램 10.6에서의생산자는속성 nslots>0이참이될때까지대기상태가된다. 이속성을테스트하기위한코드는 while(!(nslots>0) ) 혹은 while(nslots<=0) 과같이작성될수있다. 소비자는속성 (nitems > 0) producer_done(i.e., 소비자는생산자가끝났거나생산한아이템이있을경우에동작을한다 ) 이참이될때까지대기상태로있게된다. 그러므로, 이속성을테스트하기위한코드는 while( (nitems<=0) &&!producer_done ) 과같이작성될수있다. 소비자는생산자가끝났을경우혹은아이템이남아있지않을경우에만끝난다 Signal Handling and Threads 시그널을통한쓰레드간의상호작용은몇개의복잡한점을가지고있다. 모든쓰레드는프로세세
20 의시그널핸들러 (signal handler: 시그널이발생했을때처리되는루틴 ) 를공유하지만각쓰레드는자신만의시그널매스크 (signal mask) 를가질수있다. 게다가, 다른형태 (type) 의시그널은다른방법으로다루어진다. 테이블 10.1은시그널의형태와핸들링방법을종합한것이다. Type Delivery Action 비동기 (Asynchronous) 대기상태에있지않은어떤쓰레드고전달된다. 동기 (Synchronous) 시그널을일으킨쓰레드로전달된다. 직접 (Directed) 지정된 (identified) 쓰레드로전달이된다.(pthread_kill) 테이블 10.1: 쓰레드에서의시그널전달 SIGFPE(floating point exception) 과같은시그널들은그시그널을일으킨쓰레드에동기적으로동작한다 (synchronous, i.e., 시그널들은항상쓰레드가실행하는데같은점에서생성된다 (?)). 동기시그널 (synchronous signal) 은때때로함정 ( 트랩 :trap) 으로불린다. 트랩은자기를생성한쓰레드에의해다뤄진다. 다른시그널들은예측된시간에생성되지도않고, 특정쓰레드와연관성을가지지않는비동기시그널이다 (asynchronous). 만일여러쓰레드가대기상태가아닌 (unblocked) 비동기시그널을갖는다면, 여러쓰레드중하나가시그널을처리하기위하여선택이된다. 시그널은 pthread_kill을이용해특정쓰레드로직접보내질수있다 (directed). 쓰레드는시험하거나, pthread_sigmask함수를이용하여시그널매스크에설정을할수있다. SYNOPSIS #include <signal.h> int pthread_kill(pthread_t thread, int sig); POSIX.1c SYNOPSIS #include <signal.h> int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); POSIX.1c pthread_sigmask 호출은 sigprocmask와비슷하다. how 파라미터는 SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK중하나를설정할수있다. 시그널핸들러는전프로세스에걸쳐있고 (processwide), 한쓰레드만을가진프로세스 (single-threaded process) 에서와같이 sigaction을호출함으로써설치가된다. 전프로세스에걸쳐있는 (processwide) 시그널핸들러와쓰레드에의해지정된 (thread-specific) 시그널매스크사이의차이점은매우중요하다. 시그널핸들러로들어갔을때시그널에대한토론을다시생각해보다. 이벤트를일으킨시그널은자동적으로대기상태 (block) 가된다. 다중쓰레드 (multithreaded) 어플리케이션에서시그널에대해대기상태가아닌 (unblocked) 인다른쓰레드에전달되는같은타입의다른시그널을막을수없다. 이것은여러
21 쓰레드가같은시그널핸들러안에서실행되기때문에가능하다. 이것은핸들되고 (handled) 있는시그널에대해명시적으로 sigaction을호출하는것은아주심각한문제이다. 시그널을대기상태가되도록시그널핸들러를설치하는것은시그널핸들러가동작했을때모든쓰레드가대기상태가된시그널을갖도록하는일을일으킨다 ( 모든시그널에대해모든쓰레드가대기상태가된다.). 다중쓰레드프로세스에서시그널을다루는다른방침은시그널을핸들링하도록특정쓰레드를설정하는 (dedicate) 것이다. 메인쓰레드는쓰레드를생성하기전에모든시그널을대기상태 (block) 로만든다. 시그널매스크는자기를생성한쓰레드로부터상속을받기때문에모든쓰레드는대기상태가된시그널을갖게된다. 그러면시그널을핸들링하도록설정된쓰레드는시그널에대해 sigwait를실행한다.(page 391을볼것 ) 두개의접근방법 ( 시그널핸들러대설정된쓰레드 ) 을설명하기위해, 생산자가프로그램이 SIGUSR1을받을때까지버퍼에아이템을넣는제한버퍼문제의변형을생각해보자. 그시점에서생산자는현재아이템을끝마치고빠져나간다. 프로그램은생산자쓰레드를바로죽일 (kill) 수없다. 왜냐하면정해지지않은상태에서뮤텍스를떠나려는쓰레드가뮤텍스락을잡고있기때문이다. 프로그램 10.7은시그널구동형 (signal-driven) 제한버퍼문제 (bounded-buffer problem) 에대한시그널핸들러접근방법을보여준다. 시그널핸들러는생산자 Tm레드가빠져나가도록가르쳐주기위해 producer_shutdown 변수를설정한다. 프로그램 10.7의 producer_shutdown변수가시그널과생산자쓰레드에공유가되기때문에, 생산자쓰레드에서와같은뮤텍스로핸들러안에서도보호된다. 만일 SIGUSR1 시그널이생산자가이락을갖고있는동안발생한다면시그널핸들러는데드락상태가된다 (deadlock). 이런상황을피하기위하여생산자는뮤텍스를획득한상태에서는시그널을막도록 (block signal) 한다. 이해결방안은또한모든다른쓰레드가 SIGUSR1을막는다고 (block) 가정한다. 생산자는조건을기다릴 (condition wait) 동안시그널을막으므로 (block) 슬롯이사용가능하게되고, 다음아이템을생성할때까지 shutdown을감지할수없다. 프로그램 10.7에서함수는테스트할수있도록설치되었다. 메인프로그램은자신의프로세스 ID 를보여주고쓰레드를생성하기전 5초동안잠들어있는다. 이것은사용자가다른창으로움직이거나프로세스에게 ISGUSR1 시그널을보내는명령을실행할수있도록준비하도록한다. 생산자와소비자의쓰레드 ID가쓰레드의시작점을가르쳐주기위해보여진다. 대부분의머신에서이간단한프로그램의제곱합계산은상당히빠르게 (1861 아이템후에 ) 32비트정수를오버플로우 (overflow) 하게된다. 그래서속도를줄이기위해약간의딜레이요소를여러곳에추가하였다. 딜레이의양은 SPIN 상수로조절을하고다른머신에대해서조절할수있도록하였다. 오버플로우가일어났을경우프로그램이없어질때경고가디스플레이된다. 프로그램 10.7에서의소비자는딜레이요소를제외하면프로그램 10.6에서와거의동일하다. 메인프로그램은 SIGUSR1 시그널을쓰레드가생성되기전에블록시킨다 (block). 그러므로블록된시그널을가진시그널매스크가쓰레드에상속된다. 생산자는 slot_lock 뮤텍스를획득한동안블록된시그널을갖는게필요하다. 생산자쓰레드는이시그널을막지않기위해 (to unblock) pthread_sigmask를사용하고, 그래서시그널은오직이쓰레드에서만블록이되지않은상태가된다. 프로그램 10.7 시그널-구동형제한버퍼프로그램에의시그널-핸들러접근방법 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #define SUMSIZE 1861
22 #define BUFSIZE 8 #define SPIN int sum = 0; pthread_cond_t slots = PTHREAD_COND_INITIALIZER; pthread_cond_t items = PTHREAD_COND_INITIALIZER; pthread_mutex_t slot_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t item_lock = PTHREAD_MUTEX_INITIALIZER; int nslots = BUFSIZE; int producer_done = 0; int nitems = 0; int totalproduced = 0; int producer_shutdown = 0; void get_item(int *itemp); void put_item(int item); /* spinit loops to waste time */ void spinit(void) int i; for (i = 0; i < SPIN; i++) ; /* signal handler for shutdown */ void catch_sigusr1(int signo) pthread_mutex_lock(&slot_lock); producer_shutdown = 1; pthread_mutex_unlock(&slot_lock); void *producer(void * arg1) int i; sigset_t intmask; sigemptyset(&intmask); sigaddset(&intmask, SIGUSR1); for (i = 1; ; i++) spinit(); pthread_sigmask(sig_block, &intmask, NULL); pthread_mutex_lock(&slot_lock); /* acquire right to a slot */ spinit();
23 while ((nslots <= 0) && (!producer_shutdown)) pthread_cond_wait (&slots, &slot_lock); if (producer_shutdown) pthread_mutex_unlock(&slot_lock); break; nslots--; pthread_mutex_unlock(&slot_lock); pthread_sigmask(sig_unblock, &intmask, NULL); spinit(); put_item(i*i); pthread_mutex_lock(&item_lock); /* release right to an item */ nitems++; totalproduced++; pthread_cond_signal(&items); pthread_mutex_unlock(&item_lock); spinit(); pthread_mutex_lock(&item_lock); producer_done = 1; pthread_cond_broadcast(&items); pthread_mutex_unlock(&item_lock); void *consumer(void *arg2) int myitem; for ( ; ; ) pthread_mutex_lock(&item_lock); /* acquire right to an item */ while ((nitems <= 0) &&!producer_done) pthread_cond_wait(&items, &item_lock); if ((nitems <= 0) && producer_done) pthread_mutex_unlock(&item_lock); break; nitems--; pthread_mutex_unlock(&item_lock); spinit(); get_item(&myitem); spinit(); sum += myitem;
24 pthread_mutex_lock(&slot_lock); /* release right to a slot */ nslots++; pthread_cond_signal(&slots); pthread_mutex_unlock(&slot_lock); void main(void) pthread_t prodtid; pthread_t constid; double total; double tp; struct sigaction act; sigset_t set; fprintf(stderr, "Process ID is %ld\n", (long)getpid()); sleep(5); /* setup signal handler and block */ act.sa_handler = catch_sigusr1; sigemptyset(&act.sa_mask); act.sa_flags = 0; sigaction(sigusr1, &act, NULL); sigemptyset(&set); sigaddset(&set,sigusr1); sigprocmask(sig_block, &set, NULL); /* create threads */ pthread_create(&prodtid, NULL, producer, NULL); pthread_create(&constid, NULL, consumer, NULL); fprintf(stderr,"producer ID = %d, Consumer ID = %d\n", (int)prodtid, (int)constid); /* wait for the threads to finish */ pthread_join(prodtid, NULL); pthread_join(constid, NULL); printf("the threads produced the sum %d\n", sum); /* show correct value */ total = 0.0; tp = (double) totalproduced; total = tp*(tp+1)*(2*tp+1)/6.0; if (tp > SUMSIZE) fprintf(stderr,"*** Overflow occurs for more than %d items\n", SUMSIZE); printf("the checksum for %4d items is %1.0f\n",
25 totalproduced, total); exit(0); pthread_mutex_lock과 pthread_mutex_unlock은 async-signal safe한함수이다. 이뜻은이함수들은시그널핸들러에서호출될수있다는말이다. 그러나모든쓰레드는뮤텍스락을획득하거나프로그램이데드락이되기전에시그널을반드시블록해야한다. 시그널을핸들링하는데다른접근방법은설정된쓰레드를사용하는것이다. 설정된쓰레드를제외한모든쓰레드는질문하는데있어 ( 웬질문?) 시그널을블록한다. 설정된쓰레드는지정된시그널에대해 sigwait를건다. SYNOPSIS #include <signal.h> int sigwait(sigset_t *sigmask, int *signo); POSIX.1c sigwait함수는쓰레드가 *sigmask에의해지정된모든시그널들을받을때까지블록을한다. *signo 값은 sigwait로부터리턴을일으키는시그널의숫자를말한다. sigwait 함수는성공했을때 0을그렇지않을경우 -1을리턴한다. 에러가발생했을경우 errno를설정한다. sigwait와 sigsuspend 함수의차이점을알아두어라. 이두함수는첫번째인자로시그널셋에대한포인터를갖는다 (sigset_t *). sigsuspend에서이셋은새로운시그널매스크를갖고있고, 그래서이 set 에있지않은시그널은 sigsuspend를리턴할수있게만드는것중하나가된다 ( suspend하도록설정이되지않은시그널때문에 sigsuspend함수라리턴이된다 (?)). sigwait에대해이파라미터는기다려야할시그널의셋을가지고있다. 그래서셋안에있는시그널은 sigwait를리턴할수있게만드는것중하나가된다 ( 셋에설정이된시그널때문에 sigwait가리턴할수있다.). 이두가지경우에프로그램은호출이전에관심있는시그널을블록할수있다. sigsuspend와함께사용할경우시그널이프로세스에전달이되고 sigsuspend는시그널핸들러로부터평범하게리턴이된후에만리턴이된다. sigwait를사용할경우대기 (pending) 하고있는시그널은그시그널이전달되지않고제거되고, 어떤시그널핸들러도필요하지않다. 프로그램 10.8은 SIGUSR1 시그널을기다리는분리된쓰레드를사용하는시그널구동형제한버퍼문제에대한해결방안을보여준다. 설정된시그널접근방법은여러관점에서시그널핸들러접근방법보다간단하다. 쓰레드는 async-signal safe 함수를호출하는데제한을받지않고생산자쓰레드는슬롯이비는것을기다리는동안에도빠져나가도록정보를받을수있다. 프로그램 10.8에서메인프로그램은모든쓰레드를생성하기전에 SIGUSR1 시그널을블록한다. 생성된시그널은시그널매스크를상속받기때문에모든쓰레드는블록된 SIGUSR1을갖는다. 메인프로그램은시그널을핸들하도록설정된쓰레드를생성한다. 프로그램 10.8은오직선점우위스케쥴링 (preemptive priority scheduling) 만을지원하는시스템에서테스트되었다. 시그널을기다리는쓰레드, sigusr1_thread는 sigusr1_thread가시그널을잡을수있도록보장하기위하여디폴트보다높은우선순위를가진다. 프로그램 10.8이먼저 sigusr1_thread의우선순위를높이지않은같은시스템에서실행이되었을때프로그램은여전히정확하게동작하지만때때로시그널이생성되었을때와그시그널이인지되었을때사이에몇초의시간이걸리는경우가있다. 우선순위는변수에우선순위를넣고, 그변수에있는우선순위를증가시키고속성에우선순위를재설정하고그다음에이새로운설정을가지고쓰
26 레드를생성할수있게해주는 pthread_attr_init를사용해쓰레드속성 (attribute) 를초기화함으로써설정될수있다. 만일 round-robin 스케쥴링정책이가능하다면모든쓰레드는같은우선순위를갖게된다. 시그널핸들링쓰레드로설정된쓰레드, sigusr1_thread는자기우선순위가제대로설정이되었나확인하기위하여우선순위를보여주고, SIGUSR1 시그널에대해 sigwait함수를호출한다. sigwait가이러한대기상태 (pending) 로부터시그널을제거해주기때문에시그널핸들러가필요치않다. 시그널은항상블록이되어있기때문에디폴트 SIGUSR1 핸들러 ( 프로세스를죽이는역할을하는 ) 로는절대들어가지않는다. 프로그램 10.8은다른윈도우로부터 kill 명령을이용해프로세스에게 SIGUSR1을보냄으로써테스트할수있도록설정이되었다. 프로그램은시작할때프로세스 ID를보여주고, 프로그램 10.7에서와같이계산을시작한다. 만일프로그램이없어진다면프로그램은빠른시스템에서몇초안에 1861 아이템후 sum을하는데사용되는정수가오버플로우난것이다. 함수 spinit는여러곳에서프로그램을느리게한다. 파라미터 SPIN은얼마나오래그냥회전 (spin) 할것인지결정한다. 이값은타겟시스템에맞춰서조절되어야한다. 이러한잠자는형태 (sleep-type) 의함수는프로그램을더포팅하기쉽도록하지만쓰레드의스케쥴링에영향을미칠수있기때문에사용하지는않는다. 프로그램 10.8 설정된쓰레드를이용한시그널-구동형제한버퍼문제해결방안. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sched.h> #define SUMSIZE 1861 #define BUFSIZE 8 #define SPIN int sum = 0; pthread_cond_t slots = PTHREAD_COND_INITIALIZER; pthread_cond_t items = PTHREAD_COND_INITIALIZER; pthread_mutex_t slot_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t item_lock = PTHREAD_MUTEX_INITIALIZER; int nslots = BUFSIZE; int producer_done = 0; int nitems = 0; int totalproduced = 0; int producer_shutdown = 0; void get_item(int *itemp); void put_item(int item); void spinit(void) int i;
27 for (i = 0; i < SPIN; i++) ; void *sigusr1_thread(void *arg) sigset_t intmask; struct sched_param param; int policy; int sig; sigemptyset(&intmask); sigaddset(&intmask, SIGUSR1); pthread_getschedparam(pthread_self(), &policy, ¶m); fprintf(stderr, "sigusr1_thread entered with policy %d and priority %d\n", policy, param.sched_priority); sigwait(&intmask,&sig); fprintf(stderr, "sigusr1_thread returned from sigwait\n"); pthread_mutex_lock(&slot_lock); producer_shutdown = 1; pthread_cond_broadcast(&slots); pthread_mutex_unlock(&slot_lock); void *producer(void *arg1) int i; for (i = 1; ; i++) spinit(); pthread_mutex_lock(&slot_lock); /* acquire right to a slot */ while ((nslots <= 0) && (!producer_shutdown)) pthread_cond_wait (&slots, &slot_lock); if (producer_shutdown) pthread_mutex_unlock(&slot_lock); break; nslots--; pthread_mutex_unlock(&slot_lock); spinit();
28 put_item(i*i); pthread_mutex_lock(&item_lock); /* release right to an item */ nitems++; pthread_cond_signal(&items); pthread_mutex_unlock(&item_lock); spinit(); totalproduced = i; pthread_mutex_lock(&item_lock); producer_done = 1; pthread_cond_broadcast(&items); pthread_mutex_unlock(&item_lock); void *consumer(void *arg2) int myitem; for ( ; ; ) pthread_mutex_lock(&item_lock); /* acquire right to an item */ while ((nitems <=0) &&!producer_done) pthread_cond_wait(&items, &item_lock); if ((nitems <= 0) && producer_done) pthread_mutex_unlock(&item_lock); break; nitems--; pthread_mutex_unlock(&item_lock); get_item(&myitem); sum += myitem; pthread_mutex_lock(&slot_lock); /* release right to a slot */ nslots++; pthread_cond_signal(&slots); pthread_mutex_unlock(&slot_lock); void main(void) pthread_t prodtid; pthread_t constid; pthread_t sighandid;
29 double total; double tp; sigset_t set; pthread_attr_t high_prio_attr; struct sched_param param; fprintf(stderr, "Process ID is %ld\n", (long)getpid()); /* block the signal */ sigemptyset(&set); sigaddset(&set, SIGUSR1); sigprocmask(sig_block, &set, NULL); fprintf(stderr, "Signal blocked\n"); /* create threads */ pthread_attr_init(&high_prio_attr); pthread_attr_getschedparam(&high_prio_attr, ¶m); param.sched_priority++; pthread_attr_setschedparam(&high_prio_attr, ¶m); pthread_create(&sighandid, &high_prio_attr, sigusr1_thread, NULL); pthread_create(&prodtid, NULL, producer, NULL); pthread_create(&constid, NULL, consumer, NULL); /* wait for the threads to finish */ pthread_join(prodtid, NULL); pthread_join(constid, NULL); printf("the threads produced the sum %d\n", sum); /* show correct value */ tp = (double) totalproduced; total = tp*(tp + 1)*(2*tp + 1)/6.0; if (tp > SUMSIZE) fprintf(stderr, "*** Overflow occurs for more than %d items\n", SUMSIZE); printf("the checksum for %4d items is %1.0f\n", totalproduced, total); exit(0);
1장. 유닉스 시스템 프로그래밍 개요
Unix 프로그래밍및실습 7 장. 시그널 - 과제보충 응용과제 1 부모프로세스는반복해서메뉴를출력하고사용자로부터주문을받아자식프로세스에게주문내용을알린다. (SIGUSR1) ( 일단주문을받으면음식이완료되기전까지 SIGUSR1 을제외한다른시그널은모두무시 ) timer 자식프로세스는주문을받으면조리를시작한다. ( 일단조리를시작하면음식이완성되기전까지 SIGALARM 을제외한다른시그널은모두무시
More information10주차.key
10, Process synchronization (concurrently) ( ) => critical section ( ) / =>, A, B / Race condition int counter; Process A { counter++; } Process B { counter ;.. } counter++ register1 = counter register1
More informationChap04(Signals and Sessions).PDF
Signals and Session Management 2002 2 Hyun-Ju Park (Signal)? Introduction (1) mechanism events : asynchronous events - interrupt signal from users : synchronous events - exceptions (accessing an illegal
More informationMicrosoft PowerPoint - 11_Thread
Linux 쓰레드 - 기본 - Pthread - 생성과소멸 - 동기화 - 공유변수 - 상호배제 기본? 경량프로세스 (lightweight process: LWP) 일반프로세스는생성시자신만의메모리영역을할당받는다 PCB, code, static, heap, stack 등 : PCB 와스택만별도로할당받고나머지는부모프로세스와공유 생성과전환 (context switch)
More information6주차.key
6, Process concept A program in execution Program code PCB (process control block) Program counter, registers, etc. Stack Heap Data section => global variable Process in memory Process state New Running
More informationMicrosoft PowerPoint - o6.pptx
Dining-Philosophers Problem 세마포사용 6.8 모니터 (Monitors) Semaphore chopstick[5] = {1,1,1,1,1 ; // initially all values are 1 Philosopher i while (true) { P(chopStick[i]); // get left chopstick P(chopStick[(i+1)
More informationMicrosoft PowerPoint - o6.pptx
Dining-Philosophers Problem 세마포사용 Semaphore chopstick[5] = {1,1,1,1,1} ; // initially all values are 1 Philosopher i while (true) { P(chopStick[i]); // get left chopstick P(chopStick[(i+1) % 5]); // get
More informationchap 5: Trees
5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경
More informationMicrosoft PowerPoint - chap02-C프로그램시작하기.pptx
#include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의
More informationChapter #01 Subject
Device Driver March 24, 2004 Kim, ki-hyeon 목차 1. 인터럽트처리복습 1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned
More information/chroot/lib/ /chroot/etc/
구축 환경 VirtualBox - Fedora 15 (kernel : 2.6.40.4-5.fc15.i686.PAE) 작동 원리 chroot유저 ssh 접속 -> 접속유저의 홈디렉토리 밑.ssh의 rc 파일 실행 -> daemonstart실행 -> daemon 작동 -> 접속 유저만의 Jail 디렉토리 생성 -> 접속 유저의.bashrc 의 chroot 명령어
More informationInfinity(∞) Strategy
반복제어 표월성 passwd74@cherub.sungkyul.edu 개요 for() 문 break문과 continue문 while문 do-while문 for() 문 for() 문형식 for( 표현식1; 표현식2; 표현식3) 여러문장들 ; 표현식 1 : 초기화 (1 번만수행 ) 표현식 2 : 반복문수행조건 ( 없으면무한반복 ) 표현식 3 : 반복문수행횟수 for()
More information임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수
More informationMicrosoft PowerPoint - chap01-C언어개요.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을
More information제11장 프로세스와 쓰레드
제9장자바쓰레드 9.1 Thread 기초 (1/5) 프로그램 명령어들의연속 (a sequence of instruction) 프로세스 / Thread 실행중인프로그램 (program in execution) 프로세스생성과실행을위한함수들 자바 Thread 2 9.1 Thread 기초 (2/5) 프로세스단위작업의문제점 프로세스생성시오버헤드 컨텍스트스위치오버헤드
More information본 강의에 들어가기 전
유닉스프로그래밍및실습 9 장. 시그널 1. 시그널개념 시그널생명주기 시그널이발생한다. 커널이해당시그널을쌓아둔다.( 동일한시그널이오는경우하나만 ) 가능한시점에서커널이적절하게처리한다 커널의처리방법 시그널무시 아무런동작을하지않는다 절대무시할수없는시그널 SIGKILL SIGSTOP 시그널을붙잡아처리 현재코드경로를따라가는실행을중단하고, 시그널마다등록된함수로점프 기본동작
More information좀비프로세스 2
Signal & Inter-Process Communication Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 좀비프로세스 2 좀비프로세스 (zombie process) 좀비프로세스란프로세스종료후메모리상에서사라지지않는프로세스 좀비프로세스의생성이유. 자식프로세스는부모프로세스에게실행결과에대한값을반환해야한다.
More informationChapter 4. LISTS
C 언어에서리스트구현 리스트의생성 struct node { int data; struct node *link; ; struct node *ptr = NULL; ptr = (struct node *) malloc(sizeof(struct node)); Self-referential structure NULL: defined in stdio.h(k&r C) or
More informationCompareAndSet(CAS) 함수는 address 주소의값이 oldvalue 인지비교해서같으면 newvalue 로 바꾼다. 소프트웨어 lock 을사용하는것이아니고, 하드웨어에서제공하는기능이므로더빠르고 간편하다. X86 에서는 _InterlockedCompareEx
NON-BLOCKING ALGORITHM Homepage: https://sites.google.com/site/doc4code/ Email: goldpotion@outlook.com 2011/10/23 멀티쓰레드환경에서알아두면유용한자료구조에대해소개해본다. HARDWARE PRIMITIVE 효율적인구현을위해, Hardware 에서제공하는기능을이용해야한다. 자주쓰는기능에대해
More informationA Hierarchical Approach to Interactive Motion Editing for Human-like Figures
단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct
More information<4D F736F F F696E74202D BDC3B1D7B3CEB0FA20BDC3B1D7B3CE20C3B3B8AE2E707074>
10 장시그널과시그널처리 시그널과시그널처리 - sigemptyset, sigfillset - sigaddset, sigdelset, sigismember - sigaction - sigprocmask - kill, raise - alarm - pause 1 1. 서론 시그널의종류 이름설명 DA SIGABRT abort() 를호출할때발생 SIGALRM 설정된알람시간이경과한겨우발생
More informationFigure 5.01
Chapter 4: Threads Yoon-Joong Kim Hanbat National University, Computer Engineering Department Chapter 4: Multithreaded Programming Overview Multithreading Models Thread Libraries Threading Issues Operating
More informationMicrosoft PowerPoint - chap05-제어문.pptx
int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); 1 학습목표 제어문인,, 분기문에 대해 알아본다. 인 if와 switch의 사용 방법과 사용시 주의사항에 대해 알아본다.
More information슬라이드 1
CHAP 6: 큐 yicho@gachon.ac.kr 1 큐 (QUEUE) 큐 : 먼저들어온데이터가먼저나가는자료구조 선입선출 (FIFO: First-In First-Out) ( 예 ) 매표소의대기열 Ticket Box 전단 () 후단 () 2 큐 ADT 삽입과삭제는 FIFO 순서를따른다. 삽입은큐의후단에서, 삭제는전단에서이루어진다. 객체 : n 개의 element
More informationPowerPoint 프레젠테이션
Network Programming Jo, Heeseung Network 실습 네트워크프로그래밍 멀리떨어져있는호스트들이서로데이터를주고받을수있도록프로그램을구현하는것 파일과는달리데이터를주고받을대상이멀리떨어져있기때문에소프트웨어차원에서호스트들간에연결을해주는장치가필요 이러한기능을해주는장치로소켓이라는인터페이스를많이사용 소켓프로그래밍이란용어와네트워크프로그래밍이랑용어가같은의미로사용
More information슬라이드 1
/ 유닉스시스템개요 / 파일 / 프로세스 01 File Descriptor file file descriptor file type unix 에서의파일은단지바이트들의나열임 operating system 은파일에어떤포맷도부과하지않음 파일의내용은바이트단위로주소를줄수있음 file descriptor 는 0 이나양수임 file 은 open 이나 creat 로 file
More informationMicrosoft PowerPoint - StallingsOS6e-Chap05.pptx
5 장병행성 : 상호배제와동기화 5 장의강의목표 병행성 (concurrency) 의원리와주요용어를이해한다. 경쟁상태 (race condition) 의문제점에대해이해한다. 상호배제 (mutual exclusion), 교착상태 (deadlock), 기아상태 (starvation) 의 3 가지제어문제를이해한다. 상호배제를보장하기위한하드웨어적접근방법을이해한다. 세마포어를이용한상호배제기법을이해한다.
More informationOCW_C언어 기초
초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향
More informationMicrosoft PowerPoint - 10_Signal
Operating System Laboratory 시그널 - IPC - 시그널의종류 - 시그널구현함수 IPC 프로세스간통신 (Inter-Process Communication) 실행중인프로세스간에데이터를주고받는기법 IPC 에는매우많은방법이있다! File Pipe/Named pipe Socket Shared memory Message passing Remote
More informationABC 11장
12 장고급응용 0 수행중인프로그램 프로세스 모든프로세스는유일한프로세스식별번호 (PID) 를가짐 유닉스에서는 ps 명령을사용하여프로세스목록을볼수있음 12-1 프로세스 $ ps -aux USER PID %CPU %MEM SZ RSS TT STAT START TIME COMMAND blufox 17725 34.0 1.6 146 105 i2 R 15:13 0:00
More informationMicrosoft Word - FunctionCall
Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack
More information<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>
SIMATIC S7 Siemens AG 2004. All rights reserved. Date: 22.03.2006 File: PRO1_17E.1 차례... 2 심벌리스트... 3 Ch3 Ex2: 프로젝트생성...... 4 Ch3 Ex3: S7 프로그램삽입... 5 Ch3 Ex4: 표준라이브러리에서블록복사... 6 Ch4 Ex1: 실제구성을 PG 로업로드하고이름변경......
More informationMicrosoft PowerPoint - chap13-입출력라이브러리.pptx
#include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 스트림의 기본 개념을 알아보고,
More information슬라이드 1
CHAP 2: 순환 (Recursion) 순환 (recursion) 이란? 알고리즘이나함수가수행도중에자기자신을다시호출하여문제를해결하는기법 정의자체가순환적으로 되어있는경우에적합한방법 순환 (recursion) 의예 팩토리얼값구하기 피보나치수열 1 n! n*( n 1)! fib( n) 0 1 fib( n 2) n n 0 ` 1 fib( n 1) if n 0 if
More informationMicrosoft PowerPoint - chap03-변수와데이터형.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num %d\n", num); return 0; } 1 학습목표 의 개념에 대해 알아본다.
More information11장 포인터
Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함
More information3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal.
학번 : 이름 : 1. 다음가정하에서아래프로그램의출력물을예측하세요. 가정 : 부모프로세스의 process id=20100, 자식프로세스의 process id=20101. int glob = 31; /* external variable in initialized data */ char buf[] = "a write to stdout\n"; int main(void)
More informationPowerPoint 프레젠테이션
KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된
More information금오공대 컴퓨터공학전공 강의자료
C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include
More information<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>
리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1
More informationMicrosoft PowerPoint - chap06-2pointer.ppt
2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.
More information슬라이드 1
CHP 6: 큐 C 로쉽게풀어쓴자료구조 생능출판사 2005 큐 (QUEUE) 큐 : 먼저들어온데이터가먼저나가는자료구조 선입선출 (FIFO: First-In First-Out) ( 예 ) 매표소의대기열 Ticket Box 전단 () 후단 () 큐 DT 삽입과삭제는 FIFO 순서를따른다. 삽입은큐의후단에서, 삭제는전단에서이루어진다. 객체 : n 개의 element
More informationK&R2 Reference Manual 번역본
typewriter structunion struct union if-else if if else if if else if if if if else else ; auto register static extern typedef void char short int long float double signed unsigned const volatile { } struct
More informationChapter ...
Chapter 4 프로세서 (4.9절, 4.12절, 4.13절) Contents 4.1 소개 4.2 논리 설계 기초 4.3 데이터패스 설계 4.4 단순한 구현 방법 4.5 파이프라이닝 개요*** 4.6 파이프라이닝 데이터패스 및 제어*** 4.7 데이터 해저드: 포워딩 vs. 스톨링*** 4.8 제어 해저드*** 4.9 예외 처리*** 4.10 명령어 수준
More informationMicrosoft PowerPoint - SP6장-시그널.ppt [호환 모드]
UNIX System Programming Ki-Hyun, JUNG Email : kingjung@paran.com 구성 1 장 : 기본적인개념들과기초적인용어들 2 장 : 파일을다루는시스템호출 primitives 3 장 : 파일에대한문맥상의특성 4 장 : 유닉스디렉토리개념 5 장 : 유닉스프로세스의기본적인성질과제어 6 장 : 프로세스간통신 7 장 : 유용한유닉스프로세스간통신기법
More informationChap 6: Graphs
AOV Network 의표현 임의의 vertex 가 predecessor 를갖는지조사 각 vertex 에대해 immediate predecessor 의수를나타내는 count field 저장 Vertex 와그에부속된모든 edge 들을삭제 AOV network 을인접리스트로표현 count link struct node { int vertex; struct node
More informationMicrosoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100
2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack
More information비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2
비트연산자 1 1 비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2 진수법! 2, 10, 16, 8! 2 : 0~1 ( )! 10 : 0~9 ( )! 16 : 0~9, 9 a, b,
More information03_queue
Queue Data Structures and Algorithms 목차 큐의이해와 ADT 정의 큐의배열기반구현 큐의연결리스트기반구현 큐의활용 덱 (Deque) 의이해와구현 Data Structures and Algorithms 2 큐의이해와 ADT 정의 Data Structures and Algorithms 3 큐 (Stack) 의이해와 ADT 정의 큐는 LIFO(Last-in,
More informationC# Programming Guide - Types
C# Programming Guide - Types 최도경 lifeisforu@wemade.com 이문서는 MSDN 의 Types 를요약하고보충한것입니다. http://msdn.microsoft.com/enus/library/ms173104(v=vs.100).aspx Types, Variables, and Values C# 은 type 에민감한언어이다. 모든
More informationMicrosoft PowerPoint - ch07 - 포인터 pm0415
2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자
More information슬라이드 1
마이크로컨트롤러 2 (MicroController2) 2 강 ATmega128 의 external interrupt 이귀형교수님 학습목표 interrupt 란무엇인가? 기본개념을알아본다. interrupt 중에서가장사용하기쉬운 external interrupt 의사용방법을학습한다. 1. Interrupt 는왜필요할까? 함수동작을추가하여실행시키려면? //***
More informationMicrosoft PowerPoint - 08-Queue.ppt
Chapter Queue ( 큐 ) Dongwon Jeong djeong@kunsan.ac.kr Department of Informatics & Statistics 학습목표 큐의개념및추상데이터타입에대한이해 큐의구현방법 배열 링크드리스트 덱 / 데크의개념과구현방법 큐 (QUEUE) 큐 : 먼저들어온데이터가먼저나가는자료구조 선입선출 (FIFO: First-In
More information<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>
연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.
More information입학사정관제도
운영체제 강의노트 교재 : 운영체제 ( 개정판 ) 출판사 : 한빛미디어 (2010 년 11 월발행 ) 저자 : 구현회 소프트웨어학과원성현교수 1 4 장 병행프로세스와 상호배제 소프트웨어학과원성현교수 2 1. 병행프로세스 병행프로세스의과제 병행성 동시에 2 개이상의프로세스가실행되는성질 다중프로세싱시스템, 분산처리시스템에서주로발생 다중프로세싱시스템은프로세서의효율성을증대시킴
More informationAbstract View of System Components
운영체제실습 - Synchronization - Real-Time Computing and Communications Lab. Hanyang University jtlim@rtcc.hanyang.ac.kr dhchoi@rtcc.hanyang.ac.kr beespjh@gmail.com Introduction 조교소개 이름 : 임정택 Tel : 010-4780
More informationMicrosoft PowerPoint - 08-chap06-Queue.ppt
/ 큐 (QUEUE) Chapter 큐 : 먼저들어온데이터가먼저나가는자료구조 선입선출 (FIFO: First-In First-Out) ( 예 ) 매표소의대기열 큐 Ticket ox Dongwon Jeong djeong@kunsan.ac.kr Department of Kunsan National University 전단 () 후단 () 학습목표 큐 DT 큐의개념및추상데이터타입에대한이해
More informationLab 4. 실습문제 (Circular singly linked list)_해답.hwp
Lab 4. Circular singly-linked list 의구현 실험실습일시 : 2009. 4. 6. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 12. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Circular Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Circular
More informationuntitled
Embedded System Lab. II Embedded System Lab. II 2 RTOS Hard Real-Time vs Soft Real-Time RTOS Real-Time, Real-Time RTOS General purpose system OS H/W RTOS H/W task Hard Real-Time Real-Time System, Hard
More informationChapter_06
프로그래밍 1 1 Chapter 6. Functions and Program Structure April, 2016 Dept. of software Dankook University http://embedded.dankook.ac.kr/~baeksj 이장의강의목표 2 문자의입력방법을이해한다. 중첩된 if문을이해한다. while 반복문의사용법을익힌다. do 반복문의사용법을익힌다.
More informationC++ Programming
C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout
More informationuntitled
- -, (insert) (delete) - - (insert) (delete) (top ) - - (insert) (rear) (delete) (front) A A B top A B C top push(a) push(b) push(c) A B top pop() top A B D push(d) top #define MAX_STACK_SIZE 100 int
More information제1장 Unix란 무엇인가?
1 12 장파이프 2 12.1 파이프 파이프원리 $ who sort 파이프 3 물을보내는수도파이프와비슷 한프로세스는쓰기용파일디스크립터를이용하여파이프에데이터를보내고 ( 쓰고 ) 다른프로세스는읽기용파일디스크립터를이용하여그파이프에서데이터를받는다 ( 읽는다 ). 한방향 (one way) 통신 파이프생성 파이프는두개의파일디스크립터를갖는다. 하나는쓰기용이고다른하나는읽기용이다.
More informationMicrosoft PowerPoint - additional01.ppt [호환 모드]
1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능
More informationLab 3. 실습문제 (Single linked list)_해답.hwp
Lab 3. Singly-linked list 의구현 실험실습일시 : 2009. 3. 30. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 5. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Singly-linked list의각함수를구현한다.
More informationMicrosoft PowerPoint - chap06-5 [호환 모드]
2011-1 학기프로그래밍입문 (1) chapter 06-5 참고자료 변수의영역과데이터의전달 박종혁 Tel: 970-6702 Email: jhpark1@seoultech.ac.kr h k 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- ehanbit.net 자동변수 지금까지하나의함수안에서선언한변수는자동변수이다. 사용범위는하나의함수내부이다. 생존기간은함수가호출되어실행되는동안이다.
More informationUI TASK & KEY EVENT
T9 & AUTOMATA 2007. 3. 23 PLATFORM TEAM 정용학 차례 T9 개요 새로운언어 (LDB) 추가 T9 주요구조체 / 주요함수 Automata 개요 Automata 주요함수 추후세미나계획 질의응답및토의 T9 ( 2 / 30 ) T9 개요 일반적으로 cat 이라는단어를쓸려면... 기존모드 (multitap) 2,2,2, 2,8 ( 총 6번의입력
More information슬라이드 1
CHAP 6: 큐 큐 (QUEUE) 큐 : 먼저들어온데이터가먼저나가는자료구조 선입선출 (FIFO: First-In First-Out) ( 예 ) 매표소의대기열 Ticket Box 전단 (front) 후단 (rear) 큐 ADT 삽입과삭제는 FIFO 순서를따른다. 삽입은큐의후단에서, 삭제는전단에서이루어진다. 객체 : n 개의 element 형으로구성된요소들의순서있는모임
More informationChapter 4. LISTS
6. 동치관계 (Equivalence Relations) 동치관계 reflexive, symmetric, transitive 성질을만족 "equal to"(=) 관계는동치관계임. x = x x = y 이면 y = x x = y 이고 y = z 이면 x = z 동치관계를이용하여집합 S 를 동치클래스 로분할 동일한클래스내의원소 x, y 에대해서는 x y 관계성립
More information[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi
2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,
More information<4D F736F F F696E74202D20322DBDC7BDC3B0A320BFEEBFB5C3BCC1A6>
컴퓨터시스템구성 2. 실시간운영체제 1 2 운영체제의주요기능 프로세스관리 (Process management) 메모리관리 (Memory management) 인터럽트핸들링 (Interrupt handling) 예외처리 (Exception handling) 프로세스동기화 (Process synchronization) 프로세스스케쥴링 (Process scheduling)
More informationPowerPoint 프레젠테이션
Verilog: Finite State Machines CSED311 Lab03 Joonsung Kim, joonsung90@postech.ac.kr Finite State Machines Digital system design 시간에배운것과같습니다. Moore / Mealy machines Verilog 를이용해서어떻게구현할까? 2 Finite State
More informationMicrosoft PowerPoint - StallingsOS6e-Chap06.ppt [호환 모드]
6 장병행성 : 교착상태와기아 6 장의강의목표 교착상태 (deadlock) 의원리를이해한다. 교착상태에자원할당그래프가어떻게이용되는지이해한다. 교착상태가발생하기위한필요. 충분조건을이해한다. 교착상태예방기법들을이해한다. 교착상태회피기법들을이해한다. 교착상태의발견과복구기법들을이해한다. 식사하는철학자문제를이해하고해결방법을이해한다. UNIX, LINUX, Solaris,
More informationOCW_C언어 기초
초보프로그래머를위한 C 언어기초 3 장 : 변수와데이터형 2012 년 이은주 학습목표 변수와상수의개념에대해알아본다. 리터럴상수, 매크로상수, const 변수에대해알아본 다. C 언어의데이터형에대해알아본다. 2 목차 변수와상수 변수 상수 데이터형 문자형 정수형 실수형 sizeof 연산자 3 변수와상수 변수 : 값이변경될수있는데이터 상수 : 값이변경될수없는데이터
More information이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2
제 17 장동적메모리와연결리스트 유준범 (JUNBEOM YOO) Ver. 2.0 jbyoo@konkuk.ac.kr http://dslab.konkuk.ac.kr 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다. 이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다.
More information슬라이드 1
-Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역
More informationPowerPoint 프레젠테이션
Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi
More informationJUNIT 실습및발표
JUNIT 실습및발표 JUNIT 접속 www.junit.org DownLoad JUnit JavaDoc API Document 를참조 JUNIT 4.8.1 다운로드 설치파일 (jar 파일 ) 을다운로드 CLASSPATH 를설정 환경변수에서설정 실행할클래스에서 import JUnit 설치하기 테스트실행주석 @Test Test 를실행할 method 앞에붙임 expected
More informationPowerPoint 프레젠테이션
순환알고리즘 C 로쉽게풀어쓴자료구조 순환 (recursion) 수행이끝나기전에자기자신을다시호출하여문제해결 - 직접순환, 간접순환 문제정의가순환적으로되어있는경우에적합한방법 ( 예제 ) 팩토리얼 피보나치수열 n! 1 n * ( n 1)! n n 0 fib( n) 1 fib ( n 2) fib( n 1) 1 ` 2 if if n 0 n 1 otherwise 이항계수
More informationUI TASK & KEY EVENT
2007. 2. 5 PLATFORM TEAM 정용학 차례 CONTAINER & WIDGET SPECIAL WIDGET 질의응답및토의 2 Container LCD에보여지는화면한개 1개이상의 Widget을가짐 3 Container 초기화과정 ui_init UMP_F_CONTAINERMGR_Initialize UMP_H_CONTAINERMGR_Initialize
More informationuntitled
Step Motor Device Driver Embedded System Lab. II Step Motor Step Motor Step Motor source Embedded System Lab. II 2 open loop, : : Pulse, 1 Pulse,, -, 1 +5%, step Step Motor (2),, Embedded System Lab. II
More informationvi 사용법
네트워크프로그래밍 6 장과제샘플코드 - 1:1 채팅 (udp 버전 ) 과제 서버에서먼저 bind 하고그포트를다른사람에게알려줄것 클라이언트에서알려준포트로접속 서로간에키보드입력을받아상대방에게메시지전송 2 Makefile 1 SRC_DIR =../../common 2 COM_OBJS = $(SRC_DIR)/addressUtility.o $(SRC_DIR)/dieWithMessage.o
More informationchap7.key
1 7 C 2 7.1 C (System Calls) Unix UNIX man Section 2 C. C (Library Functions) C 1975 Dennis Ritchie ANSI C Standard Library 3 (system call). 4 C?... 5 C (text file), C. (binary file). 6 C 1. : fopen( )
More information본 강의에 들어가기 전
C 기초특강 종합과제 과제내용 구조체를이용하여교과목이름과코드를파일로부터입력받아관리 구조체를이용하여학생들의이름, 학번과이수한교과목의코드와점수를파일로부터입력 학생개인별총점, 평균계산 교과목별이수학생수, 총점및평균을계산 결과를파일에저장하는프로그램을작성 2 Makefile OBJS = score_main.o score_input.o score_calc.o score_print.o
More information61 62 63 64 234 235 p r i n t f ( % 5 d :, i+1); g e t s ( s t u d e n t _ n a m e [ i ] ) ; if (student_name[i][0] == \ 0 ) i = MAX; p r i n t f (\ n :\ n ); 6 1 for (i = 0; student_name[i][0]!= \ 0&&
More informationMicrosoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600
균형이진탐색트리 -VL Tree delson, Velskii, Landis에의해 1962년에제안됨 VL trees are balanced n VL Tree is a binary search tree such that for every internal node v of T, the heights of the children of v can differ by at
More informationPoison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3
Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow
More informationPowerPoint Presentation
Class - Property Jo, Heeseung 목차 section 1 클래스의일반구조 section 2 클래스선언 section 3 객체의생성 section 4 멤버변수 4-1 객체변수 4-2 클래스변수 4-3 종단 (final) 변수 4-4 멤버변수접근방법 section 5 멤버변수접근한정자 5-1 public 5-2 private 5-3 한정자없음
More informationSystem Programming Lab
System Programming Lab Week 4: Shell Schedule for your own shell 1 st shell 기본기능 fork / exec Background Processing/ Sequential Execution ls, find, grep 2 nd Environment variables/ Shell variables built-in
More informationadfasdfasfdasfasfadf
C 4.5 Source code Pt.3 ISL / 강한솔 2019-04-10 Index Tree structure Build.h Tree.h St-thresh.h 2 Tree structure *Concpets : Node, Branch, Leaf, Subtree, Attribute, Attribute Value, Class Play, Don't Play.
More informationFrama-C/JESSIS 사용법 소개
Frama-C 프로그램검증시스템소개 박종현 @ POSTECH PL Frama-C? C 프로그램대상정적분석도구 플러그인구조 JESSIE Wp Aorai Frama-C 커널 2 ROSAEC 2011 동계워크샵 @ 통영 JESSIE? Frama-C 연역검증플러그인 프로그램분석 검증조건추출 증명 Hoare 논리에기초한프로그램검증도구 사용법 $ frama-c jessie
More informationuntitled
if( ) ; if( sales > 2000 ) bonus = 200; if( score >= 60 ) printf(".\n"); if( height >= 130 && age >= 10 ) printf(".\n"); if ( temperature < 0 ) printf(".\n"); // printf(" %.\n \n", temperature); // if(
More informationPowerPoint 프레젠테이션
Chapter 06 반복문 01 반복문의필요성 02 for문 03 while문 04 do~while문 05 기타제어문 반복문의의미와필요성을이해한다. 대표적인반복문인 for 문, while 문, do~while 문의작성법을 알아본다. 1.1 반복문의필요성 반복문 동일한내용을반복하거나일정한규칙으로반복하는일을수행할때사용 프로그램을좀더간결하고실제적으로작성할수있음.
More information2009년 상반기 사업계획
시그널 IT CookBook, 유닉스시스템프로그래밍 학습목표 시그널의기본개념을이해한다. 시그널을보내는방법을이해한다. 시그널을받아서처리하는기본적인방법을이해한다. 시그널집합의개념과사용방법을이해한다. sigaction 함수를사용해시그널을처리하는방법을이해한다. 알람시그널의처리방법을이해한다. 시그널관련기타함수들의사용방법을이해한다. 2/38 목차 시그널의개념 시그널의종류
More informationMicrosoft PowerPoint - chap10-함수의활용.pptx
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과
More informationfprintf(fp, "clf; clear; clc; \n"); fprintf(fp, "x = linspace(0, %d, %d)\n ", L, N); fprintf(fp, "U = [ "); for (i = 0; i <= (N - 1) ; i++) for (j = 0
병렬계산을이용한열방정식풀기. 1. 처음 병렬계산을하기전에 C 언어를이용하여명시적유한차분법으로하나의열방정식을풀어본 다. 먼저 C 로열방정식을이해한다음초기조건만다르게하여클러스터로여러개의열방 정식을풀어보자. 2. C 를이용한명시적유한차분법으로열방적식풀기 열방정식을풀기위한자세한이론은앞서다룬 Finite-Difference method 을보기로하고 바로식 (1.10)
More informationChap 6: Graphs
5. 작업네트워크 (Activity Networks) 작업 (Activity) 부분프로젝트 (divide and conquer) 각각의작업들이완료되어야전체프로젝트가성공적으로완료 두가지종류의네트워크 Activity on Vertex (AOV) Networks Activity on Edge (AOE) Networks 6 장. 그래프 (Page 1) 5.1 AOV
More informationPowerPoint Presentation
#include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을작성하면서 C 프로그램의구성요소에대하여알아본다.
More informationJAVA PROGRAMMING 실습 08.다형성
2015 학년도 2 학기 1. 추상메소드 선언은되어있으나코드구현되어있지않은메소드 abstract 키워드사용 메소드타입, 이름, 매개변수리스트만선언 public abstract String getname(); public abstract void setname(string s); 2. 추상클래스 abstract 키워드로선언한클래스 종류 추상메소드를포함하는클래스
More information프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음
프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음 CHAPTER 9 둘중하나선택하기 관계연산자 두개의피연산자를비교하는연산자 결과값은참 (1) 아니면거짓 (0) x == y x 와 y 의값이같은지비교한다. 관계연산자 연산자 의미 x == y x와 y가같은가? x!= y
More information