베릴로그가 아닌 다이어그램을 통해 살펴보자.
위 다이어그램은 2개의 태스크가 있는 일반적인 형태의 프로그램 흐름이다. 먼저 태스크 A에서 블로킹 구간을 발견할 수 있다.
입출력 과정인 읽기나 쓰기 과정이 수행될 때 태스크 A의 코드가 진행되지 않고 내부 메모리 영역에서 해당 작업이 마무리될 때까지 코드는 멈추게 되는데, 이것을 블로킹이라고 한다.
태스크 A가 블로킹하는 동안 운영체제의 스케줄링 정책에 따라 우선순위가 낮은 또 다른 태스크B가 실행될 수 있다. 우선순위가 높은 태스크 A의 실행이 재개되면 우선순위가 낮은 태스크 B는 블로킹하고 태스크 A가 종료되면 다시 태스크 B가 재개된다.
넌블로킹의 다이어그램을 보자.
넌블로킹 형태의 프로세스에서는 입출력 요청을 하더라도 운영체제에 의해 EAGAIN과 같은 시그널을 태스크A가 받아서 실행을 재개할 수 있다. 이때 태스크 A는 다른 루틴을 수행하다가 내부적으로 입출력 완료 시그널을 받은 후 콜백루틴(Callback routine)등을 호출해 완료된 이후의 일을 처리할 수 있다. 이러한 처리는 코드의 흐름을 멈추지 않고 다른 루틴을 먼저 수행할 수 있기 때문에 실행 시간이 더 빠르고 좀 더 좋은 성능을 보여줍니다.
태스크 A를 수행하는 도중에 또 다른 태스크 B가 생설될 수 있는데 이떄 태스크 A와 B는 비동기적으로 수행될 수 있다.
이 경우에는 A와 B의 실행시점이 운영체제에 의해 결정되기 때문에 어떤 것이 어떻게 수행될지는 알 수 없고 2개의 태스크 사이에 운영체제의 스케줄링 기법에 의해 결정된다.
위 다이어그램에서는 2개의 태스크가 동시에 수행되는 것처럼 보이나 프로세서 코어 수에 따라 동시에 수행될 수도 있고 2개의 태스크를 자주 교환해 동시에 수행되는 것처럼 보이게 할 수 있다. 여러 개의 코어가 태스크가 동시에 수행되는 것을 병행 수행(Concurrency)라고 한다.
verilog HDL에서 always문과 함께 blocking과 non-blocking assignment를 활용합니다.
동시에 진행할 수 있는것은 <=로 나타내고 non-blocking assignment 주로 sequential 회로에서 활용됩니다.
따로따로 할 수 있는것은 =로 나타내고 blocking assignment 주로 combination sequential회로에서 활용합니다.
a<=2;
b<=3;
c<=4;
b<=a;
c<=b;
non-blocking 구문에는 2개의 대입문은 동시에 실행되므로, 결과는b=2, c=3이 됩니다.
blocking문은 데이터가 순서대로 들어갑니다.
하나의 대입이 끝나고 나서야, 다음 대입이 실행됩니다.
즉, 순서대로 실행되고 대입이 끝났을 때 그 값이 저장되며, 그 저장된 값이 다음 대입에 적용될 때에도 영향을 미친다는 것입니다.
a=2;
b=3;
c=4;
b=a;
c=b;
이렇게 하면 b=a가 실행되어 b=2가 되고, 그 다음에 c=b가 되어 c는 처음에 실행되어 바뀐 b값 2가 c에 들어가므로 c=2가 됩니다.
둘을 비교해 보면 c값이 다르다는 것을 알게되고, blocking assignment같은 경우에는 따로따로 진행되기때문에 대기상태가 생겨,
대입순서를 생각해서 설계를 해야합니다.
D-FlipFlop (0) | 2022.06.22 |
---|---|
ALU(Arithmetic Logic Unit) (0) | 2022.01.17 |
CLA(carry-look-ahead) (0) | 2022.01.05 |
RCA(Ripple Carry Adder) (0) | 2022.01.04 |
2-to-1 multiplexer 구현하기 (0) | 2022.01.03 |
댓글 영역