추상화를 하기 전에 복습을 하자면
앞에 내용을 정리해본다면
CPU
PC, 레지스터, condition Codes
PC(program counter) - 다음 인스트럭션의 주소를 가지고 있다.
레지스터 - 자주 사용되는 프로그램 데이터를 가지고 있다.
Condition Codes - 최근 연산 정보에 대한 상태 정보를 저장한다.(오버플로우인지.. 등등) - conditional branching에 사용된다..
ISA(Instruction Set Architecture)
프로그래머의 관점으로
데이터 흐름의 조직과 구별되는 상태 및 운영, 논리적 설계 및 물리적 구현 제어
를 하는 친구들
- 인스트럭션은 **레지스터와 메모리**를 건든다.
- 기계어를 몰라도 동작하게 하니 인터페이스라고 생각하자
메모리
- Kernal(OS), 스택, 힙, 스태틱 데이터, 리터럴, 인스트럭션(프로그램 코드)..
=>ISA의 크기에 따라 사용할 수 있는 메모리 바이트??
CPU가 32/64 비트일때 각 사용할 수 있는 메모리의 크기는?
>메모리는 주소 하나당 1 바이트의 크기를 가진다고 했다.
그렇다면 cpu가 32비트이면 32개의 주소 64비트이면 64개의 주소에 접근이 가능하다.
그래서 1 비트 (0과 1) 이니 32bit 일 경우 2^32 Byte의 주소를 사용할 수 있고
64 bit 일 경우 2^64 Byte의 주소를 사용할 수 있다.
그래서!! cpu가 처리할 수 있는 비트 수에 따라서 사용하는 명령어가 달라진다.
제한적인 cpu 자원을 무한대로 보이게 하는 것
왜?? cpu한대가 100명을 어떠캐 담당해..! => OS가 가상화를 일으켜!!
OS는많은 가상의 CPU가 존재하는 것 처럼 환상을 줄 수 있다.
Time sharing(시분할)
원하는 수 만큼의 프로세스를 동시에 실행할 수 있게 한다.
CPU를 공유하기 때문에 각 프로세스의 성능은 떨어진다.
중단한 프로세스들의 데이터(진행 결과)는 저장이 되어야한다.
시분할은 운영체제가 사용하는 가장 기본 기법이다. 자원을 많은 개체들이 공유한다. 이에 대응 되는 공간 분할(Space sharing)이 있는데 공간 분할은 개체에게 공간을 분할한다.
예를 들어 디스크의 블럭 하나를 파일에 할당하면 파일을 삭제하기 전에는 다른 파일이 그 블럭에 할당 되는 가능성을 줄인다.
가상화의 효율적인 구현을 위해서는 mechanism과 policy가 필요하다.
Mechanism
Policy
프로그램은 디스크에 존재한다. 이 프로그램을 프로세서(CPU)가 메모리로 올리면 프로세스가 되고 수행될 수 있다.
PCB- 프로세스 중지될 시 재 수행에 필요한 모든 정보를 저장하는 곳
Machine state(하드웨어 상태)를 이해하면 된다.
= 프로그램이 돌아갈때 무엇을 읽거나 업데이트 하는가?
메모리
레지스터
I/O 정보
프로세스의 하드웨어 상태에서 제일 중요한건 메모리이다. 그리고 레지스터도..
명령어, 실행하는 프로그램이 읽고 쓰는 데이터가 메모리에 저장되니
많은 명령어들이 레지스터를 읽거나 갱신하기 때문에
운영체제가 반드시 API로 제공해야하는 몇몇 기본기능이다.
컴퓨터 시스템의 두 개 이상의 개별 구성 요소가 정보를 교환하는 공유 경계
하드웨어/소프트웨어/유저 간 인터페이스
기능과 해당 기능의 유저 사이의 계층이다.
프로그램에서 상호간 상호작용하는 매체이다.
EX) 시스템 콜
프로그램 코드와 정적데이터를 메모리, 프로세슬의 주소 공간에 탑재(Load)
특정 크기의 메모리 공간이 프로그램에 스택용도로 할당되어야한다.
프로그램의 힙을 위한 메모리 영역을 Os가 할당한다.
OS는 입출력과 관련된 초기화 작업을 수행한다.
프로그램의 시작지점(entry point), 즉 main에서 프로그램 실행을 시작한다.
프로세스 상태를 단순화 하면 3개의 상태로 나타난다.
3-state
프로세스는 준비 상태와 실행 상태를 운영체제의 policy에 따라 이동한다.
실행에서 준비로 변환은 프로세스가 나중에 다시 실행 될 수 있는 상태임을 뜻함.
프로세스가 인터럽트로 대기상태가 되면 해결될 대까지 대기상태로 유지된다.
OS의 스케줄러에 의해 상태가 바뀐다.
New(creation)
Ready
Running
Blocked(Wait)
Exit(Terminated)
프로세스가 ready queue에 가기 전에 Admit을 받아야함!
New(created) state
Running state
Ready state
Blocked(wait,sleep) state
Terminated state
Zombie/Orphan state
프로세스는 일시적으로 메모리에서 디스크로 kick 될 수 있다.(Swap out)
그리고 메모리로 돌아온다(Swap in)
=> I/O가 발생하기 때문에 스와핑이 안일어나는게 좋다!!
운영체제도 일종의 프로그램이다. 다른 프로그램과 같이 많은 정보를 유지하기 위한 자료구조가 있다.
OS는 각각 프로세스의 정보에 대한 자료구조를 가지고있다.
PCB(process control block)
PCB의 정보
PCB의 정보는 OS 마다 다르다!
프로세스 리스트
Unix에선 프로세스를 생성하기 위해 fork() 와 exec() 시스템 콜을 사용한다.
wait()은 프로세스가 종료되기를 기다릴때 사용된다.
fork()
pid = fork();
if (pid == 0)
printf("child\n")
else
printf("parent\n")
함수 한번 호출하지만 return이 두번!
fork()는 부모 공간, 레지스터, pc를 복사해 자식 프로세스에 준다
부모와 자식은 같은 코드를 실행한다 -> concurently
부모 자식은 동일한 상태로 시작되지만, 각각 구분된다.
각각은 구분된 주소 공간을 지니지만, 각 변수는 fork() 전에 값으로 초기화 되기 때문에 같은 값을 가진다.
출력 파일디스크립터도 독립적으로 복사 댐(맞나...?)
출력의 순서가 딱히 정해지지 않음 (wait() 사용하면 제어 가능! 자식 죽을때 까지 기다리게 할 수 있으니)
fork()가 되면 프로세스가 2개가 된다!!
그럼 fork()가 n번 되면 프로세스의 개수??
2^n개의 프로세스가 생성됨
부모프로세스가 자식 프로세스의 종료를 대기해야 하는 경우도 있을 수 있다.
그럴때 wait()이 필요하다.
pid_t wait(int* status)
pid_t waitpid(pid, int* status,int options)
Idea
Reaping : child process를 제거하는 과정
만약 부모가 reap을 하지 않는다면?
자기자신이 아닌 다른 프로그램을 실행해야할 때 사용한다.
대부분 fork()로 자신의 복사본을 만든 후 실행한다.
왜?? 리턴값이 없어서 프로세스가 죽기때문~
현재의 프로세스에 실행할 파일데이터를 덮어쓴다!!
3줄 요약 부탁드려요