1. 프로세스

EEEFFEE·2023년 7월 6일
0

운영체제

목록 보기
2/8

23.07.06 최초작성

1. 프로세스란?

실행되고 있는 프로그램을 말한다.

각 프로세스는 자신만의 주소공간을 가진다.

CodeDataStackHeap
실제 프로그램초기화된 변수, 전역 변수실행과 관련된 정보동적 메모리 할당

2. 프로세스의 상태

  • new : 프로세스가 막 생성된 상태
  • running : 프로세스가 실행되고 있는 상태
  • waiting : 어떤 이벤트가 발생하길 기다리는 상태
  • ready : 프로세서에 할당받기 기다리는 상태
  • terminate : 프로세스가 끝난 상태

인터럽트, 스케줄러, I/O 이벤트를 통해 다른 상태로 전이한다.

3. Process Hierarchy (프로세스의 계층 관계)

모든 프로세스는 다른 프로세스로부터 생성되며 원본 프로세스를 부모(parent) 생성되는 프로세스를 자식(children) 이라고 한다. 이 관계를 트리로 나타낸다.

pid_t fork(void);	// 프로세스를 생성하는 시스템 콜
					// 자신과 동일한 자식 프로세스를 생성
                    // 생성 성공 시 부모에게는 자식의 pid가, 자식에게는 0이 return 되지만 실패 시 부모에게 -1이 return 된다. 

pid_t exec(void);	// 프로세스를 다른 프로세스로 바꾸는 시스템 콜
					// 현재 실행했던 내용이 다 사라짐
                    // 다양한 variant들이 존재(man 참고)

4. Process Termination(프로세스 종료)

프로세스가 종료 시 (exit()) 메모리의 자원을 반환하고 "return code" 를 남긴다.

pid_t wait(int *wstatus)		// 자식 프로세스가 종료될 경우 그 프로세스의 pid와 return code를 받아오는 함수
waitpid(childpid, &status, 0);	// childpid를 가진 프로세스가 종료될 경우 status를 통해 값을 저장
								//childpid = -1일 경우 함수 실행 후 가장 먼저 종료된 자식 프로세스의 값을 받아옴
                                
  1. Zombie Process
  • 프로세스가 종료된 상태지만 부모 프로세스가 wait()을 실행하지 않아 종료 상태를 회수하지 않은 상태
  • wait()이 호출될 때 까지 실행 결과가 남아있음
  1. Orphan Process
  • 부모 프로세스가 wait()을 실행하지 않고 자식 프로세스보다 먼저 종료되어 자식 프로세스의 종료 상태를 회수하지 못한 상태
  • 이를 방지하기 위해 부모 프로세스가 종료되면 자식 프로세스도 종료되도록 설정할 수 있다. 이런 방법을 "Cascading termination" 이라 한다.
  • 새롭게 부모 프로세스를 할당할 수 있는데 이런 기법을 "Reparenting" 이라고 한다.

5. Process(Task) Control Block

프로세스의 정보를 담고 있는 자료 구조

6. IPC(Inter-Process Communication) Model

다른 프로세스와 통신해 작업을 수행하는 기법. 계산 속도, 모듈화, 편의성등의 장점이 있다.


1. shared memory 방식

  • 프로세스간 서로 공유할 메모리 공간을 설정해 통신함
  • 프로세스가 통신을 제어함
  • 운영체제의 도움을 받지 않아 빠른 실행이 가능
  • 주요 이슈는 메모리 공간 접근 시 동기화 문제
  1. Message passing
  • OS가 제공하는 IPC-facility를 통해 통신함
  • OS가 통신을 제어
  • 운영체제의 도움을 받아 실행이 느림(모드 전환 잦음)

7. Signal

IPC 환경에서 프로세스에게 특정 이벤트를 알리기 위한 이벤트
동기, 비동기
"Signal Handler" 를 통해 신호 처리

man 7 signal		//시그널 확인

8. Pipe

2개의 프로세스가 통신할 수 있도록 하는 프로그램
unidirectional : 단방향 통신이 가능한 경우
bidirectional : 양방향 통신이 가능한 경우
full duplex : 동시에 읽기/쓰기가 가능한 파이프 (bidirectional)
half duplex : 읽기/쓰기 동시에 하나만 가능한 파이프 (bidirectional)

8.1 Ordianry Pipe

부모-자식간의 관계에서 생성할 수 있는 파이프
write-end에서 데이터 쓰기가 가능 & read-end에서 데이터 읽기 가능

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

void main(){
	int pipefd[2];		//pipefd[0] : 읽기 전용, pipefd[1] : 쓰기 전용
    pid_t cpid;
    char buf;
    
    if(pipe(pipefd) == -1){		//pipe() : pipe 생성하는 시스템 콜
    	perror("pipe");
        exit(EXIT_FAILURE);
    }
}

8.2 Named Pipe

부모-자식 관계에서 뿐만 아니라 다양한 프로세스 간에 사용할 수 있는 파이프

9. Remote Procedure Calls(RPC)

네트워크를 통해 프로세스끼리 통신하는 방법

10. Edianness

CPU가 데이터를 메모리에 저장할 때 바이트 단위로 나눠 저장한다. 연속되는 바이트를 저장하는 순서를 바이트 저장 순서라고 한다.
Little-endian : 낮은 주소에 데이터의 낮은 바이트(LSB)부터 저장

  • 패딩과 클램핑 시 장점
  • 합연산 시 장점
    Big-endian : 낮은 주소에 데이터의 높은 바이트(MSB)부터 저장
  • 대소관계 비교 장점
  • 네트워크에서 주소를 이 방식으로 설정

0개의 댓글