시그널
유닉스의 시그널은 프로세스에 시스템 이벤트를 알려주는 매커니즘을 제공한다. 각 이벤트는 자신만의 시그널 번호를 가지고 있다. 시스템 이벤트는 두 종류가 있다.
비동기적 알림 : 외부 이벤트로 시그널이 발생하거나 인터럽트가 발생
동기적인 에러나 예외 : divide by zero(SIGFPE)나 잘못된 메모리 접근(SIGSEGV)와 같은 특정 코드에서 발생
프로세스는 시그널을 무시하거나 비동기적으로 시그널 핸들러를 실행할 수 있다. 프로세스가 이를 지정하지 않으면 커널은 시그널 번호에 따라 기본 동작을 수행한다. 기본 동작은 프로세스를 종료하거나, 코어 덤프에 프로세스 상태를 저장하고 종료하거나, 시그널을 무시하거나, 프로세스를 보류하거나, 프로세스가 중단되어 있었다면 실행을 재개한다. SIGKILL과 같이 프로세스가 처리하거나 무시할 수 없는 시그널도 있다.
프로세스 간 통신
AT&T의 유닉스 시스템 V는 사용자 모드에서 사용할 수 있는 여러 프로세스 간 통신을 도입하였는데, 세마포어, 메시지 큐, 공유 메모리를 한데 묶어 시스템 V IPC라 한다.
커널은 이 IPC 자원을 통해 구현한다. 프로세스는 shmget(), semget(), msgget() 시스템 콜을 호출해 자원을 획득한다. 파일과 마찬가지로 IPC 자원도 메모리에 존재하는 것이기 때문에 명시적으로 할당을 해제해야 한다.
세마포어는 앞 포스팅에서 다룬 내용과 비슷하고, 메시지 큐는 프로세스가 msgsnd(), msgget() 시스템 콜을 이용하여 메시지를 교환할 수 있게 한다.
공유 메모리는 shmget() 시스템 콜을 호출해 요구한 크기의 공유 메모리를 생성할 수 있다. IPC 자원 ID를 얻고 나면 자신의 프로세스 주소 공간에 있는 새로운 영역의 시작 주소를 반환하는 shmat() 시스템 콜을 호출하고, 공유 메모리를 자신의 주소 공간에서 떼어낼 때에는 shmdt() 시스템 콜을 호출한다.
프로세스 관리
유닉스는 프로세스와 프로그램을 명확하게 구분한다. fork()와 exit() 시스템 콜은 각각 새로운 프로세스를 생성 및 종료하는 데에 사용하고, exec() 계열의 시스템 콜은 새로운 프로그램을 로드하는 데에 사용한다.
fork()를 호출한 프로세스는 부모가 되고 새로운 프로세스는 자식이 된다. 프로세스를 기술하는 자료 구조에는 부모와 자식에 관한 포인터가 들어있기에 서로를 찾을 수 있다.
fork() 함수는 단순히 부모의 코드와 데이터를 복사하는 방식으로 구현되지 않고(오래 걸림), 하드웨어의 페이징 유닛 기능을 활용해 Copy-On-Write한다. 이는 페이지 복제를 끝까지 미루다가 페이지에 쓰려고 할 때 그 때 복제한다.
exit() 시스템 콜로 프로세스를 종료할 수 있따. 커널은 프로세스가 점유한 자원을 반납하고 부모 프로세스에게 SIGCHLD 시그널을 보낸다. 기본 동작으로는 부모는 이 시그널을 무시한다.
좀비 프로세스란, 종료됐을 때 자신을 기다리는 부모 프로세스가 없는 프로세스를 뜻한다. 종료된 프로세스는 부모 프로세스가 자신에게 wait() 시스템 콜을 호출할 때까지 좀비가 된다. wait() 시스템 콜은 프로세스 디스크립터 필드에서 자원 사용에 관한 데이터를 추출하여 가져온다. 이후에 프로세스 디스크립터를 해제할 수 있기에 좀비가 되는 것이다. waitpid() 시스템 콜의 경우, 특정 자식 프로세스를 기다리게 한다.
커널은 부모 프로세스가 기다리지 않고 종료하는 경우 의미 없이 메모리를 잡아먹는 좀비 프로세스를 해제하기 위하여 프로세스가 종료될 때 그의 자식 프로세스들을 init이라는 시스템 프로세스의 자식으로 만든다. init 프로세스는 정기적으로 wait() 시스템 콜을 호출하여 모든 좀비를 제거하게 된다.
또, 유닉스 운영체제는 작업을 추상화하여 나타내기 위해 프로세스 그룹이라는 개념을 도입했다.
ls | sort | more
예를 들어 ls, sort, more 라는 세 프로세스의 그룹을 위와 같이 생성하면 세 프로세스를 작업 하나인 것처럼 여기게 된다. 각 프로세스 디스크립터에는 프로세스 그룹 ID 필드가 있고, 각 프로세스 그룹에는 그룹 리더가 있는데 그룹 리더의 프로세스 그룹 ID는 이 프로세스의 PID와 일치하게 된다.
'현생 > 리눅스 커널' 카테고리의 다른 글
세 종류의 메모리 주소 (0) | 2024.08.24 |
---|---|
유닉스 커널 개요 - 3. 메모리 관리 (0) | 2024.08.23 |
유닉스 커널 개요 - 1. 커널, 프로세스와 동기화 (0) | 2024.08.21 |
파일 관련 시스템 콜 (0) | 2024.08.20 |
유닉스 파일 시스템 (0) | 2024.08.19 |