리눅스 개요

Jongwon·2021년 11월 29일
0

Linux Programming

목록 보기
6/25

Linux는 프로세스에게 시스템 호출로 서비스를 제공하기 위해 존재한다. 리눅스는 Unix-Like OS이지만, 유닉스는 아니다. 또한 POSIX 기능을 많이 지원하지만, 인증을 받지는 못했다.
POSIX(Portable Operating System Interface)
IEEE와 ISO에서 만든 UNIX-LIKE 시스템의 인터페이스 표준이다. 운영체제가 제공하는 시스템 호출을 표준화하려 했으나 POSIX를 따르지 않는 Windows의 장악으로 쇠퇴하게 된다.
SUS(Single Unix Specification)
Open Group이 제정한 UNIX 표준이지만, POSIX와 합쳐졌다.

리눅스 특징

  • 오픈소스이므로 내부 코드를 확인할 수 있다.
  • 여러 CPU를 지원한다.
  • 강력하고 안정적이다.
  • 멀티쓰레드, 네트워킹, GUI등 많은 기능을 지원한다.
  • 커널을 굉장히 가볍게 구성할 수 있다.
  • 문서화가 잘 되어있다.
  • 많은 유틸리티와 앱을 제공한다.

리눅스의 장점

  • Open Source 소프트웨어이다.
  • 다양한 플랫폼을 지원한다.
  • 업그레이드가 잘 진행되고, 개발자 자원이 많다.
  • 안정성이 높다.
  • 다양하면서도 강력한 기능들(다중 사용자 멀티태스킹, 네트워킹, X-Window등)을 지원한다.

리눅스 파일 실행

리눅스에서는 실행파일 포맷을 ELF포맷이라 한다. 이 쉘에서 ELF파일을 운영체제에 실행해달라고 요청하면 프로그램을 실행하고, 프로세스가 되어 메모리에 적재된다. 리눅스의 init프로세스를 제외한 모든 프로세스는 부모-자식 관계를 이룬다. 처음에 컴퓨터를 부팅하면 리눅스 커널이 init 프로세스를 만든다. 쉘 같은 경우도 init 프로세스의 자식 프로세스이다.


시스템 호출(System Call)
운영체제가 제공하는 서비스로, 리눅스에서는 다양한 시스템 호출을 제공한다.
eax레지스터에 시스템 호출 번호늘 넣고, 인터럽트 0x80(리눅스에서 시스템호출 인터럽트번호)를 호출한다. 그리고, 적절한 서비스를 제공한다.



Standard C 라이브러리

리눅스는 GNU C라이브러리(glibc)를 사용하는데, C언어 프로그램 작성 시 유용한 기능을 제공하는 라이브러리 함수이다. 라이브러리는 C 컴파일러가 제공하는데, 리눅스에서는 C 컴파일러로 대표적으로 gcc(GNU compiler Collection)를 사용한다.
시스템 호출 wrapper와 쓰레드 지원을 제공한다.
ANSI C
C언어의 표준으로 후에 ISO표준으로 진화한다.
GNU C 라이브러리
- 헤더파일: /usr/include
- 라이브러리 오브젝트파일: usr/lib/libc.o, usr/lib/libc.so

장점: 개발 기간이 단축되고, 프로그램 호환이 좋으며, 유지보수 비용이 적다.
단점: 실행시간에 의존적이거나, 커널 접근이 많은 프로그램에선 부적합하다.

표준 C 라이브러리 종류

  • 표준 입출력 함수(stdio.h)
    • 스트림 파일 접근 위해 필요한 함수
    • FILE 자료형을 사용
      스트림 파일: C라이브러리에선 파일을 byte 스트림 형태로 구성된 파일로 가정하여, byte 단위로 입출력을 한다. 또한 파일입출력포인터가 존재하여 앞에서부터 읽어온다.
  • 표준 라이브러리 함수(stdlib.h)
    • 스트림 처리와 관계없는 일반적인 라이브러리 함수
      • 쉘 명령어 실행 함수: system(), 새로운 쉘을 열어 프로세스를 실행하게 함
      • 자료 변환 함수: atoi(), atof(), atol() 등 문자열 데이터를 수치 데이터(정수, 실수)로 변환
      • 난수 생성 함수: srand(), rand(), seed값을 얻어 난수를 생성
      • 프로그램 종료 함수: exit(), atexit() 등 프로그램을 종료시킴
      • 환경변수 접근 함수: getenv(), setenv() 등 쉘 환경변수를 변경하거나 접근
      • 명령어 라인 인수 접근 함수: getopt(), 명령어 라인의 인수에 접근
  • 표준 수학 함수(math.h)
    • 수학 함수를 구현함
  • 표준 문자열 처리 함수(string.h)
    • 문자열 데이터를 다루기 위하여 제공되는 함수
  • 표준 바이트 스트림 처리 함수(memory.h)
    • 구조체형 변수를 초기화, 비교, 복사하는데 이용
  • 표준 메모리 관리 함수(malloc.h)
    • 동적 메모리 할당과 회수, 재할당을 수행하는 함수
  • 표준 시간 관련 함수(time.h)
    • 시스템 클럭으로 CPU 사용량과 표준시간 정보를 얻을 수 있는 함수
  • 분기 함수(setjmp.h)
    • 특정위치를 저장하고(setjmp()) 오류 회복 등을 위해 되돌아오는(longjmp()) 기능 제공

API와 ABI의 비교

API(Application Programming Interface)ABI(Application Binary Interface)
소스코드 수준에서 인터페이스를 정의하여 같은 API를 따른 소스코드라면 다른 컴퓨터에서도 호환 가능
ex)Linux System Call API, Standard C library API
어셈블리어 수준에서 특정 CPU마다 컴파일러에서 동작하는 소프트웨어 사이에 필요한 저수준 이진 인터페이스를 정의한다.
ex)함수 호출 방식, 인자 전달 방식, 시스템 호출 방식 등
profile
Backend Engineer

0개의 댓글