[운영체제] 3. Process API

만두·2023년 12월 30일
0

운영체제

목록 보기
3/13

Process Creation

  • parent process는 child process를 생성한다.
  • 그리고 그게 결국에는 다른 프로세스를 생성한다.
  • 마침내 프로세스 트리 형태가 된다.

  • Child process들은 자원이 필요하다.
    • OS가 주거나
    • parent가 공유하는 자원이
  • Resource sharing 자원 공유
    • Parent 그리고 Children은 모든 리소스를 공유하거나
    • Children은 parent의 자원의 일부를 공유하거나
    • parent, child는 자원을 공유하지 않을 수도 있다.
  • Execution
    • Parent and child는 동시에 실행되거나
    • child가 종료될 때까지 Parent가 기다린다.
  • Address space 주소 공간
    • Child는 parent의 주소 공간을 복사하거나
    • child는 그것으로부터 load된 새로운 프로그램(주소 공간)을 갖는다.
  • Summary of process creation
    • Create PCB within OS kernel. OS 커널 안에 PCB를 생성한다.
    • Allocate memory space : 메모리 공간을 할당한다.
    • Load binary program : 2진수로 된 프로그램을 Load한다.
    • Initialize the program : 프로그램을 초기화한다.
  • UNIX example
    • fork system call creates new process
      • fork라는 시스템 콜은 새로운 프로세스를 생성한다.
      • 부모의 PCB를 복사하고
      • 메모리 공간을 할당한다.
    • execve system call is used after a fork.
      • fork 실행된 다음에 execve라는 시스템 콜이 사용된다.
      • disk에서부터 binary program을 load한다.
      • initialization한다.

Process Termination 프로세스 종료

  • processs는 마지막 상태를 실행한 다음 운영체제에게 이것좀 삭제해달라고 요청한다.(exit)
    • child process는 종료할 때 부모에게 status value를 return한다. (wait)
    • child process의 자원은 운영체제에 의해 deallocated된다.
  • Parent를 종료하면 child process의 실행도 terminate할지도 모른다.(abort)
    • 만약 child가 할당된 자원을 초과한다면
    • 만약 child에 의해 assign된 task가 더이상 요청되지 않는다면

fork()

  • 새로운 프로세스를 생성하는 시스템콜이다.
  • 이때 새로 생성된 프로세스는 실행한 프로세스의 address space, registers, PC 값을 그대로 복사한다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]){
		printf("hello world (pid:%d)\n", (int) getpid()); int rc = fork();
		if (rc < 0) { // fork failed; exit
				fprintf(stderr, "fork failed\n");
				exit(1);
		} else if (rc == 0) { // child (new process)
				printf("hello, I am child (pid:%d)\n", (int) getpid());
		} else { // parent goes down this path (main)
				printf("hello, I am parent of %d (pid:%d)\n", rc, (int) getpid());
    }
		return 0;
}

prompt> ./p1
hello world (pid:29146)
hello, I am parent of 29147 (pid:29146)
hello, I am child (pid:29147)
prompt>

prompt> ./p1
hello world (pid:29146)
hello, I am child (pid:29147)
hello, I am parent of 29147 (pid:29146)
prompt>

두 결과 중 하나가 나온다. 다른 점은 parent, child의 실행 순서이다.

참고로 fork의 return 값을 rc에 저장해뒀는데,

이 rc가 0보다 작다는 건 어디선가 에러가 있다는 것이고

rc가 0이라는 것은 현재 child 프로세스라는 뜻,

0보다 크면 parent 프로세스라는 것이다.

wait()

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

int main(int argc, char *argv[]) {
		printf("hello world (pid %d)\n", (int) getpid());
		int rc = fork();
		if (rc < 0) {
				fprintf(stderr, "fork failed\n");
				exit(1);
		} else if (rc == 0) {
				printf("hello, I am child (pid %d)\n", (int) getpid());
		} else {
				int wc = wait(NULL);
				printf("hello, I am parent of %d (sc:%d) (pid: %d)\n", rc, wc, (int) getpid());
		}
		return 0;
}

위에서 말했듯이 rc>0 → parent, rc == 0 → child였다.

마찬가지로 wait의 return 값을 wc에 저장해두는데

여기서 wait은 항상 child가 terminated 될 때까지 기다렸다가 child의 status를 반환받기 때문에 부모 프로세스가 먼저 실행되어도 자식 프로세스가 종료될때까지 기다렸다가 자식 프로세스의 pid값을 받으면 wc에 저장한다.

exec()

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
		printf("hello world (pid:%d)\n", (int) getpid());
		int rc = fork();
		if (rc < 0) {
				fprintf(stderr, "fork failed\n");
				exit(1);
		} else if (rc == 0) {
				printf("hello, I am child (pid: %d)\n", (int) getpid());
				char *myargs[3];
				myargs[0] = strdup("wc");
				myargs[1] = strdup("p3.c");
				myargs[2] = NULL;
				execvp(myargs[0], myargs);
				printf("this shouldn't print out");
		} else {
				int wc = wait(NULL);
				printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc, wc, (int) getpid());
		}
		return 0;
}

만약 fork가 실패하면 rc 값이 음수이므로 fork failed를 출력하고 종료될 것이다.

실패하지 않았다면 새로운 프로세스(child)가 생성이 되고, 프로그램 wc를 실행시키는데, 이 wc는 word count하는 프로그램이다.

마찬가지로 wait 함수를 사용하므로 child process가 먼저 실행되고 terminated를 기다리다가 Parent process가 실행이된다.

child process에서는 execvp 함수를 통해 wc함수에 myargs 인자를 넣고있고, 그 결과값이 위와 같다.

profile
아무것도 모르는 말하는 감자 입니다

0개의 댓글

관련 채용 정보