해당 글은
경희대학교 조진성, 허선영 교수님의 강의 자료 및 내용을 정리한 글입니다
개인적으로 공부하며 작성된 글이라 잘못된 부분이 있을 수 있습니다!
오류가 있다면 알려주세요
Process
- Program
- 프로그램이란, Disk에 저장된 파일과 같은 Passive entity
- Process
- 실행 중인 프로그램. 메모리에 로드된 프로그램의 인스턴스
- program counter와 연관된 리소스의 집합을 가진 Active entity
- Disk에서 binary file 형태의 프로그램을 실행함
- Main memory로 program code가 올라감. 이는 Byte array
- CPU가 이를 처리하게 됨
- 이때, CPU-memory 간의 처리는 느리다
- 따라서 일부를 Cache하여, 복사하여 처리하는 방식임
▶Process in Memory
- Text Section
- Compiled program code.
- read only! 컴파일이 한 번 된 이후에 보호가 된다
- Data Section
- global variable, Static
- 프로그램 실행 중 항상 메모리를 차지하는 변수
- Stack Section
- 고정된 Size가 아님
- 함수를 호출할 때마다 늘어나고, Return되면 줄어들게 됨
- 함수 parameters, 반환 address, Local 변수
- Stack Frame: 각 함수에게 할당되는 메모리 공간
- Heap Section
- Runtime 중에 동적으로 할당되는 메모리
- new, malloc
▶Process State
- New: 프로그램이 실행되면 프로세스가 만들어진다
- Ready: 만들어져서 실행이 가능한 상태. 프로세서에 할당되기를 기다릴 때
- 해당 상태에 있는 프로세스 중 하나를 선택하는 것이 스케줄링이다.
- Dispatch: CPU에 있는 register들에 대해서 프로세스의 상태로 복귀시킨다.
- Interrupt가 걸린 경우 처리 하던 일을 저장하고 OS가 수행→ ready
- 프로세스 A보다 우선 순위가 높은 프로세스 B가 Ready queue에 존재하는 경우
- Running : 스케줄러에 의해 프로세스가 할당되어 실행될 때
- Waiting: I/O 또는 event의 발생을 기다린다.
- Terminated: 프로세스가 실행을 마치고 사라짐
▶Process Control Block- PCB
- Process State를 저장하기 위한 Data structure
- 각각의 프로세스는 PCB를 가짐
- PCB는 kernel memory에 올라감. 쉽게 접근할 수 없음!
- Program counter: 해당 process가 이어서 실행해야할 명령의 주소를 가리킴
- Registers: Processor가 참조하는 CPU resigters의 값
- CPU scheduling information: process의 우선 순위 등의 스케줄링 정보
- Memory-management information: 프로세스에 할당된 메모리
- Accounting information: 사용 CPU량, time limits
- I/O status information: 프로세스에게 할당된 입출력 장치 목록
Process Scheduling
- 많은 프로세스가 존재할 때, 주어진 CPU core에 어떤 프로세스를 실행할 지 결정함
- Goal: 낭비되는 시간 없이, 최대한으로 CPU를 활용함
- Scheduling Queues
- Ready queue: Main memory에 상주하며, 실행되기를 기다리는 모든 프로세스
- Wait queue: I/O 등의 event 발생을 기다리는 모든 프로세스
- Queuing Diagram
- 프로세스가 생성되면 Ready queue에 들어감
- Scheduler의 선택을 받으면 CPU에서 수행됨
- I/O를 요청하는 상황에서는 I/O queue에 들어감
- Time slice를 모두 쓰면 Ready queue에 들어감
▶ Context Switch
- Context = Program Counter + Register
- CPU의 context를 $ P_0$에서 $ P_1$ 로 바꾸어야함
- 현재 context는 $P_0$로 존재하는데, 이를 저장
- $PCB_1$에 저장된 context를 CPU register에 넣어줌
- 그러면 $P_0$는 Idle(ready/waiting)
- 이를 위해 Kernel 모드로 진입
- 따라서, 이는 Pure Overhead
- context 교체 과정에서 생기는 메모리 낭비 (register save/load, cache 날림 ...
- context switch time에는 system이 유용한 작업을 할 수 없음
- 그러나 하나의 CPU에서 여러 프로세스를 실행할 수 있기에 이를 수행함
- Hyperthreading: 일부 하드웨어는 CPU 당 multiple set of registers → 한번에 여러 context를 load 가능. Physical core에 비해 많은 logical core를 활용할 수 있음!
Operations on processes
▶Process Creation
- Parent process - Child process
- tree of processes
- Process identifire(pid)를 통해 식별&관리
- Option
- Resource sharing: 모든 리소스 공유 / 하위 집합을 공유 / 공유하지 않음
- Execution: 부모, 자식 동시에 실행 / 자식이 종료될 때까지 부모는 대기
- Address space: 자식은 부모의 복제본 / 자식에게 program이 load됨
- child process pid = 0, parent process pid > 0
- wait() system call은 만든 child process가 종료되기를 대기함
▶Process Termination
- process가 모두 실행된 이후, exit() system call을 통해 OS에 삭제를 요청함
- wait()를 통해, child → parent로 상태 data를 반환
- 기다리는 parent process가 없는 경우, child는 zombie
- parent가 wait() 발생 없이 먼저 종료될 경우, child는 orphan
pid = wait(&status)
- OS에 의해 process의 리소스가 할당 해제됨
- Parent → child 실행을 종료: abort()
- 할당 리소스 초과
- child에게 할당된 작업이 더 이상 필요 없음
- parent가 종료될 경우, child는 작업을 계속할 수 없음(Cascading termination)
Interprocess Communication- IPC
- 시스템의 process는 independent / coorperating
- 왜 coorperating 할까?
- Information sharing
- Computation speedup
- Modularity: 각 task가 분리되어 관리가 쉬움
- Convenience
- 이를 위해서는, Interprocess communication(IPC)가 필요함!
▶Shared memory
- A, B가 동시에 사용할 수 있는 메모리 공간을 두고 사용
- 이는 OS가 관리하는 것이 아니다. User program 단의 일
- 👍🏼 장점
- 메모리 공간을 활용하므로, 성능 측면에서 굿
- 👎🏼 단점
- B는 A가 memory에 접근하여 데이터를 바꾸었는지 알 수 없음
- process 사이에서의 synchronize 관리가 중요함
- 예) Producer - Customer: Shared buffer를 두고, pointer를 옮겨가며 정보를 읽고 쓸 수 있음
index를 이동시키면서 데이터를 입력 및 사용한다. 이는 Program 내에서 수행하는 synchronize
- POSIX Shared Memory
- Shared memory를 생성하고, 사이즈를 할당하고, 제어하는 Linux의 라이브러리
- 동일한 name의 shared memory를 create
- 각 프로세스의 기능에 따라 주어지는 권한이 다름
- mmap() : shared memory address를 얻음
▶Message Passing
- OS에 Message queue를 두고, A가 넣어두면 B가 사용함
- Kernel 내에 존재하는 Communication Link 필요
- send(), receive()
- 👍🏼 장점
- Synchronize는 OS 단에서 수행함
- 👎🏼 단점
- kernel을 통해 massge가 전달됨
- 따라서 데이터 복사가 잦아지므로, 성능 측면에서 bad
- Physical-물리적인 구현
- Shared memory
- Hardware bus
- Network: 서로 port 뚫어서 통신할 수 있음
- Logical
- Direct / Indirect(메세지의 타겟을 미리 지정 / 메세지가 필요한 사람이 가져다 씀)
- Synchronous / Asynchronous(메세지 수신이 완료되었는지 확인 / 확인X)
- Automatic / Explicit buffering (여러 메세지를 보낼 때 버퍼 자동 / 수동)
'STUDY > 운영체제' 카테고리의 다른 글
[OS] Chap06. Synchronization Tools (0) | 2023.10.16 |
---|---|
[OS] Chap05. CPU Scheduling (0) | 2023.10.10 |
[OS] Chap04. Thread & Concurrency (0) | 2023.10.10 |
[OS] Chap02. Operating System Structures (0) | 2023.10.05 |
[OS] Chap01. Introduction (0) | 2023.10.05 |