해결된 질문
22.04.07 11:56 작성
·
235
1
안녕하세요
강의 듣다가 궁금한 점이 생겼습니다!
1. 프로그램이 메모리에 올라가 0번 프로세스가 되고, 그 0번 프로세스들이 복사된다면
프로그램 1개당 0번 프로세스가 1개 + 복사된 프로세스들은 여러 개가 되는 것인가요?
2. fork()함수는 자식 프로세스는 0, 부모 프로세스에게 0이 아닌 값을 반환한다고 하는데, 그럼 2가지 기능이 아니라 if-else if -else 처럼 여러 가지 기능을 구현하고 싶은 경우에는 어떤 방법을 사용해야 하나요? 자식 프로세스의 반환값은 0 하나뿐이라....
3. 좀비 프로세스는 exit status를 읽지 못해 메모리에 계속 살아있는 상태라고 하셨는데
그럼 정상적인 exit status 값(0)이 아닌 비정상적인 exit status 값을 읽은 경우에도 좀비 프로세스가 되는 것인가요?
p.s. cpu가 내리는 입출력 명령(키보드 키 입력, 프린트 문서 출력 등...)은 정확히 어떤 의미인가요?
키보드 키 입력을 예시로 한다면 입출력 명령은 '키보드 키 입력이 들어오면 요청 신호 줘'이고 입출력 완료는 '키보드 키 입력이 들어온 것'을 말하는 것인가요?
그리고 인터럽트는 cpu가 인터럽트 요청 신호를 받은 뒤에 cpu가 만드는 것인가요?
답변 1
0
2022. 04. 07. 13:30
1. 프로그램이 메모리에 올라가 0번 프로세스가 되고, 그 0번 프로세스들이 복사된다면 프로그램 1개당 0번 프로세스가 1개 + 복사된 프로세스들은 여러 개가 되는 것인가요?
fork() 함수와 약간 헷갈리신 것 같습니다.
컴퓨터가 부팅되면 0번 프로세스가 자동으로 생성됩니다. 이 0번 프로세스는 실제로 프로세스 스케줄링을 담당합니다.
따라서 0번 프로세스는 한 개밖에 없습니다. "0번 프로세스들"이라고 표현하셨는데 fork() 함수에서 리턴되는 값 0을 0번 프로세스로 착각하신 것 같습니다. 바로 다음 질문에서 추가적으로 설명드리겠습니다!
2. fork()함수는 자식 프로세스는 0, 부모 프로세스에게 0이 아닌 값을 반환한다고 하는데, 그럼 2가지 기능이 아니라 if-else if -else 처럼 여러 가지 기능을 구현하고 싶은 경우에는 어떤 방법을 사용해야 하나요? 자식 프로세스의 반환값은 0 하나뿐이라....
fork() 함수의 문서를 보시면 정확히 알 수 있습니다.
해당 문서에서 리턴값을 보면 성공시 부모 프로세스에서는 리턴값이 자식 프로세스의 PID이고
자식 프로세스에서는 0이 리턴된다고합니다. 실패는 -1을 리턴합니다.
만약 if-else문으로 작성하고 싶으시다면 0은 자식, -1은 에러처리, 그리고 생성된 자식프로세스의 PID는 예측이 불가능하기 때문에 else로 처리해야할겁니다.
fork() 함수의 리턴값으로 0이 리턴되는 것은 0번 프로세스가 생성되었다는 뜻이 아닙니다.
1번 질문에서 헷갈려하신 것 같아서 말씀드립니다.
3. 좀비 프로세스는 exit status를 읽지 못해 메모리에 계속 살아있는 상태라고 하셨는데 그럼 정상적인 exit status 값(0)이 아닌 비정상적인 exit status 값을 읽은 경우에도 좀비 프로세스가 되는 것인가요?
메인 함수에서 -1을 리턴하는 것 처럼 비정상적인 종료를 제대로 알렸기 때문에 좀비 프로세스가 되지않습니다.
p.s. cpu가 내리는 입출력 명령(키보드 키 입력, 프린트 문서 출력 등...)은 정확히 어떤 의미인가요?
키보드 키 입력을 예시로 한다면 입출력 명령은 '키보드 키 입력이 들어오면 요청 신호 줘'이고 입출력 완료는 '키보드 키 입력이 들어온 것'을 말하는 것인가요?
맞습니다. CPU가 입출력 장치에게 입출력 명령을 내리는 것이 입출력 명령입니다.
입출력 완료는 입출력 장치가 작업을 완료했을 때 보내는 신호로 이것이 인터럽트입니다.
그리고 인터럽트는 cpu가 인터럽트 요청 신호를 받은 뒤에 cpu가 만드는 것인가요?
소프트웨어 인터럽트는 CPU가 만들고 하드웨어 인터럽트는 해당 하드웨어가 만듭니다.
인터럽트 요청을 받고 인터럽트를 만드는 것은 아닙니다.
인터럽트 요청을 받으면 해당 인터럽트 서비스 루틴이 실행됩니다.
2022. 04. 07. 17:22
1. 운영체제가 부팅되고 0번 프로세스가 생성될 때의 프로세스 생성 과정은
.exe 파일(프로그램)을 더블클릭으로 실행한 뒤 ..... 이런 과정이라고 알고 있어서 프로그램 별로 1개씩 만들어지는 것으로 이해를 했는데 그럼 이때 만들어지는 프로세스는 어떤 프로세스인가요?
2. 그러면 if(pid == 0) 내에서 여러 가지 조건에 따라 다르게 작동시키고 싶다면 복사된 자식 프로세스끼리도 구별할 수 있는 방법이 있을까요?
3. 인터럽트가 입출력 장치가 작업을 완료했을 때 보내는 신호라면 인터럽트 요청 신호와 인터럽트는 동일한 것인가요?
4. 프린트 문서 출력이 예시가 된다면, 입출력 완료 기준점은 '프린트 문서 출력 버튼을 눌렀을 때'가 되나요 아니면 '문서 출력이 완료되었을 때'가 되나요?