새소식

인기 검색어

컴퓨터공학/운영체제

3장 프로세스와 프로세스 관리

  • -

Q1 : 운영체제는 프로그램을 적재하여 프로세스를 만든다. 프로세스를 만든다는 의미가 무엇인지 3장 전체를 공부한 결과, 나름대로 설명하라.

 

A1 : 프로세스는 프로그램이 메모리에 적재되어있는 상태를 말한다. 운영체제는 프로그램이 실행되면 이를 메모리에 적재하고 PCB를 만들어 해당 프로세스의 PID와 프로세스의 상태 정보등 모든것을 기록한뒤 프로세스 테이블에 PID와PCB를 저장하여 모든 프로세스를 관리한다. 모든 프로세스는 프로세스로부터 생성되기때문에 프로세스는 일반적으로 부모-자식 관계를 가지며 프로세스를 만든다는 의미는 프로세스가 새로운 프로세스를 생성하여 해당 프로세스의 PID와 PCB가 새롭게 생성되어 프로세스 테이블에 기록되는것이다.

 


Q2 : 32비트 컴퓨터에서 한 프로세스의 주소 공간의 크기는 최대 얼마인가 ? 이 주소 공간은 가상 주소 공간인가, 실제 주소 공간인가?

 

A2 : 32비트의 CPU는 32개의 주소선을 갖는다. 따라서 주소의 개수는 2^32개 이므로 한 번지의 저장공간의 크기는 1바이트이다.

따라서 한 프로세스의 주소공간의 최대 크기는 4GB이다. 프로세스 주소공간은 프로세스가 실행중에 접근할 수 있도록 허용된 주소의 최대 범위로 가상 주소 공간이다.

 


Q3 : 어떤 프로세스 내에 n++라는 코드가 있다. 변수 n의 주소를 출력해보니 3000이었다. 3000은 실제 메모리 주소인가? 가상 주소인가? 왜 가상주소라고 생각하는가 ?

 

A3 :  가상주소공간이다. 변수 n의 실제 메모리 주소는 운영체제만이 알 수 있고 구조를 출력했을때 나오는 주소값은 사용자나 개발자가 보는 관점에서의 주소로 모든 프로세스의 주소를 0번지부터 시작하여 연속적인 공간으로 보여주는 가상 주소 공간이다.

 


Q4 : 각 프로세스의 주소 공간은 모두 0번지부터 시작하므로, 충돌이 발생할 것으로 보인다. 운영체제는 이 문제를 어떻게 해결하는가 ?

 

A4 : 각 프로세스의 주소 공간은 물리공간이 아니라 운영체제가 만들어 준 가상공간이다. 프로세스를 구성하는 영역들은 물리 메모리의 0번지에서 시작하지도 않고, 물리 메모리에 연속적으로 적재되지도 않는다. 이들은 물리 메모리의 여러 공간에 흩어져있는데 모든 프로세스는 운영체제에 의해 코드, 데이터, 힙, 스택이 0번지부터 순서대로 주소가 매겨지고 메모리가 할당되는데 이 주소 공간이 바로 운영체제가 만들어 놓은 가상주소 공간이다. 운영체제는 각 프로세스마다 프로세스의 가상 주소 공간과 물리 메모리의 물리 주소 공간을 연결하는 매핑 테이블을 두고 두 주소 공간을 관리한다.

 


Q5 : 프로세스의 크기와 프로세스의 주소 공간은 같은 의미인지 설명하라.

 

A5 : 다르다.  프로세스의 주소공간은 프로세스가 실행 중에 접근할 수 있도록 허용된 주소의 최대 범위로 프로세스의 주소 공간은 사용자 공간과 커널 공간 전체를 포함한다. 프로세스의 주소 공간은 CPU주소 공간과 같다. 커널 공간이 포함된 것은 프로세스가 실행 중에 시스템 호출을 통해 커널에 진입하여 커널 함수를 실행하기 때문이다. 반면 프로세스의 크기는 프로세스가 현재 사용하고 있는 코드, 데이터, 힙, 스택의 크기를 말한다.

 

 

Q6 : 프로세스는 생성에서 소멸까지의 Ready, Run, Terminated, Zombie, Blocked의 5번의 상태변이를 거친다. 프로세스의 상태 변이도를 그리고 어떤 상황에서 상태 변이가 일어나는지 각각 간단히 설명하라(그림에 설명해도 됨)

 

A6 : 

 


Q7 : 운영체제 커널이 만드는 것으로 프로세스의 정보를 저장하는 구조를 PCB라고 부른다. 어떤 정보들이 저장되는지 간단히 설명하라.

 

A7 : 

-프로세스 번호(PID, Process Identification Number) :  프로세스를 식별하는 고유한 번호 0과 양의 정수만 사용.

-부모 프로세스 번호 (PPID, Parent Process Identification Number).

-프로세스 상태 정보 (Process State) : New, Ready, Running, Blocked 등의 프로세스의 상태.

-CPU 컨택스트 정보 (Process Context) : 현재 CPU가 실행 중인 프로세스를 중단시키고 다른 프로세스를 실행시킬때 현재 프로세스가 실행중인 상황 정보.

- 스케줄링 정보 : 프로세스의 우선순위, 최근에 CPU를 할당받아 실행한 시간 등

- 종료 코드 (exit code) : 프로세스가 종료할 때 종료 이류를 부모 프로세스에게 전달하기 위한 정수값.

- 프로세스의 오픈 파일 테이블 : 프로세스가 실행중일때 열어 놓은 파일에 관한 정보

- 메모리 관리를 위한 정보 : 매핑 테이블의 주소등

- 회계정보(accounting info) : 프로세스의 CPU 사용 총 시간, 프로세스가 실행을 시작하여 경과한 총 시간 등

- 프로세스 소유자 정보 : 프로세스를 생성한 사용자의 로그인 이름이나 ID 등

- 기타

 

Q8 : 종료 코드란 무엇인가 ? 왜 필요하며, 누가 누구에게 전달하는가? 전달하고 받는 방법은 무엇인가 ?

 

A8 : 종료코드는 프로세스가 종료할때 종료이류를 부모 프로세스에게 전달하기 위한 정수값으로 종료한 프로세스의 PCB에 저장된다. 종료코드는 exit() 시스템 호출의 매개변수 값이나 main()함수의 리턴값이다. 부모 프로세스는 wait()를 호출하여 자식의 종료를 기다리고 자식프로세스가 exit()를 통해 종료하면 부모 프로세스는 wait() 시스템 호출에서 자식프로세스가 PCB에 남긴 종료코드를 읽는다. 이후 자식 프로세스는 완전히 종료되어 제거되고 부모 프로세스는 wait()함수를 종료하고 실행을 계속한다.

 

 

Q9 : 프로세스는 운영체제의 스케줄링 단위인가 ? 

 

A9 : 아니다. 과거 운영체제에서는 실행단위가 프로세스였지만 현대 운영체제는 스레드가 스케줄링 단위이다. 스레드는 프로세스보다 작은 크기의 실행단위이고 프로세스는 스레들에게 공유 자원을 제공하는 컨테이너로 역할이 바뀌었다.

 

 

Q10 : 좀비 프로세스와 고아 프로세스는 어떤 프로세스인가 ?

 

A10 : 좀비 프로세스란 종료하였지만 부모가 종료 코드를 아직 읽지 않아 시스템에 남아있을 때 좀비 프로세스라고 하고 

고아 프로세스란 어떤 경우든 부모 프로세스가 먼저 종료한 자식 프로세스들을 고아 프로세스라 부른다. 고아 프로세스들은 곧장 init() 프로세스의 양자가 되어 wait()를 통해 종료를 확인한다.

 


Q11 : 탐구 3-5를 실행시켜보고 자신의 화면에 출력된 결과를 반영하여 fork()의 과정을 그림으로 그리면서 설명하라.

 

A11 : 

//forkex.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void){
	pod_t pid;
    int i, sum = 0;
    
    pid = fork();
    if(pid > 0){
    	printf("부모프로세스 : fork()의 리턴 값 = 자식프로세스 pid = %d\n", pid);
        printf("부모프로세스 : pid = %d\n",getpid());
        wait(NULL); // 자식 프로세스가 종료할 때가지 대기
        printf("부모프로세스 종료\n");
        return 0;
    }
    else if(pid == 0){
    	printf("자식프로세스 : fork()의 리턴 값 = pid = %d\n", pid);
        printf("자식프로세스 : pid = %d, 부모프로세스 pid = %d\n", getpid(), getppid());
        for(i = 1; i <= 100; i++)
        	sum += i;
        printf("자식프로세스 : sum = %d\n", sum);
        return 0;        
    }
    else{
    	printf("fork 오류");
        return 0;
    }
}

 


Q12 : 탐구 3-6을 실행시켜보고 자신의 화면에 출력된 결과를 반영하여 fork()의 과정을 그림으로 그리면서 설명하라.

 

A12 : 

// execex.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void){

	pod_t pid;  
    
    pid = fork();
    if(pid > 0){
    	printf("부모프로세스 : fork()의 리턴 값 = 자식프로세스 pid = %d\n", pid);
        printf("부모프로세스 : pid = %d\n",getpid());
        wait(NULL); // 자식 프로세스가 종료할 때가지 대기
        printf("부모프로세스 종료\n");
        return 0;
    }
    else if(pid == 0){
    	printf("자식프로세스 : fork()의 리턴 값 = pid = %d\n", pid);
        printf("자식프로세스 : pid = %d, 부모프로세스 pid = %d\n", getpid(), getppid());
        execlp("/bin/ls", "ls", "-l", NULL);
        return 0;        
    }
    else{
    	printf("fork 오류");
        return 0;
    }
}

 

 

 

Q13 : main()함수가 실행되어 f()로부터 리턴한 후 printf("%d", b);를 호출하기 직전의 사용자 주소 공간을 그리되, 주소 공간의 각 영역에 어떤 것들이 존재하는지 자세히 그려라. 현재 소스코드에 보이는 것들만 고려하라.

#include <stdio.h>
#include <malloc.h>

int a = 10;

void f();

int main() {
	int b = 20;
    int *p = (int*)malloc(100);
    
    f();
    
    printf("%d", b);
    
    return -1;
}

void f(){
	int c = 30;
    printf("%d", c);
}

 

 

Q14 : 부모 프로세스는 fork() 시스템 호출을 사용하여 자식 프로세스를 생성한다. 자식 프로세스는 1에서 5까지 합을 계산하고 이 값을 종료 코드로 리턴한다. 부모 프로세스는 6에서 10까지 합을 구하고 자식 프로세스가 종료할 때까지 기다려 자식의 종료 코드와 합쳐 1에서 10까지의 합을 출력한다. 프로그램을 작성하라.

 

A14 : 

// ex14

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

void main(){
	
    int i, status;
    int parentsum = 0, childsum = 0;
    pid_t pid;
    
    pid = fork();
    if(pid > 0){
    	for(i = 6; i <= 10; i++)       
        	parentsum += i;
		printf("부모프로세스 : 6 부터 10 까지의 합 : %d\n",parentsum);            
        wait(&status);        
        printf("부모프로세스와 자식프로세스의 결과 합\n");
        printf("parentsum + childsum = %d\n", parenstsum + WEXITSTATUS(status));        
        return 0;
   	}
    else if(pid == 0){
    	for(i = 1; i <= 5; i++)
        	childsum += i;
        printf("자식프로세스 : 1 부터 5 까지의 합 : %d\n",childsum);
        return childsum;
    }
    else{
    	printf("fork 오류\n");
        return 0;
    }
    
}
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.