Introduction_kernel2

MozziDaejang·2022년 9월 8일
0

고급운영체제

목록 보기
2/2
post-custom-banner

Process

  • 프로세스는 실행 중인 프로그램을 의미
  • 실행 프로그램의 실행 문맥, 즉 실행 컨텍스트(execution context)
  • 프로그램이 실행될 때 프로세스가 생성되어 메모리 등 필요한 자원을 가지고 실행할 수 있는 상태가 됨
  • 단일 주소 공간에서 명령어를 순차적으로 실행(주소 공간은 프로세스가 참조하는 메모리 주소 포함)
  • 현대의 OS에서는 하나의 프로세스에서 다수의 실행을 허용하는 멀티프로세싱을 지원. 즉, 동일한 주소 송간에서 다수의 명령 실행 순차가 존재할 수 있음

프로그램 생성 및 가상 주소 공간

  • 프로그램이 컴파일되면 실행가능한 프로그램 a.out의 이름으로 디스크에 생성됨
  • a.out은 일반적으로 ELF포맷으로 저장됨
  • ELF포맷은 헤더 정보, 컴파일된 프로그램 코드와 전역 변수 구역, 스택을 구성하기 위해 필요한 데이터 구역으로 구성됨
  • 위 사진의 프로그램이 실행될 때 가상 메모리의 개념적인 구조를 도시하면 아래의 사진과 같음
    ※ 32bit machine의 가상 주소 공간
  • 리눅스는 실행중인 각 태스크에게 4GB의 가상 메모리 공간을 제공(실제로 4GB의 공간을 제공하는 것은 아님)
  • 스택 세그먼트는 사용자 프로그램과 커널 프로그램의 경계 위치(3GB 즉 가상주소 0xC0000000)부터 아래 방향으로 공간을 차지

프로세스 가상 주소 공간 핸들링

  • 하나의 프로세스 주소 공간은 32bit 컴퓨터에서 4GB의 공간으로 해당 프로세스가 참조하는 모든 데이터가 포함 되어있음
  • 이 공간은 가상의 메모리 공간으로 메인 메모리에 적재되는 경우에 CPU에서 접근할 수 있음
  • 따라서 메인 메모리 공간에 가상 메모리의 적재되지 않은 공간을 접근할 때 페이지 폴트가 발생하고 해당 페이지가 메모리에 적재되면 이 공간에 접근 할 수 있음
  • 프로세스가 실행되면 커널은 프로세스에 가상 공간을 할당하고 이 가상 공간에 executable code, initialized data, uninitialized data, initial program stack(user mode stack), executable code and data of needed shared libraries, heap(the memory dynamically requested by the program)이 할당되고 이후에 프로세스가 실행됨

Process state model

  • 시스템 호출 fork에 의해 프로세스가 생성되면 initial 상태가 됨
  • 스케줄러가 프로세스를 선택하면 ready 상태가 되어 필요한 자원을 할당 받게 됨
  • cpu가 준비 상태의 프로세스를 디스패치하여 명령어를 실행하면 running 상태가 됨
  • running 상태의 프로세스는 실행 시간이 종료되는 타임 아웃 인터럽트가 발생하면 ready 상태로 전이
  • IO 요청 등의 이벤트를 대기하는 경우 sleep(block, 대기) 상태가 됨. 대기 조건이 완료되면 ready 상태로 전이
  • sleep(block, 대기) 상태에서 커널이 추가적인 메인 메모리 공간이 필요한 경우 프로세스는 보조 기억장치로 swap out됨. 이 경우 suspended sleep 상태
  • ready 상태에서 프로세스가 보조 기억장치로 swap out되는 경우 suspended ready 상태
  • 위의 두 경우에는 메인 메모리에 적재 가능하면 swap in으로 메인 메모리 자원을 할당 받음
  • 실행 상태에서 프로그램이 종료되면 종료 상태로 할당된 자원이 모두 반환되기를 기다리는 좀비 상태가 됨

Process Management

  • fork : 새로운 프로세스인 자식 프로세스를 생성하는 시스템 호출, 부모 프로세스의 데이터와 코드가 복제되어 자식 프로세스를 구성
  • clone : 쓰기시 복사하는 Copy-On-Write 기법을 사용할 수 있는 시스템 호출
  • exit : 프로세스를 종료하는 시스템 호출. 프로세스가 소유한 자워늘 반환하고 프로세스의 종료를 부모 프로세스에 통보하는 SIGCHLD 신호를 사용

프로세스 생성 및 종료

  • 시스템 호출 fork를 실행하면 수행되는 과정
  • 자식 프로세스는 부모 프로세스로부터 PCB, resource(file, ...), memory context를 복사
  1. 새로운 프로세스에 프로세스 제어를 위한 자료 구조인 PCB 생성
  2. 생성되는 자식 프로세스에 새로운 프로세스 ID 할당
  3. PCB에 필요한 정보 설정
  4. 프로세스에 필요한 링크를 연결하는데 부모 및 형제 프로세스와 링크 연결
  5. 추가적인 자료 구조를 생성하는데 부모 프로세스가 소유한 파일을 새로 생성한 자식 프로세스도 소유하게 되므로 해당 파일의 참조 카운터를 증가 시킨다.
  6. 부모 프로세스의 사용자 문맥을 복사하여 동일한 위치에서 코드가 실행될 수 있도록 한다.
  7. 자식 프로세스가 독립적으로 실행될 환경을 가지게 되었으므로 ready queue에 자식 프로세스를 준비 상태로 삽입
  8. 마지막으로 fork 시스템 호출의 반환을 하는데 부모 프로세스의 경우에는 자식 프로세스에 새로 할당된 프로세스 ID를 반환하고, 자식 프로세스에는 0의 값을 반환
  • 위 사진은 필요시 복사하는 COW의 개념을 그림으로 설명하며 자식 프로세스를 생성하여도 코드와 데이터, 스택은 부모 프로세스의 데이터를 공유함으로써 자식 프로세스의 생성을 마침. COW는 부모 프로세스와 자식 프로세스가 초기에는 같은 page들을 공유할 수 있도록하다가 공유 page가 수정되면 그때서야 page를 copy한다.
  • exec 시스템 호출은 새로운 프로그램을 실행하는 프로세스를 생성하는 시스템 호출로 실행할 프로그램을 지정한다. 기존의 프로세스가 가진 코드와 데이터, 그리고 스택을 모두 새로운 프로그램의 내용으로 대체하는 방식으로 동작.
  • exit 시스템 호출을 실행하면 프로세스가 종료. 자식 프로세스는 부모 프로세스를 갖게되는데 부모 프로세스가 종료되면 자식 프로세스는 init 프로세스를 새로운 부모 프로세스로 갖게 됨
  • 좀비 프로세스는 종료된 프로세스지만 좀비 상태는 부모 프로세스에서 wait 시스템 호출을 할 때까지 기다리는 상태이다. wait 시스템 호출없이 부모 프로세스가 종료되면 자식 프로세스는 init 프로세스를 부모 프로세스로 갖는다. init 프로세스란 시스템 부팅 시 처음에 생성되는 특별한 시스템 프로세스로 프로세스 ID가 1이다.

process switch(context switch)

  • 프로세스가 종료되면 프로세스 스위치가 발생. 이 경우 종료되는 프로세스는 종료 상태가 되고 새로운 프로세스가 디스패치 됨
  • 타임 슬라이스가 종료되는 경우에 프로세스 스위치 발생. clock interrupt가 발생하여 실행중인 프로세스에 허용된 최대의 time slice를 경과하면 다른 프로세스의 실행을 위해 context switch 발생
  • 대기가 필요한 blocking system calls(supervisor call)의 경우 프로세스 스위치 발생. IO를 요청하거나 파일 오픈 등의 system call이 이에 해당하고 메인 메모리에 상주하지 않은 가상 메모리상의 주소에 접근하려고 할 경우에 발생하는 page fault에도 해당 프로세스가 페이지 폴트를 처리하는 동안 대기하기 위해 process switch 발생
  • I/O interrupt의 경우 프로세스 스위치 발생. I/O 인터럽트 발생 시 I/O요청에 대한 처리가 완료되면 이 이벤트를 기다리던 대기 상태의 프로세스가 실행을 위해 준비 상태로 변환되어야 함. 향후 이 준비 상태의 프로세스는 스케줄에 의해 CPU를 점유하여 실행 상태가 됨.
  1. 프로그램 카운터와 다른 레지스터 등 프로세스의 상태 정보인 프로세서 컨텍스트를 저장한다. 향후, 저장된 컨텍스트를 로드하여 현재의 실행 상태로 복귀
  2. 현재 실행 상태의 프로세스에 대한 PCB를 변경
  3. 해당 프로세스는 준비 혹은 대기 상태에 해당하므로 적절한 대기 큐로 PCB를 이동시킴
  4. 이제 실행을 위한 다른 프로세스를 선택. 이 과정은 스케줄러에 의해 결정됨.
  5. 선택된 프로세스의 PCB를 업데이트
  6. 실행을 위해 메모리 관리에 필요한 자료 구조 업데이트
  7. 마지막으로 선택된 프로세스의 컨택스트를 해당 레지스터에 저장하므로써 이전에 저장된 문맥으로 복귀

process scheduling

  • 프로세스를 스케줄하는 기능을 담당하는 스케줄러. 스케줄러는 ready queue에서 대기 중인 프로세스를 선택하여 CPU를 할당할 수 있도록 결정하는 커널의 중요한 기능
  • Nonpreemptive : 프로세스가 자발적으로 CPU를 양보하는 경우에만 스케줄러가 다른 프로세스를 선택할 수 있음
  • Preemptive : 주기적으로 스케줄러가 실행중인 프로세스가 얼마동안 실행되고 있는지를 판단하여 다른 프로세스의 실행을 위해 현재의 프로세스 실행을 멈출 수 있음

multithreading

  • 프로세스는 동시에 실행되는 thread로 나뉘어진다. 그러므로 프로세스는 하나 이상의 쓰레드의 집합이 된다.
  • 동시에 실행되는 개별 thread는 실행을 위해 dispatch가 가능한 단위 작업으로 정의되고 이 thread는 순차적으로 실행되고 interrupt 될 수 있음
  • 각각의 thread는 독립적으로 실행되므로 서로 다른 문맥을 가져야 하기 때문에 별도의 register와 stack을 갖는다. 하지만 하나의 process에 속하는 thread이므로 코드와 전역변수 등의 데이터 등은 공유될 수 있음.

병렬 작업

병렬 작업은 다수의 프로세스 혹은 다수의 쓰레드에 의해 이루어짐

  • 다수의 프로세스에 의해 병행처리하는 방법은 프로세스를 역할별로 구분하고 이들간 통신을 통해 공동의 작업을 수행하는 것이다. 예를 들어 입력을 처리하는 프로세스와 변환 프로세스, 그리고 출력 프로세스로 나누고 단계별로 이들간 IPC를 통해 작업을 협력하는 방식
  • 다수의 쓰레드를 통한 병렬 처리는 하나의 프로세스에 다른 쓰레드를 두는 방법. 쓰레드 단위로 스케줄링되므로 이들이 동시에 실행될 수 있고 쓰레드간 동기화는 프로세스간 통신이 아닌, 프로세스 내에서 전역 변수 등을 사용하여 쉽게 동기화할 수 있음.
post-custom-banner

0개의 댓글