채록채록
[OS] Program, Process, Process Address State, PCB, Context switch, Scheduler, Operation on process, IPC, Client-Server communication 본문
Developing
[OS] Program, Process, Process Address State, PCB, Context switch, Scheduler, Operation on process, IPC, Client-Server communication
김책은 2025. 7. 29. 13:58Program
- Disk에 저장되어있는 binary code 덩어리
- 실행 가능한 파일
- 아직 memory에는 올라가있지 않다.
- 실행될 수 있지만 아직 실행되지 않은 상태
- will be executed by the kernel
- 정적(static)
Process
- program이 실행돼서 memory에 load된 상태
- by loader
- 실행파일인 program이 bus를 타고 memory 구조에 맞게끔 올라간 상태
- basic unit of execution and scheduling
- process ID(PID)라는 고윳값을 가진다.
- table에 기록되어있다.
- 동적(dynamic)
- cpu와 연결되어 변화를 주고받는 entity/instance(객체)
- encapsulation of the flow of control in a program
- 문맥
Process Address State
- disk에서 memory로 적재
- logical memory 구조이다.
- code segment에 text
- process counter(PC)가 가리키는 instruction을 cpu Instruction register에 복사한다.
- PC +1+1…
- data segment에 static data
- 전역변수, 상수영역
- class static data
- heap
- dynamically allocated memory
- new… 등
- data segment 위에서 올라가는 방향으로 쌓인다.
- stack
- dynamic allocated memory
- main() 등의 function call
- 0xFFFFFFFF부터 아래로 내려가면서 쌓인다.
- stack과 heap 사이
- instruction 수행을 위한 data
- function 지역변수
- cpu 계산결과가 memory 공간에 덮어씌워진다.
Process 생애주기
- new
- load, PCB 초기화 작업 등
- admitted되면 ready queue로 이동
- ready
- PCB 정보 존재
- linked list 형태로 구현되어 있다.
- scheduler dispatch되면 running queue로 갈 수 있는 것들
- running
- interrupt 발생하면 (timer interrupt or waiting queue에 있던 다른 process의 i/o 완료) ready queue로 이동
- i/o or event wait(trap 요청) 발생하면 waiting queue로 이동
- disk에서 어떤 파일의 정보를 읽어와야지만 다음 일을 할 수 있을 때 등…
- exit하면 terminated될 것들
- waiting
- 요청한 i/o 끝날때까지 기다리는 state
- i/o request, time slice expired, fork a child, wait for an interrupt 등
- 어떤 i/o를 기다리느냐에 따라서 서로 다른 queue 사용
- i/o or event completion되면 interrupt handler에 의해 ready queue로 이동
- fairness를 보장해주는 시스템
- 안그럼 ready queue에서 자기 순서 기다리고 있는 애들은 무슨 죄?
- 요청한 i/o 끝날때까지 기다리는 state
- terminated
- runnig하던게 exit한 state
Process Control Block (PCB)
- cpu에 내려갔다가 올라올 때 필요한 모든 정보를 담은 구조체
- 1 process 1block by kernel
- process state, program counter(PC), cpu register, cpu scheduling information, memory-management information, accounting information, i/o status information
- kernel이 관리하는 memory에 저장된다.
Context Switch(cpu switch)
- Multi program by Time Sharing
- process P0 → operating system ← process P1
- cpu에서 수행되는 주체가 변한다 = cpu의 문맥 자체가 변하는 것이다.
- OS가 scheduling, interrupt, trap등의 interrupt&system call로 handling
- process P0 → operating system ← process P1
- cpu 명령어는 binary code
- flow(문맥) : 어디까지 수행되었는지, 그 시점에 필요한 data들이 무엇인지 (for register)
- save state into PCB0
- cpu register값, process state, memory-management information 등
- reload state from PCB1
- 그것들을 cpu register에 그대로 저장
- 끝나면 free memory로 반환된다.
- 단점
- 오버헤드 발생
- cpu register ↔ PCB 의 문맥교환시간
- os도 cpu를 점유해야하는 권한을 넘겨주는 등의 추가작업이 필요한 소프트웨어이다. (feat. dual mode operation)
- dependent on hardware support
- context switch 전용 register 존재
- 오버헤드 발생
Scheduler
- context swtich할 때 ready queue의 어떤 process를 다음 cpu에서 동작할 process는 무엇이 될것인가에 대한 문제
- Long-term scheduler
- job scheduler
- n개의 process를 memory overflow때문에 다 올릴 수 없을 때
- Virtual memory가 없어서 physical memory가 부족할 때
- disk에 존재하는 process들 중 어떤 애를 memory에 올려서 cpu와 연결되게 할 것인가
- Short-term scehduler
- cpu scheduler
- reqdy queue에 있는 애들 중 누구를 cpu에 올릴 것인가
- Medium-term scheduler
- swapper
- memory에 너무 많은 process가 있을 때 일부 process를 memory에서 제거하고 나중에 다시 로드될 수 있도록 disk로 swap
- cpu에서 돌던 애들 중에서 누가 disk에 내려가고 (=swap out)
- 누가 memory에 올라갈 것인가 (=swap in)
Operations on Processes
- fork()
- creates and initializes a new PCB & new address space
- fork()를 호출하는 것도 process
- 부모 process도 ready queue에 들어가고
- fork된 자식 process도 ready queue에 들어간다.
- 각각 scheduling이 된다.
- 근간이 되는 process (init) 존재
- fork() 호출 시점의 상태 그대로를 shallow copy
- pointer 변수를 갖는 indirection을 처리하기 위해
- 같은 곳을 가리키도록 참조에 의한 할당
- 공유 가능 → process 협력
- fork() 후의 명령어부터 실행 계속함
- 부모 process : fork()의 결과로 child PID 반환
- 자식 process : fork()의 결과로 0 반환
- 분기가 생성된다
- 수행하는 동작 (program path)가 달라진다.
- ex : web server
- exec()
- load program into process address space
- 실행하고자 하는 프로그램 경로/이름, 프로그램 실행 위한 옵션값등을 인자로 받는다.
- fork() 후 exec()
- 이미 복사된 것에다가 입히는 것
- disk에서 load된 binary code를 code segment에 덮어씌운다.
- register도 삭제한다.
- 새로운 프로그램이 입혀지는 셈이다.
- 그럼에도 불구하고 부모-자식관계는 유지된다.
- exit()
- kernel에게 일 벌려놓은 것들 수습(사후처리) 후 종료
- _exit() : 그냥 종료해주는 tool같은 것
- abort()
- 비정상적 종료 (abnormal termination)
- wait()
- multi process 상황에서 부모 process가 사라지지 않게 child process의 종료를 대기하는 system call
- parent process가 wait()을 실행해야 child process proc entry가 proc table에서 released된다.
- zombie process
- 종료가 되었지만 부모 process가 아직 wait()호출을 하지 않은 process
- process가 종료되면 사용하던 자원은 운영체제가 되찾아가는데 process table의 해당 항목은 부모 프로세스가 wait()을 호출할 때까지 남아있게 되기 때문
- orphan process
- parent process가 wait()을 호출하지 않고 terminate
- load program into process address space
While(1){ //다수 연결 보장
int socket = accept(); //client 요청이 들어오면 세션 연결
if ((pid = fork()) == 0){
//세션이 만들어져 있는 상태 = socket이 연결되어있는 상태
// child process에서 할 역할들 수행
// handle client request
} else{
// parent process면 close socket
} //그리고 반복문이니까 waiting for 다음 accept() 세션 연결 요청
}
- windows에서는 CreateProcess()
- fork+exec 동시에
- 맨땅에 새로운 process를 만드는 것이기 때문에 원본 & 부모자식관계가 없다.
- multi-threading 이후 os이기 때문
- ex : google chrome browser with 3 types of processes:
- browser process & renderer process & plug-in process
- 각각의 tab마다 separate renderer process가 따로 붙는다.
Inter-Process Communication (IPC)
- process간 통신
- message passing
- message queue가 존재
- os가 process A와 B가 message 교환할 수 있도록 양방향 buffer 관리 & signal 보내준다.
- 장단점
- kernel overhead는 증가하지만 안전하다.
- shared memory
- os는 shared memory를 할당&반환하는 역할만 수행
- 어떤 message를 주고받는지는 관여하지 않는다.
- kernel이 해주던 것들을 process에서 직접 해야한다.
- 단점
- Garbage memory 발생 가능성이 증가하는 등 위험하다.
- 동기화 문제 등등의 안전을 위한 사후처리를 개발자가 다 manualling해야한다.
- circuler que로 구현
- Unix/Linux IPC : pipes, FIFOs, message queue, shared memory, socket
- socket : 원격의 다른 computer process간 통신. 그러나 한 system인 IPC 처리를 port값 매핑하여 data를 주고받는다.
int count;
struct item buffer[N];
int in, out; //in pointer에 producer가 데이터를 계속 넣고
//out pointer에서 계속 빼내면서 역할 수행
Client-Server communication
- Sockets
- Remote Procedure Call(RPC)
- parameter를 socket을 통해 전달
- 연산한 후 결과값을 전달
- ex : chat gpt