ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [운영체제] 03. 프로세스
    CS/OS 2023. 5. 16. 00:06

    03. 프로세스 

     

    1. 운영체제가 프로세스 초기구동하는 데 사용되는 파일(프로그램) - 저장장치에 정적으로 저장되어 있음 

    2. 운영체제는 실행가능 한 파일 읽어들여 프로그램 실행 

    3. 프로그램 실행되면 프로세스 !

     

    프로세스 : 실행파일이 메모리에 로딩되어 실행되는 상태 

    (= 프로그램이 주기억 장치에 상주되고 cpu에 의해 처리되는 상태,

    cpu에 의해 현재 실행되고 있는 프로그램, 실행을 위해 메모리에 올라온 동적인 상태 ,

    프로그램과 달리 메모리에 주소 공간 갖는 능동적 개체 )

     

    OS는 Process Control Block (PCB)를 통해 프로세스 관리

    메모리 올라간다고 프로세스 아님, PCB로 운영체제가 제어 가능해야 CPU할당 받을 수 있음

     

    여러 프로그램 동시 실행 -> 다중프로그래밍 

    : 여러 프로세스 메모리에 동시에 있을 수 있음 , 프로세스들 상호 독립적인 공간에서 실행 

    하나의 프로그램이 여러 프로세스로 -> 다중인스턴스 

    : 실행될 때마다 독립된 프로세스 생성 

     

    Loading : 실행파일이 메모리에 올라가는 과정 

    로더 : 메모리에 적재(로드) 해주는 것 

    1. 프로그램 위한 메모리 공간 할당 memory allocation 

    2. 외부 라이브러리 참조 linking

    3. 상대주소의 절대주소로의 변환 relocation

    4. 실제 프로그램과 데이터를 메모리에 적재 loading

     

    절대 로더 : 항상 고정된 위치에만 로딩됨, 재배치및 랭킹없음 ,다중프로그래밍 x

    재배치로더 : 프로그램 여러개 실행되면, 메모리 위치상 충돌 발생 , 주기억 장치 상태에 따라 프로그램을 주기억장치의 임의의 공간에 적재 

    동적적재 : 필요한 부분만 주기억장치에 적재 , 남은 부분 보조기억 장치에 저장 

     

    문제점

    1. allocation 문제 메모리 어디에 어떻게

    2. 가상메모리 및  paging 프로그램 크기 매우 큰경우

    3. swapping 및 단편화 문제 context switching suspend에 걸쳐 발생

    4. 보안문제 서로다른 메모리 영역 침범 

     

    프로세스 생애 주기 

    생성 : 프로세스 생성 되고 PCB 부여 받은 상태  ->

    준비 : 준비큐에서 자기차례 기다림 -> 디스패치(준비큐에서 차례대로 가져와 실행) ->

    <- 타임아웃(인터럽트, CPU할당시간경과, 스스로 CPU양보 ) < - 실행 : 프로세스가 현재 CPU에 의해 실행되고 있는 상태 

    -> 입출력 요청 (자원대기) -> 대기 : 프로세스가 자원 요청하여 대기큐에서 완료기다림 -> 입출력 완료 시 준비상태로 ->

    완료 : 외부에 의해 프로세스 강제 종료되고 PCB 제거된 상태 

     

    생애주기 : 생성 (메모리 할당, PCB생성) -> 준비(디스패치) -> 실행(타임아웃, exit, block) -> (대기(wake up)) -> 완료 (메모리 삭제, PCB 제거)

    보류 상태 : 프로세스 어떤 이유로 쫓겨나 메모리 아닌 디스크에 있는 상태 (PCB는 있음)

    이유 1. 메모리 꽉차서 2. 프로그램 오류 3. 악성코드 격리 4. 매우 긴 주기로 실행 5. 입출력 지연 

     

    프로세스 관리 - 커널(운영체제)

    생명주기, 프로세스 정보 관리, 통신 , 동기화, 문맥교환 

    PCB : 운영체제가 프로세스 제어하기 위해 프로세스 상태 정보 저장하는 자료구조 ( 메모리의 운영체제 영역에 위치)

    (= 프로세스의 context)

     

    시분할 : 프로세스 번갈아가며 cpu 사용 

    문맥교환 Context switching :

    메모리와 cpu 사이, 메모리와 디스크 사이

    한 프로세스에서 다른 프로세스로 cpu 넘겨주는 과정 

    실행에서 나가는 프로세스 PCB에 지금까지 내용 저장(타임아웃), 들어오는 프로세스의 PCB 내용으로 CPU 세팅(디스패치)

    오버헤드 크기 때문에 문맥교환 줄이거나 스레드 사용해야하는 문제 발생 ! 

     

    프로세스 메모리 구조 :

    CPU 주소 공간이 물리 메모리 

    CPU 버스의 크기 = 워드 

    32개 비트 CPU = 32개의 주소선 = 2^32 - 4GB

    주소공간 0번지부터 시작(번지 : 1byte) 

    cpu 주소공간 보다 큰 메모리, 설치된 메모리 주소영역 넘어 액세스 -> 오류 

     

    Segmentation

    프로세스 실행 중 접근 가능 주소 최대 범위

    cpu 관점 : 경계 한계 레지스터 벗어나는 지 감시 

    프로세스 관점 : 가상메모리 (1. 메모리에 대한 확장성 2. 모든 프로그램 동일한 메모리 공간 제공)

    각 프로세스가 마치 자신이 cpu 주소공간 독점하는 것처럼 보임 

     

    프로세스 주소공간 

    userspace 코드 데이터 힙 스택 

    kernelspace 커널코드 커널데이터 커널스택 

     

    프로세스 영역  : Code영역, Data영역, Heap영역, Stack영역

    1. 코드영역 

    크기 컴파일에 결정 

    실행될 프로그램 코드 적재 

    Read only 

    2. 데이터 영역

    크기 컴파일에 결정 

    전역변수공간, 정적 데이터 공간 (프로세스 적재 시 할당, 종료시 소멸)

    Read- write 

    3. 힙 영역

    크기 런타임에 결정

    프로세스 실행 도중 동적으로 사용할 수 있도록 할당된 공간( 필요할 때 마다 할당)

    malloc() 

    아래번지로 내려가면서 할당 

    4. 스택영역 

    크기 런타임에 결정

    함수 실행 될 때 사용 될 데이터 위해 할당된 공간 

    매개변수, 지역변수, 종료 후 주소 등 

    스택 위쪽 으로 공간 할당 (함수 return 하면 공간 반환)

     

    프로세스 생성 상태 되기 위한 생성 과정 

    1. 생성하려는 실행파일 경로 OS에 전달 

    2. OS는 메모리에 프로그램 적재 

    3. PCB공간 할당 받고 필요 정보 채움

    4. PCB상태 Ready, 준비 큐 장착 

     

    프로세스 생성과 복사 

    fork() : 기존의 프로세스로 복사하여 새로운 프로세스 생성 /PCB생성(pid, ppid, cid, 메모리관련정보 다름)

    기존 프로세스로부터(부모) 새로운 프로세스(자식) 복사하는 함수 

    리턴 값 부모 : 자식pid 자식 : 0

    pid_t = pid; //pid 변수 
    
    pid = fork(); 
    
    if(pid > 0 ) { //부모 코드}
    else if(pid == 0 ) {// 자식 코드}

    단점 1. 매번 복사본 만들기 비효율적 2. 맨 처음 만든 프로그램 프로세스 외 다른 프로그램 동작 x

     

    exec() : 프로세스 오버레이, 기존의 프로세스를 새로운 프로세스로 전환  /PCB생성 X(메모리 공간에 새로운 프로그램 적재) 

    else if(pid == 0 ) {
    execlp(); // 자식프로세스에서 호출 
    }

    wait() : 부모 프로세스가 자식 프로세스 종료까지 대기, 종료를 확인하려고 호출 

    exit() : 종료함수 

     

    프로세스 완료상태 되기위한 종료과정 

    1. 프로세스 모든 자원 반환 

    2. PCB상태 Terminated , PCB에 종료 코드 저장(아직 제거 X)

    3. 종료된 프로세스의 자식 프로세스는 init프로세스에 입양 (ppid 1 됨)

    4. 부모 프로세스에 SIGCHLD 신호 전송 

    (부모의 의무 : SIGCHLD 수신, wait()함수로 자식의 종료 코드 읽기

    부모가 죽은 자식의 정보 확인 해야 PCB 제거됨 )

     

    fork + exec 

    1. 생성과정 간소화 2. 관리 수월 3.  통신 

     

    프로세스 계층 구조 

    모든 프로세스의 조상 init 

    fork - exec 구조 

    1. 여러 작업 처리 용이 2. 프로세스 재사용 용이 3. 관리 용이 

     

    좀비 프로세스 : 부모프로세스가 자식 프로세스의 종료 SIGCHLD 제때 확인 X -> 작업 종료후 PCB 남은 상태 

    좀비프로세스 제거 1. 부모에 SIGCHLD 신호 보내기 2. 부모프로세스 강제종료 , 좀비 고아화 

    고아 프로세스 : 부모프로세스가 먼저 종료됨. init 프로세스에 입양. PPID 1 

     

    프로세스 단점 

    1. 생성 오버헤드 큼 2. 문맥교환 오버헤드 큼 3. 통신 어려움

     

     

    'CS > OS' 카테고리의 다른 글

    [운영체제] 05. 스케쥴링  (1) 2023.05.16
    [운영체제] 04. 스레드  (0) 2023.05.16
    [운영체제] 02. 컴퓨터 아키텍쳐  (0) 2023.05.16
    [운영체제] 01. OS  (0) 2023.04.17
Diseñada por Tistory.