728x90
Process
- Batch system의 Job / 시분할 시스템의 task, program
- Process : 실행 중인 프로그램
- 실제 코드 (text section)
- program counter : 현재 상태 추적
- 데이터 저장 및 함수 호출을 위한 메모리 스택, 힙
- OS의 system call로 프로세스의 생성/삭제 구현
- 메모리 상의 프로세스 할당
- 시작 위치에는 text 저장(작성된 코드)
- 그 위에 data(const, global 변수)
- 그 위에 heap(malloc 등의 동적 할당)
- stack : 지역 변수 / 함수 call
- text, data, heap은 주소값이 작은 > 큰 쪽으로 할당
- 스택의 경우 주소값이 큰 > 작은 쪽으로 할당
- 프로세스 상태
- new : 프로세스 생성
- running : 명령 실행
- waiting : 특정 이벤트 전까지 대기
- ready : 프로세서에 할당되기 전의 대기 상태
- terminated : 프로세스 삭제
- Process Control Block(PCB)
- task control block이라고도 함
- 각 프로세스에 대한 정보 저장
- 프로세스 상태
- program counter : 다음 명령어의 위치
- 프로세스의 우선 순위
- 메모리 정보
- 사용된 CPU, 클락 등의 정보
- 프로세스에 할당된 I/O, 파일 정보
- process간의 교환 : Interrupt 혹은 System Call로 이루어짐
- Threads
- 한 프로세스당 여러 개의 program counter 할당
- 스레드 정보를 저장 가능한 공간 필요
- ex. linux
task_struct
- ex. linux
pid t_pid; /* process identifier */ long state; /* state of the process */ unsigned int time_slice /* scheduling information */ struct task_struct *parent; /* this process’s parent */ struct list_head children; /* this process’s children */ struct files_struct *files; /* list of open files */ struct mm_struct *mm; /* address space of this process */
Process Scheduling
- CPU 활용을 최대한으로 하는 것이 목적
- Queue 자료구조를 이용하여 관리
- Job queue : 시스템 내 모든 프로세스
- ready queue : ready / waiting 상태의 프로세스
- device queue
- 각 장치별로 queue head 존재
- 프로세스가 device 사용 요청 시 해당 queue에 PCB가 연결
- 프로세스의 동작 순서
- 생성된 프로세스는 ready queue로 할당
- 동작하는 프로세스는 CPU로 이동
- I/O request 시 > I/O queue 할당 후 I/O 접근
- time slice expire > ready queue 할당 후 CPU 할당
- child fork / interrupt > 작업 후 ready queue 할당
- scheduler
- 프로세스가 I/O를 많이 쓰는지, CPU를 많이 쓰는지를 판단(I/O bound, CPU bound)
- short term(CPU scheduler)
- 현재 프로세스 바로 다음에 할당할 프로세스 선택
- Long term(job scheduler)
- 데이터센터 등 대형 시스템에서 사용
- 다수의 작업을 모아서 한번에 효율적으로 처리
- Context Switch
- 프로세스 상태를 저장하고 새 프로세스로 전환
- 상태를 저장 - 불러오고 새로 실행하는 과정의 overhead가 매우 큼
- 파일 입/출력을 많이 하는 프로그램이 느린 이유
Operations on Process
- Process Create
- 부모 프로세스는 자식 프로세스를 생성
- 트리 자료구조를 형성
- 부모 프로세스는 자식 프로세스의 관리 가능(권한, 공유 등)
- 부모-자식 프로세스의 동시 동작시 대기 혹은 병렬 처리 가능
- 새 프로세스 생성 시, 부모 프로세스를 복사 후 프로그램 실행
- UNIX의 프로세스 생성 명령어 - fork()
- 자식 프로그램은 exec()명령어로 프로그램 실행
- 부모 프로세스 wait : 자식 프로세스가 종료할 때까지 대기
- 부모 프로세스는 자식 프로세스를 생성
- Process Terminate
- 완료 시 exit 후 상태 데이터를 반환
- 자원을 과도하게 사용하는 등 프로세스 종료가 필요할 경우 abort()도 가능
- cascading termination : 부모 프로세스가 먼저 종료시 하위 프로세스도 종료
- 자식 프로세스가 사라져도 자원 회수 등을 위해 PCB는 여전히 존재
- 부모 프로세스는 wait()으로 exit될 때까지 대기해야 함
- wait 없이 프로세스 종료 시 : Zombie Process
- wait 없이 부모 프로세스 종료 시 : Orphan Process
interprocess communication
- 프로세스 간의 정보 교환
- 교환 모델
- message passing : 커널에서 제공하는 메세지 큐를 이용한 정보 교환
- shared memory : 프로세스 간 공유 공간 할당
- Producer-Consumer Problem
- 데이터의 생산자(Producer)와 소비자(Consumer) 관계
- 버퍼를 한정할지(bound), 안할지(unbound)의 문제
- Shared memory
- 통신하고자 하는 프로세스 간에 공유하는 메모리
- OS가 아닌 사용자 level에서 통신 조절
- 같은 메모리에 다른 프로세스가 동시에 조작 시 문제 존재
- 프로그래밍이 어려우나
- Message Passing
- send / receive를 이용하여 프로세스 간에 데이터 전송
- 프로세스 간의 링크 설정 필요
- 2개 이상의 프로세스 연결 / 통신 방향(단방향, 쌍방향) 등을 고려
- direct Communication
- 데이터를 받을 프로세스 명시 send/receive(process, message)
- pid가 바뀔 경우 접근 불가
- Indirect Communication
- mailbox(port)를 이용한 데이터 공유
- 같은 process 연결에서 여러 개의 link 형성 가능
- mailbox 생성 > 데이터 교환 > mailbox 삭제 과정으로 진행
- Synchronization
- Blocking : 데이터 송신 / 수신 중 한쪽이 끝날때까지 다른쪽은 불가
- non-blocking : 송/수신에 제한 x, 오류 방지를 위해 데이터가 없는 경우 return 등으로 다른 행동을 하기 위한 별도 조치 필요
- Buffering : 링크 사이의 메세지 큐
- zero cap. : 큐 용량 x, 송/수신 중 하나가 끝나야 함
- bound cap. : 정해진 용량, 큐가 모두 차면 대기
- unbound cap. : 중단 없이 전송 가능
IPC system
- POSIX
- 통신할 각 process 내에 shared memory 생성
- map 된 메모리에 메세지 작성(sprintf)
- 받는 쪽은 해당 주소에서 데이터를 읽어옴
- Windows
- LPC(local procedure cell) : 일종의 mailbox
- client - server 사이에 connect port(연결 요청)
- client/communication port(일종의 양방향 통신, message passing)
- shared section object(공유 메모리 역할)
- Remote Procedure Call
- 상대방 프로세스로 특정 동작을 요청
- Stub : 두 프로세스 사이에 서로 다른 parameter, return 규칙을 알맞게 변환
- Matcmaker : 프로세스 연결을 위한 Port 지정
- Pipe
- 부모 - 자식 프로세스 간의 데이터 교환
- pipe라는 파일 객체로 데이터 관리
- fd[0] : write / fd[1] : read
- named pipe : 부모-자식 관계와 무관하게 통신
728x90