본문 바로가기
혼자 공부하는 것들/운영체제

[운영체제] 스레드(Thread) + 실습을 통해 직접 깨우치기! 프로세스와의 차이점?

by applepick 2020. 9. 28.
반응형

일단 실습을 해보기전에!

스레드(Thread)는 무슨 역할을 하고 무슨 기능이있는지 간단하게 살펴보겠습니다.

 

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.

 

단일 및 다중 스레드 프로세스


그러면 전에 공부했던 프로세스와 차이점은 무엇일까?

스레드와 프로세스의 차이점

 

프로세스는 서로 완벽히 독립적인 공간을 가진다. 각자가 각자의 스택과 데이터 영역을 가지고, 보호받는다. 프로세스는 시작할 때 운영체제에서 PCB와 메모리 공간을 할당받고 초기화하는 과정이 필요하다. 다른 프로세스의 영역을 들여다볼 수 없기 때문에 프로세스끼리 통신하기 위해서 프로세스간 통신을 활용하거나 공유 메모리를 생성해 데이터를 주고받는 등의 번거로운 과정을 거쳐야만 한다.

 

스레드는 스택은 따로따로이지만, 코드 영역과 데이터 영역은 하나를 공유한다. 데이터 영역에 속하는 변수를 통해서 쉽고 빠르고 편하게 통신할 수 있다. 같은 은행 지점에서는 옆 창구에 말만 하면 바로 알아들을 수 있는 것과 비슷하다. 단, 스레드 하나가 잘못된 연산이나 버그 등으로 비정상 종료한다면 같은 프로세스에 소속된 다른 스레드들까지 모두 강제로 종료된다.


이제 실습을 해보자! 리눅스 기반입니다. 

 

htr1.c 코드

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
void * func(void *i);
int main(void)
{
 	pthread_t thr;
	printf("\n");
 	pthread_create(&thr, NULL, func, NULL);
	printf("Main thread ...\n");
 	pthread_join(thr, NULL);
	printf("Joined ...\n");
}
void * func(void *arg)
{
	printf("Child thread ...\n");
 	sleep(60);
 	pthread_exit(NULL);
}

아래의 컴파일 명령어를 입력해보고 대답해보자!

gcc -o thr1 thr1.c -lpthread //컴파일
./thr1 & //실행

1) 몇 개의 프로세스가 생성되었는가?

 - 1개

2) 몇 개의 스레드가 수행되는가?

- 2개

3) 이때 LWP는 무엇을 의미하는가? PID와의 차이를 설명하시오.

LWP스레드 식별자이고. PID는 프로세스 식별자이다. 동알한 프로세스ID(PID)를 공유한다.

4) 생성된 스레드(자식)는 어떤 일을 하는가? ->func함수를 불러와서 실행한다.

 또 main 스레드(부모)는 어떤 일을 하는가?  ->자식스레드를 생성하고 printf("Main thread ...\n");와 printf("Joined ...\n");를 실행한다.

5) pthread_join() 역할과 pthread_exit()의 역할을 설명하시오

 (1)sub 스레드 종료할때까지 main스레드 종료대기함수이다.

 (2)현재 실행중인 스레드를 종료시키고자할때 사용한다.


fork5.c 코드

#include <unistd.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>

void X(int i);
int global = 0;

int main(void)
{
 	int status;
 	if (fork() != 0) {
 	X(1);
 	waitpid(-1, &status, 0);
 } else {
 	X(2);
 	exit(0);
 }
 	printf("global = %d after child process exits\n", global);
}
void X(int i)
{
 	global = i;
 	printf("global = %d\n", global);
}

아래의 컴파일 명령어를 입력해보고 대답해보자!

gcc -o fork5 fork5.c //컴파일
./fork5 & //실행

1) 실행 결과는?

global = 2

global = 1 after child process exits

 

2) 부모와 자식 프로세스는 변수 global 값을 공유하는가?

-공유되지않는다. 

반응형

댓글