컴공/운영체제

    스핀락(spinlock)을 최대한 안쓰는게 좋은 이유

    스핀락의 동작 방식 스핀락의 동작 원리는 대략 아래와 같다 volatile int lock = 0; // global void doYourJob() { while (test_and_set(&lock) == 1); // spinlock ... // critical section lock = 0; // spinlock } 스핀락의 동작 방식은 조건문이 false가 될 때까지 계속 while loop를 돌면서 끊임없이 확인하는 방식이다 오늘 주제에서는 test_and_set이 뭘 하는 친구인지는 중요하지 않다 (test_and_set 관련 내용은 여기로 오세요) 오늘 중요한 것은 스핀락의 동작 방식은 loop를 탈출하기 위해 조건문을 끊임없이 확인한다는 점이다 스핀락의 문제점 조건문을 끊임없이 계속해서 확인한..

    멀티태스킹에서 CPU time slice는 고정일까?

    (멀티태스킹 개념을 아셔야 이해하실 수 있습니다) 👉 멀티태스킹 글 보러 가기 👉 컴공 맛집 백엔드 전문 채널 쉬운코드 유튭 구경 가기 멀티태스킹이란? 멀티태스킹 방식은 CPU 사용 시간을 아주 짧게 쪼개서 time slice 단위로 여러 스레드들이 번갈아 CPU에서 실행될 수 있도록 하는 방식이다 (스레드들은 같은 프로세스 소속일 수도 있고 다른 프로세스 소속일 수도 있다) time slice가 '고정'값일까? 결론부터 얘기하면 OS 마다 다르겠지만 적어도 리눅스에서는 고정이 아니다 time slice가 '고정'값이면 어떤 문제가 생길까? 아래 그림을 보자 멀티태스킹 방식으로 동작하는 세 가지 경우를 묘사한 그림이다 (1)번 스레드 t1, t2가 CPU에서 멀티태스킹으로 동작하는 방식이다 (2)번 ti..

    [OS] 멀티태스킹(multitasking)이란?

    멀티태스킹 ? 쉽게 설명하기 위해 싱글 코어 CPU로 예를 들겠다 한 컴퓨터에서 여러 프로세스나 스레드를 동시에 실행하고 싶은데 싱글 코어 CPU에서는 한 번에 하나의 프로세스 혹은 스레드만 실행될 수 있다는 제약이 있다 그러면 어떻게 동시에 실행하게 만들 수 있을까? 이 문제를 해결하는 방식이 멀티태스킹(multitasking) 방식이다 예를 들어 스레드 t1, t2, t3가 있다고 가정해 보자 (각 스레드가 같은 프로세스 소속인지 아닌지는 중요하지 않다) 멀티태스킹 방식은 (간단하게 설명해서) 이 세 개의 스레드들에게 아주 짧은 CPU 시간을 할당해 주고, 그 시간을 다 사용하면 다음 스레드가 실행될 수 있도록 하는 방식이다 그리고 이때 각 스레드마다 동일하게 부여되는 CPU 시간을 time slic..

    프로세스와 스레드의 관계를 바라보는 두 가지 세계관

    프로세스(process)와 스레드(thread)의 관계는 개념적으로 크게 두 가지 세계관이 존재한다 세계관 1 임의의 프로그램(program)이 실행되려면 기본적으로 가지고 있어야 하는 리소스들(메모리 공간, 프로그램 코드, 환경 변수, 프로세스 ID)이 있다 프로그램이 실행되면 OS가 이런 리소스들을 부여하고, 메모리에 올려서 실행 가능한 형태로 만드는데 이렇게 리소스를 부여받아 실행 중인 (혹은 실행 가능한) 프로그램을 프로세스라고 부른다 하지만 실제로 CPU에서 (요즘은 멀티코어니까 각 코어에서) 실행(execution)되고 스케줄링(scheduling) 되는 것은 스레드다 그렇기 때문에 프로세스는 최소 하나의 스레드를 반드시 가져야 하며, 그러므로 이 세계관에서는 스레드 또한 프로세스가 가지는 리..

    프로세스는 최소한 하나의 스레드를 가진다 (맥북에서 확인하기)

    오늘날의 컴퓨터에서 프로그램 동작 방식 프로그램이 컴퓨터에서 실행되면 그걸 프로세스라고 부른다 그 프로세스는 최소 한 개의 스레드를 가진다 스레드는 CPU 코어에서 실제로 실행되는 실행 단위다 오늘은 실제로 그러한지 맥북에서 테스트해보는 내용이다 맥북에서 테스트를 위한 프로그램 작성 C언어로 아주 간단한 프로그램을 아래처럼 작성했다 // 파일 이름 : hello.c #include #include int main(void) { printf("Hello, world!\n"); // 화면에 출력 sleep(10); // 10초 sleep return 0; // 정상적인 종료를 의미 } 이 코드 어디에서도 명시적으로 스레드를 만드는 코드는 없다 단지 프로그램을 실행하면 호출되는 main() 함수가 있을 뿐이다..