✅ 단점
💁🏻♀️ 한 프로세스 안에서 패스를 여러갈래로 만들어 보자..!
단일 프로세스 안에서 여러 개의 execution path를 만들어서 fork 사용하는 것보다 가볍게 동작하면서도 멀티프로세스한 것과 비슷하게 만들 수 있을 것 같다.
→ 하나의 프로세스가 한 번에 하나의 작업만 수행하는 것
→ 하나의 프로세스가 동시에 여러 작업을 수행하는 것
멀티프로그래밍 시스템이니까 프로세스를 여러개 돌려도 되는데 굳이 스레드를 나누는 데는 이유가 있다.
📌single보다 좋은점
■ Web server example
멀티프로세스로 만든 이유
■ Using threads
We can create a new thread for each request
#include <stdio.h>
#define MAX_CMD 256
void DoCmd(char *cmd)
{
printf("New command: %s\n", cmd);
sleep(1);
printf("Done\n");
}
int main()
{
char cmd[MAX_CMD];
while (1) {
printf("CMD> ");
fgets(cmd, MAX_CMD, stdin);
if (cmd[0] == 'q')
break;
DoCmd(cmd);
}
return 0;
}
#include <stdio.h>
#define MAX_CMD 256
void DoCmd(char *cmd)
{
printf("New command: %s\n", cmd);
sleep(1); printf("Done\n");
exit(0);
}
int main()
{
char cmd[MAX_CMD]; int pid;
while (1) {
printf("CMD> ");
fgets(cmd, MAX_CMD, stdin);
if (cmd[0] == 'q') break;
if ((pid = fork()) == 0) {
DoCmd(cmd);
}
#if 1
else { wait(pid); }
#endif
}
return 0;
}
#include <stdio.h>
#include <pthread.h>
#define MAX_CMD 256
void DoCmd(char *cmd)
{
printf("New command: %s\n", cmd);
sleep(1); printf("Done\n");
pthread_exit(NULL);
}
int main()
{
char cmd[MAX_CMD]; pthread_t tid;
while (1) {
printf("CMD> ");
fgets(cmd, MAX_CMD, stdin);
if (cmd[0] == 'q') break;
pthread_create(&tid, NULL,(void *)DoCmd, (void *)cmd);
#if 1
pthread_join(tid, NULL);
#endif
}
return 0;
}
CC = gcc
CFLAGS =
LDFLAGS =
LIB = -lpthread
OBJ1 = iteration.o
OBJ2 = process.o
OBJ3 = thread.o
TARGET = iteration process thread
.SUFFIXES: .c .o
.c.o:
$(CC) $(CFLAGS) -c $<
default: $(TARGET)
iteration: $(OBJ1)
$(CC) -o $@ $(LDFLAGS) $(OBJ1)
process: $(OBJ2)
$(CC) -o $@ $(LDFLAGS) $(OBJ2)
thread: $(OBJ3)
$(CC) -o $@ $(LDFLAGS) $(OBJ3) $(LIB)
clean:
rm -f *.o $(TARGET)
📌 Concurrent execution on a single-core system
: 병렬연산의 일종, 코어가 하나일 때는 그렇게 보이게 함
동시성(Concurrency) : 프로세서가 여러 개의 스레드를 번갈아가며 수행함으로써 동시에 실행되는 것처럼 보이게 하는 방식
📌 Parallel execution on a multicore system
: 멀티코어인 상황에서 process를 나누어서 수행
병렬성(Parallelism) : 멀티코어 시스템에서 사용되는 방식으로, 여러 개의 코어가 각 스레드를 동시에 수행하는 방식
Data vs. Task parallelism
Task Parallelism
✅ Pthreads (POSIX threads)
Data Parallelism
✅ OpenMP (Open Multi-Processing)
✅ SIMD (Single Instruction Multiple Data)
✅ SIMD (Single Instruction Multiple Data)
✅ GPGPU (General Purpose computing on GPUs)
📌 초창기
✅ 장점
✅ 단점
: 최신 OS들은 모두 지원
✅ 장점
✅ 단점
Many-to-One
One-to-One
Many-to-Many
✅ 2개의 버전의 fork - fork() exec()을 실행했을 때
개발자들이 1번이나 2번 방법 중에 선택을 해서 fork를 해야하는데 현장에서는 멀티스레드로 만들어진 application 안에서는 fork를 하지 않는다.
📢 언어마다 플랫폼마다 멀티스레드를 구현하는 것이 다 제각각이다.
int pthread_create(...)
: create pthreadvoid pthread_exit (...)
: exit pthreadint pthread_join (...)
: 멀티프로세스에서 wait과 같음
wow? fantastic posting <3 i love it