카테고리 없음

시스템 프로그래밍 - 1. 시스템 프로그래밍의 개요

machine-archive 2025. 3. 8. 22:30

1. 강의 개요

시스템 프로그래밍(System Programming)은 운영체제(OS)와 직접 상호작용하는 소프트웨어를 개발하는 과정입니다.
이 강의에서는 C/C++을 활용한 리눅스 기반 시스템 프로그래밍을 실습하며, 운영체제의 내부 동작 원리를 익힙니다.

📌 강의 기본 정보

  • 사용 언어: C, C++ (필요 시 Java도 언급됨)
  • 실습 환경: Linux (Unix 기반)
  • 주요 학습 대상:
    • 운영체제 개념 (프로세스, 스레드, 메모리 관리, 동기화 등)
    • Unix/Linux 환경에서의 시스템 프로그래밍
    • C/C++을 활용한 시스템 호출(System Call)
  • 참고자료:
    • 8권의 서적을 언급하지만, 주요 교재는 "Operating Systems Concepts"
    • 대부분의 개념은 **인터넷 검색(Google)**을 통해 학습 가능

2. 강의 커리큘럼

한 학기 동안 기본 개념 → 시스템 프로그래밍 실습 → 운영체제 심화 개념 적용의 순서로 진행됩니다.

주차학습 내용

1주차 강의 소개 (시스템 프로그래밍의 필요성)
2주차 유닉스 및 리눅스 기초 (기본 명령어 및 환경설정)
3~4주차 C 언어 기초 및 복습 (파일 입출력, 포인터, 메모리 관리)
5~7주차 프로세스 및 스레드 개념 (생성, 관리, 동기화)
8주차 중간고사
9~10주차 CPU 스케줄링 알고리즘
11~13주차 동기화 (세마포어, 뮤텍스 등)
14~15주차 프로세스 간 통신 (IPC: 파이프, 메시지 큐, 공유 메모리)
16주차 기말고사

3. 시스템 프로그래밍 개념

📌 운영체제와 컴퓨터 시스템 구조

운영체제(OS)는 하드웨어와 응용 프로그램을 연결하는 핵심 역할을 합니다.

+-------------------------------+  
| 유저 애플리케이션        |  ← 크롬, 파워포인트 등 실행
+-------------------------------+  
| 시스템 콜 인터페이스   |  ← 커널과 애플리케이션의 API
+-------------------------------+
| 운영체제 커널               |  ← OS의 핵심 (파일 시스템, 프로세스 관리)
+-------------------------------+
| 하드웨어                       |  ← CPU, 메모리, 디스크 등
+-------------------------------+

운영체제의 주요 기능

프로세스 관리 (fork(), exec(), exit())
파일 시스템 관리 (open(), read(), write())
메모리 관리 (페이징, 세그멘테이션)
디바이스 제어 (드라이버, I/O 관리)


4. 리눅스 운영체제와 시스템 프로그래밍

강의에서는 리눅스 기반 시스템 프로그래밍을 중심으로 실습이 진행됩니다.

📌 리눅스 개요

  • 리눅스는 유닉스 기반 운영체제
    • 1991년 리누스 토발즈가 개발
    • 다양한 배포판 존재 (Debian, Ubuntu, Fedora 등)
    • 멀티유저, 멀티태스킹 지원
  • 리눅스 시스템 프로그래밍의 주요 개념
    • 파일 시스템 조작: ls, pwd, cat, grep, chmod
    • 프로세스 관리: ps, top, kill, nohup
    • 시스템 호출 (System Call): open(), write(), fork(), exec()

5. 주요 학습 개념

(1) 프로세스 및 스레드 관리

📌 프로세스 개념

프로세스 관련 주요 시스템 콜

  • fork(): 부모 프로세스가 자식 프로세스를 생성
  • exec(): 새로운 프로그램 실행
  • exit(): 프로세스 종료
  • wait(): 자식 프로세스 종료 대기

스레드(Thread)

  • 하나의 프로세스 내에서 여러 개의 실행 흐름 존재
  • pthread_create(), pthread_join() 활용하여 멀티스레딩 구현

(2) CPU 스케줄링

📌 스케줄링 개념

운영체제는 CPU 자원을 효과적으로 할당하기 위해 다양한 스케줄링 알고리즘을 사용합니다.

알고리즘특징

FIFO 먼저 도착한 프로세스를 먼저 실행
SJF 실행 시간이 가장 짧은 프로세스를 먼저 실행
Round Robin 각 프로세스에 동일한 시간 할당
멀티레벨 큐 우선순위를 기준으로 여러 개의 대기열 관리

(3) 동기화 (Synchronization)

📌 동기화 기법

멀티스레드 및 멀티프로세스 환경에서 공유 자원에 대한 동기화 문제가 발생할 수 있습니다.

  • 뮤텍스 (Mutex): 한 번에 하나의 프로세스만 접근 가능
  • 세마포어 (Semaphore): 카운터 기반 동기화 메커니즘
  • 모니터 (Monitor): 동기화된 객체

(4) 프로세스 간 통신 (IPC)

📌 IPC 기법 비교

IPC 방식특징

파이프 (Pipe) 부모-자식 프로세스 간 데이터 전달
메시지 큐 (Message Queue) 프로세스 간 메시지 전달
공유 메모리 (Shared Memory) 동일한 메모리 공간을 여러 프로세스가 공유
소켓(Socket) 프로그래밍 네트워크를 통한 프로세스 간 통신

6. C 프로그램 실행 과정

📌 C 프로그램 실행 흐름

  1. 편집(Edit): 코드 작성 (.c 파일)
  2. 전처리(Preprocess): #include, #define 등 전처리 실행
  3. 컴파일(Compile): 기계어로 변환 (.o 파일 생성)
  4. 링크(Link): 라이브러리와 연결하여 실행 파일 생성 (a.out)
  5. 로딩(Load): 실행 파일을 메모리에 적재
  6. 실행(Execute): CPU가 명령어를 수행

7. 결론 및 학습 전략

📌 효과적인 학습법

  1. 리눅스 실습 (터미널 명령어, 시스템 프로그래밍 경험)
  2. C 프로그래밍 심화 학습 (시스템 콜, IPC 활용)
  3. 운영체제 이론 학습 (스케줄링, 동기화, 메모리 관리)
  4. 실제 프로젝트 수행 (멀티스레드, 소켓 프로그래밍 실습)

🚀 시스템 프로그래밍 실습을 많이 하면서 이해하는 것이 핵심입니다! 🚀