prgrms-web-devcourse / BE-Team-preArmand-Book-study

2 stars 2 forks source link

실습과 그림으로 배우는 리눅스 구조 1장, 2장 #54

Open HunkiKim opened 1 year ago

HunkiKim commented 1 year ago

1장

2장

시스템 콜

CPU의 모드 변경

평균값: CPU %user %nice %system %iowait %steal %idle 평균값: all 0.34 0.00 0.34 0.00 0.50 98.83 평균값: 0 0.34 0.00 0.34 0.00 0.67 98.66 평균값: 1 0.34 0.00 0.34 0.00 0.34 98.99

- user 부터 idle까지 모두 더하면 100이된다.
- 한 줄에 하나의 코어가 처리하는 것이다.
- all은 전체 평균치를 의미한다.
- 중요한건 사용자 모드를 실행하고 있는 시간의 비율은 %user + %nice의 합계로 얻을 수 있다.
  - 차이점은 4정에서 설명
- system 콜 처리는 %system을 보면 알 수 있다.
- %idle은 CPU 코어상에 프로세스도, 커널도 움직이고 있지 않은 idle 상태인 것을 의미하며 이는 4장, 나머지 필드는 3장에서 나온다.
- **무한루프 도는 코드를 실행하면 한 코어는 %user가 100인걸 알 수 있다.**
  - **그런데 만약 무한루프 도는 코드에 getppid() 시스템 콜을 하는 코드가 있다면 %user는 28, %system은 72인걸 확인할 수 있다.**
```c
int main(void)
{
    for (;;)
        getppid();
}

write(1, "hello\n", 6hello ) = 6 <0.000042> close(1) = 0 <0.000038> close(2) = 0 <0.000033> exit_group(0) = ? +++ exited with 0 +++


## 시스템 콜의 wrapper 함수
- OS의 도움이 없다면 고급언어로 어셈블리어로 써진 시스템 콜 호출 프로그램을 호출하고 커널에 요청을 한다.
- OS의 도움이 있다면 OS Wrapper함수를 통해 대응하는 시스템 콜을 호출해준다.

## 표준 C 라이브러리
- ldd를 통해 프로그램이 어떠한 라이브러리를 링크하고 있는지 확인 가능하다.
  - libc가 표준 c라이브러리이다.
```shell
ldd python3
    linux-vdso.so.1 (0x00007ffe2f3cf000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2a9ce67000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f2a9ce36000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2a9ce1a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2a9c400000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f2a9cf59000)

OS가 제공하는 프로그램

OS가 제공하는 프로그램은 다음과 같다.

kimziou77 commented 1 year ago

1. 컴퓨터 시스템의 개요

2. 사용자 모드로 구현되는 기능

epicblues commented 1 year ago

1장. 컴퓨터 시스템의 개요

2장. 사용자 모드로 구현되는 기능

시스템 콜

모드 변경

시스템 콜 호출의 동작 순서

시스템 콜의 wrapper 함수

표준 C 라이브러리

OS가 제공하는 프로그램

이름 기능
init 시스템 초기화
sysctl, nice, sync OS 동작을 바꿈
grep, sort, uniq 텍스트 데이터 가공
sar, iostat 성능 측정
gcc 컴파일러
perl, python, ruby 스크립트 언어 실행 환경
bash
X 윈도우 시스템
Leeyerimearth commented 1 year ago

1. 컴퓨터 시스템의 개요

컴퓨터 시스템이 동작할 때 하드웨어의 동작 순서

  1. 입력장치 혹은 네트워크 어댑터를 통해서 처리 요청이 들어옴
  2. 메모리에 있는 명령을 읽어서 CPU에서 실행
  3. 실행한 내용을 메모리에 적음
  4. 메모리에 적은 내용을 HDD or SSD에 적거나 네트워크를 통해 전달 or 디스플레이에 출력함
  5. 1번부터 내용 반복

OS가 추상화된 디바이스 드라이버 프로그램을 별도로 가지고 있고, 때문에 각각의 다른 프로세스가 별도 디바이스 관련 프로그램을 할 필요 없이 디바이스와 통신할 수 있다. 또 OS는 프로세스가 디바이스 등에 직접 접근하는 것을 막기때문에 (해킹등의 이유로) 커널모드와 사용자 모드를 각각 운영한다.

커널은 메모리, 프로세스 등을 관리하는데 메모리를 나눠서 OS용, 프로세스0용, 프로세스 1용 등으로 관리하고있는 걸 보여주는 그림이 신기했다.

2. 사용자 모드로 구현되는 기능

시스템콜, OS가 제공하는 라이브러리, OS가 제공하는 프로그램

시스템 콜

프로세스는 프로세스 생성이나 하드웨어 조작같은 것들은 무조건 시스템 콜을 통해 커널의 도움으로 실행하도록 되어있다.

시스템 콜의 종류

CPU의 모드 변경

프로세스에서 시스템 콜을 호출하면 interrupt가 발생하고 이경우 CPU 모드는 사용자 모드에서 커널모드로 변경된다. 커널 모드로 변경된 후 요청 받은 시스템 콜을 수행하고 다시 사용자 모드로 돌아가 프로세스를 이어서 수행한다.

$ strace -o hello.log ./hello

위의 명령어를 통해서 시스템콜 어떤것이 호출되었는지 알 수있다. 해당 내용은 -o 옵션으로 hello.log 파일에 저장되어있다.

시스템 콜은 프로그램 시작과 종료를 처리하는 곳에서 다수 발생되고, 파일 내에 내용을 print하는 기능이 있으면 해당 기능 또한 시스템콜을 호출한다. 어떠한 언어를 써도 비슷하다.

$ sar -P ALL 1 //1초 단위로 프로세스의 사용자 모드와 커널 모드의 사용 비율을 알수 있는 명령어

시스템 콜의 wrapper 함수

리눅스는 프로그램의 작성을 돕기위해 프로세스 대부분에 필요한 여러 라이브러리 함수가 있다.

시스템콜은 고급언어(C언어 등)에서 바로 호출하는 것이 불가하다. 어셈블리어를 사용해서 호출해야한다.

이것도 드라이브와 마찬가지로 OS가 없었다면, 각각의 어셈블리언어를 써서 고급언어에서 어셈블리어를 호출했어야 했을 것이다. 그러나 OS가 제공하는 시스템 콜의 wrapper 함수를 통해 고급언어에서 어셈블리어를 호출 할 필요가 없다.

표준 C 라이브러리

C 언어는 표준 라이브러리가있는데, 리눅스에서도 이 라이브러리를 제공하고있다. (glibc)

kimziou77 commented 1 year ago

os아키텍처 + 언어에 맞는 sdk(라이브러리)호출 -> 부가적인것들 + 시스템콜래퍼호출(어셈블리) -> 디바이스드라이버(추상) -> 디바이스 조작