운영체제란?
컴퓨터의 자원을 효율적으로 관리를 해주고 사용자가 이용을 편리하게 해주는 기능을 제공해주는 프로그램이다.
운영체제에서 가장 중요한 프로세스 프로세스만 알면 절반은 먹고간다.
프로세스
프로세스는 cpu의 처리에 의해 실행중인 프로그램을 프로세스라고한다.
1 프로세스의 구조
프로세스는 4개의 구조를 가지고 있다.
- text(CODE): 컴파일된 소스 코드가 저장되는 영역
- data: 전역 변수/초기화된 데이터가 저장되는 영역
- stack: 임시 데이터(함수 호출, 로컬 변수 등)가 저장되는 영역
- heap: 코드에서 동적으로 생성되는 데이터가 저장되는 영역
좀더 쉽게 실제 코드에서 작동을 했을 때 저장되는 부분을 보면 이해가 쉽다.
1-1 프로세스의 생명주기
프로세스는 5가지의 생명주기로 나눌수 있다.
- New- 디스크에서 메모리로 올라가 있는상태
- Running- CPU가 실제로 프로세스를 수행하고 있는 상태이다.
- Waiting- 프로세스 도중에 I/O 작업이 필요하여 I/O 작업을 수행하는 상태이다. 이 때 CPU는 I/O를 기다리며, 다른 프로세스를 수행한다. Waiting 상태가 끝나면 프로세스는 다시 Ready 상태가 되고, 잠시 후 다시 Running 상태가 된다.
- Ready- 변수 초기화 등 기초 준비작업을 모두 끝나고 실행을 할 수 있는 상태이다.
- Terminated- 최종적으로 프로세스가 종료된 상태이다. 사용하던 메모리 영역이 해제된다.
그림으로 확인해보겠습니다.
1-2 PCB(Process Control Block)
프로세서가 실행이 될때 각각 고유의 PCB가 생성됩니다.
PCB에는 운영체제가 효율적으로 일을 스케쥴링을 하기위해서 필요한 프로세서의 모든 정보의 데이터라고 할수 있습니다.
1) 프로세스 식별자(Process ID)
2) 프로세스 상태(Process State) : 생성(create), 준비(ready), 실행 (running), 대기(waiting), 완료(terminated) 상태가 있습니다.
3) 프로그램 계수기(Program Counter) : 프로그램 계수기는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킵니다.
4) CPU 레지스터 및 일반 레지스터
5) CPU 스케줄링 정보 : 우선 순위, 최종 실행시각, CPU 점유시간 등
6) 메모리 관리 정보 : 해당 프로세스의 주소 공간 등
7) 프로세스 계정 정보 : 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
8) 입출력 상태 정보 : 프로세스에 할당된 입출력장치 목록, 열린 파일 목록 등
9) 포인터 : 부모프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등.
1-3 쓰레드
쓰레드란 가벼운 프로세스이다. 프로세스 안에 쓰레드가 있는 그림을 상상하면 될거 같다.
쓰레드에 대한 부분은 뒤에서 상세하게 배울 예정이다.
간략하게 이야기를 하자면 위드라는 프로세스가 있으면 타자를 입력 받는 쓰레드, 디스크에 저장을 하는 쓰레드,
파일을 입력 받는 쓰레드등 이 모여서 워드라는 프로세스를 이루게 된다.
이처럼 하나의 프로그램에서 동시에 여러가지일들을 처리를 할수 있게 도와준다.
2. Process Scheduling
2-1 Mutliprogramming,time sharing
Mutliprogramming 멀티프로그래밍은 말그래도 동시에 여러가지 일을 하는것을 의미한다.
우리는 컴퓨터를 사용하면 여러개를 뛰우는것을 보고 동시에 일을 하는것처럼 보인다.
하지만 진행될 프로세스들이 잠깐 실행하고 다음 프로세스가 실행 이런 과정을 매우 빠르게 처리를 하면 동시에 처리 되는것처럼 느껴진다.
이를 활용하면 cpu의 효율성을 최대로 끌어올릴수 있습니다.
time sharing 여려명이 공동으로 사용을 하는 컴퓨터가 있으면 컴퓨터는 각가의 개인마다 사용하는 프로그램을 번갈아 가면서 처리를 해서 마치 개인의 컴퓨터로 작업을 하는 것처럼 느낀다.
만약 하나의 cpu에서 동시에 일이 발생이되면 수행을 할수 없으니 cpu의 전체 사용시간에서 작업 시간량으 나누어서 cpu가 처리를 하는것을 타임슬라이스 라고 부릅니다.
멀티프로그래밍 VS 타임쉐어링의 개념을 잘 이해하는게 좋을거 같다.
2-2 Context Swihch
위에서 동시에 일을 하는것처럼 하기 위해서는 Context Swihch이 필요하다.
Context Swihch은 현재 프로세스의 상태를 저장하고 다음 진행할 프로세스의 정보를 읽어와서 실행을 하는 과정을 말합니다.
Context Switching가 이루어지면 Cache초기화, Memory Mapping초기화, kernel이 항상 실행이 되어야 하므로 많은 비용을 소비하게됩니다.
위에 그림을 설명 하자면 p0이 실행을 하다가 interrupt또는 system call이 와서 p1이 실행이되고 끝나면 저장했던 p0의 상태를 복구 하여 실행을 한다 라고 이해하면될거 같습니다.
2-3 프로세스의 부모-자식 관계
프로세스는 새로운 프로세스를 만들수 있습니다.
만들었을때를 부모프로세스 만들어진 프로세스를 자식 프로세스라고 부릅니다.
트리의 형태로 만들어져서 아래와 같은 트리구조로 프로세스들이 연결 되어있습니다.
Zombie and Orphan processes
Orphan(고아)프로세스는 자식 프로세스가 실행중인데 부모 프로세스가 먼저 종료를 해버리면 자식은 부모를 잃어버린 상태가 된다. 이를 해결하기 위해서는 첫번째 프로세스가 고아프로세스를 종료시켜 해결을 해주어야 한다.
Zombie프로세스는 자식 프로세스가 종료될 때 부모 프로세스에 종료 정보를 보내고, 부모 프로세스가 이 정보를 받으면 자식 프로세스는 프로세스 테이블 목록에서 삭제된다. 그런데 자식 프로세스가 종료되었는데도 프로세스 테이블 목록에 남아 있는 경우가 있다. 이를 좀비 프로세스라고 한다.
부모의 프로세스가 자식프로세스의 종료를 제대로 확인을 안하면 이런경우가 생긴다.
'CS자료 > 운영체제' 카테고리의 다른 글
[OS] Thread-safe (0) | 2022.03.03 |
---|---|
[OS] Swapping (0) | 2022.03.03 |
[OS] Deadlock(교착상태) (0) | 2022.03.03 |
[OS]Context switching (0) | 2022.03.03 |
[OS] CPU Scheduler, Scheduling Algorithm (0) | 2022.03.03 |