CS/운영체제

[os]운영체제

용감한 개복치 2022. 2. 10. 17:59

전에 썼던 글 그대로 이사왔습니다.

혹시 타임라인이 안맞다면 그것 때문입니다.

 

Reference

-Remzi H. Arpaci-Dusseau, Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces,

http://pages.cs.wisc.edu/~remzi/OSTEP/ , chapter 04

- 강의, 강의자료

key word = {process, abstraction, virtualization, overview}

프로세스란?

: 돌아가는 프로그램. os가 제공하는 가장 근본적인 추상화

프로세스가 작동하려면?

: 하나의 프로세스당 하나의 cpu 필요, 하지만 물리적 cpu는 제한된 개수.

>> 어떻게 cpu는 제한된 물리적 cpu 안에서 무한에 가까운 cpu는 제공하는가

>> virtualiztion, 가상화

( 책의 큰 줄기는 가상화(Virtualiztion), 병행성(Concerrency), 영속성(Persistence) 가지로 나누어 설명.

가상화는 cpu / memory 두 개를 위주로 설명 )

가상화란?

: os 가 하는일. 실제의 cpu를 빠르게 각 프로세스에 번갈아가며 할당해줌. time sharing 이라는 매커니즘 위에서 여러 정책들로 돌아감.

어떻게 가능?

: 항상 사용하지않기 때문에 cpu를 가상화 하는 것이 가능, 짧은 시간만 사용하기 때문에 memory를 가상화 하는 것이 가능.

* 프로세스의 판별

뭐가 프로세스 되고 있는지 알려면 기계상태에 대한 이해가 필요.

실행중인 프로그램이 읽거나, 업데이트 할 수 있는 것이 무엇인가.

* 프로세스가 포함하는 것

1) cpu 요소 (레지스터)

2) os 리소스 (주소공간, 파일들 기타 등등)

3) 그 외 정보(pid, 상태, 기타 등등)

* 기계상태에 대한 주요 구성요소

1) 메모리

명령어는 메모리안에 / 프로그램 실행시 여기에 읽고 쓰고 / 프로게스가 참조하는 주소공간(메모리)는 프로세스의 일부

2) 레지스터

명령이란 명시적으로 레지스터를 읽고 업데이트 / 명령 실행에 중요함 / 스페셜한 레지스터 (program counter 주소를 리턴함,

비슷한 기능으로 스택 포인터, 프레임 포인터 등이 있음. 지역변수, 함수 파라미터 를 넣는 스택을 관리하고 주소를 리턴함 )

3) I/O

* 프로세스의 과정

cpu 에서 pc가 코드(instruction list)에서 하나의 명령어를 지정, 메모리에서 fetch해오고, cpu에서 decode하고 execute 하면 다시 pc가 다음 명령어를 update함.

각각의 명령어를 실행할 때, 하나씩 물리적 cpu를 배정하는 것은 가능하나, 물리적으로 그 많은 cpu를 두는 것은 불가능.

코드 a를 실행하다가 도중에 b로 그 도중에 c로 넘어가는 방법도 가능하나, 그러러면 코드 a가 b로 넘어가라 는 명시적인 표현이 있어야함. 수많은 코드가 서로가 서로를 아는 것은 불가능

그래서 가상화가 등장, time sharing

a를 실행하다가 b를 시행하는데 이를 코드에서 코드로 넘어가는게 아니라 os가 중간에서 강제적으로 줬다 뺏기 반복. 사람은 눈치채지 못할정도로 빠른 속도의 연산을 하기 때문에 사람이 보기엔 동영상 보면서 블로그 글쓰기가 가능한것.

타임셰어링을 하는 방법 중에 현대에는 context switch 를 사용.

a에 cpu를 쓰다가 b에 쓰는 과정 == a의 상태정보를 기록하고 b 상태정보를 복구하는 과정 / 추후 자세히 설명

* 프로세스의 창조

프로세스 직전 원래 disk에 있던 코드, 데이터 등을 pc가 가르킬 수 있게 메모리(프로세스의 주소공간)로 올리는 것이 load 과정

초반엔 실행 전에 디스크를 몽땅 로딩했지만 요샌 프로세스 실행 중에 필요한 것만 로딩함, ==> paging, swapping 과정이 중요해짐

스택에 지역변수, 함수 파라미터, 리턴 주소값 등을 배정. 함수가 시작하면서 arguments(c언어에서 메인 함수에 argc, argv 배열 같은 그거)로 스택 초기화

프로그램의 힙 공간을 창조. 동적할당. 그래서 malloc 이랑 free 같은 힙을 시작하고 끝내는게 필요. 왜냐면 얘는 실행 중에 점점 쌓여서 메모리 관리가 안돼면 무한정 커질 수 있기 때문.

I/O 셋업, 기본적으로 3개의 오픈파일 디스크립터(입력, 출력, 에러)가 있음

함수 main()으로 넘어감 == 우리가 하려고 하는 그 동작들 수행 시작.

* unix에서 창조

fork()로 부모 프로세스를 복제, pcb의 ppid가 이 부모 프로세스의 id를 말함. 이걸 복제해서, 자식 프로세스가 만들어지면 얘는 리턴 0, 부모는 리턴 자식 pid 이걸로 둘을 구별. => 항상 파일이 tree 구조, 계층 구조를 가지게 됨, 단, 윈도우는 아님.

int fork()

exec()으로 실행

int execv (char *prog, char *argv[])

* 프로세스의 상태 / PCB안에 정보들을 포함함, 프로세스를 순간 스냅샷 찍는 것 처럼. PCB는 각 상태에 따라 상태대기열에 대기중

1) running : 돌아가는 중. 끝나면 종료

2) ready : I/O셋업은 완료했으나 모종의 이유로 돌아가지는 않는 상태

3) blocked : I/O셋업 작업 중일때, 즉 다른 프로세스가 돌아가고 있을 때, 별 다른 별도의 이벤트가 발생해야 ready 상태로 넘어감

#zombie : running 하던 프로세스가 끝났는데, 아직 데이터나 이런게 다 지워지지는 못한 상태

* 메커니즘 vs 정책

time sharing 이 매커니즘. 이 매커니즘 위에서 어떤 방식으로 우선순위를 정해서 뭐부터 실행할지, 언제 레디 런 블락 사이를 오갈지를 정하는게 정책

'CS > 운영체제' 카테고리의 다른 글

[Linux]입출력, 표준 스트림  (0) 2022.02.11
[Linux]패키지&프로세스  (0) 2022.02.10
[Linux] 리눅스 디렉토리 구조  (1) 2022.02.09
[Linux]_CLI 기본명령어(2)  (0) 2022.02.09
[Linux]CLI 기본명령어  (0) 2022.02.09