프로세스와 스레드의 공통점
둘 다 컴퓨터에서 실행되는 작업의 단위이다.
프로세스
현재 실행 중인 프로그램이다.
운영체제에 의해 메모리에 할당된 프로그램의 실행 인스턴스이다.
여기서 인스턴스란 실행 중인 프로그램의 실행 환경으로 한 프로그램이 여러 번 실행될 때, 각각의 실행을 인스턴스라고 할 수 있다. 이러한 인스턴스들은 각각 독립적으로 실행되며, 서로 다른 메모리 공간을 사용한다.
운영체제는 프로그램을 실행할 때, 해당 프로그램을 메모리에 할당하여 실행환경을 제공한다. 이 메모리 공간은 프로세스가 실행되는 동안 사용된다. 여기서 프로그램의 실행 인스턴스란, 하나의 프로그램이 실행되어 메모리에 할당되고, CPU에 의해 실행되는 상태를 의미한다. 따라서 프로세스란, 운영체제에 의해 실행되는 프로그램이 메모리에 할당되고, CPU에 의해 실행되는 상태라고 할 수 있다.
스레드
프로세스 내에서 실행되는 작은 실행 단위이다.
한 프로세스 내에서 여러 개의 스레드가 동시에 실행될 수 있다.
스레드는 같은 프로세스 내에 속하므로, 프로세스의 자원(메모리, 파일 등)을 공유할 수 있다.
프로세스와 스레드의 차이점
- 독립성
- 프로세스 : 각자의 독립적인 메모리 공간
- 스레드 : 같은 프로세스 내의 메모리를 공유함.
- 자원 사용량
- 프로세스 : 독립적인 메모리 공간을 가지기 떄문에, 생성과 관리에 더 많은 시스템 자원이 소비된다.
- 스레드 : 프로세스 내의 자원을 공유하기 때문에, 프로세스 생성보단 더 적은 시스템 자원이 소비된다.
- 생성 및 종료
- 프로세스 : 다른 프로세스를 생성하고 제어할 때 fork()와 exec() 함수와 같은 시스템 콜을 사용한다.
- 스레드 : 한 프로세스 내에서 함수 호출을 통해 생성되고 제어된다.
- 통신
- 프로세스 : 프로세스 간 통신은 운영체제가 제공하는 메커니즘을 통해 이루어진다.
- 대표적인 메커니즘으로는 파이프, 메시지 큐, 공유 메모리 등이 있다.
- 스레드 : 스레드 간 통신은 간단한 변수 공유를 통해 이루어진다.
- 프로세스 : 프로세스 간 통신은 운영체제가 제공하는 메커니즘을 통해 이루어진다.
파이프를 사용한 간단한 프로세스 간 통신 예시 코드
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
int pipefd[2];
char buffer[50];
// 파이프 생성
if (pipe(pipefd) == -1) {
perror("파이프 생성 실패");
exit(EXIT_FAILURE);
}
// 자식 프로세스 생성
pid_t pid = fork();
if (pid == -1) {
perror("fork 실패");
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 자식 프로세스: 파이프에 메시지 쓰기
close(pipefd[0]); // 읽기용 파이프 닫기
write(pipefd[1], "Hello from child!", 17);
close(pipefd[1]); // 쓰기용 파이프 닫기
exit(EXIT_SUCCESS);
} else {
// 부모 프로세스: 파이프에서 메시지 읽기
close(pipefd[1]); // 쓰기용 파이프 닫기
read(pipefd[0], buffer, 50);
printf("부모 프로세스에서 읽은 메시지: %s\n", buffer);
close(pipefd[0]); // 읽기용 파이프 닫기
}
return 0;
}
간단한 변수 공유를 통한 스레드 간 통신 예시 코드
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 2
int shared_variable = 0;
void *thread_function(void *thread_id) {
int tid = *((int*) thread_id);
// 공유 변수 값 증가
for (int i = 0; i < 5; i++) {
shared_variable++;
printf("스레드 %d: 공유 변수 값 증가: %d\n", tid, shared_variable);
}
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
// 스레드 생성
for (int i = 0; i < NUM_THREADS; i++) {
thread_ids[i] = i;
int result = pthread_create(&threads[i], NULL, thread_function, (void*) &thread_ids[i]);
if (result) {
printf("스레드 생성 실패: %d\n", result);
exit(EXIT_FAILURE);
}
}
// 스레드 종료 대기
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
}
printf("최종 공유 변수 값: %d\n", shared_variable);
return 0;
}
'기술 지식 쌓아가기 📚' 카테고리의 다른 글
[CS] 시스템 콜이란? + fork() 함수 (0) | 2024.04.03 |
---|