onboard (1) 운영체제 이해: OS, Linux, Kernel, Shell, Process, Thread

changwoo·2024년 5월 1일
0

AIFFEL

목록 보기
2/2
post-thumbnail

컴퓨터?


factorio thumbnail

  • 컴퓨터는 크게 하드웨어소프트웨어로 구분
  • 소프트웨어는 다시 운영체제응용프로그램으로 구분
  • 여기서 운영체제커널시스템 프로그램으로 구분

운영체제?


Operating System(OS).

  • 일반적인 UNIX 시스템의 구조:

factorio thumbnail

: 컴퓨터 하드웨어와 소프트웨어 리소스를 관리하고, 컴퓨터 "사용자"와 "프로그램"이 이러한 리소스를 효율적이고 쉽게 사용할 수 있도록 돕는 "소프트웨어 시스템"

  • UNIX 운영체제에서 사용할 수 있는 시스템 호출들의 대략적인 분류와 예시

factorio thumbnail

  • 파일 관리: 파일을 열고, 읽고, 쓰고, 닫고, 잠그는 등의 작업을 포함합니다.
  • 디렉토리 관리: 디렉토리를 생성하고 삭제하며, 파일을 이동하는 작업을 다룹니다.
  • 프로세스 관리: 프로세스를 생성하고, 종료하며, 추적하고, 시그널을 보내는 등의 작업을 포함합니다.
  • 메모리 관리: 프로세스 간의 메모리 공유, 페이지 보호 등을 관리합니다.
  • 파라미터 설정 및 가져오기: 사용자, 그룹, 프로세스 ID를 얻고, 우선순위를 설정하는 등의 작업을 포함합니다.
  • 날짜와 시간: 파일 접근 시간을 설정하고, 실행을 프로파일링하는 타이머를 사용합니다.
  • 네트워킹: 네트워킹 연결 설정, 메시지를 송수신하는 등의 네트워크 관련 작업을 다룹니다.
  • 기타: 시스템 리소스의 사용을 추적하고 기록(accounting), 디스크 할당량을 조작하며, 시스템을 재부팅하는 등의 다양한 작업을 포함합니다.

리눅스?


: 컴퓨터의 운영체제 중 하나로 리누스 토르발스(Linus Torvalds)에 의해 시작된 다중 사용자, 다중 작업을 지원하는 유닉스(UNIX)와 유사한 운영체제

  • 간단한 리눅스의 구조

factorio thumbnail

리눅스는 리눅스 커널 + + 컴파일러 + 다양한 소프트웨어를 포함한 하나의 패키지를 지칭


커널?


: 운영체제의 핵심으로 컴퓨터 자원들을 관리하는 역할 (사용자와의 상호작용은 지원 안함)
커널과 사용자와의 상호작용을 위해 운영체제에는 대표적으로 "shell"이라는 시스템 프로그램을 제공

  • 커널의 가장 큰 역할: 컴퓨터의 물리적(=하드웨어) 자원과 추상화 자원을 관리

    추상화?

    • 물리적으로 하나 뿐인 하드웨어를 여러 사용자들이 번갈아 사용하게 중재함으로서, 마치 한 개의 하드웨어가 여러개인 것처럼 보여지도록 하는 기술)

커널은 하나의 하드웨어 자원을 여러 사용자들을 위한 복수개의 추상화된 객체로 관리. 아래는 커널이 추상화하여 관리하는 물리적 자원들과 이를 추상화한 자원을 칭하는 용어 간 대응 관계:

하드웨어추상화한 자원
CPU태스크(task)
메모리페이지(page), 세그먼트(segment)
디스크파일(file)
네트워크소켓(socket)

커널은 물리 자원과 추상 자원들을 관리(manage)

리눅스 커널의 구성요소

: 여러가지 자원들을 관리하는 관리자(manager)들. 커널을 구성하는 resource manager들은 아래와 같이 크게 다섯가지로 구분

  1. 태스크(Task) 관리자: 물리적 자원인 CPU를 추상적 자원인 태스크로 제공
  2. 메모리(Memory) 관리자: 물리적 자원인 메모리를 추상적 자원인 페이지나 세그먼트로 제공
  3. 파일 시스템(File System) 관리자: 물리적 자원인 디스크를 추상적 자원인 파일로 제공
  4. 네트워크(Network) 관리자: 물리적 자원인 네트워크 장치를 추상적 자원인 소켓으로 제공
  5. 디바이스 드라이버(Device Driver) 관리자: 각종 외부 장치에대한 접근

Details

factorio thumbnail

  • Kernel Space: 커널 구성요소들이 존재하는 공간
  • User Space: 프로그램 파일들. 사용자
  • System Call Interface: User Space의 task들이 커널이 관리하는 자원에 접근해야할 필요가 있으면 System Call Interface를 통해 Kerenel Space의 자원 관리자에게 요청이 전달 됩니다. 그리고 이 커널의 각 자원 관리자는 사용자 요청에 맞게 알맞는 하드웨어에 사용자 명령을 전달하고 작업을 수행합니다.

요약하자면, 커널'사용자가 system call을 통해 컴퓨터 자원을 사용할 수 있게해주는 자원 관리자' 라고 할 수 있습니다.


Shell?


: 운영체제에서 커널과 이용자 사이에서 이용자의 명령을 해석하고 그 처리 결과를 뿌려주는 "시스템 프로그램".

하드웨어 위에 커널(kernel)이 올라가고, 커널 위에서 셸(shell)애플리케이션(application)이 실행된다. 사용자는 기본적으로 "셸을 통해 애플리케이션을 실행"한다.

  • 역할: 화면에 사용자가 "볼 수 있는" 요소. 사용자의 지시를 해석하여 커널에게 전달
  • GUI: Graphical User Interface
  • CLI: Command Line Interface

UNIX 계열 운영체제에서 널리 쓰이는 셸:

  • Bourne Shell(sh)
  • Korn Shell(ksh)
  • Bourne Again Shell(bash)
  • C Shell(csh)
  • TC Shell(tcsh)

Linux에서는 bash가 많이 쓰이고,
UNIX의 경우 과거에는 cshksh가 많이쓰였지만 최근에는 Linux와 같이 bash 셸이 많이 쓰인다.

Microsoft Windows는 explorer.exe가 셸 프로그램이며, macOS에선 Finder가 그 역할을 한다.

Secure Shell, SSH ?

원격지의 셸에 접속하기 위해 사용되는 네트워크 프로토콜. 보통 축약해서 SSH라고 부른다. 보안 셸. 
기존의 유닉스 시스템 셸에 원격 접속하기 위해 사용하던 텔넷은 암호화가 이루어지지 않는 
텍스트 기반 통신인지라 모든 통신 내용이 탈취될 위험이 높으므로, 
여기에 키 교환 알고리즘 기반의 암호화 기능을 추가하여 1995년에 공개된 프로토콜이다. # 기본 포트는 22번.

Process, Thread


factorio thumbnail

  • program: 컴퓨터가 수행할 작업을 기록해 놓은 것. 어떤 작업을 위해 실행할 수 있는 "파일"
  • process: 운영체제가 메모리를 할당하는 작업단위
    • 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
    • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
    • 운영체제로부터 시스템 자원을 할당받는 작업의 단위
    • 즉, 동적인 개념으로는 "실행된 프로그램"을 의미한다.
  • thread: 프로세스가 할당받은 메모리를 활용하는 실행단위

프로그램이 실제로 실행될 때 운영체제는 이를 "프로세스(Process)"라는 단위로 관리.
-> 운영체제는 프로세스 단위로 메모리와 CPU연산 등 컴퓨팅 자원을 분배

  • 메모리 관리: 운영체제는 프로세스에 실제 메모리의 일부를 가상 메모리(virtual memory)로 떼어서 제공함으로써, 프로세스가 컴퓨터의 메모리 "전체"에 접근할 수는 없도록 하고, 다른 프로세스의 메모리 또는 운영체제 자체가 사용중인 커널 메모리를 훔쳐볼 수 없도록 합니다.
    이를 운영체제의 중요한 보안 기제중 하나인 "프로세스 격리(process isolation)"라고 부르며, 다른 프로세스 메모리에는 접근할 수 없기 때문에 프로세스들이 서로 소통하기 위해서는 별도로 혀용된 "프로세스 간 통신(Inter-Process Communication, IPC)"기법을 사용해야 합니다.

  • CPU 자원 관리: 메모리는 주소(id)로서 프로세스에 제공되지만, CPU 연산의 경우 "코어 단위"로 프로세스에 제공됩니다. 프로세스는 스레드(thread)라는 단위로 코어를 하나씩 사용할 수가 있는데, 하나의 프로세스가 시작되면 기본적으로 "하나의 스레드"를 가지고 있습니다. 하지만 개발자는 프로그램이 더 많은 스레드를 사용하도록 설계하여 다중 CPU 코어의 이점을 극대화할 수 있습니다.

  • 멀티프로세싱(Multiprocessing): 하나의 프로그램 안에서 여러개의 프로세스를 활용하는 것
  • 멀티스레딩(Multithreading): 하나의 프로세스 안에서 여러개의 스레드를 활용하는 것

컴퓨터 프로그램이 실행될 때, 그 메모리 공간은 크게 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack) 영역으로 나뉩니다.

factorio thumbnail

factorio thumbnail

각 영역의 역할:

  1. 코드(Code) 영역: 실행할 프로그램의 기계어 코드가 저장되는 곳
    프로그램이 실행되면, 운영체제는 디스크에서 이 코드를 메모리로 로드합니다. 코드 영역은 일반적으로 읽기 전용으로 설정되어 있어, 프로그램 코드가 실행 중에 변경되지 않도록 합니다.

  2. 데이터(Data) 영역: 프로그램의 전역 변수와 정적 변수를 저장
    이 영역의 데이터는 프로그램의 시작부터 종료까지 지속되며, 초기화된 데이터(전역 변수에 할당된 초기 값)와 초기화되지 않은 데이터(BSS 세그먼트)로 구분될 수 있습니다.

  3. 힙(Heap) 영역: 동적으로 할당된 메모리를 위한 공간
    즉, 프로그램이 실행 중에 필요에 따라 메모리를 할당(예: malloc 또는 new)하고 해제(예: free 또는 delete)할 수 있는 영역입니다. 힙은 메모리가 할당되고 해제되는 순서에 구애받지 않으며, 힙의 크기는 프로그램의 요구에 따라 운영체제로부터 동적으로 확장되고 축소될 수 있습니다.

  4. 스택(Stack) 영역: 함수의 호출과 관련된 지역 변수, 매개변수, 반환 주소 및 기타 함수 호출 정보를 저장
    스택은 LIFO(Last In First Out) 구조를 가지고 있으며, 함수 호출 시 해당 함수의 실행 정보를 스택 프레임이라는 블록으로 푸시하고, 함수가 반환될 때 이를 팝하여 제거합니다. 스택은 자동으로 할당되고 해제되며, 스택 오버플로우나 언더플로우 같은 문제가 발생할 수 있습니다.





참고링크

0개의 댓글