[c언어] 공유 자원에 대한 접근 제어 및 보호

프로그램이 실행되는 동안 공유 자원에 대한 접근을 관리하고 보호하는 것은 중요합니다. 공유 자원은 여러 프로세스나 스레드 사이에서 공유되는 데이터나 자원을 말합니다. 이러한 공유 자원에 대한 올바른 접근 제어를 위해서는 동기화(synchronization)보호 보안(protective measures)가 필요합니다.

동기화(Synchronization)

동기화는 공유 자원에 대한 병행 수행(concurrent execution)의 순서를 조절하는 기술입니다. 이를 통해 여러 프로세스나 스레드가 공유 자원에 동시에 접근하는 것을 방지하고 충돌을 막을 수 있습니다.

뮤텍스(Mutex)

뮤텍스는 프로그램에서 단일 스레드만이 특정 자원에 접근할 수 있도록 하는 동기화 메커니즘입니다. 뮤텍스를 사용하면 임계 구역(critical section)에 대한 접근을 상호 배제할 수 있어서 데이터 일관성을 유지할 수 있습니다.

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 임계 구역 보호
void* criticalSection(void* arg) {
    // 임계 구역 진입
    pthread_mutex_lock(&mutex);

    // 임계 구역에서의 작업 수행
    // ...

    // 임계 구역 퇴출
    pthread_mutex_unlock(&mutex);
    return NULL;
}

int main() {
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, criticalSection, NULL);
    pthread_create(&thread2, NULL, criticalSection, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    return 0;
}

세마포어(Semaphore)

세마포어는 동기화 메커니즘으로, 공유 자원에 대한 접근 가능 여부를 나타내는 카운터로 구성되어 있습니다. 이를 사용하여 여러 프로세스나 스레드가 특정 자원에 한꺼번에 접근하는 것을 제어할 수 있습니다.

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t semaphore;

// 임계 구역 보호
void* criticalSection(void* arg) {
    // 임계 구역 진입
    sem_wait(&semaphore);

    // 임계 구역에서의 작업 수행
    // ...

    // 임계 구역 퇴출
    sem_post(&semaphore);
    return NULL;
}

int main() {
    sem_init(&semaphore, 0, 1);
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, criticalSection, NULL);
    pthread_create(&thread2, NULL, criticalSection, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    sem_destroy(&semaphore);
    return 0;
}

보호 보안(Protective Measures)

공유 자원에 대한 보호 보안은 무결성(integrity)과 기밀성(confidentiality)을 유지하고자 하는 것을 의미합니다. 주요 기법으로 암호화(encryption)접근 제어(access control)가 있습니다.

암호화(Encryption)

암호화는 데이터를 인가된 사용자만이 해독할 수 있도록 변환하는 과정을 말합니다. 공유 자원을 보호하기 위해 민감한 정보를 암호화하여 무단 접근을 막을 수 있습니다.

#include <stdio.h>
#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>

void encryptData(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv) {
    EVP_CIPHER_CTX *ctx;

    // 암호화 컨텍스트 초기화
    ctx = EVP_CIPHER_CTX_new();
    EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);

    // 암호화 수행
    int len;
    int ciphertext_len;
    unsigned char ciphertext[1024];
    EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len);
    ciphertext_len = len;
    EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
    ciphertext_len += len;

    // 암호문 출력 또는 외부 저장
    // ...

    EVP_CIPHER_CTX_free(ctx);  // 암호화 컨텍스트 해제
}

접근 제어(Access Control)

접근 제어는 특정 사용자나 프로세스가 공유 자원에 접근할 수 있는 권한을 부여하거나 제어하는 방법입니다. 이를 통해 불법적인 접근으로부터 공유 자원을 보호할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    // 특정 파일을 읽기 전용으로 열기
    if(access("shared_file.txt", R_OK) != -1 ) {
        // 파일이 읽기 가능한 경우
        // ...
    } else {
        // 파일이 읽기 불가능한 경우
        // ...
    }
    return 0;
}

공유 자원에 대한 접근 제어와 보호는 프로그램의 안정성과 보안을 유지하는 데 중요한 요소입니다. 적절한 동기화와 보호 보안을 통해 데이터 무결성과 안전한 접근이 가능하도록 관리해야 합니다.

참고 문헌