[OS 2일차] 실행파일, process, multiprogramming, Virtual Memory, virtual address spaces, Life, Scope, variable, local variable, static variable, static local variable
04 Jan 2019
Reading time ~3 minutes
실행파일이란? (컴퓨터공학)
스크립트나 바이트 코드로 데이터와 코드화된 명령들을 수행하도록 하는 이진 파일
- 소스 코드로 개발 된 것을 compile을 한 후 실행을 할 수 있는 파일
- 그 팔일을 실행 할 때마다 새로운 인스턴스가 생긴다.
- 여기서 실행중인 인스턴스가 process
- 동일한 실행파일을 실행시켜도 두 인스턴스는 다른 프로세스에서 돌며 virtual memory 역시 따로 쓴다.
Process
실행중인 프로그램의 객체
- 여기서 프로그램은 무엇이든 될 수 있다.
- “컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음(집합체)” in wiki
- logical control flow
- 각 process들은 processor의 각각의 공간들을 가진다.
- virtual address space(가상 주소 공간)
- private address은 프로그램이 차지하는 공간이고, 코드, 명령어 다 있다.
- process 만의 virtual 메모리 공간(private address)을 따로 제공받는다. 그 용량이 꽤 크다
여기서 physical memory는 Multiprogramming과 Virtual Memory를 잘 사용해 마치 혼자 사용하는 것 처럼 logical 적으로 착각할 수 있게 한다.
Multiprogramming
- process들이 번갈아서 processor를 사용한다.
- 한번에 여러 시스템을 실행하는데, 각 프로세스들을 정해진 타임 슬라이스 만큼 잘라서 거의 동시 인 것 처럼 실행한다.(병렬 처리는 아니다.)
- 개발자는 이 가상주소공간 4G가 진짜 메모리인것 처럼 사용한다.
- 내 컴퓨터 RAM은 12G 인데 그럼 내가 실행할 수 있는 프로그램은 3개일까? -> 더 사용할 수 있다.
Virtual memory
virtual address space ≠ virtual memory
- Virtual Machine 안의 process의 virtual memory 들을 Virtual Machine의 Physical memory에 저장한다. 그리고 물리 메모리로부터 사용자 관점의 논리 메모리를 분리시켜 주 메모리를 균일한 크기의 저장 공간으로 구성된 큰 배열로 추상화 시켜 준다.
- 파일 공유를 쉽게 해주고 공유 메모리 구현을 가능하게 한다.
- 잘못사용시 성능이 저하
- cpu에는 tlb(virtual memory에서 필요한 operand를 caching 하는 것)을 통해 불러올 때 속도를 높일 수 있다.
- 프로그램의 virtual address 명령어가 physical address 어디에 저장될 지 모른다. 그냥 paging을 통해 random하게 넣어 놓는다.
virtual address spaces
process들은 각각의 virtual address space(메모리공간 x)를 가지고 있다.
- variable들의 위치
- global variable : read-only segment
- 모든 곳에서 access할 수 있게 하기 위해 memory에 넣는다.
- static variable : read-write segment
- dynamic data : run-time heap, user stack
- global variable : read-only segment
- stack은 함수콜이 될 때마다 생기는 frame을 담는 곳
- heap은 c에서는 malloc, 필요할 때 memory 줬다가 다쓰면 다 free.
- 자주 사용되는 모듈들은 shared library를 통해서 사용한다.(ex. print)
kernel은 하나만 올라와있고, 그걸 sharing하는 것이다. user-kernel 왔다갔따 하면서 실행한다.
참고 java, python의 경우 heap 영역에 저장을 할 수 있고, data, stack영역에는 저장은 불가능하다. stack의 경우 연산 시 heap으로 부터 register를 가져온 후 ALU로 넘겨 연산을 수행 한다. 연산 결과값은 operand stack에 먼저 저장 하고, register로 보낸 후 heap으로 보낸다.
Life (변수의 상태)
- memory에서 공간을 차지하고 있는지에 따라 변수의 상태가 결정된다.
- 만약에 scope 밖이라고 해도 memory에 있다면 live한 상태
Scope (변수의 범위)
- 현제 포지션에서 사용할 수 있는 변수가 scope 내에 있는 변수이다.
변수
local 변수
- 함수 안에서 쓸수 있는것
- 함수 밖에서는 scope안이 아니어서 변수를 읽을 수 없다.
- function 다시 call 하면 초기화도 다시된다.
Global 변수
- 함수 밖에서 정의된 변수
- 프로그램 전체가 scope인 변수
- 프로그램이 complete되면 variable의 life가 끝난다.
static 변수
- function 바깥인데 static 선언된 변수
- static의 scope는 file
- 그 정의된 파일 안에서만 사용될 수 있는 변수
- 다른 파일에서 그 변수를 불러도 안된다.
- 만약 library 안에서만 global변수로 사용하고 싶으면 그 때 사용하면 좋다.
static local 변수
- function 안에서 static으로 선언된 변수
- static local의 scope는 function
- function안에 다시 실행했는데 그 값을 전에 실행한 후의 값을 재사용하고 싶다. 글로벌 변수 안쓰고, -> static을 선언해 주면 된다.
- 왜냐하면 function 바깥으로 나가도 해당 변수는 memory에 존재하기 때문이다.
참고자료: 전체적인 글은 [KUOCW]최린_운영체제(160919) 강의를 들었습니다.
(url)https://www.youtube.com/watch?v=9bkuN7Fj-8o
(강의 slide)https://slideplayer.com/slide/14698319/
컴퓨터 프로그램 정의
https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8
실행 파일
https://ko.wikipedia.org/wiki/%EC%8B%A4%ED%96%89_%ED%8C%8C%EC%9D%BC
메모리 구조
https://m.blog.naver.com/PostView.nhn?blogId=premiummina&logNo=220696110624&proxyReferer=https%3A%2F%2Fwww.google.com%2F
가상 메모리
https://wayhome25.github.io/cs/2017/04/13/cs-15-1/