C언어에서 가장 중요한 버퍼는 stdin, stdout, stderr이다. 이는 stdio.h에 정의되어 있다.
CPU가 버퍼의 값을 가져가는 방식에는 buffer full, line-by-line, character-by-character 모드 등이 존재한다.
* buffer full의 경우 버퍼가 꽉 찼을 때 CPU가 버퍼를 읽어가는 형식이다.
* line-by-line의 경우 뉴라인(\n)이 입력되었을때 CPU가 버퍼를 읽어가는 형식이다.
* character-by-character의 경우 한 글자 입력 시 CPU가 바로 버퍼를 읽어가는 형식이다. 즉 이는 버퍼를 사용하지 않는 것과 같다. 하지만 이 방식은 CPU가 매번 버퍼를 비워주는 형식이기에 성능 측면에서 그다지 좋은 방식은 아니다.
표준 입출력의 버퍼는 기본적으로 line-by-line을 사용한다. 예를 들어 printf의 경우 뉴라인이 있기 전까지 터미널에 출력을 하지 않는다.
stdbuf 리눅스 명령어를 통해 표준 버퍼를 제어할 수 있다. 버퍼의 크기를 조절할 수 있으며, 버퍼를 사용하지 않을 수도 있다. 버퍼의 크기를 키운다면 CPU가 버퍼를 처리해주는 간격을 키우므로 성능 면에서 향상이 있을 수 있다.
fflush를 통해 버퍼를 강제적으로 비울 수 있다.
c언어에서는 setvbuf를 통해 버퍼의 방식과 크기를 조절을 할 수 있다.
setvbuf와 stdbuf를 동시에 실행한다면 setvbuf가 우선적으로 실행된다.
리디렉션은 입출력으로 데이터가 버퍼로 향하는 방향을 바꾸는 방식이다.
##### 스레드
스레드는 비동기적으로 작동을 한다. 여기서 말하는 비동기적이란 비순차적이란 의미와도 같은데, 이는 다른 프로세스 혹은 스레드들이 서로 동시에 작동하는 것을 의미한다.
스레드는 프로세스와는 다르게 전역 변수와 static 변수들의 메모리 공간을 서로 공유한다. 따라서 서로 다른 스레드가 전역변수들을 동시에 접근할 수 있다. 이런 상황에서 동기화의 문제가 발생할 수 있다. 따라서 전역 변수와 같이 여러 스레드가 동시에 접근이 가능한 변수들을 변경하는 과정에는 mutual exclusive 방법이 필요하다. mutual exclusive는 mutex로 불리며 pthread 라이브러리에서 사용이 가능하다.
mutex는 위와 같은 식으로 사용이 가능하다. 위의 식에서 count를 모든 스레드들이 접근가능한 변수라고 할 때, count 값을 변경하는 것은 프로그램의 동기화 측면에서 문제가 발생 할 수 있다. 따라서 count를 변경하는 식 위 아래로 mutex lock을 걸고 푸는 것을 설정하면, count의 값에 대한 비정상적인 연산을 막을 수 있다.