본문 바로가기

VEDA 복습/리눅스, 리눅스 프로그래밍

VEDA 37일차 - 멀티 프로세스와 다중 프로그래밍

반응형

 

다중 프로그래밍

1. process

    fork() -> create new PCB

2. thread = light weight process

    leader thread(main) => thread1, thread2, ... (parent, child 관계와 유사)

    create : 생성

     join : wait()과 유사한 역할

     exit : 단순 return과는 차이점이 있다.

 

스레드의 속성도 당연히 설정할 수 있다.

pthread_attr_init() 속성 객체 초기화 (기본값으로 설정) 전체 스레드 속성 사용 전 반드시 호출 필요
pthread_attr_destroy() 속성 객체 메모리 해제 전체 속성 사용 후 정리 필요
pthread_attr_setdetachstate() 스레드의 detach 상태 설정 Detach 상태 PTHREAD_CREATE_JOINABLE, PTHREAD_CREATE_DETACHED
pthread_attr_getdetachstate() 스레드의 detach 상태 조회 Detach 상태 현재 설정된 상태 확인 가능
pthread_attr_setschedpolicy() 스케줄링 정책 설정 (SCHED_FIFO, SCHED_RR, SCHED_OTHER) 스케줄링 정책 실시간 스레드 구현 시 사용
pthread_attr_getschedpolicy() 스케줄링 정책 조회 스케줄링 정책  
pthread_attr_setschedparam() 스케줄링 우선순위 등 파라미터 설정 스케줄링 파라미터 struct sched_param 사용
pthread_attr_getschedparam() 스케줄링 파라미터 조회 스케줄링 파라미터  
pthread_attr_setinheritsched() 부모로부터 스케줄링 속성을 상속할지 여부 설정 스케줄 상속 여부 PTHREAD_INHERIT_SCHED 또는 PTHREAD_EXPLICIT_SCHED
pthread_attr_getinheritsched() 스케줄 상속 여부 조회 스케줄 상속 여부  
pthread_attr_setscope() 스레드 스케줄링 범위 설정 (프로세스 내 또는 시스템 전체) Scope PTHREAD_SCOPE_SYSTEM / PTHREAD_SCOPE_PROCESS
pthread_attr_getscope() 스케줄링 범위 조회 Scope  
pthread_attr_setstacksize() 스레드 스택 크기 설정 Stack Size 최소값 이상이어야 함 (PTHREAD_STACK_MIN)
pthread_attr_getstacksize() 스택 크기 조회 Stack Size  
pthread_attr_setstack() 스택 시작 주소 및 크기 직접 설정 Stack 시작 주소 및 크기 고급 설정 시 사용
pthread_attr_getstack() 현재 설정된 스택 주소 및 크기 조회 Stack 시작 주소 및 크기  

 

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_attr_setstacksize(&attr, 1024 * 1024);  // 1MB
pthread_create(&thread, &attr, thread_func, NULL);
pthread_attr_destroy(&attr);

 

두 개 이상의 프로세스 또는 두 개 이상의 스레드가 하나의 자원에 접근하는 경우 충돌이 발생한다.

동기화 필요 : 배타적 사용, 순차적 사용

동기화 객체 : semaphore, counting semaphore, mutex, critical section, 조건 변수 etc

 

세마포어 : 세마포어를 획득해야만 자원을 획득할 수 있다. 세마포어를 획득하기 전까지 대기해야 한다.

 

1. 이름 없는 세마포어 (Nameless Semaphore)

정의

이름 없는 세마포어는 메모리 상에서만 존재하며, 주로 스레드 간 동기화를 위해 사용됩니다. POSIX 기반 API에서는 sem_init() 함수를 통해 생성합니다. 해당 세마포어는 프로세스 간 공유하려면 **공유 메모리(shared memory)**에 위치시켜야 합니다.

주요 특징

생성 함수 sem_init()
제거 함수 sem_destroy()
사용 대상 주로 스레드 간 동기화 (또는 공유 메모리 사용 시 프로세스 간도 가능)
커널 객체 등록 여부 커널에 등록되지 않음
파일 시스템의 이름 없음
공유 방식 같은 프로세스 내 스레드 간 또는 공유 메모리를 통한 프로세스 간 공유

2. 이름 있는 세마포어 (Named Semaphore)

정의

이름 있는 세마포어는 파일 시스템을 통해 커널에서 관리되는 세마포어 객체입니다. 이는 여러 프로세스 간에 쉽게 공유될 수 있으며, sem_open() 함수를 통해 이름을 기반으로 접근할 수 있습니다.

주요 특징

항목내용

생성/열기 함수 sem_open()
닫기 함수 sem_close()
제거 함수 sem_unlink()
사용 대상 프로세스 간 동기화
커널 객체 등록 여부 등록됨
파일 시스템의 이름 /dev/shm/ 아래에 존재
공유 방식 이름을 통해 OS 차원에서 여러 프로세스 간 공유 가능

 

Mutex(Mutual Exclusion, 상호 배제) : 멀티스레드 프로그래밍이나 멀티프로세스 환경에서 공유 자원의 동시 접근을 제어하기 위해 사용되는 동기화 기법

상호 배제(Mutual Exclusion) 하나의 스레드만 mutex를 통해 자원에 접근 가능
블로킹(Block) mutex가 사용 중일 경우 다른 스레드는 block 상태로 대기
소유권 기반 대부분의 구현에서 mutex는 lock을 획득한 스레드만이 해제(unlock) 가능
커널 객체 운영체제 차원에서 관리되며, 타 스레드 간 동기화에 사용됨

 

Mutex vs Semaphore 비교

항목  Mutex  Semaphore
목적 상호 배제 동기화 및 제한된 자원 접근
소유권 있음 (소유자만 unlock 가능) 없음 (모든 프로세스가 signal 가능)
값의 범위 0 또는 1 (binary) 0 이상 (counting 가능)
사용 용도 주로 임계 구역 보호 자원 개수 제어, 이벤트 통지 등

 

반응형