컴퓨터 공학 | 퀴즈 (5)

Faithful Dev·2025년 1월 28일

컴퓨터 공학

목록 보기
57/81

프로세스 관리

프로세스 생성 (Process Creation)

  1. 프로세스 생성: 운영체제에서 fork() 함수는 부모 프로세스의 복제본을 만들어 자식 프로세스를 생성한다.
  2. 구분 가능: 부모와 자식 프로세스는 fork() 함수의 반환값을 통해 서로를 구분한다. (부모는 자식의 PID를, 자식은 0을 반환받음.)
  3. 메모리 공간: 자식 프로세스는 부모 프로세스의 메모리 공간을 복사하지만, 이후 독립적인 메모리 공간을 사용한다. (Copy-On-Write 기법 활용)
  4. 프로그램 실행 위치: 자식 프로세스는 fork() 호출 직후부터 실행을 시작하며, 부모와 동일한 프로그램 상태에서 시작한다.
  5. 다른 함수: 이후 자식 프로세스는 exec() 함수 호출로 새로운 프로그램으로 변환할 수 있다.

exec 계열 함수 (execl, execlp 등)

  1. exec의 역할: exec 계열 함수는 현재 프로세스의 이미지를 새로운 프로그램으로 대체하며, 기존 코드나 데이터는 사라진다.
  2. 환경 변수 설정: execve() 함수는 실행 중 환경 변수 배열을 지정할 수 있다.
  3. 성공 시 동작: exec 호출 이후에는 새로운 프로그램이 실행되므로, 기존 코드의 exec 이후 부분은 실행되지 않는다.
  4. 실패 시 동작: exec 호출이 실패하면 함수는 반환되며, exec 이후의 코드가 실행된다.
  5. 메모리 대체: exec는 별도의 메모리 공간을 생성하지 않고 기존 프로세스의 메모리를 대체한다.

프로세스 종료와 종료 상태 회수 (Process Termination and Exit Status)

  1. 종료 상태 회수: 부모 프로세스는 자식 프로세스가 종료된 후 wait() 또는 waitpid() 함수를 사용해 자식의 종료 상태를 회수한다.
  2. 정상 종료 확인: WIFEXITED(status) 매크로를 사용해 자식 프로세스가 정상적으로 종료되었는지 확인할 수 있다.
  3. 좀비 프로세스: 종료된 자식 프로세스는 부모가 종료 상태를 회수하기 전까지 좀비 프로세스로 남아 리소스를 점유한다.
  4. 종료 상태: 종료 코드는 exit() 함수 또는 return 문으로 설정할 수 있으며, 반드시 main 함수 내의 return만 요구되는 것은 아니다.
  5. 비정상 종료: 시그널로 인해 종료된 경우 WIFSIGNALED(status)로 확인 가능하다.

프로세스 간 통신 및 시그널

프로세스 간 통신 (Inter-Process Communication, IPC)

  1. 파이프(Pipe): 파이프는 기본적으로 단방향 통신을 지원하며, 부모-자식 프로세스 간 데이터 전송에 주로 사용된다.
  2. 양방향 파이프: 양방향 통신이 필요한 경우에는 두 개의 파이프를 사용하거나 socketpair와 같은 대안을 사용할 수 있다.
  3. 메시지 큐(Message Queue): 메시지 큐는 FIFO(First-in First-out) 방식으로 데이터를 관리하며, 임의의 두 프로세스 간 통신이 가능하다.
  4. 공유 메모리: 공유 메모리는 IPC에서 가장 빠른 방식으로, 여러 프로세스가 동일한 메모리 공간에 접근할 수 있도록 한다.
  5. 시그널과 소켓: IPC는 시그널, 소켓 등 다양한 기법을 통해 다양한 상황에 맞는 통신 방식을 제공한다.

시그널 (Signal)

  1. 시그널의 정의: 시그널은 프로세스 간, 혹은 커널이 프로세스에 전달하는 비동기적 알림 메커니즘이다.
    2 SIGKILL과 SIGTERM: SIGKILL은 프로세스를 강제로 종료하며 무시할 수 없고, SIGTERM은 종료 요청을 전달하며 무시 또는 핸들링 가능하다.
  2. 핸들링 가능: 기본 동작은 커널에 의해 설정되지만, signal() 또는 sigaction() 함수를 사용해 프로세스가 동작을 변경할 수 있다.
  3. 시그널 확인: kill -l 명령어를 사용하면 시스템에서 사용 가능한 시그널 종류와 번호를 확인할 수 있다.
  4. 시그널 종류: 시그널은 종료, 일시 정지, 재시작, 사용자 정의 등 다양한 동작을 위해 사용된다.

POSIX 스레드

Pthread API (POSIX Threads)

Pthread API는 다중 스레드 기반 프로그래밍을 위해 POSIX 표준에서 제공하는 라이브러리이다. 이를 통해 여러 스레드를 생성하고 관리할 수 있다.
1. Pthreads는 스레드 간 자원 공유를 지원하나, 공유 변수에 대해 기본적으로 동기화는 제공하지 않으므로 별도의 동기화 메커니즘이 필요하다.
2. Pthreads는 스레드를 생성하고 관리하는 데 사용되며, 프로세스 생성을 지원하지 않는다.
3. POSIX 스레드 라이브러리는 세마포어를 포함하며, sem_t와 같은 데이터 구조를 통해 동기화 구현이 가능하다.
4. 대부분의 Linux 시스템에서 glibc에 Pthreads가 포함되어 있으며, 별도의 설치 없이 사용할 수 있다.

Pthread 라이브러리 함수 (POSIX Threads)

  1. pthread_create: 새로운 스레드를 생성하며, 생성된 스레드가 실행할 함수와 전달할 인수를 지정할 수 있다.
  2. pthread_exit: 현재 실행 중인 스레드를 종료하며, 스레드의 종료 상태를 다른 스레드에 전달할 수 있다.
  3. 세마포어 초기화: 세마포어 초기화는 pthread가 아닌 sem_init 함수를 사용하며, Pthread 라이브러리의 일부는 아니다.
  4. pthread_join: 특정 스레드가 종료될 때까지 대기하며, 종료 상태를 회수할 수 있는 함수다.
  5. 스레드 동기화: Pthread는 스레드 동기화를 위해 mutexcondition variable도 제공한다.

pthread_create 함수의 인자들

  1. pthread_t *thread: 생성된 스레드의 ID를 저장할 변수에 대한 포인터이다. 이는 종료 상태 값을 의미하지 않는다.
  2. const pthread_attr_t *attr: 스레드의 속성을 지정하는 데 사용되며, 기본 속성을 사용할 경우 NULL을 전달할 수 있다.
  3. void *(*start_routine)(void *): 새로 생성된 스레드에서 실행할 함수의 포인터로, 반환값과 입력값 모두 void * 타입이어야 한다.
  4. void *arg: 실행 함수에 전달할 인자로, 다양한 데이터를 전달하기 위해 일반 포인터 타입으로 설정된다.

상호 배제와 Pthread Mutex (Mutual Exclusion and Pthread Mutex)

  1. 상호 배제: 여러 스레드가 공유 자원에 동시에 접근하는 것을 방지하려면 상호 배제(Mutual Exclusion)가 필요하다.
  2. pthread_mutex_lock: 뮤텍스를 잠그는 함수로, 성공적으로 실행되면 다른 스레드가 해당 뮤텍스를 사용할 수 없도록 막는다.
  3. 임계 구역 보호: 뮤텍스를 잠근 후 실행된느 코드(예: x = go_beyond(x))는 임계 구역에 해당하며, 상호 배제가 보장된다.
  4. pthread_mutex_unlock: 뮤텍스를 해제하는 함수로, 이후 다른 스레드가 뮤텍스를 사용할 수 있도록 허용한다.

메모리 관리

메모리 매핑(mmap)과 해제 함수

mmap는 파일 또는 장치를 프로세스의 메모리 공간에 매핑하여 효율적인 파일 I/O를 가능하게 하는 시스템 호출이다.
1. mmap으로 매핑된 메모리 공간을 해제하려면 반드시 munmap() 함수를 사용해야 한다.
2. read()close()는 파일 I/O와 관련된 함수로 메모리 매핑 해제와는 무관하다.
3. munmap(void *addr, size_t length)는 매핑된 메모리 주소와 길이를 인자로 받아 매핑을 해제한다.
4. destroy()는 C 표준 라이브러리나 POSIX 표준에서 정의된 함수가 아니다.

메모리 매핑된 영역의 동기화 (msync)

msync 함수는 mmap으로 매핑된 메모리 영역을 파일 시스템과 동기화하는 데 사용된다.
1. MS_ASYNC: 비동기 방식으로 동기화를 수행하며, 함수 호출 후 즉시 프로그램이 속행된다.
2. MS_SYNC: 동기 방식으로 동기화를 수행하며, 동기화가 완료된 후 프로그램이 속행된다.
3. MS_ALERT: 존재하지 않는 동기화 옵션이다. POSIX 표준이나 Linux 시스템에서 정의되지 않았다.
4. MS_INVALIDATE: 매핑된 메모리와 파일 시스템 간의 캐시를 무효화하고, 다른 프로세스가 수정된 데이터를 읽도록 강제한다.


파일 시스템

inode와 파일 메타데이터

inode는 파일 시스템에서 파일의 메타데이터를 저장하는 데이터 구조이다.
1. inode는 파일을 구성하는 데이터의 저장 매체상 위치(데이터 블록 주소)를 포함한다.
2. 파일의 소유자 정보(UID), 권한, 생성/수정 시간 등의 메타데이터를 제공한다.
3. 파일의 크기와 관련된 정보도 inode에 포함된다.
4. 파일이 저장된 디렉토리의 이름은 inode에 포함되지 않으며, 디렉토리 엔트리에서 파일 이름을 관리한다.

inode 메타데이터와 관련된 함수

inode 메타데이터를 얻기 위해 POSIX에서 제공하는 다양한 함수가 사용된다.
1. fstat(...): 파일 디스크립터를 이용하여 inode의 메타데이터를 가져온다.
2. stat(...): 파일의 경로를 통해 inode의 메타데이터를 가져온다.
3. lstat(...): 심볼릭 링크 자체의 메타데이터를 가져온다(링크를 따라가지 않음).
4. openat(...): 파일을 여는 함수로, inode 메타데이터를 직접적으로 반환하지 않는다.


쉘 스크립트

쉘 스크립트 문법 (Shell Script Syntax)

  1. 쉘 스크립트 기본 문법: 쉘 스크립트는 일반적으로 bash, sh, 또는 다른 쉘 환경에서 동작하며, 변수 선언이 공백 없이 name='value' 형식으로 작성한다.
  2. 주석: 주석은 #으로 시작하며, C언어의 #include 같은 구문은 쉘 스크립트 문법에 포함되지 않는다.
  3. 변수 타입: 쉘 스크립트에서는 숫자, 문자열 등 데이터 타입을 명시하지 않으며, 기본적으로 문자열로 처리된다.
  4. 파이썬 및 Go 문법과 차이: 쉘 스크립트에는 파이썬의 언팩킹(key, _ :=)이나 정밀한 실수 처리 문법(int x= 3.55)이 포함되지 않는다.
  5. 코드 실행: 쉘 스크립트 파일은 실행 권한을 설정(chmod +x)한 후 ./script.sh와 같은 방식으로 실행한다.
profile
Turning Vision into Reality.

0개의 댓글