패스트캠퍼스

[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 15회차 미션

돌맹이시터 2020. 11. 2. 20:33

 

 

환급미션 15일째..

 

 

 

 

 

컴퓨터 구조 - 중앙처리장치 - 마이크로 명령 - 입출력과 인터럽트 -1

컴퓨터 구조 - 중앙처리장치 - 마이크로 명령 - 입출력과 인터럽트 -1

 

 

 

이전까지 다루었던 내용에 대한 구체적인 내용은 

네트워크나 자료구조와 같은 수업에서 배우고

이 수업에서는 여기까지로 정리한다고 하면서..

입출력, 인터럽트에 관한 내용으로 넘어가게 됨

 

 

 

 

 

 

컴퓨터/사용자간의 통신을 위해 외부장치인 입,출력장치를 갖추어야 한다.

위 그림은 기본적인 입출력 구성이 어떤 식으로 이루어지는지에 대한 설명인데..

모든 상황에서 위와 동일하게 구성되는 것은 아니고

일반적인 상황에서의 예시를 나타낸다.

 

 

먼저 입력정보가 들어오게 되면 순차적으로, 직렬로 통과하면서 INPR (input register)으로 들어가게 되고,

INPR, 코어인 AC (accumulator), OUTR (output register)가 병렬연결되어 정보가 전달되고,

다시 직렬로 통과하면서 출력장치를 통해 출력되게 되는 일련의 과정을 보여준다.

이 과정 중에 INPR,AC,OUTR 을 거치면서 전달할 때 제어 플립플롭의 flag bit를 이용하는 과정도 포함되어있다.

 

 

 

 

- 인터럽트 ( interrupt )

 

: 입출력 장치의 처리속도(10문자/sec)에 비해 컴퓨터의 프로세스 처리 속도(10us-fetch and excute cycle time)

가 너무 빠르기 때문에 매 전송 시 5000번의 플래그 체크가 필요하게 된다.

따라서 보다 효율적으로 장치를 구성하기 위해 인터럽트의 개념이 필요하다.

 

 

*IEN ( interrupt enable flip-flop ) 

 

프로그램 제어전송 대신, 외부장치가 전송 준비가 되었을 때 컴퓨터에 알리는 방법에 활용되는 플립플롭

프로그램 실행 도중에 플래그를 체크하는 것이 아니라,

플래그가 세트되면 컴퓨터는 실행중이던 프로그램을 중지하고, 플래그의 세트 정보를 통해 입출력을 실행 후 원래 프로그램으로 복귀한다.

 

 

 

결론은

인터럽트로 인해 우선순위가 높은 작업을 먼저 실행하게 된다는 것이다.

 

 

 

 

 

 

위 그림은 인터럽트의 과정이 어떻게 흘러가는지,

직관적으로 파악해볼 수 있는 flow chart이다.

 

R=1일 때 하고있던 작업을 저장하고, 입출력과 PC값을 0으로 돌린 후, 명령어 처리 과정으로 진입하게 되는 흐름을 보여준다.

 

 

 

 

 

위에서 봤던 플로우차트보다

조금 더 구체적으로 인터럽트 사이클의 흐름을 확인할 수 있다.

 

 IEN=1 이면서 FGI or FGO=1일 때, R=1이 되면서 인터럽트 사이클로 진입하게 된다.

 

 

오른쪽 메모리 상태 sample의 상황을 보자면,

메모리 주소 255에 있는 명령어가 실행중일 때, R=1 이고 인터럽트가 발생했을 경우

 

1. 수행 중이던 PC 값을 메모리[0]번지에 저장한다.

2. PC에 주소 1을 저장한다. 

3. 1120번지의 I/O program을 실행한다.

4. 다시 PC값이 0이 되고 원래 진행중이던 메인 프로그램을 진행하게 된다.

 

 

 

 

 

 

 

 

 

소프트웨어 베이직 - c언어의 기초 - 12. 컴퓨터가 변수를 처리하는 방법

 

 

 

 

 

위 그림과 같이, 

일반적으로 메모리 공간을 4가지 영역으로 구분하여 관리한다.

 

코드 영역 - 한 줄씩 실행시키는 소스코드

데이터 영역 - 전역 변수, 정적 변수

힙 영역 - 동적 할당 변수

스택 영역 - 함수마다 포함되어 있는 지역변수, 매개변수

 

 

 

* 전역 변수 ( Global variable ) : 전체를 총괄하는 변수, 프로그램의 어디서든 접근 가능한 변수

main 함수가 실행되기 전에 프로그램의 시작과 동시에  메모리에 할당된다.

프로그램의 크기가 커질수록 전역 변수로 인해 프로그램이 복잡해질 수 있으니, 이 점에 유의해서 코딩해야 한다.

메모리의 데이터 영역에 적재된다. 

 

위 코드에서 3번째 줄에 선언한 변수 a가 전역 변수이다.

예제에서 보는 것과 같이 changeValue 함수와 main함수에서 모두 사용되고 있다.

 

 

 

* 지역변수 ( Local variable ) 

 

프로그램에서 특정한 블록 (block) 에서만 접근할 수 있는 변수

함수가 실행될 때마다 메모리에 할당되고, 함수가 종료되면 메모리에서 해제된다.

메모리의 스택 (stack) 영역에 기록된다.

 

 

 

위 코드는 main함수와 if문, 두 블록이 존재한다.

if 문 안에서 새로 선언된 변수 a는 해당 블록을 벗어나면서 사라지게 된다.

만약 a의 값을 바꾸고자 한다면 if문 내에서 

int a=7; 이 아닌 a=7;을 입력한다면 블록을 벗어나더라도 메모리 상에 남아있게 되어 출력값은 5가 된다.

 

 

 

* 정적변수 ( Static variable )

 

특정한 블록에서만 접근할 수 있는 변수

프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제된다.

메모리의 데이터 영역에 적재된다.

전역변수와 지역변수의 특징을 섞어놓은 듯한 변수이다.

 

 

위 코드의 출력값은

6

7

8

이다.

프로그램을 실행할 때 할당되고,

함수를 실행할 때마다 사라지는 것이 아니라 계속 메모리에 남아있는 것을 알 수 있다.

 

 

 

* 레지스터 변수 ( Register variable ) 

 

메인 메모리 대신 cpu의 레지스터를 사용하는 변수

레지스터가 메모리보다 cpu에 가깝기 때문에 레지스터의 처리속도가 훨씬 빠르다.

레지스터는 한정적이기 때문에 실제로 레지스터에서 처리될 지는 장담할 수 없다. 

 

 

int main(void)

{

register int a=10, i;

for (i=0;i<a;i++)

 printf("%d\n",i);

return 0;

}

 

위의 코드에서처럼

register int a

와 같은 형태로 코드를 작성하면 된다.

기능은 일반 변수와 똑같기 때문에 처리 속도를 비교해보면 알겠지만 이런 단순한 코드에서는 사실 의미가 없고,

이런 게 있구나 하고 넘어가면 될 듯 하다.

 

 

 

 

 

- 컴퓨터가 변수를 처리하는 방법

 

 

* 함수의 매개변수가 처리될 때

함수를 호출할 때 필요한 데이터를 매개변수로 전달한다.

값에 의한 전달 - ''을 전달, 함수 내에서 변수가 새롭게 생성된다 (지역변수와 같은 개념)

참조에 의한 전달 - '주소'를 전달, 원래의 변수 자체에 접근한다 

 

 

위의 코드는 값에 의한 전달방식을 보여준다.

두 번째 출력값에서 볼  수 있는 것과 같이 함수 내에서 이루어졌던 연산의 결과값이 메인함수에서 선언되었던 변수 a의 값에 반영되지 않고 사라진다.

 

 

 

위의 코드는 참조에 의한 전달방식을 보여준다.

주소값을 이용해 원래의 변수에 전달하기 때문에 main함수에서 선언했던 a의 값에 영향을 준다.

 

 

 

올인원 패키지 : 컴퓨터 공학 전공 필수👉https://bit.ly/3i4sCVE