diff --git a/README.md b/README.md index b2727bf1f34f3f20fbeaf932744f3f5a88e7c8cf..e1422bb5e9937b35fb8c91229424f52d345f7a67 100644 --- a/README.md +++ b/README.md @@ -757,3 +757,88 @@ int main() printf("Thread return %d at the end\n", result1); } ``` + + +## lesson 14 + +* 사람들이 많이 이용중이던 unix에서 갑자기 소스코드를 닫고 바꾸었다. 그 뒤 bsc라는 것이 나왔고 ios의 기반이 되었다. +* 프리소스 운동 중 GNU에서도 unix와 같은 것을 만들었고 그것이 GNU의 공식 OS인 "LINUX"이다. +* unix계열 os를 쓰지 않으면 POSIX FIPS(연방계정)을 사용하지 못했다. +* ISO에서 현재 표준화를 했다. (JTC sc22 프로그래밍 랭귀지를 표준화) +* pthread 는 posix에서 만든 thread이다. + +1. buffer +> * stack : LIFO 형태 + +> * 버퍼에서 뽑아가능 3가지 형태 +> 1. buffer full : 버퍼가 꽉 차면 한번에 쏵 뽑아간다. +> 2. line by line mode : 한 줄씩 enter를 치면 뽑아간다. +> 3. zero buffer : buffer 사이즈가 0 또는 1로 설정하여 한 글자씩 뽑아가게 만든다. + +> * 제일 중요한 표준 버퍼 stdio +> 1. stdin +> 2. stdout +> 3. stderr +>> * 리디렉션은 이러한 stdio들의 방향을 리디렉션 해주는 것이다. + +* lec13 실습시간에 버퍼문제로 인해 a.out 이 실행이 잘 되지 않았고 \n을 넣어 버퍼문제를 해결했었는데, 이 것을 다른 방법으로 stdbuf를 이용하여 해결할 수 있다. +* buffer control 실행하면서 하기 +>1. stdbuf --output=o a.out : zero buffer를 이용하여 lec13에서 만든 코드를 1초마다 내보내짐 +>2. stdbuf --output=L a.out : line by line buffer이용 + +* 프로그램 안에서 버퍼를 짜는 방법 +```C +#include <stdio.h> +#include <sys/types.h> +#include <unistd.h> + +int bbb = 0; + +void fn_s() +{ + static int a = 0; + printf("== %d %d ==",a++, bbb++); + fflush(stdout); +} + + +void *run (void *arg) +{ + printf("Hello world of POSIX threads.%d\n", (int) (0) ); + for (int i = 0; i < 10; i++) + { + sleep(1); + fn_s(); + } + return 0; + +} + +int main() +{ + int result1; + char bufff[10]; + setvbuf(stdout,bufff, _IONBF, 10); + run((void *) 0); + printf("Thread return %d at the end\n", result1); +} +``` +* 위와 같이 코드를 작성하여 main에서 buffer 를 생성하여 _IONBF, 10 을 주어 내부에서 버퍼 설정이 가능하다. +* 바로 위의 코드와 같이 설정하고 밖에서 이중으로 $stdbuff --output=L a.out 등과 같이 명령 실행시에는 a.out이 이긴다. 즉, 코드에 짠것대로 나온다. +* 위의 코드에서 +>* char bufff[10]; +>* setvbuf(stdout,bufff, _IONBF, 10); +* 두 줄 대신 f flush(stdout); 을 해도 같은 결과가 나온다. + + +2. thread +>* thread를 여러개 만들어서 코어를 다 사용할 수 있게 한다면 훨씬 속도가 빨라진다. 하지만 쓰레드가 무조건 다 코어를 사용하는 것은 아니다. + +3. 동기화 문제 +>* 어떠한 코드에서 a++; 을 하는 중에 cpu에서 memory의 값을 자꾸 가져갔다 돌려주게 된다면 예를 들어 301후 +1은 302가 되어야 하는데 cpu때문에 300으로 다시 덮이는 등 동기화 문제가 발생하게 된다. +>* 이러한 동기화 문제는 mutex를 이용하여 해결한다. +```C +static pthread mutex_t mutex += PTHREAD_MUTEX_INITIALIZER; +``` +