공부/운영체제 5

시스템 콜(System Call)

시스템 콜(System Call)이란 - 운영 체제의 커널이 제공하는 서비스. 응용 프로그램의 요청에 따라 커널에 접근하는 인터페이스이다. 시스템 콜이 필요한 이유 - 우리가 사용하는 응용 프로그램은 보통 유저 모드(User Mode)에서 실행되므로 유저 프로세스인데, 이 유저 모드에서 가능한 기능만으로는 많은 기능들을 구현하기 힘들다. 따라서 시스템 콜을 이용해서 유저 모드에서 커널 모드로 전환한 후에 커널이 제공하는 기능들을 사용해야 한다. 시스템 콜 유형 1. 프로세스 제어(Process Control) - fork(), exit(), kill(), malloc(), free() 등 2. 파일 조작(File Manipulation) - open(), close(), read() 등 3. 장치 관리(..

공부/운영체제 2022.09.06

데드락(Deadlock)

데드락(Deadlock)이란? - 프로세스나 쓰레드가 얻고자 하는 자원을 얻지 못해, 교착 상태에 빠진 것 데드락 발생 조건 아래 4개의 조건 모두를 만족한다면 잠재적으로 데드락이 발생할 가능성이 있다. 1. 상호 배제(Mutual Exclusion) - 자원은 한번에 하나의 프로세스나 쓰레드만 사용할 수 있다 2. 점유 대기 - 프로세스가 최소 하나의 할당된 자원을 갖고 있으면서 다른 자원을 기다린다 3. 비선점 - 다른 프로세스가 갖고 있는 자원을 강제로 빼앗을 수 없다 4. 순환 대기 - 각 프로세스는 다음 프로세스가 점유중인 자원을 순환적으로 대기중이다. 예를 들어서 P1, P2, P3 프로세스가 있고, P1은 R1, P2은 R2, P3는 R3 이렇게 각각 리소스를 점유중일 때, P1는 R2을 기..

공부/운영체제 2022.09.02

Spin Lock, Semaphore, Mutex

상호 배제(Mutual Exclusion)를 위한 OS에서 제공하는 동기화 기법으로는 Spin Lock, Mutex, Semaphore가 있다 단순히 Race Condition을 피하기 위한 상호 배제만 달성할 뿐이지, 데드락(Deadlock)이나 기아(Starvation)을 발생시킬 수도 있다 Spin Lock - lock을 얻고자 하는 쓰레드가 CPU점유를 다른 쓰레드에 내주지 않고, 계속해서 lock을 얻을 수 있는지 무의미한 루프를 돌면서(busy wait) 체크하는 방법이다. 다른 쓰레드에게 CPU점유를 내주지 않으니 Context Switching을 함으로써 생기는 오버헤드가 없다는 장점이 있지만, lock을 얻기전까지 쓸데 없는 루프를 돌면서 CPU를 점유하는데, 그 점유를 다른 쓰레드에게 ..

공부/운영체제 2022.09.02

쓰레드(Thread), 프로세스(Process)란?

쓰레드(Thread) - 프로세스 내에서 실제로 실행중인 주체. 프로세스 내에 여러개가 있을 수 있다. 쓰레드는 프로세스로부터 독립적인 스택 공간과 레지스터(ex. Stack Point Register, Program Counter Register, Frame Pointer Register)를 갖고 있으면서, 동시에 Code, Heap, Data 영역은 쓰레드끼리 공유한다. -> 왜 쓰레드는 스택과 PC, SP, FP Register를 공유하지 않는지 생각해보면 당연하다. 쓰레드는 독립적인 실행 흐름을 갖고 있다고 했다. 독립적인 실행 흐름을 갖는다는 말은 쓰레드마다 실행중인 라인이 다를 수 있다는 것이고, 독립적으로 함수 호출이 가능하다는 것이므로 호출 스택과 관련된 SP, FP를 따로 갖는게 당연하다..

공부/운영체제 2022.09.01

Windows에서의 동기화 기법

DirectX 공부를 하면서 게임을 만들고 있는데 멀티 쓰레드를 이용해서 로딩을 하기 위해 그에 대한 공부가 필요해져서 해보려고 한다. 사실 우리는 visual studio에서 이미 멀티 쓰레드 환경에서 프로그래밍을 하고 있다. Window환경에서의 쓰레드 생성을 위해 필요한 함수 // 새로운 쓰레드를 생성한다 // 1번째 인자는 자식 프로세스에 상속할때 설정해주는 구조체의 포인터 // 2번째 인자는 stack size. 0을 넘겨주면 자동으로 설정된다 // 3번째 인자는 생성한 쓰레드가 동작하게 될 함수 // 4번째인자는 생성한 쓰레드가 동작하게 될 함수에 넘겨줄 인자 // 마지막 인자에는 ThreadID를 받고 싶다면 unsigned int* 타입의 변수를 넣어두면 된다 uintptr_t _begin..

공부/운영체제 2022.01.22