프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위이고,

스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위이다.

 

1. 멀티 프로세스(Multi Process)

- 컴퓨터가 프로그램을 처리하는 과정을 프로세스라고 하는데 이 과정에서

프로세스에 각각 일련의 번호가 주어진다. PID (Process Identification Number) 이다.

fork()함수를 사용한다. 부모 프로세스를 PPID(Parent Process Identification Number)라고 부른다.

 

- 개념  

두 개 이상의 다수의 프로세서(CPU)가 협력적으로 하나 이상의 작업(TASK)을 동시에 처리하는 것이다.(병렬처리)

각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 경우 사용 

 

 

2. 멀티 스레드 (Multi Thread)

- 멀티 프로세스와는 다르게 프로세스 1개에 여러개의 멀티 스레드가 들어갈 수 있다.

정확하게는 한 프로세스에 stack이 여러 개로 나누어서 데이터를 처리하는데 이것을

멀티 스레드라고 한다. 

 

★ 스레드를 컴파일 할 시에 명령어 

gcc -o pthred pthread.c -lpthread

스레드가 포함 된 c언어는 끝에 -lpthread를 붙여야 컴파일이 가능하다. 

 

 

3. 메세지 큐

- 하나의 프로세스로부터 다른 프로세스로 데이터의 블록을 전달하는 IPC의 하나 

- 각 데이터 블록은 type을 가짐. 

 

- 쓰이는 함수 

int msgget(key_t key, int msgflg)

주요 기능 : 메세지 큐 생성, 액세스

parameters 

1) key : 메세지 큐 명명 

2) msgflg 

   - IPC_PRIVATE : 프로세스 전용 큐

   - IPC_CREAT : 허용 플래그 포함. or 연산 (0666 | IPC_CREAT)

return value 

 - 성공 : 큐 식별자

 - 실패 : -1 

 

int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);

주요 기능 : 메세지 추가

parameters 

1) msgid : 메세지 큐 식별자

2) msg_ptr : 전달되는 메세지에 대한 포인터

3) msg_sz 메세지 크기

4) msg_flag 큐가 가득 차거나 큐에 저장되는 메세지에 대한 시스템 버위의 제한에 도달 시 

발생 이벤트 제어 

  - IPC_NOWAIT : 메세지 전달하지 않고 즉시 반환

  - null : 큐의 공간이 유효할 때까지 대기 

return vlaue 

- 성공 : 0

- 실패 : -1

 

int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);

주요 기능 : 메세지 큐로부터 메세지를 구함

parameters 

1) msg_sz 메세지 크기 

2) msgtype : 간단한 형태의 우선권 지정 

 =0 큐에서 처음으로 유효한 메세지

 >0 같은 메세지 형태를 가지는 첫 메세지

 <0 같은 형태의 메세지 or msgtype의 절대값보다 적은 첫 메세지 

return value

- 성공 : 버퍼에 저장된 바이트 수 반환, msg_ptr에서 가리키는 사용자 할당의 버퍼로 복사되며, 데이터 메세지는 큐로부터 삭제 

- 에러 : -1 반환 

 

int msgctl(int msqid, int command, struct msqid_ds *buf);

주요 기능: 메세지 큐 제어 함수 

parameters 

1) command : 수행할 동작 

- IPC_STAT : 메세지 큐와 관련된 값을 반영하기 위해 msqid_ds 구조체에서 데이터 설정 

- IPC_SET : 프로세스가 허용 권한을 가진다면 메세지 큐와 관련된 값을 msqid_ds 데이터 구조체에 제공 되는 것을 설정

- IPC_RMID : 삭제

return value

- 성공 : 0

- 실패 : -1

4. 공유 메모리 

- 컴퓨터 환경에서 여러 프로그램이 동시에 접근할 수 있는 메모리이다.

int shmget (key_t key, size_t size, int shmflg);

주요 기능 : 공유 메모리를 만든다. 

return value

성공 : a non negative integer 

실패 : -1 

 

void *shmat (int shm_id, const void *shm_addr, int shmflg);

parameters

1) shm_flg

- SHM_RND : in conjunction with shm_addr, controls the address at which the shared memory is attached 

- SHM_RDONLY : makes the attached memory read-only

return value 

성공 : a pointer to the first bytes of shared memory

실패 : -1

 

int shmdt (const void *shm_addr);

주요 기능 : detaches the shared memory from the current process 

return value

- 성공 : 0

- 실패 : -1 

(detaching은 공유 메모리를 지우는 것이 아니다. 잠시 비활성화 상태로 만드는 것이다.)

 

int shmctl (int shm_id, int command, struct shmid_ds *buf)

주요 기능 : 공유메모리를 통제한다.

parameters

1) command  

- IPC_STAT : 메세지 큐와 관련된 값을 반영하기 위해 msqid_ds 구조체에서 데이터 설정

- IPC_SET : 프로세스가 허용 권한을 가진다면 메세지 큐와 관련된 값을 msqid_ds 데이터 구조체에 제공 되는 것을 설정

- IPC_RMID : 삭제

return value

- 성공 : 0

- 실패 : -1 

5. 시그널 

1. 사용자가 터미널에서 특수문자를 누르는 경우

- 인터럽트 문자 control+c , control +z

 

2. 하드웨어 예외가 발생한 경우 

- 하드웨어 이벤트가 발생하여 커널에 통보하고, 커널이 해당 시그널을 관련된 프로세스에 보냅니다.

 

3. 소프트웨어적 조건

- 네트워크 데이터 오류 (SIGURG), 파이프 작업에서의 오류 (SIGPEPE), 알람시계의 종료(SIGALRM) 등 

 

표준 시그널 

Signal Description Default Action
SIGABRT 프로세스 중단  구현에 따라 틀림
SIGALRM 알람 알림 비정상 종료
SIGBUS 정의되지 않은 메모리 영역 접근 구현에 따라 틀림
SIGCHLD 자식의 종료, 중단, 계속 무시
SIGCONT 중단되었다면 재시작한다. 계속
SIGFPE 0으로 나누는 것과 같은 산술연산 에러 구현에 따라 틀림
SIGHUP 제어 터미널(프로세스)의 중단(종료) 비정상 종료 
SIGILL 잘못된 하드웨어 명령어 구현에 따라 틀림
SIGINT 양방향 주의 시그널(보통 CTRL+C) 비정상 종료
SIGKILL 종료(처리되거나 무시될 수 없음) 비정상 종료
SIGPIPE 읽기 주차게 없는 파이프에 쓰기 비정상 종료
SIGQUIT 대화형 종료: 코어덤프(보통 CTRL+\) 구현에 따라 틀림
SIGSEGV 잘못된 메모리 접근 구현에 따라 틀림
SIGSTOP 실행 중지(처리되거나 무시될 수 없음) 중지
SIGTERM 종료 비정상 종료
SIGTSTP 터미널 중지 중지
SIGTTIN 백그라운드 프로세스가 읽기를 시도 중지
SIGTTOU 백그라운드 프로세스가 쓰기를 시도 중지
SIGURG 소켓에 높은 대여폭 데이터가 유용함 무시
SIGUSR1 사용자 정의 시그널 1 비정상 종료 
SIGUSR2 사용자 정의 시그널 2  비정상 종료

 

시그널 속성

- signal()의 handler 인자로 함수의 주소 대신 다음 값 중 하나를 명시할 수 있다.

1) SIG_DFL

시그널 속성을 기본 값으로 재설정

시그널 속성을 변경한 signal()의 이전 호출의 영향을 무효화 할 때 유용

2) SIG_IGN

시그널을 무시한다. 커널은 조용히 해당 시그널을 폐기한다. 프로세스는 그 시그널이 발생했는지 절대 알지 못한다. 

 

시그널 관련 함수

Signal Handling - signal()

Sending signals - kill(),alarm()

Robust signal interface - sigaction()

signal sets - sigaddset(), sigemptyset(), sigfillset(), sigdelset(), sigismember() , etc... 

6.  IPC(InterProcess Communication) 

- 프로세스 사이에 데이터를 주고 받는 일. 프로세스 간 통신은 실제로 한 컴퓨터 내의 프로세스 간보다도 네트워크 상의 객체 사이에 데이터를 주고 받을 수 있도록 설계된 것이 많다. 

7. POSIX

- POSIX (Portable Operating System Interface)(포직스) 이식 가능 운영 체제 인터페이스

서로 다른 유닉스 OS의 공통 API를 정리하여 이식성이 높은 유닉스 응용 프로그램을 개발하기 위한 목적.

규격의 내용으로 커털로의 C언어 인터페이스인 시스템콜, 프로세스 환경, 파일과 디렉토리, 시스템 데이터베이스, tar 압축 포맷 등 다양한 분야를 아우른다.  

 

 

오늘의 결론 - pdf파일 및 구글링 잘 참고하고 ~ 깃허브 잘 참고하고~ 

함수 사용법 및 내장함수 구별하고 인자별 특징 및 어떤 것을 return 하는 지 잘 찾아보자잉! 

 

+ Recent posts