Basic CS(2)

WorldWannyWeb.·2021년 6월 3일
3

CS

목록 보기
2/7
post-thumbnail

2021-06-03

'프로그램에 대해 설명하세요'
이 질문을 받았을 때, 바로 대답이 나오는 사람은 없을 것이다. 어렴풋이 무엇인지는 알고 있는 것 같지만, '프로그램이 뭐지? 뭐라고 설명하지?' 라는 물음표가 더먼저 떠오르지 않을까싶다. 아마 프로그램이라하면, 컴퓨터 프로그램이 먼저 떠오를 것이다. 정확히 프로그램이 무엇인지 한번 알아보자.

1. Program

1-1. 프로그램이란?

먼저, 컴퓨터 프로그램에 대한 사전적 정의를 찾아보자.

컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음(집합체)이다. 특정 문제를 해결하기 위해 처리 방법과 순서를 기술하여 컴퓨터에 입력되는 일련의 명령문 집합체이며 대부분의 프로그램은 실행 중(즉, 명령어를 '불러들일' 때)에 사용자의 입력에 반응하도록 구현된 일련의 명령어들로 구성되어 있다. (출처:위키백과)

프로그램은 실행이 가능한 완성된 코드들의 모음 또는 집합이라고 볼 수 있다. 윈도우를 사용할때 흔히 접할 수 있는 exe파일들이 모두 프로그램이라고 볼 수 있다. 여기서 실행가능한파일과, 문자열로만 나열되어있는 파일 이렇게 두가지로 나눌 수 있다. 실행이 가능한 파일은 명령어가 포함되어있는 파일이라고 보면 되고, 명령어가 존재하지 않는 txt파일이나, 오디오, 이미지 파일등을 문자열로만 나열되어있는 파일로 볼 수 있다.

1-2. 프로그래밍?

프로그램은 완성된 코드들의 집합인데 그렇다면 프로그래밍은 무엇일까? 사실상 컴퓨터의 구조에서 가장 중요한 핵심은 CPU 즉, 프로세서다. 컴퓨터가 일을 실행할 수 있도록 컴퓨터가 이해할 수 있는 언어로 입력을 시켜줘야하는데 이는 결국 CPU를 조작하는 것이라고 볼 수 있다.

CPU에는 컴퓨터를 조작할 수 있는 명령어들이 들어있는데, 사실 이 명령어들은 0과1로만 구성되어있다. 그래서 이를 알아보기 쉬운 문자체계로 바꾸어주는 것이 어셈블리어다. 그리고 이 어셈블리어를 CPU가 알아들을 수 있도록 다시 바꾸어주는 것이 어셈블러이다.

하지만 어셈블리어를 사용한 프로그래밍은 너무 번거로웠고, 이를 생략시키고 조금 더 범용적인 언어들이 등장했는데 그것이 흔히 아는 c언어, 자바같은 언어들이다. 그리고 이 언어들을 가지고 만든 코드를 다시 변환해주는 것이 많이 들어본 컴파일러이다.

컴퓨터의 언어는 사람의 언어와는 다른 언어이기 때문에 컴퓨터가 이해할 수 있는 0과1로 변환해 전달해주어야한다. 이를 전달해주기 위해서는 프로그램 언어를 사용해 작업해주어야하는데 이것을 프로그래밍이라고 한다. 엄밀히 보면 코딩은 프로그래밍의 하위개념이지만, 굳이 나누어 사용하지는 않는다.

2. Process

2-1. 프로세스란?

그렇다면, Process는 무엇일까? 정의를 알아보자

프로세스(process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 스케줄링의 대상이 되는 작업(task)이라는 용어와 거의 같은 의미로 쓰인다. (출처:위키백과)

즉, Process는 쉽게 말하면, 실행 중인 프로그램이다. 프로그램을 실행하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭한다. 하나의 CPU에서 한순간에 하나의 프로세스만 실행할 수 있는데, 그렇다면, 음악을 듣다가 카톡을 하고, 구글링을 하는 것은 어떻게 가능한 것일까? 이는 운영체제가 엄청나게 빠르게 CPU가 실행할 프로세스를 교체하고 있기 때문이다. 눈 깜박할 사이에 이 교체가 수천번 일어나기 때문에 동시에 여러개의 프로세스가 실행된다고 착각하는 것이다.이런 운영체제 덕분에 프로세스의 교체와 사용할 수 있는 CPU자원에 대해 신경 쓰지 않고 개발에 온전히 집중할 수 있다.

그럼 어떻게 운영체제는 프로세스를 교체하고, 이런 일을 할 수 있는지 프로세스의 구성과 관리를 통해 알아보자.

2-2. 프로세스의 구성

프로세스를 공부하다보면 커널이라는 단어가 유독 눈에 많이 밟힌다. 커널이 무엇이길래..? 왜냐하면, 프로세스가 커널에 등록되고 커널의 관리하에 있는 작업이기 때문이다. 커널은 OS의 핵심 부분으로써, 가장 빈번하게 사용되는 기능들을 담당하고 있는데, 프로세서관리나 메모리관리와 같은 시스템관리를 담당하고 있으며, 메모리에 항상 상주하고 있다.

이런 프로세스가 가지고 있는 정보는 Process Control Block(PCB) 즉, 프로세스 제어블록이라는 곳에 저장된다. 프로세스를 생성한다라는 의미는 곧 커널에 PCB를 생성한다는 말과 같다. PCB가 관리하는 정보는 7가지가 있다.

PID: 프로세스 고유 식별번호
스케줄링 정보: 프로세스 우선순위 등
프로세스 상태: 자원, 요청정보 등
메모리 관리 정보
입출력 상태 정보
문맥 저장 영역(context save area): 프로세스의 레지스터 상태를 저장하는 공간 등
계정 정보

PCB 정보는 OS 별로 서로 다르며, PCB를 통해서 프로세스를 관리하기 때문에 OS의 성능을 결정짓는 중요한 요소 중 하나라고 볼 수 있다.

2-3. 프로세스의 관리

프로세스의 상태

커널 내에는 Ready Queue, Device Queue, I/O Queue 등의 자료 구조가 있으며 커널은 이것들을 이용하여 프로세스의 상태를 관리한다. 프로세스의 상태는 자원간의 상호작용에 의해 결정된다.

프로세스 관리를 위한 자료구조

  • Ready Queue:프로세스들이 스케줄러에 의해 선택됨
  • Asleep 상태: 프로세스 외의 다른 자원들을 요청했을때, 자원별로 queue를 따로 관리 (I/O Queue, Device Queue)

프로세스의 상태

  • Create state : 작업을 커널에 등록 (PCB할당 및 프로세스 생성)
  • Ready state : 프로세서 외에 다른 모든 자원을 할당받은 상태. 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있다. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
  • Running state : 프로세서와 필요한 자원을 모두 할당받은 상태. 프로세스가 CPU를 차지하여 명령어들이 실행되고있다.
  • Blocked/Asleep state : 프로세서 외에 다른 자원을 기다리는 상태. 프로세스가 입출력 완료, 시그널 수신 등 어떤 사건을 기다리고 있는 상태를 말한다.
  • Suspended State : 메모리를 할당받지 못한 상태
  • Terminated/Zombie state : 프로세스 수행이 끝난 상태. 프로세스 실행이 종료된 상태이다.

프로그램의 상태전이

사용자가 프로그램을 실행하면 프로세스가 생성되고 준비에 추가된다. 프로세스는 프로세서(CPU)가 사용가능한 상태가 되면 CPU를 할당받고, 이를 준비상태에서 실행상태로 상태전이(state transition)된다. 이 과정을 디스패칭(dispatching)이라고 하고 디스패처(dispatcher)가 이 일을 수행한다.

이제 프로세스는 실행상태에서 CPU를 이용해 연산한 후 CPU를 자발적으로 반납하고 작업이 끝나지 않았으면 다시 준비상태에 들어간다. 운영체제는 다시 준비리스트의 첫번째에 있는 프로세스를 실행상태로 바꾸고 이 과정을 반복한다.

Dispatch
준비 리스트의 맨 앞에 있던 프로세스가 CPU를 점유하게 되는 것, 즉 준비 상태에서 실행
상태로 바뀌는 것을 디스패치라고 하며 다음과 같이 표시한다.
Dispatch (processname) : Ready → Running

Timeout
운영체제는 프로세스가 프로세서를 계속 독점해서 사용하지 못하게 하기 위해 clock interrupt를 두어서 프로세스가 일정 시간동안만 (시분할 시스템의 time slice) 프로세서를 점유할 수 있게 한다
Timeout(processname) : Running -> Ready

Block
실행 상태의 프로세스가 허가된 시간을 다 쓰기 전에 입출력 동작을 필요로 하는 경우 프로세스는 CPU를 스스로 반납하고 보류 상태로 넘어 간다. 이것을 보류라고 하며 다음과 같이 표시한다.
Block (processname) : Running → Blocked

Wakeup
입출력 작업 종료 등 기다리던 사건이 일어났을 때 보류 상태에서 준비 상태로 넘어가는 과정을 깨움이라고 하며 다음과 같이 표시한다.
Wakeup (processname) : Blocked → Ready

profile
와니완의 월드와이드와니웹🐥

1개의 댓글

comment-user-thumbnail
2021년 6월 6일

깔끔한 정리~~!

답글 달기