시스템프로그래밍_1-SP

안수빈·2025년 4월 14일

시스템프로그래밍

목록 보기
1/7
post-thumbnail

텍스트 파일과 vs 바이너라 파일 구분하기 !
processes(프로세스) : 실행 중인 프로그램
프로세스 관리 : 그 프로그램들을 살리고, 돌리고, 멈추고, 정리하는 OS의 일
Concurrent processes(병합프로세스): 동시에 같이 실행되는 프로세스

IPC: 프로세스 간 통신



<시스템 프로그래밍을 배우는 이유>

  1. 운영체제의 역할 및 시스템 콜 이해

  2. 실제 애플리케이션 개발을 위한 리눅스 명령어와 도구 실습

  3. 시스템 콜 기반 프로그래밍 익숙해지기


shell: 명령줄 인터프리터

vi, vim, emacs,...: 편집자

GNU tools

  • compiler(컴파일러) - gcc, g++,...

  • debugger(디버거) - gdb

    Tip) 앞에 g가 붙으면 GNU 소프트웨어구나 생각하기!


<Operating System- 운영체제>

컴퓨터 사용자와 컴퓨터 하드웨어 간의 중개 역할을 하는 프로그램


운영체제 목표

  • 컴퓨터 시스템을 편리하게(convenient) 사용
  • 컴퓨터 하드웨어를 효율적으로(efficient) 사용

기본 OS 개념

  • 다중 사용자 환경
  • 프로세스 및 스케줄링
  • 사용자 공간 및 커널 공간
  • 기본 및 고급 입출력


<Unix & Linux 역사 요약>

Unix

  • 1969년 Bell Labs에서 시작 (Ken Thompson, Dennis Ritchie)

  • BSD와 System V로 분기

  • TCP/IP, NFS, POSIX 표준 등 진화

unix 철학

  • 단순함(작게 만들자!!), 이식성 중시
  • 하나의 프로그램은 하나의 작업을 잘하게
  • 쉘 스크립트를 활용해 자동화
  • 기본 기능을 빠르게
  • 효율성보단 휴대성 good


Linux

  • 1991년 리누스 토르발스가 커널 개발 시작

  • GPL 기반 오픈소스

  • 서버, 임베디드 시스템, 실시간 시스템에 널리 사용

리눅스 장점 (Advantages)

  • 오픈 소스(Open Source) -> 누구나 자유롭게 사용, 수정, 배포 가능

  • 개발자용, 안정화 버전 등 다양한 형태 존재

  • 자유로운 커뮤니티와 정보 공유

  • 개발자 커뮤니티, LUG(리눅스 사용자 그룹) 등을 통한 정보 교류 활발

  • 로열티 없음 (Royalty Free)

  • 소프트웨어 구매 비용 없이 자유롭게 사용 가능

리눅스 단점 (Weakness)

  • 버전 업그레이드가 너무 빠름, 다양한 배포판과 버전이 존재해서 관리 복잡

  • 공식적인 애플리케이션 부족

  • MS Office나 일부 게임, 고급 데스크탑 환경은 상대적으로 부족함

  • 상용 장치에 대한 드라이버가 부족하거나 완성도가 낮음

  • 오픈소스 개발 특성상 수익이 낮아 품질 관리가 어려움

  • 특허 문제 및 라이선스 충돌 가능성

리눅스는 개방성과 확장성이 최대 장점이지만,
일관성 부족과 드라이버 호환성이 실사용에 제약을 줄 수 있음!



< 컴퓨터 시스템 구조>

  • 운영체제(OS)는 하드웨어 자원을 효율적으로 관리하고 사용자에게 편리한 환경을 제공하는 시스템 소프트웨어이다.
  • 운영체제(OS)는 밑에 있는 하드웨어를 효과적으로 활용할 수 있는 아주 기본적인 함수들(=시스템콜)을 탑재하고 있다.




<리눅스의 계층 구조 - 1>

1️⃣ 사용자 영역 (User Space)

(the users) - 사용자들

shells and commands - 셸과 명령어

compilers and interpreters - 컴파일러와 인터프리터

system libraries - 시스템 라이브러리

사용자가 직접 접근하는 영역이고, 응용 프로그램들이 있는 곳


2️⃣ 시스템 콜 인터페이스 (System Call Interface)

system-call interface to the kernel - 커널과 사용자 공간 사이를 이어주는 통로 역할

사용자 프로그램이 OS 기능을 요청할 때 이걸 통해 전달.


3️⃣ 커널 영역 (Kernel Space)

signals, terminal handling - 시그널 처리, 터미널 관리

character I/O system, terminal drivers - 문자 입출력 시스템, 터미널 드라이버

file system, swapping, block I/O system - 파일 시스템, 스와핑(메모리 교체), 블록 입출력 시스템

disk and tape drivers - 디스크 및 테이프 장치 드라이버

CPU scheduling, page replacement, demand paging - CPU 스케줄링, 페이지 교체, 요청 페이징

virtual memory - 가상 메모리

커널은 하드웨어를 직접 제어하면서, 사용자 요청을 수행해주는 시스템의 핵심.


4️⃣ 하드웨어 인터페이스 (Kernel-Hardware Interface)

terminal controllers, terminals - 터미널 제어기, 터미널 장치

device controllers, disks and tapes - 디바이스 제어기, 디스크 및 테이프

memory controllers, physical memory - 메모리 제어기, 물리적 메모리

OS가 하드웨어와 직접 소통하는 마지막 계층!


<리눅스의 계층 구조 - 2>

하드웨어(Hardware)

  • CPU, 메모리, 디스크, 주변 장치(Peripherals)

커널(Kernel)

커널은 하드웨어 자원을 직접 제어하고 운영체제의 핵심 기능들을 담당.

  • 프로세스 관리 (Process management): 실행 중인 프로그램(=프로세스)을 효율적으로 관리

  • 파일 관리 (File management)

  • 메모리 관리 (Memory management)

  • 장치 관리 (Device management)


시스템 콜(System call)

프로그램이 커널 기능을 요청할 때 사용하는 통신 수단.

프로그래머가 리눅스 커널 기능을 호출하기 위한 함수 인터페이스

명령어, 유틸리티, 응용 프로그램(Commands, Utilities, Application programs)

라이브러리 함수 또는 시스템 콜을 이용해 커널 서비스를 요청함

예: ls, cat, vi 같은 명령어도 결국 시스템 콜을 통해 커널과 소통하는 거임.

  • 사용자 → 셸 → 시스템 콜 → 커널 → 하드웨어로 요청이 전달됨
  • 계층적으로 분리된 구조라서 유지보수와 보안에 유리


<System Calls sv Library Calls>

시스템 콜(System call)

ㄴ> 운영체제 기능을 직접 호출할 때 사용하는 커널 인터페이스

✔ 커널 내부 코드를 직접 호출하는 진입 지점
커널 영역에서 기능이 직접 구현되어 있음
✔ 리눅스 매뉴얼 2번 섹션에 문서화됨
예: write(2) → $ man 2 write로 확인 가능

라이브러리 콜 (Library Calls)

ㄴ> 프로그래머가 쉽게 사용하도록 제공되는 편리한 함수 모음

사용자 영역의 코드에서 제공되는 함수 호출
✔ 대부분 시스템 콜을 내부에서 간접 호출하거나 자체 구현함
✔ 리눅스 매뉴얼 3번 섹션에 문서화됨
예: printf(3) → $ man 3 printf로 확인 가능
✔ 보통 API (Application Programming Interface)라고도 불림



application code: 응용 프로그램 코드(사용자가 작성한 코드)

C library functions: C 라이브러리 함수들 (printf(), scanf(), fopen()과 같은 표준 C 라이브러리 함수들)

system calls: 파일 읽기/쓰기, 프로세스 생성, 메모리 요청 등 하드웨어 관련 작업을 위해 필요.

OS kernel: 시스템의 핵심. 하드웨어 자원을 관리하고, 시스템 콜을 통해 사용자 요청을 처리함.

hardware (hard disk…): 실제 물리적인 자원들. 커널을 통해서만 접근 가능.

user process (사용자 프로세스): 점선 박스는 하나의 사용자 프로세스를 의미. (즉, application code와 C library functions는 사용자 영역에서 실행됨)







<리눅스 매뉴얼 페이지 사용법>

man [섹션 번호][키워드]

ex) man 3 printf → 섹션 3(라이브러리 함수)에 있는 printf에 대한 설명 출력

  • 섹션 번호를 생략하면 가장 먼저 해당 키워드를 찾은 섹션 내용을 보여줌

    <매뉴얼 섹션 번호별 의미>

번호: 설명
1: 실행 가능한 프로그램 또는 셸 명령어 (e.g. ls, cat)
2: 시스템 콜 (e.g. open(), fork())
3: 라이브러리 호출 (e.g. printf(), malloc())
4: 특수 파일 (디바이스 파일 등)
5: 파일 형식 및 설정 파일 문법 (e.g. /etc/passwd)
6: 게임
7: 기타 (매크로, 규약, 표준 등)
8: 시스템 관리자용 명령어 (주로 root가 사용)

  • man 명령어 ➡ 리눅스 문서 열람용. 섹션 번호를 이용해 정확한 정보 확인
  • 로그인 ➡ 계정과 비밀번호로 인증 후 $ 프롬프트 표시
  • 명령어 입력command options arguments 형식, 대소문자 구분, 종료하려면 exit 명령어 사용
  • 원격 접속SSH 프로토콜을 이용한 터미널 프로그램 사용

<Shell>

  • 운영체제와 사용자 사이의 인터페이스
  • 사용자가 명령어를 입력하면 그것을 해석해서 운영체제에 전달해주는 중간 관리자 같은 역할

<기능>

  • 다른 프로그램 실행
  • 파일 관리
  • 프로세스 관리

/bin/sh Bourne Shell ➡ POSIX 호환
/bin/csh ➡ C Shell
/bin/tcsh ➡ 개선된 C Shell
/bin/ksh ➡ Korn Shell
/bin/bash ➡ Bash (가장 보편적인 무료 셸)


<주요 기능>
로그인 후 셸을 인터랙티브하게 사용할 수 있어요. 주요 기능:

명령어 히스토리 (↑ ↓ 키로 이전 명령 복원)

커맨드 라인 편집

파일 이름 자동 완성 (ex: tab)

명령어 확장 (ex: echo *)

키 바인딩

오타 자동 수정

작업 제어 (백그라운드 실행 등)



<Shlle의 기본 구조>

while (사용자 명령어 입력 받음) {
명령어 해석
명령어 실행
}


<단순 명령어 구조>

명령어 [옵션][인자]

ex) ls -l /home/suvin
ls → 명령어

**특수 문자는 shell로 해석됨 (ex: cd ~ → 셸이 해석해서 사용자의 홈 디렉토리 경로로 바꿈)

<예시>

$ ls -l /bin

$: 프롬프트 (prompt) – 명령어를 입력하라는 표시

ls: 명령어(command) – 디렉토리의 내용을 나열

-l /bin: 인자(arguments)
ㄴ> -l: long listing 형식 옵션, /bin: 목록을 볼 디렉토리

명령어는 입력되면 shell이 이를 파싱(parsing) 해서 명령어와 인자로 나눔. 이걸 splitting이라고 부름.



<자주 쓰이는 리눅스 기본 명령어 정리>




<Linux File System>

<디렉터리 계층 구조>
루트 디렉토리 /를 기준으로 하위 디렉토리들이 트리 구조로 확장됨

예: /bin, /home, /usr, /etc 등

<홈 디렉토리 (Home Directory)>
사용자 계정별로 부여된 개인 작업 공간

일반적으로 /home/사용자이름

ex) suvin 사용자의 홈 디렉토리는 /home/suvin


<File/Directory Path>

<절대 경로(Absolute Path)>
루트 /부터 전체 경로를 명시

예: /home/avr/java/Go.java

<상대 경로(Relative Path)>
현재 위치 기준으로 경로 표현

. 현재 디렉토리

.. 상위 디렉토리

~ 내 홈 디렉토리

cd, cd ~ 홈으로 돌아감


<파일 권한>

파일 권한 구성
각 파일/디렉토리는 소유자(owner), 그룹(group), 기타(others) 에 대해 권한을 가짐

r: 읽기(Read)
w: 쓰기(Write)
x: 실행(Execute)

형식 예시: -rwxr-xr-x
- : 일반 파일
rwx: 소유자는 읽기/쓰기/실행 모두 가능
r-x: 그룹은 소유자는 읽기/실행 가능
r-x: 일반 사용자도 읽기/실행 가능

<파일 권한 변경 방법 – chmod>

chmod [권한][파일이름]


ex) chmod 774 myFile.txt



<gcc Compiler>

0개의 댓글