gwimong's blog Software Engineer

ptrace 기본적인 사용 방법


리눅스에서는 프로세스보다 작은 개념인 쓰레드를 이용해 다중 작업을 구현할 수 있습니다.

fork()는 프로세스를 복사하여 새로운 메모리에 할당하는 것이므로 각 프로세스간의 메모리를 공유할 수 없습니다.

반면 pthread()는 같은 프로세스 안에 프로세스보다 작은 thread를 생성하여 각각의 작업을 수행하기때문에 같은 메모리를 공유합니다.

#include <pthread.h>

int pthread_create(pthread_t *thread,pthread_attr_t *attr, void*(*start_routine)(void *),void* arg);

thread에서 수행할 작업을 pthread_create()에 등록함으로써 동작합니다.

예제

void a() {
    // thread에서 수행할 작업
}


void main() {

pthread_t pid;

pthread_create(pid, NULL, a, (void *)NULL);

}

여러개의 thread가 같은 변수에 접근하다보면 교착상태가 발생할 수도 있습니다.

이러한 문제를 해결하기 위해 변수에 접근할 때 누군가 사용하고 있으면 기다렸다가 사용할 수 있도록 설정해줘야합니다.

이때 사용하는 것이 mutex입니다.

mutex 변수에 thread가 접근하면 lock을 걸어 다른 thread가 사용하지 못하게 합니다. 다른 thread는 mutex변수가 unlook이 되기전까지 기다렸다가 unlook이 되면 수행됩니다.

/* mutex 선언 */
pthread_mutex_t sync_mutex;

/* 사용 시 */
pthread_mutex_lock(&sync_mutex);

/* 사용 후 */
pthread_mutex_unlock(&sync_mutex);

초기화 하는 방법은 2가지가 있습니다.

  • 변수 선언과 동시에 초기화 하는 방법
    pthread_mutex_t sync_mutex =  PTHREAD_MUTEX_INITIALIZER;
    
  • 초기화 함수를 이용하는 방법
    pthread_mutex_init(&sync_mutex, NULL);
    

cond signal로 이러한 mutex를 보다 효율적으로 사용할 수 있습니다.
ptreahd_cond_wait()는 cond_t 변수의 신호를 전달받을때까지 기다립니다.
pthread_cond_signal()는 cont_t 변수에 신호를 전달합니다.

/* cond_t 변수 선언 및 초기화 */
pthread_cond_t thread_cond = PTHREAD_COND_INITIALIZER:

/* sync_cond 에 신호 발생 */
pthread_cond_signal(&sync_cond);

/* sync_cond에 신호가 발생될 때(pthread_cond_signal())까지 대기하였다가 발생하면 호출 됨 */
pthread_cond_wait(&sync_cond, &sync_mutex);

pthread_cond_wait()는 호출 될 때 2번째 인자로 받은 mutex를 자체적으로 관리해줍니다.
신호를 받기 위해 대기할 경우 pthread_mutex_lock()를 내부적으로 호출하고,
신호를 받아 처리한 경우 pthread_mutex_unlock()을 내부적으로 호출합니다.


Comments

Content