Open HunkiKim opened 1 year ago
{컴퓨터시스템하드웨어:{컴퓨터:{CPU, 메모리},외부장치:{입출력장치:[디스플레이, 키보드, 마우스, 터치패널..], 저장장치, 네트워크-어댑터}}}
strace
명령어를 통해 확인할 수 있다. strace -o ${저장할 파일명} ${프로그램 실행}
sar
명령어로 확인할 수 있다. sar -P ALL 1
- 1초 단위 측정, output 1줄당 cpu 1코어strace - T -o ${저장할 파일명} ${프로그램 실행}
<0.000014> : 14마이크로 초ldd
명령어를 사용해 확인 할 수 있다. ldd /bin/echo
시스템 콜은 CPU의 특수한 명령
을 실행해야만 호출됨
사용자 모드 —> 시스템 콜 —> 인터럽트 —> 커널 모드
커널은 프로세스가 요청한 내용을 처리하기 전에, 해당 요청의 유효성을 검증한다.
시스템 콜 외에 다른 방법으로 CPU 모드를 변경할 수 없음
strace
프로그램을 통해 추적 가능
-T
옵션
%system
의 비율이 너무 높으면
직접 호출이 불가능함
C 언어에는 ISO에서 정해진 표준 라이브러리가 있음
리눅스에서는 보통 glibc
를 표준 C 라이브러리로 사용
대부분의 C 푸로그램은 glibc
를 링크하고 있음
구성
많은 프로그램들이 의존
ldd
otool
이름 | 기능 |
---|---|
init | 시스템 초기화 |
sysctl, nice, sync | OS 동작을 바꿈 |
grep, sort, uniq | 텍스트 데이터 가공 |
sar, iostat | 성능 측정 |
gcc | 컴파일러 |
perl, python, ruby | 스크립트 언어 실행 환경 |
bash | 셸 |
X | 윈도우 시스템 |
컴퓨터 시스템이 동작할 때 하드웨어의 동작 순서
OS가 추상화된 디바이스 드라이버 프로그램을 별도로 가지고 있고, 때문에 각각의 다른 프로세스가 별도 디바이스 관련 프로그램을 할 필요 없이 디바이스와 통신할 수 있다. 또 OS는 프로세스가 디바이스 등에 직접 접근하는 것을 막기때문에 (해킹등의 이유로) 커널모드와 사용자 모드를 각각 운영한다.
커널은 메모리, 프로세스 등을 관리하는데 메모리를 나눠서 OS용, 프로세스0용, 프로세스 1용 등으로 관리하고있는 걸 보여주는 그림이 신기했다.
시스템콜, OS가 제공하는 라이브러리, OS가 제공하는 프로그램
프로세스는 프로세스 생성이나 하드웨어 조작같은 것들은 무조건 시스템 콜을 통해 커널의 도움으로 실행하도록 되어있다.
시스템 콜의 종류
프로세스에서 시스템 콜을 호출하면 interrupt가 발생하고 이경우 CPU 모드는 사용자 모드에서 커널모드로 변경된다. 커널 모드로 변경된 후 요청 받은 시스템 콜을 수행하고 다시 사용자 모드로 돌아가 프로세스를 이어서 수행한다.
$ strace -o hello.log ./hello
위의 명령어를 통해서 시스템콜 어떤것이 호출되었는지 알 수있다. 해당 내용은 -o 옵션으로 hello.log 파일에 저장되어있다.
시스템 콜은 프로그램 시작과 종료를 처리하는 곳에서 다수 발생되고, 파일 내에 내용을 print하는 기능이 있으면 해당 기능 또한 시스템콜을 호출한다. 어떠한 언어를 써도 비슷하다.
$ sar -P ALL 1 //1초 단위로 프로세스의 사용자 모드와 커널 모드의 사용 비율을 알수 있는 명령어
리눅스는 프로그램의 작성을 돕기위해 프로세스 대부분에 필요한 여러 라이브러리 함수가 있다.
시스템콜은 고급언어(C언어 등)에서 바로 호출하는 것이 불가하다. 어셈블리어를 사용해서 호출해야한다.
이것도 드라이브와 마찬가지로 OS가 없었다면, 각각의 어셈블리언어를 써서 고급언어에서 어셈블리어를 호출했어야 했을 것이다. 그러나 OS가 제공하는 시스템 콜의 wrapper 함수를 통해 고급언어에서 어셈블리어를 호출 할 필요가 없다.
C 언어는 표준 라이브러리가있는데, 리눅스에서도 이 라이브러리를 제공하고있다. (glibc)
os아키텍처 + 언어에 맞는 sdk(라이브러리)호출 -> 부가적인것들 + 시스템콜래퍼호출(어셈블리) -> 디바이스드라이버(추상) -> 디바이스 조작
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
write(1, "hello\n", 6hello ) = 6 <0.000042> close(1) = 0 <0.000038> close(2) = 0 <0.000033> exit_group(0) = ? +++ exited with 0 +++
OS가 제공하는 프로그램
OS가 제공하는 프로그램은 다음과 같다.