https://github.com/BOOOO0/linux-operating-system
GitHub - BOOOO0/linux-operating-system: 리눅스 명령어, 이론과 운영체제 실습
리눅스 명령어, 이론과 운영체제 실습. Contribute to BOOOO0/linux-operating-system development by creating an account on GitHub.
github.com
깃허브에 더 많은 내용이 있습니다.
프로세스 (The Process)
프로세스는 프로그램이 실행되어서 메모리에 로드된 것 그러니까 프로그램이 실행 중에 있는 것을 말한다.
프로세스가 실행되기 위해서 필요한 자원들은
- CPU time
- Memory
- File
- I/O Devices
가 있다.
프로세스 상태 (Process State)
- New : 프로세스가 생성된 상태이다.
- Running : 프로세스가 수행중인 상태이다.
- Waiting : 프로세스가 어떤 이벤트(입출력 요청의 완료나 신호의 수신)같은 것을 기다리고 있는 상태이다.
- Ready : 프로세스가 수행되기를 기다리고 있는 상태이다.
- Terminated : 프로세스가 종료된 상태이다.
프로세스 제어 블록 (Process Control Block)
프로세스와 연관된 여러 정보를 저장하고 있고 각 프로세스 마다 하나씩 존재한다.
PCB는 다음과 같은 정보들을 저장하고 있다.
- 프로세스 상태
- PC 레지스터 - 명령어 레지스터, 메모리 주소 레지스터 등
- 프로그램 카운터 - 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
- CPU 스케줄링 정보 - 프로세스 우선순위, 스케줄 큐 등
- 메모리 관리 정보 - 페이지 테이블, base 레지스터와 limit 레지스터 등
- accounting 정보 - CPU 사용시간 등
- 입출력 상태 정보 - 프로세스에 할당된 I/O Devices 와 Open Files
스레드 (Threads)
스레드는 프로세스 내에서 실행되는 CPU 사용의 기본 단위이다.
스레드는 파트인 스레드 파트에서 자세히 다룰 예정이다.
프로세스 스케줄링 (Process Scheduling)
프로세스의 스케줄링이 필요한 이유는 멀티 프로그래밍을 통한 CPU 활용의 극대화와 시분할(time sharing)을 통해 프로세스 간의 빠른 문맥 교환으로 사용자가 여러 프로그램이 동시에 상호작용하는 것 처럼 느끼게 하기 위함이다.
프로세스 스케줄링에 대한 내용도 다다음 파트에서 자세히 다룰 예정이다.
스케줄링 큐 (Scheduling Queue)
프로세스가 시스템에 들어오면 Ready Queue에 놓인다.
그 후 프로세스가 어떤 이벤트가 일어나서 waiting 해야 할 땐 Wait Queue에 놓이고
이 큐들은 일반적으로 PCB들로 구성된 연결리스트로 구현된다.
최상단이 Ready Queue이고 그 아래 큐들이 Wait Queue들이다.
그림에서도 연결리스트로 구현되어 있는 것을 알 수 있다.
결국 프로세스가 수행이 되고 수행이 되다가 어떤 이벤트를 기다리는 경우가 생길 수 있다는 것을 얘기하는데
이것을 강조하는 이유는 결국 멀티 프로그래밍으로 여러 프로세스가 동시에 사용되는 것 처럼 보일 수 있게 하기 위해서 문맥 교환이 원활히 일어나야 하고 이 프로세스 파트에서 중요한 것은 문맥 교환을 잘 이해하는 것이다.
그리고 문맥 교환을 이해하기 위해서는 프로세스들이 상태에 따라서 어디에 놓이고 어떻게 되는지를 이해해야 한다.
문맥 교환 (Context Switch)
프로세스가 실행중에 있는데 입출력 요청이나 인터럽트가 발생한 상태라고 가정해보자.
그 프로세스는 Running 상태에서 Waiting 상태로 바뀌고 요청에 대한 결과를 기다려야 한다.
그렇다면 CPU는 현재 실행중인 프로세스를 당장 실행할 수 없고 Ready Queue에 있는 다음 프로세스를 실행해야 한다.
하지만 여기서 그냥 다음 프로세스를 실행시킨다면 이전 프로세스가 재개되어야 할 때 그것에 대한 정보를 기억하지 못할 수가 있기 때문에 입출력 요청을 기다리러 Wait Queue로 가기 전에 해당 프로세스의 문맥을 레지스터에 저장해둬야 한다.
그리고 다음 프로세스를 실행하기 위해서 다음 프로세스의 문맥을 레지스터에 복구시키고 이전 프로세스가 입출력 요청이 완료되고 재개되어야 할 상황이라면 지금 프로세스의 문맥을 또 레지스터에 저장하고 재개되어야 할 프로세스의 문맥을 복구시켜서 프로세스를 실행한다.
프로세스에 대한 연산 (Operation on Processes)
프로세스라는 것도 운영체제의 시스템 콜을 이용해서 관리할 수 있고 운영체제는 프로세스를 생성하고 종료하는 기법을 제공한다.
프로세스를 생성하는 프로세스는 부모 프로세스가 되고 생성된 프로세스는 자식 프로세스가 된다.
트리가 형성될 수 있는 것이다.
그리고 각 프로세스는 프로세스 식별자(pid)로 구분된다.
pid가 1인 init process가 항상 트리의 루트 노드가 된다.
그리고 이 생성된 프로세스들은 실행되는 방법이 두가지가 있다.
- 부모와 자식을 동시에 실행시키는 방법
- 부모가 자식들 일부나 전부가 종료될때까지 기다리는 방법
생성된 프로세스들은 주소 공간 측면에서는 두가지 가능성으로 볼 수 있다.
- 자식 프로세스는 부모 프로세스의 복사본이다.
- 자식 프로세스는 자신에게 적재될 새로운 프로그램을 가지고 있다.
프로세스 종료 (Process Termination)
프로세스는 마지막 문장의 실행을 끝내고, exit() 시스템 콜을 호출하여 운영체제에게 자신의 삭제를 요청한다.
프로세스가 종료되고 운영체제는 다른 프로세스를 실행할 자원을 확보하기 위해 해당 프로세스의 모든 리소스를 회수한다.
'Operating System' 카테고리의 다른 글
Operating System : Concepts - 가상 메모리 (Virtual Memory) (3) (0) | 2022.10.11 |
---|---|
Operating System : Concepts - 가상 메모리 (Virtual Memory) (2) (0) | 2022.10.06 |
Operating System : Concepts - 가상 메모리(Virtual Memory) (1) (0) | 2022.08.06 |
Operating System : Concepts - 주 메모리(Main Memory) (4) (0) | 2022.07.19 |
Operating System : Concepts - 주 메모리(Main Memory) (3) (0) | 2022.07.19 |