-
리눅스 - 프로그램과 프로세스, 커널, 시스템 콜CS지식/운영체제 2024. 1. 14. 13:39
리눅스
프로그램과 프로세스
리눅스에서는 다양한 프로그램이 동작한다. 프로그램이란 컴퓨터에서 동작하는 관련된 명령 및 데이터를 하나로 묶은 것이다. Go언어와 같은 컴파일형 언어라면 소스코드를 빌드해서 만들어진 실행 파일을 프로그램이라고 부른다. 파이썬 같은 스크립트 언어는 소스코드 그 자체가 프로그램이 된다. 커널(Kernel)도 프로그램의 일종이다.
컴퓨터를 켜면 처음에 커널이 실행된다. 그외의 모든 프로그램은 커널 이후에 실행된다.
리눅스에서 동작하는 프로그램은 다음과 같은 다양한 종류가 있다.
- 웹브라우저: 크롬, 파이어폭스
- 웹서버: 아파치,Nginx
- 텍스트 에디터: Vim,이맥스
- 프로그래밍 언어 관련: Go컴파일러, 파이썬 인터프리터 등
- 셸(shell) : bash,zsh 등
- 시스템 전체 관리 소프트웨어 : systemd 등
실행되어 동작 중인 프로그램을 프로세스(Process)라고 부른다. 때로는 동작 둥인 프로세스를 프로그램이라고 부르기도 하므로 프로그램은 프로세스보다 넓은 의미를 가진 말이다.
커널
커널이 무엇이고 왜 필요한지, 시스템에 연결된 HDD나 SSD 같은 저장 장치에 접근하는 방법을 예로 들어서 설명할 수 있다.
그림 01-01 프로세스에서 저장 장치에 직접 접근하기
먼저 프로세스가 저장 장치에 직접 접근 가능한 시스템을 생각해 보자
이때 동시에 여러 프로세스가 장치를 제어하려고 하면 문제가 발생한다. 저장 장치에서 데이터를 읽고 쓰려면 다음과 같은 두 가지 명령어를 호출해야 한다고 하자.
- 명령 A : 데이터를 읽고 쓸 장소를 지정한다.
- 명령 B : 명령 A에서 지정한 장소에 데이터를 읽고 쓴다.
이런 시스템에서 프로세스0이 데이터를 쓰는 작업과 프로세스1이 다른 장소에서 데이터를 읽는 작업이 동시에 발생하면 다음과 같은 순서로 명령이 호출될 가능성이 있다.
1️⃣ 프로세스0이 데이터를 쓸 장소를 지정(프로세스0이 명령 A를 호출)
2️⃣ 프로세스1이 데이터를 읽을 장소를 지정(프로세스 1이 명령 A를 호출)
3️⃣ 프로세스0이 데이터를 쓰기(프로세스0이 명령 B를 호출 )
3️⃣번 처리에서 데이터를 쓰고 싶었던 원래 장소는 1️⃣에서 지정한 장소이지만, 2️⃣번 처리가 끼어 들어와서 의도와는 다르게 2️⃣에서 지정한 장소에 쓰기가 실행되면서 원래 있던 데이터가 손상된다. 위 그림처런 프로세스가 직접 저장 장치에 접근한다면 명령 실행 순서를 올바르게 제어하지 못하므로 무척 위험하다.
이런 문제 말고도 원래라면 접근 불가능이어야 할 프로그램이 장치에 접근 가능한 문제가 생길 수도 있다. 이런 문제를 해결하기 위해 하드웨어는 커널의 도움을 받아 프로세스가 장치에 직접 접근할 수 없도록한다. 구체적으로는 CPU에 내장된 모드(mode)기능을 사용한다. PC나 서버에서 사용하는 일반적인 CPU에는 커널 모드와 사용자 모드 두 종류의 모드가 있다. 정확하게 말하면 CPU 아키텍쳐에 따라 세 종류 이상의 모드가 존재 하기도 합니다. 프로세스가 사용자 모드로 실행되고 있으면 사용자 공간(userland)에서 프로세스를 실행한다고 한다.
CPU가 커널 모드라면 그 어떤 명령을 실행하는 데 아무런 제약이 없는 반면에, 사용자 모드로 실행 중 이라면 특정한 명령을 실행하지 못하도록 하는 등 제약이 걸린다.
리눅스라면 커널만이 커널 모드로 동작해서 장치에 접근할 수 있다. 이에 비해 프로세스는 사용자 모드로 동작하므로 장치에 직접적근할 수 없다. 따라서 프로세스는 커널을 통해서 간접적으로 장치에 접근한다.
그림 01-02 커널을 이용한 저장 장치에 간접적으로 접근하기
커널은 커널 모드로 동작하면서 다른 프로세스에서는 불가능한 장치 제어, 시스템 자원 관리 및 배분 기능을 제공한다. 이런 장치 제어뿐만 아니라 시스템 내부의 모든 프로세스가 공유하는 자원을 한 곳에서 관리하고 시스템에서 동작하는 프로세스에 배분할 목적으로 커널 모드로 동작하는 프로그램이다.
시스템 콜
시스템 콜(System Call)은 프로세스가 커널에 처리를 요청하는 방법이다. 새로운 프로세스 생성이나 하드웨어 조작처럼 커널의 도움이 필요할 때 사용한다. 구체적으로 다음과 같은 시스템 콜이 있다.
- 프로세스 생성, 삭제
- 메모리 확보, 해제
- 통신 처리
- 파일 시스템 조작
- 장치 조작
시스템 콜은 CPU의 특수한 명령을 실행해서 처리된다. 프로세스는 앞에서 설명한 것처럼 사용자 모드로 실행되지만 커널에 처리를 요청하기 위해 시스템 콜을 호출하면 CPU에서는 예외(Eception)라는 이벤트가 발생한다. 이를 계기로 CPU 모드가 사용자 모드에 커널 모드로 바뀌고 요처 내용에 따라 커널 처리가 동작한다. 커널 내부에서 시스템콜 처리가 끝나면 또 다시 사용자 모드로 돌아와서 프로세스 동작이 이어진다.
그림 01-03 시스템 콜
시스템 콜 처리를 하기 전에 커널은 프로세스에서 온 요청이 올바른지 확인한다. 예를 들어 시스템에서 처리 가능한 범위 이상으로 메모리를 요청하는가 등 올바르지 않은 요청이라면 시스템 콜은 실패하게 된다. 시스템 콜을 통하지 않고 프로세스에서 직접 CPU모드를 변경하는 방법은 존재하지 않는다. 만약 있다고 하면 커널이 존재할 의미가 없다. 예를 들어 악의적인 사용자가 프로세스에서 CPU를 커널 모드로 변경해서 직접 장치 조작을한다면 다른 사용자의 데이터를 훔쳐보거나 파괴할지도 모른다.
[출처 - 그림으로 배우는 리눅스 구조 , 저 다케우치 사토루 ]
https://www.hanbit.co.kr/store/books/look.php?p_code=B9151150768
'CS지식 > 운영체제' 카테고리의 다른 글
하드웨어 레벨 - 메인보드 (1) 2024.01.30 리눅스 - 라이브러리 (2) 2024.01.14 운영체제 - OS, Operating System (0) 2023.11.02 서버 기술 기초 요약 - 리눅스 쉘 사용법 6 (0) 2022.05.01 서버 기술 기초 요약 - 리눅스 쉘 사용법 5 (0) 2022.05.01