
다중 프로그래밍
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 가능) |
사용 용도 | 주로 임계 구역 보호 | 자원 개수 제어, 이벤트 통지 등 |
'VEDA 복습 > 리눅스, 리눅스 프로그래밍' 카테고리의 다른 글
VEDA 41일차 - POSIX 스레드, 스레드 동기화 (1) | 2025.05.15 |
---|---|
VEDA 40일차 - 리눅스 프로그래밍(프로세스 간 통신) (0) | 2025.05.14 |
VEDA 36일차 - 프로세스와 시그널 (0) | 2025.05.08 |
VEDA 35일차 - 임베디드 리눅스 프로그래밍 (1) | 2025.05.02 |
VEDA 34일차 - 임베디드 리눅스 프로그래밍(라즈베리파이) (0) | 2025.05.01 |