운영체제 4)
운영체제
4) The Abstraction: Process
복습을 하자면
프로그래머의 입장으로 보기
앞에 내용을 정리해본다면
CPU
-
PC, 레지스터, condition Codes
PC(program counter) - 다음 인스트럭션의 주소를 가지고 있다.
레지스터 - 자주 사용되는 프로그램 데이터를 가지고 있다.
Condition Codes - 최근 연산 정보에 대한 상태 정보를 저장한다.(오버플로우인지.. 등등) - conditional branching에 사용된다..
ISA(Instruction Set Architecture)
프로그래머의 관점으로
데이터 흐름의 조직과 구별되는 상태 및 운영, 논리적 설계 및 물리적 구현 제어
를 하는 친구들
- 인스트럭션은 **레지스터와 메모리**를 건든다.
- 기계어를 몰라도 동작하게 하니 인터페이스라고 생각하자
ISA 비트수 == 레지스터 비트수 == 메모리 주소 비트수 == CPU 크기
메모리
- Kernal(OS), 스택, 힙, 스태틱 데이터, 리터럴, 인스트럭션(프로그램 코드)..
- 바이트 배열 주소이다.
- 주소 하나당 1 바이트다.
=>ISA의 크기에 따라 사용할 수 있는 메모리 바이트??
CPU가 32/64 비트일때 각 사용할 수 있는 메모리의 크기는?
>메모리는 주소 하나당 1 바이트의 크기를 가진다고 했다.
그렇다면 cpu가 32비트이면 32개의 주소 64비트이면 64개의 주소에 접근이 가능하다.
그래서 1 비트 (0과 1) 이니 32bit 일 경우 2^32 Byte의 주소를 사용할 수 있고
64 bit 일 경우 2^64 Byte의 주소를 사용할 수 있다.
그래서!! cpu가 처리할 수 있는 비트 수에 따라서 사용하는 명령어가 달라진다.
CPU 가상화
제한적인 cpu 자원을 무한대로 보이게 하는 것
왜?? cpu한대가 100명을 어떠캐 담당해..! => OS가 가상화를 일으켜!!
어떻게 CPU에 가상화를 줄까?
-
OS는많은 가상의 CPU가 존재하는 것 처럼 환상을 줄 수 있다.
- 하나의 프로세스를 실행하고, 중단시키고 다른 프로세스를 실행하는 작업을 이용
=>Time sharing
- 하나의 프로세스를 실행하고, 중단시키고 다른 프로세스를 실행하는 작업을 이용
-
Time sharing(시분할)
-
원하는 수 만큼의 프로세스를 동시에 실행할 수 있게 한다.
-
CPU를 공유하기 때문에 각 프로세스의 성능은 떨어진다.
중단한 프로세스들의 데이터(진행 결과)는 저장이 되어야한다.
시분할은 운영체제가 사용하는 가장 기본 기법이다. 자원을 많은 개체들이 공유한다. 이에 대응 되는 공간 분할(Space sharing)이 있는데 공간 분할은 개체에게 공간을 분할한다. 예를 들어 디스크의 블럭 하나를 파일에 할당하면 파일을 삭제하기 전에는 다른 파일이 그 블럭에 할당 되는 가능성을 줄인다.
-
가상화의 효율적인 구현을 위해서는 mechanism과 policy가 필요하다.
-
Mechanism
- 필요한 기능을 구현하는 방법
- EX) Context switch
-
Policy
- 운영체제에서 어떤 결정을 내리는데 사용되는 알고리즘
- Ex) 스케줄링
프로세스란
프로그램은 디스크에 존재한다. 이 프로그램을 프로세서(CPU)가 메모리로 올리면 프로세스가 되고 수행될 수 있다.
- 실행 중인 프로그램
- 프로그램, 프로세서와 다른 개념!
- 메모리에 있다! (CPU에 의해 실행되는.. )
- 객체는 커널에 의해 관리된다.
- 객체는 PCB에 할당된다.
- 활성 되거나 실행 되는 객체
- 이 말은 프로세스는 다른 state를 가질 수 있다.
- 요청
PCB- 프로세스 중지될 시 재 수행에 필요한 모든 정보를 저장하는 곳
프로그램?
- 코드와 코드와 연관된 데이터들의 연속적 집합(Sequence)이다.
- 디스크에 있다. => 실행될 준비가 되지 않았다를 의미!
- 수동적인 객체
- 프로세스와 달리 다른 상태를 나타내지 못한다. ex) 실행중.. 대기.. 같은거
무엇이 프로세스를 구성하는가?
Machine state(하드웨어 상태)를 이해하면 된다.
= 프로그램이 돌아갈때 무엇을 읽거나 업데이트 하는가?
- Machine state
- 컴퓨터는 유한한 머신으로 가정
- 프로세스를 실행할때 프로세서는 오직 레지스터와 메모리의 상태를 하나씩 바꿀 수 있다.
Machine state of Process
-
메모리
- 프로그램 코드 -> "text" 영역
- 전역 데이터 - > "data" 영역
- 일시적 데이터(함수 파라미터 리턴 주소 지역 변수) -> "stack" 영역
- 힙 -> 실행되며 유동적으로 할당되는 메모리
-
레지스터
- 프로세서 레지스터의 값들
- 프로그램 카운터, 스택 포인터 포함
-
I/O 정보
- 프로세스가 현재 열어 놓은 파일 목록을 지님
프로세스의 하드웨어 상태에서 제일 중요한건 메모리이다. 그리고 레지스터도..
명령어, 실행하는 프로그램이 읽고 쓰는 데이터가 메모리에 저장되니
많은 명령어들이 레지스터를 읽거나 갱신하기 때문에
프로세스 API
운영체제가 반드시 API로 제공해야하는 몇몇 기본기능이다.
- Create(생성)
- 새로운 프로세스를 생성할 수 있는 방법을 제공해야함
- fork() 같은 기능 제공
- Destroy(제거)
- 프로세스를 강제로 제거할 수 있는 인터페이스를 제공해야함
- Wait(대기)
- 프로세스의 실행 중지를 기다릴 필요가 있기 때문에 대기 인터페이스가 제공됨
- Miscellaneous Control(각종 제어)
- 프로세스의 제거, 대기 이외에 여러가지 제어기능이 제공 됨
- Ex) 프로세스를 일시 정지 하거나 재개 하는 기능을 제공
- 프로세스의 제거, 대기 이외에 여러가지 제어기능이 제공 됨
- Status(상태)
- 프로세스의 상태 정보를 얻어내는 인터페이스 제공
- 얼마동안 실행 되었는지 어떤 상태인지
- 프로세스의 상태 정보를 얻어내는 인터페이스 제공
인터페이스란??
-
컴퓨터 시스템의 두 개 이상의 개별 구성 요소가 정보를 교환하는 공유 경계
하드웨어/소프트웨어/유저 간 인터페이스
-
기능과 해당 기능의 유저 사이의 계층이다.
- 인터페이스 자체는 아무것도 하지 않음. 단지 기능을 발동 한다.
API란?
프로그램에서 상호간 상호작용하는 매체이다.
EX) 시스템 콜
프로세스 생성
-
프로그램 코드와 정적데이터를 메모리, 프로세슬의 주소 공간에 탑재(Load)
- 프로그램은 디스크 or SSD에 "실행 파일" 형식으로 존재한다.
- Os는 이 작업을 의도적으로 늦춘다.
- 프로그램을 실행하며 코드나 데이터가 필요할 때 불러온다.
-
특정 크기의 메모리 공간이 프로그램에 스택용도로 할당되어야한다.
- 지역변수, 함수 인자, 리턴 주소를 위해서
- argc, argv 배열을 사용해 main에서 스택을 초기화 한다.
-
프로그램의 힙을 위한 메모리 영역을 Os가 할당한다.
- 동적으로 할당된 데이터를 저장하기 위해 사용된다.
- mlloc()을 통해 필요한 공간을 요청하고 free()를 호출해 사용했던 공간을 반환한다.
-
OS는 입출력과 관련된 초기화 작업을 수행한다.
- 각 프로세스는 기본 3개의 파일 디스크립터를 지닌다.(stdin,stdout,stderr)
-
프로그램의 시작지점(entry point), 즉 main에서 프로그램 실행을 시작한다.
- os는 CPU의 제어를 새로 생성된 프로세스로 이전한다.
프로세스 States
프로세스 상태를 단순화 하면 3개의 상태로 나타난다.
3-state
- Running(실행)
- 프로세서에서 실행 중이다. 명령어를 실행 중이다.
- Ready(준비)
- 프로세스는 실행할 준비가 되어있지만, 운영체제가 다른 프로세스를 실행 하는 것과 같은 이유로 대기 중이다.
- 실행이 가능하지만 CPU 권한이 없어 기다린다.
- Blocked(대기)
- 프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시키는 연산,
- Ex) 프로세스가 디스크에 입출력을 요청하면 프로세스는 입출력이 완료될때까지 대기 상태가 되고 다른 프로세스가 실행 상태로
- CPU 권한도 없고 실행을 위한 모든 자원도 가지고 있지 않는다.
프로세스는 준비 상태와 실행 상태를 운영체제의 policy에 따라 이동한다.
실행에서 준비로 변환은 프로세스가 나중에 다시 실행 될 수 있는 상태임을 뜻함.
프로세스가 인터럽트로 대기상태가 되면 해결될 대까지 대기상태로 유지된다.
OS의 스케줄러에 의해 상태가 바뀐다.
5-State Model
-
New(creation)
- 자원이 다 없는 상태 ex) 메모리 할당이 덜댐
-
Ready
- admit 되면 되는 상태
- 프로세스가 ready queue에 올라감
-
Running
- ready에서 dispatch 되면 되는 상태
- 프로세스 실행 중
- Time-out이 되면 다시 Ready queue로 가서 Ready 상태로
-
Blocked(Wait)
- Running에서 event wait이 되면 되는 상태 (EX 입출력 대기)
- event를 해결하면 admit 후 Ready 상태로 가 ready queue에 할당 댐
-
Exit(Terminated)
- 실행이 다 되면 프로세스를 메모리에서 디스크로 보내버림
- 종료
프로세스가 ready queue에 가기 전에 Admit을 받아야함!
Process states
-
New(created) state
- 완성이라기 보단 변하고 있는 단계
- fork() 시스템 콜로 프로세스가 생성 됨
- PCB가 할당 됨, 그러나 메인 메모리로 load 되진 않았다.
- 새 프로세스가 생성된다: 과도기
- 커널
- 남는 메모리 공간을 확인
- 프로세스를 ready 상태로 전환하거나 ready state를 중단한다.
- Process creation
- 자식. 부모 프로세스 => 트리 구조의 계층적 프로세스 구조
-
Running state
- 싱글 프로세서 시스템이라 가정!!
- 오직 하나의 running state만 존재 가능
- 프로세서 권한 소유
- 모든 필요한 자원 소유
- Preemption
- 자원이 부족해서 멈춘게 아님!
- running state에서 ready state로 전환
- time slice를 다 썼거나 높은 우선 순위의 프로세스 때문에
- Block/Wait/Sleep
- preemption과 달리 자원이 부족해 멈춘거
- running state에서 ready state로 전환
- 실행 도중 입출력 대기, 시스템콜 완료 대기 때문에 일어남
- 싱글 프로세서 시스템이라 가정!!
-
Ready state
- 실행 준비하는 단계
- 프로세서 빼고 모든 실행에 필요한 자원 가짐
- ready queue에 위치되고 OS에 의해 스케줄 될때까지 기다린다
- 프로세서만 할당 된다면 즉시 실행가능!!
-
Blocked(wait,sleep) state
- 자원이 충분하지 않아 실행될 준비가 덜 된 상태
- 프로세서 또는 메모리 이외의 요청된 리소스 및 대기 중
- 자원 요청은 시스템 콜을 통해 이루어짐
- 커널이 어플리케이션 프로세스를 제공해준다 시스템 콜 인터페이스를 통해, 그래서 자원 요청 가능
- 프로세스는 대부분 block이다 critical section으로 접근을 요청할때
- Ready queue에 있지 않음, blocked queue에 있음
- 실행하기 위한 자원을 얻는다면, block queue에서 ready queue로 이동 ,그리고 Os의 스케줄링을 기다린다
-
Terminated state
- 프로세스 실행을 완료
- 모든 queue에서 삭제됨
- 할당된 모든 자원을 release하고 os로 모든 자원을 return
- 메인 메모리와 큐에서 제거됨
- pcb의 내용도 삭제됨
-
Zombie/Orphan state
- 나중에 설명함
7-state model
- 만약 실행해야할 프로세스를 탑재하기에 메인메모리의 용량이 부족할때?
- Swapping
- 메인 메모리에서 디스크로 모든 프로세스의 일부를 이동
- 일시 중지된 queue를 관리해야한다
- 메모리의 여유가 생기면 바로 실행해야하니 os가 관리함
- Swapping
Swapping
프로세스는 일시적으로 메모리에서 디스크로 kick 될 수 있다.(Swap out)
그리고 메모리로 돌아온다(Swap in)
- 새 프로세스를 탑재할 메모리 공간이 없어서,
- 상대적으로 덜 중요한, 덜 active 된 프로세스(block state)가 디스크로 간다 여유 공간을 만들기 위해
- 스와핑도 I/o다! -> 높은 오버헤드 -> 많은 스와핑이 일어나면 퍼포먼스도 느려진다.
=> I/O가 발생하기 때문에 스와핑이 안일어나는게 좋다!!
- 컴퓨터에 Swap 공간을 확인 가능
- swap 공간 제거도 가능
- 시스템은 특정 프로세스를 죽여서 여유 공간을 얻을 수 있다. -> OOM(out of memory) killer
- 커널(OS)에 의해 일어
- 프로세스 죽이는 순서는 OS가 내부적으로 결정, 유저가 결정 할 수도 있다.
PCB: 자료구조
운영체제도 일종의 프로그램이다. 다른 프로그램과 같이 많은 정보를 유지하기 위한 자료구조가 있다.
-
OS는 각각 프로세스의 정보에 대한 자료구조를 가지고있다.
- Process list: 프로세스 상태를 파악하기 위한 자료구조
- Ready processes
- Blocked processes
- Current running process
- Register context: 프로세스가 중단되었을 때 해당 프로세스의 레지스터 값을 저장함
- Process list: 프로세스 상태를 파악하기 위한 자료구조
-
PCB(process control block)
- 각각 프로세스의 정보를 포함하는 C-자료구조이다.
- PCB 접근 속도는 전체 시스템 성능에 중요함!
-
PCB의 정보
- PID
- process state
- program counter: 다음 인스트럭션 수행 위치,context
- CPU 레지스터: 모든 프로세스 중심 레지스터의 내용,context
- 스케줄링 정보: 우선순위, 파라미터
- 메모리 관리 정보
- I/o상태 정보
- I/o 기기 할당 정보, 연 파일 리스트
- accounting 정보
- CPu used, 클락 타임, time limit
- context save area
- 프로세스의 레지스터 콘텍스 저장을 위한 공간
-
PCB의 정보는 OS 마다 다르다!
- Unix: process table
- Linux: process descriptor
-
프로세스 리스트
- 태스크 리스트라고도 부름
- 이를 이용해 시스템에서 실행 중인 프로그램을 관리함
- 이 안에 PCB가 있다라고 보면 될듯? pcb로 프로세스의 정보를 확인!
프로세스 관련 주요 용어
- 프로세스
- 실행중인 프로그램을 나타냄
- 프로세스 API
- 프로세스와 관련된 함수(생성, 삭제)
- 프로세스 상태
- 프로세스 리스트
- 시스템에 존재하는 모든 프로세스에 대한 정보를 지님
- 리스트의 각 노드는 PCB이다!!!
fork() 시스템 콜
Unix에선 프로세스를 생성하기 위해 fork() 와 exec() 시스템 콜을 사용한다.
wait()은 프로세스가 종료되기를 기다릴때 사용된다.
fork()
- 새 프로세스(자식 프로세스)를 만든다.
- 자식 프로세스는 0을 리턴한다.
- 부모 프로세스는 자식의 pid를 리턴한다.
- pid = 프로세스 id
pid = fork();
if (pid == 0)
printf("child\n")
else
printf("parent\n")
함수 한번 호출하지만 return이 두번!
-
fork()는 부모 공간, 레지스터, pc를 복사해 자식 프로세스에 준다
- 단!! 자식과 부모 프로세스는 분리된 각 각의 주소 공간을 갖는다!!
- 그래서 서로 영향을 끼치지 않음!
- 단!! 자식과 부모 프로세스는 분리된 각 각의 주소 공간을 갖는다!!
-
부모와 자식은 같은 코드를 실행한다 -> concurently
- 각 프로세스는 fork() 이후코드를 실행한다.
- fork()의 리턴값으로 부모와 자식을 구분한다.
-
부모 자식은 동일한 상태로 시작되지만, 각각 구분된다.
-
각각은 구분된 주소 공간을 지니지만, 각 변수는 fork() 전에 값으로 초기화 되기 때문에 같은 값을 가진다.
- 이후에는 독립된 주소를 가지기 때문에 서로에 같은 이름에 변수에 영향을 끼치지 않는다.
- ex) 부모 프로세스에서 변수 값을 바꾸면 부모 프로세스에서만 바뀐다!
-
출력 파일디스크립터도 독립적으로 복사 댐(맞나...?)
-
출력의 순서가 딱히 정해지지 않음 (wait() 사용하면 제어 가능! 자식 죽을때 까지 기다리게 할 수 있으니)
- 부모가 먼저 될 수도 자식이 먼저 될 수도
- 시프 시험 문제 생각해!!
fork()가 되면 프로세스가 2개가 된다!!
그럼 fork()가 n번 되면 프로세스의 개수?? 2^n개의 프로세스가 생성됨
-
wait() 시스템 콜
부모프로세스가 자식 프로세스의 종료를 대기해야 하는 경우도 있을 수 있다.
그럴때 wait()이 필요하다.
- wait()은 부모 프로세스의 실행을 중지한다 자식 프로세스가 종료될 때 까지.
- 멈춘 부모 프로세스는 Blocked(sleep,wait) state가 된다.
pid_t wait(int* status)
- 성공하면 자식의 pid 반환, 실패하면 -1 리턴
- status 값으로 어떻게 자식이 종료되었는지 알 수 있다.
pid_t waitpid(pid, int* status,int options)
- 특정 자식이 종료될 때 까지 기다릴 수 있다.
- 다양한 옵션이 있음
Reaping Child process
-
Idea
- 프로세스가 종료될때, 여전히 시스템의 자원을 사용한다.
- OS table, exit status
- 좀비라고 부른다
- OS에서 정상적으로 제거되지 못하고 리소스를 사용하고 있는 child process
- 프로세스가 종료될때, 여전히 시스템의 자원을 사용한다.
-
Reaping : child process를 제거하는 과정
- 종료된 자식(wait 또는 waitpid 사용)의 부모에 의해 수행됨
- 부모에게 종료 상태 정보가 제공됨
- 커널은 좀비 하위 프로세스를 삭제
-
만약 부모가 reap을 하지 않는다면?
- 고아가 되었다고 한다. init process가 orphan process를 reaping해준다.
- 그래서 오직 long-running 프로세스에서만 reaping이 필요하다
- ex) shell, server
Exec(): loading running programs
자기자신이 아닌 다른 프로그램을 실행해야할 때 사용한다.
대부분 fork()로 자신의 복사본을 만든 후 실행한다.
왜?? 리턴값이 없어서 프로세스가 죽기때문~
- 현재 프로세스에서 load하고 run 한다
- 실행가능한 파일 이름과 인자를 필요로 함
- 리턴이 없다
- 해당 실행할 파일의 코드와 데이터를 읽어 현재 프로세스의 코드,정적 데이터,스택에 덮어쓴다.
- 새 프로세스를 생성 안하고 덮어쓴다!!
- pid, open files, 시그널 context는 유지한다.
- 새 프로세스를 생성하지 않는다는걸 뜻함
현재의 프로세스에 실행할 파일데이터를 덮어쓴다!!
Author And Source
이 문제에 관하여(운영체제 4)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@zh025700/운영체제-4저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)