'System Program'에 해당되는 글 46건

  1. 2013.07.08 2. 시그널의 종류와 사용법
  2. 2013.07.04 동적 뮤텍스
  3. 2013.07.03 8. 쓰레드 클린업 핸들러(쓰레드 취소와 연관)
  4. 2013.07.02 5. pthread attributes
  5. 2013.05.27 1. pthread 개요
  6. 2013.01.01 7. 쓰레드 취소

2. 시그널의 종류와 사용법

System Program/signal 2013. 7. 8. 11:26

1. 시그널의 종류

 

앞장에서 시그널은 표준과 전통적인 두 가지의 범주로 나눌 수 있다고 했다.

아래 표는 일반적인 시그널의 리스트이다.

 

1) SIGHUP                 2) SIGINT                 3) SIGQUIT                      4) SIGILL
5) SIGTRAP               6) SIGABRT              7) SIGBUS                       8) SIGFPE
9) SIGKILL                10) SIGUSR1            11) SIGSEGV                   12) SIGUSR2
13) SIGPIPE              14) SIGALRM           15) SIGTERM                  16) SIGSTKFLT
17) SIGCHLD             18) SIGCONT           19) SIGSTOP                   20) SIGTSTP
21) SIGTTIN               22) SIGTTOU            23) SIGURG                    24) SIGXCPU
25) SIGXFSZ              26) SIGVTALRM       27) SIGPROF                  28) SIGWINCH
29) SIGIO                  30) SIGPWR             31) SIGSYS                    34) SIGRTMIN
35) SIGRTMIN+1         36) SIGRTMIN+2       37) SIGRTMIN+3              38) SIGRTMIN+4
39) SIGRTMIN+5         40) SIGRTMIN+6       41) SIGRTMIN+7              42) SIGRTMIN+8
43) SIGRTMIN+9         44) SIGRTMIN+10     45) SIGRTMIN+11             46) SIGRTMIN+12
47) SIGRTMIN+13       48) SIGRTMIN+14      49) SIGRTMIN+15            50) SIGRTMAX-14
51) SIGRTMAX-13      52) SIGRTMAX-12     53) SIGRTMAX-11          54) SIGRTMAX-10
55) SIGRTMAX-9       56) SIGRTMAX-8       57) SIGRTMAX-7            58) SIGRTMAX-6
59) SIGRTMAX-5       60) SIGRTMAX-4       61) SIGRTMAX-3            62) SIGRTMAX-2
63) SIGRTMAX-1       64) SIGRTMAX

 

2. 시그널 확인 방법

 

쉘 상에서 아래와 같은 명령어로 표준 시그널 정보를 확인할 수 있다.

 

 $ kill -l

 

3. kill 명령어 사용법

 

$ kill -[시그널번호] [pid]

 

[예]

$ kill -SIGKILL 100 ( kill -9 100)

 

4. 자주 쓰는 시그널 정리

 

CTRL + C : SIGINT (터미널 Interrupt)

CTRL + Z : SIGSTP (프로세스 중단)

CTRL + \ : SIGQUIT (Core Dump를 남기고 프로세스 종료) 

 

5. 시그널의 범주

 

시그널은 제어가능한 것과 그렇지 않은 것으로 나눈다. 제어가능 한 것은 시그널 Catch가 가능한 것이고 반대는 그렇지 않은 것이다.

일반적으로 SIGKILL, SIGSTOP은 제어가 불가능하다.

 

6. reference

 

http://man7.org/linux/man-pages/man7/signal.7.html

 

'System Program > signal' 카테고리의 다른 글

1. 개념과 개요  (0) 2014.02.19
6. sigaction() 함수에 대한 고찰  (0) 2013.07.08
5. (1 ~ 4)장에 대한 총괄 예제  (0) 2013.07.08
3. 시그널 전송 방법(시스템 콜)  (0) 2013.07.08
:

동적 뮤텍스

System Program/mutex 2013. 7. 4. 09:49

1. 동적 뮤텍스

 

실행 중에 뮤텍스를 할당하여 사용하고자 하는 응용에 적합한 방식이다.

또한 PTHREAD_MUTEX_INITIALIZER 초기값 이외값은 정적 초기값으로 사용될 수 없고

동적 뮤텍스를 통해서만 가능한다.

 

2. 동적 뮤텍스 초기화

 

#include <pthread.h>

 

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

 

성공하면 '0'을 리턴하고, 에러가 발생하면 에러번호 (양수)를 리턴한다.

 

3. 동적 뮤텍스 제거

 

동적으로 할당된 뮤텍스가 더 이상 필요하지 않으면 제거해야 한다. 아래 함수를 통해서 제거할 수 있다.

 

#include <pthread.h>

 

int pthread_mutex_destroy(pthread_mutex_t *mutex);

 

성공하면 '0'을 리턴하고, 에러가 발생하면 에러번호 (양수)를 리턴한다.

 

4. 뮤텍스 속성

 

위의 뮤텍스 초기화부분에 필요한 attr 설정 부분에 대한 자세한 설명은 생략하고 예제 코드로 대체한다.

NULL로 설정되면 기본 속성값으로 뮤텍스가 초기화된다.

 

pthread_mutex_t mtx;
pthread_mutexattr_t mtxAttr;
int retval, type;

retval = pthread_mutexattr_init(&mtxAttr);
if(retval != 0)
{
	perror("pthread_mutexattr_init : ");
	exit(EXIT_FAILURE);
}

retval = pthread_mutexattr_settype(&mtxAttr, PTHREAD_MUTEX_ERRORCHECK);
if(retval != 0)
{
	perror("pthread_mutexattr_settype : ");
	exit(EXIT_FAILURE);
}

retval = pthread_mutex_init(&mtx, &mtxAttr);
if(retval != 0)
{
	perror("pthread_mutex_init : ");
	exit(EXIT_FAILURE);
}

retval = pthread_mutexattr_destroy(&mtxAttr);
if(retval != 0)
{
	perror("pthread_mutexattr_destroy : ");
	exit(EXIT_FAILURE);
}


 

뮤텍스 속성도 초기화 함수와 기타 설정함수, 마지막으로 제거함수로 구성되어 있다.

여기서는 단지 뮤텍스 종류에 대해서만 살펴보고 자세한 내용은 메뉴얼 참조.

 

 종류

설명 

 PTHREAD_MUTEX_NORMAL

셀프 데드락 감지 기능이 없어서 이미 잠겨 있는 뮤텍스를 잠그려고 하면 뮤텍스는 데드락된다.  

 PTHREAD_MUTEX_ERRORCHECK

모든 동작에서 에러 검사를 수행한다. 디버그용으로 적합하다.  

 PTHREAD_MUTEX_RECURSIVE

잠금 카운터 개념이 추가되어 뮤텍스 잠금이 계속될 때 카운터가 증가한다.  

 

 

'System Program > mutex' 카테고리의 다른 글

조건변수  (0) 2014.03.10
정적 뮤텍스  (0) 2014.03.10
:

8. 쓰레드 클린업 핸들러(쓰레드 취소와 연관)

System Program/pthread 2013. 7. 3. 15:15

클린업이란

 

쓰레드 취소 요청에 의해 쓰레드가 취소될 때, 경우에 따라서 정리가 필요한 부분을 정리하지 않고

쓰레드가 취소되어 종료되면 문제가 발생할 여지가 생긴다.

 

한 예로 뮤텍스로 묶인 임계영역을 두고 여러 쓰레드가 경쟁상태에 있을 경우, 어떤 쓰레드가 

뮤텍스 락 상태로 취소되면 데드락에 빠질 수 있는 상황이 발생할 수 있다.

 

쓰레드 취소 요청에 대해서 정리가 필요한 부분이 있으면 아래 함수를 통해서 핸들러를 등록하여

핸들러를 통해서 정리하도록하여 문제가 발생하지 않도록 조치할 수 있다.

 

#include <pthread.h>

 

void pthread_cleanup_push(void (*routine)(void *), void *arg);

void pthread_cleanup_pop(int execute); 

 

pthread_cleanup_push() 함수는 routine으로 지정한 함수를 클린업 핸들러로 등록하고 등록된 핸들러는

함수의 push/pop의 의미에서 유추할 수 있듯이 구현이 스택으로 구현되어 있음을 유추할 수 있다. 따라서

등록하면 스택상의 최상위에 차곡차곡 쌓이게된다.

 

pthread_cleanup_push() 함수의 routine 함수의 형태는 아래와 같다.

 

void routine(void *arg)

{

/* cleanup codes */

 

pthread_cleanup_pop() 함수의 execute 인자가 '0'이 아닌 값이 설정되면 클린업 핸들러가 pthread_cleanup_pop()

함수에서도 호출된다.

 

 

'System Program > pthread' 카테고리의 다른 글

2. pthread 생성  (0) 2014.03.07
6. pthread attribute - (2)  (0) 2013.07.12
5. pthread attributes  (0) 2013.07.02
1. pthread 개요  (0) 2013.05.27
7. 쓰레드 취소  (0) 2013.01.01
:

5. pthread attributes

System Program/pthread 2013. 7. 2. 17:15

1. pthread attributes

 

#include <pthread.h>

 

int pthread_attr_init(pthread_attr_t *attr);

int pthread_attr_destroy(pthread_attr_t *attr);

 

성공하면 '0'을 리턴, 에러가 발생하면 에러 번호(양수)를 리턴한다.  

 

pthread_create() 함수의 두 번째 인자인 const pthread_attr_t *attr에 NULL을 넘기면 default값이 설정된다.

Default값 이외의 값을 설정하고자 할 때, 위의 attribute설정 함수들을 사용한다.

Attribute의 설정은 이 기본값을 쓰레드 생성시 변경할 수 있지만 생성 후에는 변경 할 수 없다.

 

2. 예제

 

pthread_detach()함수 대신에 attribute 설정을 통하여 thread 생성 시, detachable하게 생성할 수 있다.

 

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> #include "common.h" void *SI_ProcessTSFilter(void *pData) { UINT16 PID = 0x00; FILE *fp = NULL; UINT32 nRead = 0; UINT8 buffer[188] = {0, }; UINT32 filesize = 0; fp = fopen("hurrycain.ts", "rb"); if(!fp) { printf("fopen error \n"); } while(1) { nRead = fread(buffer, 1, 188, fp); if(nRead < 188) break; if(buffer[2] == 0) printf("TS Header = %#x %#x %#x\n", buffer[0], buffer[1], buffer[2]); } fclose(fp); pthread_exit(0); } int main(int argc, char *argv[]) { int opt; pthread_t tid; pthread_attr_t attr; int s; // Initialize attribute structure s = pthread_attr_init(&attr); if(s != 0) { printf("pthread_attr_init error \n"); exit(1); } s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); if(s != 0) { printf("pthread_attr_setdetachstate error \n"); exit(1); } s = pthread_create(&tid, &attr, SI_ProcessTSFilter, NULL); if(s != 0) { printf("pthread_create error \n"); exit(1); } s = pthread_attr_destroy(&attr); if(s != 0) { printf("pthread_attr_destory error \n"); exit(1); } while((opt = getchar()) != 'q'); return 0; }

 

 

그 밖의 스택사이즈/우선순위/CPU 친화도 등 attribute설정하는 함수는 여러가지 존재한다.

 

create생성함수와 attribute 설정 함수 등을 하나로 뭉쳐서 설계하면 더 좋은 구조가 될 것이라 본다.

 

 

 

 

'System Program > pthread' 카테고리의 다른 글

2. pthread 생성  (0) 2014.03.07
6. pthread attribute - (2)  (0) 2013.07.12
8. 쓰레드 클린업 핸들러(쓰레드 취소와 연관)  (0) 2013.07.03
1. pthread 개요  (0) 2013.05.27
7. 쓰레드 취소  (0) 2013.01.01
:

1. pthread 개요

System Program/pthread 2013. 5. 27. 08:15

1. 역사

 

1996년에 처음 리눅스에서 리눅스쓰레드(LinuxThread)를 지원했으나 현재의 모습과는 달리 Thread를 라이블러리 형태로 지원하였다. 이 형태는 POSIX표준과 약간의 불일치점이 있었는데 큰 차이는 신호처리 부분이다.

 

리눅스는 다양한 프로젝트를 거치면서 NPTL(Native POSIX Thread Library)이라는 새로운 표준으로 자리잡았으며 이는 레드헷 9부터 지원하기 시작했다. NPTL은 POSIX표준을 따르도록 수정하기보다는 사용단의 Thread를 커널 수준의 쓰레드로 대응하는 방안으로 초점을 맞쳐서 개선활동을 하였다.

 

우리가 Thread를 사용하여 User단에 기능 구현을 하지만 실제 커널은 프로세스와 쓰레드는 크게 차이는 없다. 차이는 프로세스가 Fork를 통해서 새로 생성되면 자식프로세스는 부모프로세스와 독립된 객체 반면 쓰레드는 자신이 생성한 지역변수를 제외한 프로세스가 생성한 전역변수, 파일설명자, 신호처리기, 현재 디렉토리 상태에 대한 정보를 공유한다.

 

2. 쓰레드마다 고유한 속성

 

생성된 쓰레드들은 프로세스내에 존재하고 같은 가상메모리상에 있으므로 대부분의 프로세스의 자원을 공유한다. 다만 아래와 같은 속성은 쓰레드마다 독립적으로 관리한다.

 

  • 쓰레드 ID
  • 시그널 마스크
  • 쓰레드 고유 데이터
  • 대체 시그널 스택
  • errno 값
  • 부동 소수점 환경
  • 실시간 스케쥴링 정책과 우선순위
  • CPU 친화도
  • 능력
  • 스택

 

3. Pthread 함수의 리턴값

 

시스템 호출과 일부 라이블러리 함수에서 상태를 리턴하는 전통적인 방법은 성공하면 '0'을 리턴하고 에러가 발생하면 음수를 리턴하고 errno를 설정해 에러를 알리는 구조이다.

하지만 Pthread API 함수는 성공하면 '0'을, 실패하면 양수를 리턴한다. 이 점이 주의해야 할 사항이다.

 

4. pthread 사용을 위한 선행 작업

 

1) -D_REENTRANT Define 정의

 

2) include pthread.h

 

3) -lpthread : 라이블러리 Link

 

* NPTL의 헤더와 라이블러리 Path

- /usr/include/nptl,  /usr/lib/nptl (이 PATH는 CFLAGS나 LDFLAGS에 포함시킬 없다)

 

3. References

 

https://computing.llnl.gov/tutorials/pthreads/

 

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Thread/Beginning/PthreadApiReference

 

 

 

 

'System Program > pthread' 카테고리의 다른 글

2. pthread 생성  (0) 2014.03.07
6. pthread attribute - (2)  (0) 2013.07.12
8. 쓰레드 클린업 핸들러(쓰레드 취소와 연관)  (0) 2013.07.03
5. pthread attributes  (0) 2013.07.02
7. 쓰레드 취소  (0) 2013.01.01
:

7. 쓰레드 취소

System Program/pthread 2013. 1. 1. 13:54

1. 정의

 

쓰레들은 보통 pthread_exit() 함수를 호출하거나 콜백함수에서 리턴함으로써 종료될 때까지

병렬로 작업을 수행한다.

 

가끔은 특정 쓰레드의 동작을 취소하고 싶은 경우가 있다. 이 때 사용하는 함수이다.

 

2. 쓰레드 취소 함수

 

#include <pthread.h>

 

int pthread_cancel(pthread_t thread);

 

성공하면 '0'을 리턴, 에러가 발생하면 에러 번호(양수)를 리턴한다.  

 

pthread_cancel() 함수는 즉시 리턴한다.

 

3. 취소 상태와 종류 설정 함수

 

pthread_cancel() 함수를 주 쓰레드나 어떤 쓰레드에서 취소하고자 하는 쓰레드 ID를 호출하면

그 쓰레드의 콜백함수는 취소되게 된다. 취소되는 지점은 취소 지점 가능 함수에 의해서 설정되는데

가능한 함수들의 목록은 너무 길어서 생락한다.

 

4. 예제

 

/*
* main.c -- C Test App.
*
* Copyright (C) 2012-2013, 2013 heesoon.kim <chipmaker.tistory.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

void *threadFunc(void *arg)
{	
	int count = 0;
	printf("new thread started ....\n");
	int retval;
	
#ifdef TEST_PTHREAD_TESTCANCEL
	while(1)
	{
		count++;
		// 임의의 cancle point 지정
		pthread_testcancel();
	};
#else

#ifdef TEST_PTHREAD_SETCANCELSTATE
	retval = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
	if(retval != 0)
	{
		perror("pthread_create : ");
		exit(EXIT_FAILURE);
	}
	
	retval = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
	if(retval != 0)
	{
		perror("pthread_create : ");
		exit(EXIT_FAILURE);
	}	
#endif
	
	while(1)
	{
		printf("count = %d \n", count++);
		sleep(1);
		
		// for testing pthread_exit() return value
		if(count == 10)
			break;
	}
#endif

	pthread_exit((void *) count);	
}

int main(int argc, char *argv[])
{
	pthread_t tid;
	int retval;
	void *res;
	
	retval = pthread_create(&tid, NULL, threadFunc, NULL);
	if(retval != 0)
	{
		perror("pthread_create : ");
		exit(EXIT_FAILURE);
	}
	
	sleep(5);
	
#ifndef EXIT_NORMAL	
	retval = pthread_cancel(tid);
	if(retval != 0)
	{
		perror("pthread_cancle : ");
		exit(EXIT_FAILURE);
	}	
#endif
	
	retval = pthread_join(tid, &res);
	if(retval != 0)
	{
		perror("pthread_join : ");
		exit(EXIT_FAILURE);
	}	
	
	if(res == PTHREAD_CANCELED)
	{
		printf("thread cancled\n");
	}
	else
	{
		printf("thread is normal exit retval = %ld \n", (long)res);
	}
	
	exit(EXIT_SUCCESS);
}


 

위의 예제에서 pthread_testcancel() 함수가 있는데, 이 함수는 pthread_cancel() 함수를 주 쓰레드에서 호출 후에

쓰레드가 취소될 수 있는 함수는 정해져 있다 (printf나 sleep 함수는 취소지점으로 가능한 함수이다).

만약 이런 취소 지점으로 가능한 함수가 존재하지 않을 경우, pthread_testcancel() 함수를 주기적으로 호출함으로써

쓰레드 취소지점으로 강제 설정하는 것이다.

 

TEST_PTHREAD_SETCANCELSTATE define 전처리 설정으로 묶어 있는 부분은 쓰레스 취소에 대한 설정을 변경할

수 있다. 자세한 내용은 참고 서적이나 사이트 참조바람.

 

'System Program > pthread' 카테고리의 다른 글

2. pthread 생성  (0) 2014.03.07
6. pthread attribute - (2)  (0) 2013.07.12
8. 쓰레드 클린업 핸들러(쓰레드 취소와 연관)  (0) 2013.07.03
5. pthread attributes  (0) 2013.07.02
1. pthread 개요  (0) 2013.05.27
: