프로세스 생성
메모리 할당, PCB 생성, 매핑 테이블 생성
컨텍스트 스위칭
매핑 테이블 전환에 시간적 공간적 오버헤드
컨텍스트 옮기는 시간
CPU 캐시에 새로운 프로세스의 코드와 데이터가 채워지는데 걸리는 시간
프로세스들은 완전한 독립적인 주소 공간을 가짐
-> 프로세스가 다른 프로세스의 메모리에 접근 불가
프로세스 사이의 통신을 위한 제 3의 방법 필요함
-> 커널 메모리나 커널에 의해 마련된 메모리 공간을 이용하여 데이터 송수신
-> 코딩 어렵고 속도 느리고 운영체제 호환성 부족
부록 A 공유 메모리, 신호, 파이프 참고
프로세스보다 더 작은 실행 단위
- 프로세스 문제점 해결을 위해 고안됨
- 프로세스 생성 및 소멸에 따른 오버헤드 감소
- 빠른 컨텍스트 스위칭
스레드는 실행 단위이며 스케줄링 단위
운영체제가 TCB를 통해 스레드 존재를 인식하고 TCB 중 하나를 선택해서 CPU에게 실행시킴
프로세스는 스레드들의 컨테이너
프로세스와 스레드 차이
구분 | Thread | Process |
---|---|---|
상호통신 | Library Call / 요청한 Thread만 Blocking | System Call / Call 종료까지 전체 Blocking |
구분처리 | CPU를 사용할 기본단위 | 자원을 할당할 기본단위 |
실행방식 | 다중 처리 | 한 개의 Process |
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
int a[4] = {1,2,3,4}; int b[4];
void *func1() {
b[0] = a[0] + 1; b[1] = a[1] + 1;
printf("In func1: %d\n", b[0]);
}
void *func2() {
b[2] = a[2] + 1; b[3] = a[3] + 1;
printf("In func2: %d\n", b[2]);
}
int main(void) {
int pid;
// child 프로세스를 생성하여 func1()을 수행
if ((pid = fork()) < 0)
exit(1);
else if (pid == 0) {
func1();
exit(0);
}
wait();
func2();
printf("sum=%d\n", b[0]+b[1]+b[2]+b[3]);
exit(0);
}
실행 결과
In func 1: 2
In func 2: 4
Sum=9
child 프로세스에서 func1을 수행하고 exit(0)를 하지 않으면
In func 1: 2
In func 2: 4
Sum = 14
In func 2: 4
Sum=9
POSIX thread
thread를 지원하기 위한 C 표준 라이브러리셋 제공
컴파일 시 gcc -o ~ ~.c -lpthread
#include <pthread.h> // pthread 라이브러리를 사용하기 위해 필요한 헤더 파일
#include <stdio.h>
#include <stdlib.h>
void* calcThread(void *param); // 스레드로 작동할 코드(함수)
int sum = 0; // main 스레드와 calcThread가 공유하는 전역 변수
int main() {
pthread_t tid; // 스레드의 id를 저장할 정수형 변수
pthread_attr_t attr; // 스레드 정보를 담을 구조체
pthread_attr_init(&attr); // 디폴트 값으로 attr 초기화
pthread_create(&tid, &attr, calcThread, "100"); // calcThread 스레드 생성
// 스레드가 생성된 수 커널에 의해 언젠가 스케줄되어 실행
pthread_join(tid, NULL); // tid 번호의 스레드 종료를 기다림
printf("calcThread 스레드가 종료하였습니다.\n");
printf("sum = %d\n", sum);
}
void* calcThread(void *param) { // param에 "100" 전달
printf("calcThread 스레드가 실행을 시작합니다.\n");
int to = atoi(param); // to = 100
int i;
for(i=1; i<=to; i++) // 1에서 to까지 합계산
sum += i; // 전역 변수 sum에 저장
}
atoi()
: ASCII 를 integer로 변환
concurrency(동시성)
parallelism(병렬성)
스레드가 생성되고 실행되는 동간 접근 가능한 메모리 영역
프로세스의 주소 공간 내에 형성됨
스레드 사적 공간
- Thread code
스레드 사이의 공유 공간(프로세스 내에 존재)
- 프로세스의 코드
TCB에 저장됨
스레드가 다른 스레드의 종료를 기다림
부모 스레드가 자식 스레드 종료할 때까지 대기
스레드의 실행중인 상태 정보(CPU 레지스터 값)로 TCP에 저장됨
스레드 제어 블록
: 스레드에 관한 정보를 담은 구조체
: 커널 영역에 만들어짐