Scribbling

컴퓨터의 구조 - 8 본문

Computer Science/Computer Knowledge

컴퓨터의 구조 - 8

focalpoint 2021. 9. 7. 16:41

 

1. 고수준 / 저수준 프로그래밍

- 운영체제는 사용자 프로그램이 I/O 장치의 복잡도를 상당 부분 볼 필요 없도록 가려준다.

- 브라우저 같은 복잡한 사용자 프로갬은 그 프로그램 위에 만들어진 다른 애플리케이션 프로그램들이 운영체제를 다루는 복잡도를 볼 필요 없도록 가려준다.

 

2. 터미널 / 장치 드라이버 / 운영체제

2.1. 터미널과 장치 드라이버

터미널은 I/O 장치이며, 사용자 프로그램은 직접 I/O 장치와 통신하지 않는다. 아래 그림처럼 운영체제가 중간에서 통신을 중재한다.

< 장치 드라이버>

장치 드라이버는 말 그대로 특정 하드웨어 장치를 제어하는 프로그램을 의미한다. 사용자 프로그램이 특정 장치 (예컨대 I/O 장치)를 제어하기 위해서는, 시스템 콜을 통해 운영체제를 통하여 장치 드라이버의 기능을 사용해야만 한다. 

 

2.2. 문맥 전환

운영체제는 한 번에 사용자 프로그램을 하나 이상 실행할 수 있다. 그러나 컴퓨터 레지스터 집합은 하나뿐이므로, 운영체제가 프로그램을 전환할 때마다 레지스터들을 저장하고 복구하는 일련의 작업을 수행하여야 한다. 또한 CPU 레지스터 외에도 MMU 레지스터, I/O 상태 등도 저장하고 복구해야 한다. 이때 저장하고 복구해야 하는 모든 내뇽을 프로세스 문맥 (Process Context)라고 하며, 이러한 전환을 문맥 전환 (Context Switching)이라고 한다.

문맥 전환은 비용이 비싼 과정이다. 당연하게도 문맥 전환을 최소화하는 것이 중요하다. 사용자 프로그램은 터미널을 직접 조작할 수 없다. 사용자 프로그램은 오직 운영체제를 통하여 터미널 등의 I/O 장치 드라이버와 통신이 가능하다. 사용자 프로그램은 시스템 콜 (System Call)을 통해 장치 드라이버를 간접적으로 사용 가능하다.

앞의 예제의 경우처럼, 사용자 프로그램이 터미널 장치로 I/O하는 경우를 고려해보자. 사용자가 키를 누를 때 마다 매번 I/O를 한다면, 사용자 프로그램이 운영체제에 계속 시스템 콜을 보내어 쓸떼없는 문맥 전환을 계속 발생시킬 것이다. 이를 최소화하기 위해서는 사용자가 ENTER를 누를 때까지는 사용자가 무엇을 타이핑하든 상관없다는 점을 활용할 수 있다.

사용자 프로그램은 시스템 콜을 사용하여 터미널에서 입력을 'Read'하고 싶다는 의사를 표시하고, ENTER가 입력되기 전까지는 Sleep 상태가 된다. 터미널의 장치 드라이버 (Device Driver)는 터미널에서 들어오는 문자를 Buffer에 저장하고, ENTER 키가 들어올 때에만 사용자 프로그램을 깨운다.

사용자가 터미널에 입력하는 즉시 화면에 표시할 필요가 있다. 이는 에코 (Echo)를 활용한다. 출력 Buffer 또한 필요하다.

2.3. 표준 I/O

장치 드라이버 내의 버퍼링은 일부 문제를 해결하지만, 사용자 프로그램에도 입출력을 위한 버퍼가 필요하다. (버퍼가 없다면 시스템 콜을 호출하는 타이밍의 문제가 생길 것) 표준 입력/출력 (Standard Input/Output) 라이브러리가 이러한 기능을 제공한다. 표준 입출력 라이브러리에는 사용자 프로그램이 쓸 수 있는 버퍼 I/O 함수가 포함되어 있다.

표준 입출력 라이브러리에는 fopen과 fclose 함수 또한 포함되어있는데, 이는 시스템 프로그램 (OS만 사용 가능한)의 open 및 close와 대응된다. open 시스템 콜은 파일 이름을 파일을 참조할 수 있는 핸들 (Handle)이나 파일 디스크립터(File Descriptor)로 변환해준다.

< File Descriptor >

시스템으로 부터 할당 받은 파일을 대표하는 정수이다. 하나의 프로세스가 파일을 오픈하는 경우, 시스템은 3부터 시작하는 파일 디스크립터를 부여한다. 해당 프로세스는 부여 받은 파일 디스크립터를 통해 파일을 지칭할 수 있다. 부여 받는 파일 디스크립터가 3부터 시작되는 이유는, FD의 0~2가 고정되어 있기 때문이다. 

참고할만한 주소: https://code4human.tistory.com/123

 

다시 표준 I/O 라이브러리에 대한 얘기로 돌아오자. C로 작성된 사용자 프로그램이 터미널의 I/O를 이용하려면 stdio 라이브러리를 사용한다. 이 프로그램을 실행하려면, 작성된 코드가 컴파일 될 것이고, 컴파일된 코드가 stdio 라이브러리 등의 다른 코드를 링크한다.

런타임 라이브러리가 연 stdio 라이브러리는 시스템 파일 디스크립터를 파일 포인터와 연관시킨다. 파일 포인터는 stdin (표준입력), stdout (표준 출력), stderr (표준 오류 출력)이다. 

표준 입력 (stdin): 일반적으로 키보드의 입력을 의미한다.

표준 출력 (stdout): 출력을 위한 스트림으로, 일반적으로 현재 콘솔이나 터미널을 의미한다.

 

 

 

'Computer Science > Computer Knowledge' 카테고리의 다른 글

운영체제 - 1  (2) 2021.09.17
컴퓨터의 구조 - 9  (0) 2021.09.10
컴퓨터의 구조 - 7  (0) 2021.09.06
컴퓨터의 구조 - 6  (0) 2021.09.05
컴퓨터의 구조 - 5  (0) 2021.09.01