-
운영체제의 구성과 커널의 역할
-
운영체제는 커널과 기타 이것저것으로 구성되어 있음
-
커널은 스케쥴링을 담당
→ 보안, 자원관리, 디바이스 인터페이스 추상화 등
-
-
터미널과 터미널 에뮬레이터, 셸의 차이점
-
터미널은 CLI 인터페이스
→ 컴퓨터에 정보를 입력하고 출력하는 소프트웨어 및 하드웨어로써의 장치
-
터미널 에뮬레이터 ?
- 그래픽 환경에서 터미널을 묘사
-
셸 터미널 내부에서 터미널의 제어 접근을 도와주는 프로그램
-
-
기본적인 리눅스 명령어
- 기본은 많이 아는듯
- #(현재 로그인한 사용자가 최고 관리자 계정), 일반 사용자의 경우 $
shift + PgUp | PgDown
-
일부 주요 폴더들의 용도 및 내용물
/home
: 사용자별 홈 디렉토리들이 있는 곳/root
: 최고 관리자 계정의 홈 디렉토리/mnt
: 저장장치(HDD, SSD)가 붙는 위치/media
: 이동식 미디어(USB 드라이브)가 붙는 위치/tmp
: 재부팅 시 삭제될 임시 파일들을 저장하는 폴더/dev
: 컴퓨터에 연결된 하드웨어 및 가상 기기(device)들을 가리키는 파일들/proc
: 현재 실행 중인 프로세스들을 가리키는 파일들/etc
: 각종 설정 파일들/bin
: 실행 가능한 프로그램(binary)들/sbin
: 시스템 관리용 프로그램들/usr
: 다중 사용자 모드에서 사용 가능한 파일 및 프로그램들 (root 계정만 있는 단일 사용자 모드에서는 사용 불가)/var
: 캐시, 로그 등 시스템 구동 간 계속 내용이 바뀌는 파일들
우분투 → 리눅스
윈도우 → Windows NT
macOS → XNU
- 운영체제는 프로세스 컴퓨터의 전체 메모리 어디든지 쓸 수 있도록 하는 것이 아니라 가상 메모리로써 일부만 떼어서 제공해줌
- 다른 프로세스의 메모리 또는 운영체제 자체가 사용하고 있는 커널 메모리를 훔쳐볼 수 없도록 함
- 프로세스들이 서로 소통하기 위해서는 별도로 허용된 프로세스 간 통신 (IPC) 기법들을 사용해야함
- IPC 기법 : PIPE, Named PIPE(FIFO), Meesage Queue, Shared Memory(공유 메모리), Memory Map, Socket
- CPU 연산의 경우 코어 단위로 프로세스에 제공
- 프로세스는 스레드라는 단위로 코어를 하나씩 사용
- 프로세스가 하나 시작되면 기본적으로 하나의 스레드를 가지고 시작하지만, 개발자는 프로그램이 더 많은 스레드를 사용하도록 설계하여 다중 CPU 코어의 이점 극대화
- 프로세스는 운영체제가 메모리를 할당하는 작업단위, 스레드는 프로세스가 할당받은 메모리를 활용하는 실행단위
UID
: User ID, 프로세스마다 누구의 권한으로 실행되는가
TTY
: 프로세스(PID)가 붙어있는 teletype(터미널)
pts/n
: n번 가상터미널(pseudo teletype slave)
?
: 터미널에 부착되지 않은 프로세스들
- 프로세스가 커널에게 요청을 전달하는 기능
- 커널이 프로그램에 제공하는 인터페이스
- 각 프로세스는 커널을 통하지 않고서는 파일이나 장치, 또는 다른 프로세스에 간섭할 수 없음
kill
: 그 자체로 프로세스를 죽이는 명령어이 아니라, 프로세스에 신호를 보내는 명령어
- KILL 신호말고 INT(interrupt, ctrl+c), TERM(terminate) 신호도 있음
운영체제가 프로세스 단위로 사용하는 변수
동일한 이름의 프로그램이 여러 디렉토리에 설치되어 있으면, PATH
내 순서 상 앞에 있는 디렉토리의 프로그램을 실행
- APT(Advanced Packaging Tool)
- 운영체제가 공식적으로 제공
- 공인 저장소에서 프로그램과 라이브러리(다른 프로그램이 참조하여 사용할 수 있는 코드)
- 운영체제상: 우분투 apt,snap Centos YUM, Red Hat rpm 등등
- 프로그래밍 언어상: 파이썬 pip
개인용 컴퓨터 시대의 운영체제에도 그대로 남아있음.
특히, 유닉스 계열 운영체제들은 개인용 컴퓨터보다 서버용 또는 기타 산업용으로 쓰이는 경우가 잦기에, 다른 운영체제보다 사용자와 권한의 개념을 훨씬 더 자주 마주치게 됨
보통 우리가 사용하는 사용자 계정은 운영체제를 설치할 때 최초로 생성한 계정
최고 관리자: 윈도우-Administrator, 유닉스계열-root
사용자들이 여러 명 있을 떄, 쉽게 묶어서 관리하는 개념
한 사용자가 sudo
명령어를 실행하기 위해서는, 동일한 이름 sudo
라는 이름의 그룹에 속해있어야함
- 실제 현재 디렉토리와 상위 디렉토리 나타내는 거였음
그냥 사용하면 디렉토리의 소유자가 변경되고 -R
을 사용하면 디렉토리 내의 모든 파일들에 대한 소유자가 변경됨
실행하기(x)의 경우 프로그램이라면 실제 실행할 수 있다는 것을 나타내지만, 디렉토리의 경우 해당 폴더 안으로 cd로 이동할 수 있는지 여부
스마트폰 등 모바일 기기에 들어가는 CPU ARM사의 RIS
지원하는 명령어는 더 적지만 전력을 더 적게 소비하는 방향으로 설계
더 이상 칩을 만들지 않고, 설계만 만들어 라이센스를 판매
삼성전자(엑시노스), 애플(A11), 퀄컴(스냅드래곤) 등
초당 처리 속도 기준
요즘 나오는 CPU는 클럭이 4GHz에서 더 이상 발전하기 보다 동시에 더 많은 스레드를 처리할 수 있도록 코어를 늘리는 방향으로 제조
-
그래픽 연산장치
-
CPU 보다 이해할 수 있는 명령어는 훨씬 적지만, 코어 수를 훨씬 늘리는 방법으로 다차원 행렬에 특화
- ASIC (작업에 맞게 직접 설계), FPGA(그때그떄 회로를 직접 프로그래밍해서 사용)
- GPU를 쓰면 '연산'이 빨라져 딥러닝 모델이 무조건 빨라질 것 같지만 아님
- 데이터를 읽어오는 데 시간이 너무 많이 소요되고 있다면
- 저장장치 SSD로 변경
- 미리 여러 개의 스레드를 사용하여 RAM 메모리에 올려둠
아마존 - 한대의 물리적인 서버를 여러 개의 가상 서버로 쪼개어 판매
물리적인 서버를 임대하는 것이 아님
하나의 컴퓨터를 쪼개어 여러 대의 컴퓨터가 있는 것처럼 사용하게 하는 기술
호스트: 실제 물리적인 서버, 게스트: 그안에서 돌아가는 가상 서버
종류
가상머신 가상화: 게스트 자체에 운영체제가 돌아감
컨테이너 가상화: 호스트의 운영체제 커널을 공유 (커널의 기능만 공유하고, 프로세스나 자원 철저히 격리하며 간섭 X)
- 가상화가 무조건 클라우드 컴퓨팅과 함께하는 개념은 아님
- 아나콘다나 virtualenv는 클라우드 컴퓨팅과 크게 관계가 없지만 가상화의 한 종류
터미널 에뮬레이터에서 무언가를 복사하거나 붙여넣을 때에는 Ctrl+Shift+C
, Ctrl+Shift+V
를 사용해야 합니다.
history
명령에서 나오는 번호를 참고하여 !번호
를 실행하면 해당 번호의 명령이 다시 실행됩니다.
Ctrl+A
, Ctrl+E
를 통해 명령어의 앞, 뒤로 커서를 이동할 수 있습니다.
clear
명령어 또는 Ctrl+L
을 통해 기존에 터미널에 출력되었던 내용을 깨끗이 지울 수 있습니다.
실수로 Ctrl+z
를 눌러 프로세스를 중지시켰다면, fg
를 통해 다시 재개시킬 수 있습니다.
sudo apt install curl
및 curl parrot.live
를 통해 춤추는 앵무새를 볼 수 있습니다.( 클라우드에서는 작동이 안되니 로컬에서 테스트 해보세요 !)
2-8
코어 수마다 실행할 수 있는 프로세스와 쓰레드의 개수가 정해져있지 않을까?
- CPU가 n코어 m스레드라고 말하는데, n코어개만큼의 프로세스만 물리적으로 병렬적 실행이 가능한거고 (스케줄링)없이 동시에 실행 가능한 스레드의 개수가 프로세스 개수만큼인데 요즘은 프로세스별로 하나 이상의 스레드를 지원하시도함
2-9
- 터미널의 번호가 여러개 있고 프로세스에 붙어있다는 개념
2-10
2-11
환경 변수를 운영체제가 프로세스 단위로 사용하나?
→ 탭을 여러개 켜놓고 실행해보니 맞음
- zsh를 탭단위로 열때마다 CMD가 4개씩 생김 (왜지)
- export가 현재 환경으로 내보낸다, 그리고 env가 새로운 환경에서 실행한다는 무슨 의미일까?
2-13
- 모든 것들은 파일로 저장이 되어있는데 내 현재 위치가 어디인지 저장되어있는 파일은 어디에 이쓸까
2-18
셸에도 파이썬처럼 조건문과 연산자들이 있습니다. ||를 써서 이전 명령이 false를 반환한 경우에만 다음 명령을 실행하거나, &&로 이전 명령이 true를 반환한 경우에만 다음 명령을 실행할 수 있습니다.
→ 실험해봄 실제로 그럼