목록OS (17)
BASIC의 개발 노트
Thread를 사용할 때 공유된 자원(데이터)이 있다면 어떻게 될까? -> 문제가 발생한다. 이전 글 Concurrency 에서 봤던 코드와는 조금 다른데, mythread에서 counter 라는 변수를 증가 시키는 일을 한다. 그런데 counter는 전역 변수로 선언이 됐다. (volatile은 최적화(레지스터 이용 등)하지 않고 메모리에 머물게 하겠다) static은 이 코드에서만 counter를 사용하겠다는 뜻, 다른 코드에서는 counter를 다른 의미로 써도 무방. 전역 변수는 하나인데 Thread를 2개 생성해서 각 thread 들이 counter 변수를 공유하게 됐다. 여기서 짚고 넘어가야 할 내용이 있다. 하나의 Process에서 ..
Concurrency는 '동시성'이라는 뜻이다. 이 때 조심 해야 할 것은 '동시'라고 했지만 좀 더 엄밀하게 보면 동시에 실행되는 것'처럼' 보이는 것이다. 특히 싱글 코어에서는 하나의 코어 내에서 Thread 간 교차가 빠르게 일어나면서 명령을 처리하기 때문에 사용자 눈에는 마치 동시에 실행되는 것처럼 보여도 실제로 동시에 실행되는 것은 아니다. 만약 2개 이상의 코어를 갖고 있는 CPU가 있을 때, 각 코어 내 Thread가 실제로 동시에 실행될 수 있는데 이것을 우리는 Parallelism(병렬성) 이라고 하며 Concurrency 와는 미세한 차이가 있다. 물론 우리는 앞으로 계속해서 Concurrency를 다룰 것이기 때문에 싱글 코어 환경으로 생각하면 편하다. Open File Descrip..
Read & Write read_size -> fd가 가리키는 File에서 request_size 만큼 읽어서 buf에 넣는다. written_size -> buf에 있는 값을 fd에 쓰는데 request_size 만큼 쓴다. read_size = read(fd, buf, request_size); written_size = write(fd, buf, request_size); echo는 원래 뒤에 오는 문자열을 모니터에 출력해주는데 방향을 바꿔서(>) foo 라는 File에 저장되도록 했다. 그래서 cat foo 를 통해서 File을 읽어서 모니터로 출력하도록 했더니 hello가 출력이 됐다. 그럼 cat이 어떻게 동작하는지 살펴보자. 그러기 위해선 strace를 사용하는데, strace는 어떤 sys..
File System에는 File과 Directory가 존재한다. File을 먼저 간단하게 살펴볼텐데, Process의 구조를 보면 주소 공간 메모리를 추상화한 Address Space와 PCB(Process Control Block)가 존재하고 Process 마다 File Descripter Table을 하나씩 가지고 있다. File Descripter Table에서 처음 3칸은 미리 할당을 해놓는다. Standard I/O를 위해서 할당해놓는 것인데 stdin, stdout, stderr는 각각 대표적으로 키보드, 모니터를 말하고 stderr는 에러를 출력하기 위해서 구별해서 쓴다. 만약 File을 Open하게 되면 0, 1, 2 다음 숫자가 3번이기 때문에 3번 슬롯에 File 정보를 넣어주게 된다..
보호되어 있는 글입니다.
지금부터 말하는 Bounded Buffer는 Circular Queue가 된다. 그림으로 그려보면 아래와 같다. item이 들어있는 개수와 매칭 되는 semaphore는 full, 현재 넣을 수 있는 빈칸 수에 대한 semaphore가 empty 이다. 따라서 put 은 빈칸이 있어야 할 수 있도록 해야하며, get은 item이 들어 있어야 꺼내올 수 있도록 작성되어야한다. 추가로 empty는 넣을 수 있는 빈칸 수를 의미 하기 때문에 초기값을 buffer의 최대 크기인 MAX 값을 주고 full은 item이 들어있는 개수를 의미하기 때문에 초기값을 0으로 준다. 다시 말하지만 초기값 설정은 중요하다. Condition Variable에서는 count 변수를 가지고 이를 확인했다. 상태를 저장할 수 있는..
Semaphore는 라이브러리로 제공이 되며 초기화가 굉장히 중요하다. 초기값은 sem_init 의 세 번째 parameter가 된다. (예시에서는 1) sem_wait는 P 연산(네덜란드어로 검사하다)이라고도 하며 positive number 일 때는 value를 감소를 시키고 negative number 일 때는 더 이상 감소 시킬 수 없기 때문에 sem_wait를 호출한 시점에서 sleep 상태로 진입하게 된다. sem_post는 V 연산(네덜란드어로 증가하다)이라고도 하며 value를 돌려놓는 일 즉, semaphore value를 증가시킨다. 또한 누군가 wait 하고 있다면 하나를 깨운다. wait 하고 있는 대상을 깨운다는 것을 좀 더 자세히 알아보면 Semaphore 내부에는 wait qu..