다음 답변은 KG아이티뱅크 2학기 3기수 시스템프로그래밍 수업의 과제에 대한 개인적인 답변입니다.
이에 받은 점수와 무관하게 학기를 마무리하며 개인적으로 기록을 남기고자 포스팅합니다.
주제
1.과제목적
리눅스 프로세스 생성과 종료에 대한 이해 증진.
2.과제내용
프로세스 생성 및 종료에 대해 아래 항목(2-1,2-2)에 대한 보고서 형식을 갖추어서 작성하고 제출 하시면 됩니다.
※ 과제는 참고자료를 활용하여 하도록 하나 본인이 이해를 하고
활용을 하는것을 원칙으로 합니다.
2-1. 리눅스 프로세스 생성
ⓐ 프로세스 생성 개념
ⓑ 프로세스 생성함수에 대한 세부 설명
ⓒ 프로세스 생성함수에 대한 사용예제
2-2. 리눅스 프로세스 종료
ⓐ 프로세스 종료 개념
ⓑ 프로세스 종료함수에 대한 세부 설명
ⓒ 프로세스 종료함수에 대한 사용예제
답변
1. 리눅스 프로세스 생성
(a) 프로세스 생성 개념
리눅스에서 프로세스란, 실행 중이어서 메모리에 적재된 프로그램을 지칭한다. [1] 보안을 위해 사용자모드에서만 구동되며, 디바이스 드라이버를 통해 커널모드에서 디바이스에 접근할 수 있다.
프로세스를 생성하는 이유에는 크게 두 가지가 있는데, 같은 프로그램을 여러 프로세서가 동시에 처리하기 위함과, 다른 프로그램을 생성하기 위함이다.[1][2]
(b) 프로세스 생성함수에 대한 세부 설명
프로세스 생성 함수로는 fork()가 있다. 프로세스들은 기본적으로 부모-자식 관계를 갖고 있으며, 먼저 실행된 “부모 프로세스
가 필요에 따라 fork() 함수를 호출함으로써 “자식 프로세스 (혹은 서브 프로세스)” 를 계층적 구조로 생성하여 프로그램을 처리한다. 자식 프로세스는 이 때, 부모 프로세스의 여러 속성을 상속받아 생성되며, 부모와 자식 프로세스의 함수 리턴값이 다른 것을 이용하여 작업을 분배한다. 생성된 자식 프로세스는 특정 기능을 수행하고 결과값을 부모 프로세스에 반환하고 종료된다. [1] 각기 다른 프로그램의 생성을 위해서는 execve() 함수가 사용된다. 이 함수는 자식 프로세스를 만들 지 않고, 현재 프로세스의 메모리를 새 프로세스의 데이터로 변경하여 실행한다. [2]
(c) 프로세스 생성함수에 대한 사용 예제
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <err.h>
int main(void) {
pid_t pid;
pid = fork();
/* when error */
if (pid == -1) {
err(EXIT_FAILURE, "fork() failed");
}
/* fork() returns 0 for child process */
else if (pid == 0) {
printf("Child Process – my pid: %d, my parent’s pid: %d\n", (int)getpid(), (int)getppid());
}
/* parent process*/
else {
printf("Parent Process – my pid: %d, my parent's pid: %d, my child's pid: %d\n", (int)getpid(), (int)getppid(),
(int)pid);
}
}
2. 리눅스 프로세스 종료
(a) 프로세스 종료 개념
프로세스 종료는 반대로 실행중인 프로그램을 종료시키는 방법이며, 종료 함수 실행 시 프로세스에 할당된 메모리 전부를 회수하게 된다.[2] 일반적으로 모든 파일 기술자를 닫고, 부모 프로세스에 종료 상태를 알리고, 자식과 부모 프로세스에 시그널을 전송하고, 프로세스 간 통신에 이용한 자원을 반납하며 종료한다. 프로세스가 운영체제의 서비스를 호출하는 정상 종료 외에도, 시간 초과, 데이터 오류, 메모리 부족 등의 이유로 종료될 수도 있다.
(b) 프로세스 종료함수에 대한 세부설명
_exit()함수로 프로세스의 정상 종료를 구현시키는데, 이 함수가 실행되면 프로세스에 할당된 메모리 전부가 회수된다. 하지만 직접 이 함수를 호출하는 경우는 흔치 않고 보통 표준 C 라이브러리의 exit()함수를 이용한다. exit()함수 이용 시, 표준 C 라이브러리는 자신의 종료 처리를 모두 수행한 이후에 _exit()함수를 호출한다. exit()과 _exit() 모두 정수를 인수로 입력받는다. 프로세스 종료 시 수행할 작업이 있다면, 수행 작업 함수명을 인수로 받는atexti()함수로 지정 가능하다.
(c) 프로세스 종료함수에 대한 사용예제
#include <stdlib.h>
#include <stdio.h>
void cleanmemory(void) {
printf("Memory allocated to the process is cleared\n");
}
int main(void){
atexit(cleanmemory);
exit(0);
}
출처:
[1] 학점은행제 시스템프로그래밍 교안, 아이티뱅크, 2020
[2] 다케우치 사토루. 실습과 그림으로 배우는 리눅스구조. 한빛미디어,2019
'학점은행제 > 첫 학기 - 수업' 카테고리의 다른 글
[과제] 전자계산기구조 - 컴퓨터구조 (0) | 2020.12.22 |
---|---|
[과제] 자료구조 - 스택과 큐 (0) | 2020.12.22 |
[과제] 마이크로프로세서 - 카운터 (0) | 2020.12.22 |
[과제] 디지털공학개론 - 부울대수 & 카르노맵을 사용한 응용 기술 (0) | 2020.12.22 |
[과제] 네트워크 I - IPv4 vs. IPv6 (0) | 2020.12.22 |
댓글