Process Management
- 프로세스는 실행 중인 프로그램이다. 그것은 시스템에서 일하는 동작 단위이다. 프로그램은 패시브 객체이고 프로세스는 액티브 객체이다. (자주 변한다는 뜻)
- 프로세스는 작업을 끝내기 위해 resource들이 필요하다
- CPU, 메모리, I/O, 파일
- 초기화된 데이터
- 프로세스 종료는 모든 재사용 가능한 resource들을 회수한다.
- Single-threaded 프로세스는 실행할 다음 명령의 위치를 구체화하는 program counter을 가지고 있다.
*program counter = 컴퓨터 프로그램은 CPU에게 작업을 수행하도록 명령한다. CPU는 이러한 명령을 차례대로 가져와서 실행한다. 이때 다음에 실행할 명령어의 주소를 저장하는 역할을 하는 레지스터인 것이다.
• 끝날 때까지 프로세스는 명령을 순차적으로 한 번에 하나씩 실행한다.
- Multi-threaded 프로세스는 program counter를 각각의 thread마다 가진다.
- 일반적으로 시스템에는 많은 프로세스로 이루어져 있으며 일부는 사용자이고 일부는 OS로 하나 이상의 CPU를 갖고 동시에 돌아간다.
• 프로세스/스레드 간에 CPU를 다중화하여 동시성을 확보한다.
Process Management Activities
OS는 프로세스 관리와 같이 다음 행동들을 담당한다.
• 사용자 프로세스와 시스템 프로세스 모두 생성 및 삭제
• 프로세스 일시 중지 및 재개
• 프로세스 동기화를 위한 메커니즘 제공
• 프로세스 커뮤니케이션을 위한 메커니즘 제공
• 데드락 핸들링 위한 메커니즘 제공
Linkers and Loaders(링커와 로더)
- 주로, 프로그램은 disk상에서 이진 실행 파일로 저장된다. CPU에서 작동하려면, 프로그램은 메모리로부터 불리고, 프로세스의 context에 배치되어 있어야 한다.
- 소스파일들은 물리적 메모리 위치에 로드되도록 설계된 객체 파일에 컴파일되어 있다. = relocatable object file
- 객체, 실행파일들은 기본 포맷을 가지고 있어서 OS가 어떻게 로드하고 시작하는지 알고 있다.
- Linker가 relocatable object file을 단일 executable파일로 결합시킨다.
- 링크 과정에서 다른 객체 파일들이나 라이브러리들도 데리고 온다.
- Loader는 메모리로 단일 executable file을 로드시키는 데 사용된다.
= 실행되기 위해서는 반드시 loader에게 메모리로 불려 와야 한다.
- 재배치는 링킹과 로딩을 관여하는 활동이라 한다:
=최종 주소를 프로그램 부분에 할당하고 해당 주소와 일치하도록 프로그램의 코드와 데이터를 조정한다.
• compiler : source program -> object file / 소스 코드를 바이너리 코드로 변환
• linker : object file -> executable file / relocatable object file들을 연결하여 single binary executable file로 변환하는 역할
• loader: executable file -> Program in memory / executable file을 메모리에 적재함.
•./main : fork() 시스템 콜을 통해서 새로운 process가 생성
• build = source program이 compiler와 linker를 거쳐 executable file이 되는 과정
• dll(dynamically linked libraries) = program 중에서 기본적으로 실행하지 않고 사용자가 요청할 때, 실행 중간에 동적으로 link 된다. 여러 process들이 DLL을 공유하여 메모리를 절약한다.
• object file = 컴파일, 어셈블러를 통해 변환된 파일 (기계어), relocatable object file(ELF 포맷)
Process Concept
- OS는 프로세스로 실행되는 다양한 프로그램을 실행한다.
- 프로세스:실행 중인 프로그램; 프로세스 실행은 순차적이어야 한다. 단일 프로세스 명령을 병렬로 실행하지 않는다.
- 여러 파트들
• 텍스트 섹션 = 프로그램 코드
• program counter, 프로세서를 포함한 현재 활동
• 임시 데이터가 포함된 스택
-스택: 함수 매개변수, 반환 주소, 지역 변수
• 전역 변수가 포함된 데이터 섹션
• 실행 중에 동적으로 할당된 메모리를 포함하는 heap
- 프로그램은 디스크(실행 파일)에 저장된 수동적인 개체이다; 프로세스는 능동적임
- GUI 마우스 클릭, 명령줄 이름 입력 등을 통해 시작된 프로그램을 실행한다.
- 하나의 프로그램에는 여러 프로세스들이 있을 수 있다.
• 동일한 프로그램을 실행하는 여러 사용자를 고려해야 한다.
Process State
- 프로세스가 실행되면, state를 변경시킨다.
• 신규: 프로세스가 생성되고 있다.
• 실행 중: 명령이 실행되고 있다.
• 대기 중: 프로세스가 어떠한 사건이 발생하기를 기다린다.
• 준비: 프로세스가 할당되기를 기다리고 있다.
• 삭제: 프로세스가 실행을 마친다.
Process Control Block (PCB)
- 각각의 프로세스와 관련된 정보( task control block라고도 불린다.)
- 프로세스 상태: 실행 중, 대기 중 등
- 프로그램 카운터: 다음 실행 명령의 위치 제어 블록)
- CPU 레지스터: 모든 프로세스 중심 레지스터의 내용
- CPU 스케줄링 정보: 우선순위, 스케줄링 큐 포인터
- 메모리 관리 정보: 할당된 메모리
- 회계 정보: 사용된 CPU, 시작 후 경과된 시계 시간, 시간제한
- I/O 상태 정보: 프로세스에 할당된 I/O 장치, 열린 파일 목록
Process Scheduling
- process scheduler은 CPU 코어에서 다음 실행을 위해 사용 가능한 프로세스 중에서 선택한다.
- 목표: CPU 사용량 최대화, CPU 코어에서 빠르게 프로세스들을 전환시킨다.
- 프로세스의 스케쥴링 큐들을 유지시킨다.
• Ready queue – 메인 메모리에 상주하고 준비되어 실행을 기다리는 모든 프로세스 집합
• Wait queues – 이벤트를 기다리는 프로세스 집 (ex: I/O)
• 프로세스들이 다양한 큐들을 더불어 이동시킨다.
CPU Switch From Process to Process
- Context switch는 CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생한다.
Context Switch
- CPU가 다른 프로세스로 전환되면 시스템은 이전 프로세스의 state를 저장해야 하고 context switch를 통해 저장된 state를 새 프로세스에 로드해야 한다.
- 프로세스의 Context는 PCB에서 제공된다.
- context-switch 시간은 순수 오버헤드이다; 시스템은 스위칭하는 동안 유용한 일을 하지 않는다.
• OS와 PCB가 더 복잡할수록 더 긴 context switch가 길어진다.
- 시간은 하드웨어 지원에 따라 판정된다.
• 몇몇의 하드웨어는 CPU당 여러 세트들의 레지스터들을 제공한다 -> 여러 context가 동시에 로드된다.
Operations on Processes
-시스템은 프로세스 생성과 종료를 위한 메커니즘이 제공되어야 한다.
Process Creation
- 부모 프로세스가 자식 프로세스를 생성하고, 하위 프로세스는 다시 다른 프로세스를 생성하여 프로세스 트리를 형성한다.
- 일반적으로, 프로세스는 process identifier(pid)를 통해 식별되고 관리된다.
- 자원 공유 옵션들
• 부모와 자식은 모든 리소스를 공유한다.
• 자식은 부모 리소스의 하위 집합을 공유한다.
• 부모와 자식이 리소스를 공유하지 않는다.
- 실행 옵션들(둘 중 하나)
• 부모와 자식이 동시에 실행됩니다.
• 부모는 자식 종료될 때까지 기다립니다.
-새로운 프로세스에 대한 주소공간의 가능한 경우
1. 자식 프로세스는 부모 프로세스의 복제 품여서, 같은 프로그램, 데이터를 사용한다
2. 자식은 로딩될 새로운 프로그램이 있다
-UNIX의 예
각 프로세스는 pid에 의해 identify 된다.
새로운 프로세스는 fork()라는 syscall에 의해 생성된다.
새로운 프로세스의 주소 공간은 원래 프로세스를 복사한 것이며, 이러한 원리를 통해 부모-자식 프로세스 간의 소통이 용이하다.
fork()에 의해 생성된 부모-자식 프로세스 간의 유일한 차이점으로는, return code가 다르다는 것이다. 자식은 0을 return, 부모는 자식의 pid값이 반환된다.
fork() call 이후에, exec() syscall에 의해 부모 자식 중 하나는 프로세스 메모리 공간을 새 프로그램으로 교체한다. 이러한 방식을 통해 서로 분리되면서도 소통할 수 있게 된다.
Process Termination
- 몇몇의 OS들은 부모 프로세스가 종료되었을 때 자식 프로세스가 존재하는 것을 허용하지 않는다. 만약 프로세스가 사라지면, 모든 자식들도 사라진다.
• 계단식 종료: 모든 자식들, 손자들 등이 종료된다.
• 종료는 OS에서 시작된다.
- 부모 프로세스는 자식 프로세스가 종료할 때까지 wait() 시스템 콜로 기다릴 수 있다. 이 호출은 상태 정보와 종료된 프로세스의 pid를 반환한다. pid= wait(&status);
- 대기 중인 부모가 없는 프로세스는 좀비 프로세스이다.
* 좀비 프로세스:
-자식 프로세스가 부모 프로세스보다 먼저 종료된 경우이다.
-자식 프로세스가 exit 시스템 콜을 호출하면서 종료되면 이 프로세스에 관련된 모든 메모리와 리소스가 해제되어 다른 프로세스에서 사용할 수 있게 된다.
-자식 프로세스가 종료된 이후에 부모 프로세스가 자식 프로세스의 상태를 알고 싶을 수 있기 때문에 커널은 자식 프로세스가 종료되더라도 최소한의 정보(프로세스 ID, 프로세스 종료 상태 등)를 가지고 있게 된다.
-부모 프로세스가 좀비 프로세스의 종료상태를 회수하게 되면(wait 시스템콜을 호출을 통하여) 좀비 프로세스는 제거된다.
-부모가 wait()을 호출하지 않고 종료되면, 고아 프로세스이다.
*고아 프로세스:
-부모 프로세스가 자식 프로세스보다 먼저 종료된 경우이다.
-init 프로세스가 새로운 부모 프로세스가 된다.
-종료되는 프로세스가 발생할 때 커널은 이 프로세스가 누구의 부모 프로세스인지 확인한 후, 커널이 자식 프로세스의 부모 프로세스 ID를 1(init 프로세스)로 바꿔 준다.
Interprocess Communication
- 시스템 안의 프로세스들은 독립적이거나 협력적일 수 있다.
-협동하는 프로세스는 공유된 데이터를 포함하여 다른 프로세스들에게 영향을 주거나 받는다.
-협동하는 이유:
• 정보공유
• 연산속도 증가
• 모듈화
• 편리
- 협동하는 프로세스들은 interprocess communication(IPC)이 필요하다.
* interprocess communication(IPC): 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로
-IPC의 두 가지 모델이 있다.
• 공유된 메모리: shared memory 방식에서는, 프로세스 간 공유할 메모리 공간이 만들어진다. 프로세스들은 이 공간에 데이터를 읽고 쓰는 것이다. (a)
• 메시지 넘기기: message passing방식에서는, message교환을 통해 정보를 주고받는다. (b)
'시스템 > 시스템보안' 카테고리의 다른 글
(1-4) OS (0) | 2024.07.07 |
---|---|
(1-3) OS (0) | 2024.07.06 |
(1-1) OS (0) | 2024.06.24 |
9-1. Reverse Engineering (3) | 2024.06.04 |
중간(7~8 선택과 집중) (0) | 2024.04.24 |