스레드 => 프로세스를 구성하는 실행 흐름의 단위 각기 다른 thread id, 프로그램 counter, register, stack을 가진다.
일반적으로 process , thread를 구분해서 말하기는 하지만 Linux에서는 "Task"라는 이름으로 퉁 치는 경우도 대부분.
가장 주된 차이점은 자원을 공유하는지 안하는지 여부.
Process간에는 기본적으로 자원을 공유 X, thread는 프로세스 자원을 공유. => 메모리 효율적일 수 있음.
각 Process마다 자원들이 있고 thread가 따로 존재하게 되는데 아래 사진(multi thread)를 보면
동일한 자원은 모두 공유하고, 개별의 Thread들만 각각의 register stack programm counter를 가지는 것이다.
훨씬 효율적인데, 단점이 있다.
만약 Process의 자원에 Error가 발생하게 된다면, 3개의 Thread가 모두 먹통이 되게 되는 것이다.
Process간에 기본적으로 자원 공유가 불가능한데, 자원을 공유할 수 있는 방법이 있기는 하다.
IPC (Inter-Process-Communication) 이라고 하는데, 시스템 프로그래밍 쪽에서 자세히 알아보도록 하자.
[실습]
다음과 같은 main1.c 파일을 하나 만들었다고 하자.
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("hello, os\n");
printf("my pid is %d", getpid());
return 0;
}
gcc -o main1 main1.c 로 main1.c 파일을 컴파일하여 main1 이라는 실행 프로그램을 생성한다.
프로그램을 실행하면
hello os 문구와 함께 process 아이디가 나오게 된다.
프로그램을 여러번 실행하면 계속해서 pid 값이 바뀌게 되는데 => 한 번의 Process 가 종료되면 할당 받았던 자원을 반납하기 때문 , 다시 프로그램을 실행하면 다시 자원을 할당받고 반납하는 과정을 반복 => 다른 Process
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("parent pid is %d\n", getpid());
if(fork()==0)
{
printf("child pid is %d\n",getpid());
}
return 0;
}
위 코드를 컴파일 해서 실행 프로그램으로 만든뒤 실행해보면.
parent pid is 5000
child pid is 5001
다음과 같은 결과를 확인할 수 있다. 즉 하나의 프로그램에 두 개의 process (부모, 자식) 이 동작을 하는 것이다 .
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("parent pid is %d\n", getpid());
if(fork()==0)
{
printf("child pid is %d\n",getpid());
}
printf("Yaho~");
return 0;
}
다음과 같이 만들고, 컴파일 해서 실행한다면은
parent pid is 5000
Yaho~
child pid is 5001
Yaho~
다음과 같은 결과를 확인할 수 있다.
부모 프로세스가 우선적으로 동작을 하고, 이후 자식 프로세스가 동작을 하는 것이다.
다음과 같은 코드가 있을 때
(1) 코드는 Parenet의 자식 Process 의 child 가 접근할 수 있다.
(2) 은 Parent의 child 첫 번째 child가 접근할 수 있다.
(3)은 Parent의 두 번째 child가 접근할 수 있다.
(4)는 부모 parent 만 접근할 수 있다.
출력 예시
parent pid is 5000 excute foo child pid is 5002 excute foo child pid is 5001 excute foo child of child pid is 5003 excute foo |
이번에는 Thread를 생성해서 볼건데
스레드와 관련된 함수를 사용하기 위해서는 pthread.h 파일을 include 해주면 된다.
대표적으로 pthread_create()함수는 1번째 component에 thread의 pointer를 주고, 3번째에는 함수의 포인터를 준다.
보통 2,4번째는 모두 NULL로 둔다.
2번째로 pthread_join(thread,NULL)은 해당 thread의 종료를 기다리라는 뜻이다.
실행해보면 process id는 모두 동일하지만, thread id 는 모두 다른 것을 확인할 수 있다.
'컴퓨터 공학 > 운영체제' 카테고리의 다른 글
프로세스와 스레드(1) (0) | 2023.12.13 |
---|