현대 컴퓨팅시스템에서 작업 단위, cpu의 활동들?, 프로그램이 메모리에 올라간것, 실행중인 프로그램
활성화 레코드
)프로세스를 실행하기위한 필요한 정보들이 들어있다.
식별자, 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터, 각종 레지스터 등등
옛날에는 일괄작업 시스템 이였지만, 지금은 CPU코어에서 찰나의 시간동안에 여러 프로세스를 번갈아 실행하면서 작업을 동시에 하는것처럼 느끼게해주는데, 이때 프로세스가 cpu에 어떻게 할당될것인지 정하는게 cpu 스케쥴러이다.
프로세스가 생성되고 준비 큐
에 들어가서 준비 상태가 되어 cpu에서 실행되기만을 기다린다. 그리고 시스템에는 여러 가지큐가 존재하는데,
준비큐에서 디스패치되가지고 코어에 할당된다음, i/o요청이 필요하면 i/o 대기 큐에도 가고, 인터럽트 당하거나, 타임슬라이스 만료되면 다시 준비큐에 간다
프로세스는 아주 짧은 시간동안 코어를 점유하며 번갈아 실행되는데, 이때 프로세스가 전환되는 과정을 컨텍스트 스위치
라고한다. a 프로세스와 b 프로세스가 계속 번갈아가면서 실행되려면 각 프로세스가 실행되던 문맥
을 저장해야하는데
이 문맥은 pcb에 표현되고, cpu 레지스터의 값, 프로세스의 상태 등을 저장한다.
1. a프로세스는 문맥을 Pcb저장하고 cpu 코어에서 쫓겨난다. 그리고
2. b프로세스의 pcb에서 문맥을 복구해서 cpu 코어에서 실행한다.
3. 인터럽트나 시스템 콜이 생기면 b프로세스는 문맥을 Pcb저장하고 cpu 코어에서 쫓겨난다.
4. 1번으로 다시
저 idle 상태는 cpu가 아무 일도 안하는 상태다.
프로세스가 생성되고(부모 프로세스
) 그 프로세스는 자신을 복사해서 다른 프로세스(자식 프로세스
)를 만들수있다.
unix에서,
1. 프로세스는 fork() 시스템콜로 자식프로세스를 낳을수 있다. 자식프로세스는 구분자 빼고 부모 프로세스의 자원을 그대로 상속받는다
그리고 exec()로 아예 새로운 프로세스로 바꿀수도 있다. -> 코드영역을 새걸로 바꾸고, 데이터 영역을 새로운 변수로 채워지고 스택 영역이 리셋된다.
부모 프로세스는 자원을 회수하기 위해 자식프로세스를 기다리는데, 부모가 먼저 죽어버리면, 자식은 미아프로세스가 되서
자원이 낭비가 된다.
프로세스는 독립적이게 실행되기도 하고 , 데이터를 주고 받으면서 협업하기도 한다.
공동으로 관리하는 메모리를 통해서 전역변수에 값을 쓰고, 자식프로세스가 그 전역변수를 읽는 방식으로 통신한다.
파이프에 쓰기 연산을 하면 파이프에 데이터가 들어가고 파이프에 읽기연산을 하면 데이터를 받는다. 프로세스 b가 빈 파이프에 읽기 연산을 했다면 빈 파이프에 데이터가 들어올때까지 대기상태에 빠진다.
자신과 상대의 소켓을 바인딩하고 소켓에 쓰기 연산과 읽기 연산을 통해 통신을 한다.