본문 바로가기
반응형

CS 지식/시스템 프로그래밍9

[C언어] pthread 라이브러리를 이용해서 스레드에게 signal 보내기 Sending a Signal to Thread멀티 쓰레드 환경에서 시그널을 보내는 방법과 이를 다루는 코드 예제를 알아본다.기본 환경아래는 간단한 멀티 쓰레드 환경을 구현한 코드이다.세 개의 쓰레드가 각각 thread1, thread2, thread3 함수를 실행하며, 각 함수는 무한 루프 내에서 메시지를 출력한다. void* thread1(void *data){ while(1){ printf("thread 1\n"); sleep(2); }}void* thread2(void *data){ while(1){ printf("thread 2\n"); sleep(2); }}void* thread3(void *data){ while(1.. 2025. 1. 28.
[C언어] Deadlock(교착상태) 원인과 해결법 Issues in Multithread app (DeadLock)멀티스레드 환경에서 나올수 있는 문제들 : 교착상태 Dining-Philosophers Problem철학자-젓가락 문제는 멀티스레딩 환경에서 데드락(Deadlock)을 설명하기 위해 자주 사용되는 고전적인 문제이다.문제 설명:철학자는 생각과 식사 중 하나만 할 수 있다.식사를 하기 위해서는 양쪽 젓가락 두 개를 들어야 한다.젓가락은 철학자와 이웃 사이에서 공유된다.한 철학자가 들고 있는 젓가락은 다른 철학자가 사용할 수 없다.식사를 마치면 철학자는 두 젓가락을 내려놓는다.Deadlock데드락이란 서로 다른 스레드(또는 프로세스)가 자원을 점유한 상태에서 서로의 자원을 기다리며 무한정 대기하는 상황을 말한다.Deadlock이 발생하는 이유:H.. 2025. 1. 28.
[C언어] pthread 라이브러리를 이용한 스레드 동기화 Threads Synchornization  Multi Thread에서 전역 변수, 힙 영역, malloc 등은 Data Sharing을 한다.다음 코드는 입력한 초만큼 전역 변수 cnt가 증가하는 예제이다.volatile: 컴파일러 최적화 방지. cnt 변수를 레지스터가 아닌 메모리에서 직접 읽고 쓰게 만듦volatile int cnt;void* do_loop (void *loop){ while(1) cnt++; return NULL;}int main(int argc, char *argv[]){ int status, sec; pthread_t thread_id; cnt = 0; sec = atoi(argv[1]); if (pthread_create(&threa.. 2025. 1. 28.
[C언어] 스레드의 개념과 pthread 라이브러리 Thread 개요실행의 최소 단위이고 함수를 실행한다.자체적인 논리적인 control flow를 가진다.각각 쓰레드는 자체의 스택과 지역변수를 가지지만 다른 쓰레드에게 보호받지 않는다.각각 쓰레드는 자체의 TID(thread ID)를 가진다.각각 쓰레드는 프로세스의 context에 실행되며 global data와 같은 코드를 공유한다.통상적으로 프로세스보다 더 오버헤드가 작다(경량화).가상 주소 공간 비교왼쪽은 프로세스가 2개일 때이고, 오른쪽은 하나의 프로세스 영역에서 User stack에 Thread1, Thread2가 할당되는 것을 볼 수 있다.같은 프로세스의 data, code, heap 공유독자적인 stack, PC, 레지스터를 할당받음.fork vs exec vs pthread_createfo.. 2025. 1. 28.
[C언어] 프로세스 간 통신 (IPC) 프로세스 간 통신 (IPC)1. 파이프 (Pipe)스트림 지향: 데이터를 순차적으로 단방향으로 전송하는 방식입니다.시스템 호출: pipe(), read(), write()를 사용하여 데이터 전송을 처리합니다.동작 방식: 파이프의 쓰기 끝에 데이터를 작성하면, 커널이 해당 데이터를 버퍼에 저장하고 읽기 끝에서 읽힐 때까지 유지합니다.FIFO 동작: First In First Out 방식으로 데이터를 처리합니다.2. 메시지 큐 (Message Queue)메시지 지향: 프로세스가 메시지를 쓰고 다른 프로세스가 읽는 형태입니다.특징: 메시지 큐는 메시지 식별자로 관리되며, 커널 내에서 메시지의 연결 리스트로 구현됩니다.메시지 순서: 메시지는 FIFO 방식으로 읽히지만, 비순차적으로도 메시지를 검색할 수 있습니다.. 2024. 10. 18.
Assembly(어쌤블리어)의 기초 Machine Code:머신 코드는 프로세서가 실행하는 바이트 수준의 프로그램입니다. 이는 0과 1로 구성된 이진 형식으로, CPU가 직접 이해하고 수행할 수 있는 명령어들로 구성되어 있습니다. 각 명령어는 특정 작업을 수행하도록 설계되어 있으며, 메모리에서 특정 위치에 저장됩니다.Assembly Code:어셈블리 코드는 머신 코드를 텍스트 형식으로 표현한 것입니다. 이는 인간이 읽고 쓰기 쉬운 형태로, 각 머신 코드 명령어에 대해 기억하기 쉬운 기호(레지스터, 메모리 주소, 명령어 이름 등)를 사용합니다. 어셈블리 코드는 어셈블러라는 프로그램에 의해 머신 코드로 변환됩니다.  “Integer” data of 1, 2, 4, or 8 bytes:정수 데이터는 1, 2, 4 또는 8 바이트 크기로 표현되며.. 2024. 10. 18.
[C언어] Signal 프로그래밍에서의 Race Condition과 해결법 시그널 프로그래밍에서의 Race Condition과 해결법시그널은 비동기적으로 동작하기 때문에, 잘못 설계된 시그널 핸들러는 Race Condition을 유발할 수 있다. Race Condition은 여러 흐름(프로세스나 스레드)이 공유 자원에 동시 접근하면서 예상치 못한 동작을 초래하는 문제를 말한다. 본 글에서는 시그널 핸들러로 인해 발생할 수 있는 Race Condition의 원리, 해결 방법, 그리고 관련 코드를 중심으로 자세히 설명한다.Race Condition의 발생 관련 개념Race Condition은 다수의 흐름(프로세스나 스레드)이 공유 자원에 동시에 접근하거나 수정하려고 할 때 발생할 수 있는 문제를 말한다. 이를 방지하려면 공유 자원에 대한 Critical Section(임계영역)을 .. 2024. 10. 17.