프로세스 (Process)
목차
프로세스 (Process)
컴퓨터에서 실행되고 있는 프로그램으로, 하드디스크에 저장되어 있는 프로그램을 메모리에 할당한 상태인 프로그램입니다. 프로그램 = Passive, 프로세스 = Active
프로세스의 메모리 영역은 아래와 같은 부분들로 구성되어 있습니다.
- 프로그램 카운터, 프로세서 레지스터
- Text or Code: 프로그램 코드 저장 부분 - passive
- Data : 초기값 있는 전역 변수, 정적 변수 - passive
- Bss : 초기값 없는 전역 변수, 정적 변수 - passive
- Heap : 동적할당 변수 공간 - active
- 공유 라이브러리 : 공유 라이브러리 공간
- Stack : 지역변수 공간 - passive. 컴파일 시 스택 공간이 확정됩니다.
프로세스 상태 (Process State, LifeCycle)
New : 프로세스가 막 생성된 상태
Running : 프로세스가 CPU를 사용 중인 상태
Waiting : 프로세스가 특정 이벤트나 작동을 받기를 대기중인 상태. CPU 사용 불가 상태.
Ready : 프로세스가 Waiting 상태에서 이벤트, 작동을 받아 CPU 사용을 기다리는 상태
Terminated : 프로세스가 종료된 상태
* PCB (Process Control Block) : 프로세스를 관리에 필요한 정보를 모아놓은 OS 커널 자료 구조.
프로세스의 상태, 번호, 프로그램 카운터, 레지스터, 스케줄링을 위한 우선 순위 등 포함.
스레드 (Thread)
프로세스 내에 있는 어떤 한 실행 유닛으로 프로세스는 적어도 하나의 스레드를 가지고 있습니다. 여러 스레드가 하나의 프로세스에 있을 수 있습니다. 스레드는 고유 스택 공간을 가지며, 프로세스와 나머지 공간을 공유합니다. '실'에서 유래했습니다.
각 프로세스간은 공유하지 않는 개별/독립적 개념입니다. "철수네 프로세스", "영희네 프로세스."
각 스레드간은 같은 프로세스 내에 개별 실행 유닛으로 공유되는 개념입니다. 철수네 집에 "화장실", "거실", "방"
프로세스 스케줄링 (Process Scheduling)
CPU를 최적화 하기 위해서는 각 프로세스를 빠르게 CPU로 스위치해줘야 합니다.
프로세스 스케줄러는 실행가능한 프로세스(available processes)를 빠르게 다음 CPU에 실행으로 넘겨줘야 합니다.
그래서 스케줄링 큐라는 공간을 만들어 프로세스를 정리합니다.
Ready Queue : 실행가능한 프로세스 = 프로세스 상태가 Ready 상태인 애들만 모아놓은 큐
Wait queue : Waiting 상태인 프로세스를 모아놓은 큐 (I/O 대기 등)
Context Switch
CPU가 프로세스에서 다른 프로세스로 스위칭하는 작업으로 이전 프로세스 상태를 저장하고 다음 프로세스를 가져오는 과정입니다. Context Switch 시간은 overhead입니다. 스위칭 중에는 시스템은 아무 생산적인 활동을 하지 않고, 이후 스케줄링이나 스핀락 부분에서 Context Switch일때 소모 리소스와 아닐 때 소모를 비교해 방법을 정하기도 합니다.
복잡한 OS, PCB일 수록 더 긴 Context Switch를 가집니다.
*Overhead : 어떤 처리를 위해 들어간 간접적인 리소스
프로세스 생성
부모(Parent) 프로세스가 자신을 복제(fork)하여 복제한 자신에 다른 코드를 덮어씌워(exec) 자식(Children)프로세스를 생성합니다. 이 과정을 반복하면 트리의 형태가 됩니다. 최초 부팅에서 init 프로세스가 부팅되며 트리 형태로 계속 확장됩니다. 각 프로세스는 process id(이하 pid)로 구분됩니다.
● fork() : 새로운 프로세스를 생성하는 시스템 콜로, 과정이 식사도구 포크처럼 진행되어 포크라는 이름이 되었습니다.
정확히는 자가복제를 통해 자신과 동일한 프로세스를 복제하며 LINUX 시스템에서 내부적으로 clone() 시스템 콜을 사용하며 이는 스레드 생성도 동일합니다.
fork의 리턴값에 따라 현재 자신이 어떤 프로세스인지 확인이 가능합니다.
pid = 0 : 나는 자식 프로세스
pid > 0 : 나는 부모 프로세스
pid < 0 : ERROR
실제 자식 프로세스의 pid는 OS에 따라 달라질 수 있습니다. UNIX 시스템에서는 프로세스가 생성될 때, OS가 현재 시스템에서 사용하지 않는 가장 작은 pid 값을 할당하며, 프로세스 fork를 한 경우 fork 호출 시점과 프로세스가 생성된 시점 사이에 다른 생성/종료된 프로세스가 없다면 parent pid + 1이 될 것입니다.
● exec() : fork() 다음에 실행하는 시스템 콜로 복제된 프로세스에 다른 프로그램을 덮어 씌웁니다.
● wait() : 부모 프로세스가 자식 프로세스의 종료를 대기합니다. 아무 자식이나 종료하면 대기를 그만하며, 특정 프로세스의 종료를 기다릴 시 waitpid(자식 프로세스 pid)를 사용합니다.
● exit() : 프로세스가 마지막 줄을 실행하고 OS에게 자신을 종료시켜달라는 시스템 콜입니다. 함수에서 return은 함수 종료와 반환을 하고, exit는 프로세스를 종료시키는 요청입니다.
● abort() : 부모 프로세스가 자식 프로세스를 코어 덤프시키고 강제로 종료시킵니다. 일반적으로 부모 프로세스가 자식 프로세스를 강제 종료시키는 3가지 이유가 있는데
1. 리소스를 초과해 너무 많은 상태이거나
2. 더 이상 자식 프로세스가 필요하지 않거나
3. OS의 정책이 부모 프로세스가 종료될 때 자식 프로세스에 존재를 허용하지 않아 부모가 종료될 때 강제 종료되는 경우입니다.
프로세스 종료와 좀비, 고아
OS는 부모 프로세스가 없다면 자식 프로세스가 존재하는걸 허용하지 않는 경우가 있습니다. 그래서 모든 자식 프로세스를 종료 시키는 것을 cascading termination이라 합니다. 그와 달리 OS가 관리해주는 경우 OS가 입양했다고 합니다.
좀비 (Zombie) : 자신을 기다리는 부모 프로세스가 없는 경우 좀비 프로세스라고 합니다. 부모가 wait()을 실행하지 않은 경우입니다. 모든 리소스를 반납했는데, 프로세스 테이블에 이름만 남아있는 경우입니다.
고아 (Orphan) : 부모가 wait()을 실행하지 않고 종료되어 없어진 경우입니다.
멀티프로세싱과 우선순위
기본적으로 OS에 모든 관리와 우선순위는 중요도가 있고 그에 따라 희생을 합니다. 일반적인 상용 OS(윈도우 등)에서 가장 중요시 되는 부분은 사용자와의 상호작용입니다. 사용자가 직접 보고 있는 장면, I/O 부분 등이 우선순위가 높은 경우가 많습니다.
■ 안드로이드 프로세스 계층
멀티 프로세스는 자주쓰는 웹 브라우저에 여러창이 각각의 프로세스입니다. 프로세스의 새창을 만들 때 크기가 동일한 경우도 같은 이유로 복제된 프로세스이기 때문이라 생각합니다.
■ 크롬 멀티프로세싱
프로세스간 통신 (IPC : Interprocess communication)
- 공유 메모리(Shared Memory) : 하나의 공유 메모리, 공유 폴더를 만들어 그 곳에 정보를 주고 받는 방식입니다. 홍보게시판에 유인물을 붙이는 아이디어입니다. 여러 프로세스가 동시에 가능합니다.
- 메세지 전달(Message Passing) : 프로세스가 다른 프로세스에게 메시지를 전달하는 방식입니다. 인터넷 이메일 등의 방식입니다. 메세지를 전달할 버퍼(메세지 큐)를 만들어 주고 받습니다.
위 방식 모두 메시지를 주고 받을 때 어떻게 동기화를 할지에 대한 문제점(생산자 소비자 문제)을 가지고 있습니다.
파이프 (Pipes. |)
두 프로세스간 통신을 위한 통로입니다. 리눅스에서는 A 명령에 결과를 바로 B 명령에 입력으로 전달하는 통로 역할을 합니다. ( ls | less)
*(참고) 통신 방향성
Simplex (단방향) : 키보드
Half-duplex(반이중방향) : 무전기. 한번에 양쪽은 전달 불가
Duplex(이중/양방향) : 핸드폰.
Ordinary Pipes (일반적인 파이프) : 부모 자식 관계여야 하며 일반적으로 부모 클래스가 파이프를 만들어 자식 프로세스에게 통신하며 단방향입니다. 생성한 프로세스 말고는 보이지 않지만 자식 프로세스는 열린 파일을 상속받아서 볼 수 있습니다.
파이프를 열면 파일디스크립터에 읽기 전용과, 쓰기 전용을 할당해 통로를 통해 통신합니다.
Named Pipes : 부모자식 관계가 아니더라도 통신할 수 있게 만든 파이프로 다중 프로세스가 동시 사용이 가능하며 양방향입니다.
'강의 > OS' 카테고리의 다른 글
OS - CPU Scheduling (0) | 2023.07.13 |
---|---|
OS - Thread (0) | 2023.06.29 |
OS - Structure (0) | 2023.06.26 |
CPU스케줄링(5장) - 시험 요약 (0) | 2023.04.20 |
스레드 (4장)-시험 요약 (1) | 2023.04.20 |