이전 글에서 프로그램 내에서 자식 프로세스를 만들어 여러가지 명령어를 처리하는 방법에 대해서 배웠는데, 이번 글에서는 새롭게 프로세스를 만들어 처리하지 않고 쓰레드를 사용하여 명령어를 처리하는 방법에 대해서 알아 보도록 합시다.
● 프로세스 vs 쓰레드
Process : 프로그램의 실행상태를 의미하며 프로세스 생성 시 상태정보 및 PCB를 생성합니다.
Thread : 프로세스의 작업단위를 의미하며 쓰레드 생성 시 PCB는 공유를 하며, 오로지 스택만을 생성합니다.
● 쓰레드를 사용하는 이유
-> 보통 리눅스 시스템에서 서버 프로그램은 수많은 클라이언트의 요청에 대해 응답을 하기위해 여러 프로세스를 만들어 task를 처리합니다. 하지만 주어진 task가 경량화된 작업일 경우에는 쓰레드를 이용하여 한개의 프로세스 내에서 처리를 할 수 있는데, 이러한 경우 스택만을 생성하여 작업을 처리하기 때문에 효율적인 업무가 가능합니다.
● 쓰레드 용도 및 특징
- 쓰레드는 프로세스에 비해 경량화 및 작은 일처리에 주로 사용합니다.
- 서버 프로그램에서 수많은 요청이 들어올 경우 프로세스에 비해 빠른 일처리가 가능합니다.
- 프로세스 안에서 한개 이상의 쓰레드를 가지고 있어야합니다.
● 쓰레드 구현
프로그램 내에서 쓰레드를 생성하고 쓰레드의 동작을 구현하기 위해서는 다음과 같은 함수들이 사용됩니다.
- 쓰레드 생성 : pthread_create(pthread_t *tid, pthread_attr_t *attr, void *(start_routine) (void *), void *arg);
- 동기화 : pthread_join(pthread_t tid, void **thread_return);
- 쓰레드 종료 : pthread_exit(void *retval); //본 글에서는 사용 x
예제를 통해 쓰레드의 구현에 대해 알아보도록 합시다.
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> //생성된 쓰레드가 실행할 코드 void *thread_function(void *arg){ char *p = malloc(sizeof(char) * 20); strcpy(p, (char *)arg); printf("%s\n", p); for(int i=0; i<3; i++){ sleep(2); puts("Tread is running..."); } } int main(int argc, char *argv[]) { int state; void *t_return; pthread_t tid; state = pthread_create(&tid, NULL, thread_function, (void *)argv[1]); //쓰레드 생성 if(state != 0) { perror("Thread create error : "); exit(1); } pthread_join(tid, NULL); //동기화 puts("main function is end"); return 0; } |
위 예제의 코드는 쓰레드가 실행할 함수를 정의해주고, main에서 쓰레드 생성 및 함수와 매개변수를 지정하여 쓰레드의 구현을 하는 내용입니다.
실행파일을 만들 때에는 gcc 옵션으로 -lpthread를 추가해주어야 정상적으로 실행시킬 수 있다.
thread_function은 쓰레드의 생성에서 지정하여줄 동작이며, 단순 매개변수로 받은값을 출력하고, 간단한 for문을 돌며 종료하는 함수입니다.
또한 pthread_join(tid, NULL)을 통해 메인 프로세스의 종료를 막고 쓰레드의 동작이 끝날때까지 동기화를 해주는 함수를 사용하였습니다.
이제 결과를 확인해보겠습니다.
결과를 보면 알 수 있듯 예제에서 입력에 hello라는 argv를 주었고, 프로세스 내에서 쓰레드를 생성한 뒤 입력받은 매개변수를 출력하고 간단한 for문을 도는 과정을 나타내고 있습니다.
또한 프로세스와 달리 쓰레드는 생성 시에 동작함수를 정의하여 주며 정의된 함수만을 실행하는것을 볼 수 있었습니다.
위의 예제에서는 한개의 쓰레드를 통해 간단한 함수를 정의하여 동작을 실행해봤는데요.
여러개의 쓰레드를 정의하고 동일한 함수를 지정하여주거나, 여러개의 쓰레드에 각각의 함수를 정의하여줌으로써 사용자의 목적에 맞는 프로그램을 만들 수 도 있을것 같습니다.
잘못된 부분이나 질문사항이 있을 경우 댓글에 써주시면 빠른 시일내에 응답 하도록 하겠습니다.
'CS > 시스템 프로그래밍' 카테고리의 다른 글
시스템 V IPC (System V) 2 -Infinite (0) | 2022.06.21 |
---|---|
시스템 V IPC (System V) 1 -Infinite (0) | 2022.06.21 |
파이프(PIPE) -Infinite (0) | 2022.06.20 |
시그널(signal) -Infinite (0) | 2022.06.20 |
프로세스 생성과 실행 -Infinite (1) | 2022.06.20 |
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!