[OS] System Structure & Program Execution , Process
-
System Structure & Program Execution
CPU
= Memory에있는 instruction을 실행하는 것 (항상 메모리와 상호작용) *instruction: 컴퓨터에게 일을 시키는 단위로서, 컴퓨터가 알아들을 수 있는 기계어로 이루어진 명령어
- 입출력 같은 요청을 cpu에서 필요로 하면 cpu는 메모리와만 상호작용하므로 직접 디스크나 입출력에 접근하는게 아니라 - 접근 요청을 시키면 디바이스 컨트롤러는 로컬 버퍼로 값을 전달한다.
- cpu는 성능이 매우 빠르고 IO 수행하는 것은 매우 느리기 때문에 cpu가 마냥 놀고만 있을 수 없기 때문에 다른 메모리의 인터럽트를 실행
CPU 내부 - interrupt line = 외부 디바이스나 이벤트에서 CPU의 주의를 끌고 중단된 작업을 처리 - mode bit = 메모리 내에서 os인지 사용자 프로그램인지 구분0 = 모니터 모드 , 커널 모드 (운영체제가 cpu에서 수행중일 때)1 = 사용자 프로그램이 cpu에서 실행 중 사용자 프로그램은 잘못된 수행으로 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치 - registers = 데이터를 처리하고 저장
만약 CPU에서 A의 IO 입출력 요청으로 무한한 대기를 방지하여 B를 실행하고 있던 중, IO 입출력 값이 로컬 버퍼를 통해 전달되어 cpu의 interrupt line으로 들어오면,
cpu는 다시 운영체제에게 사용권이 넘어가 해당 요청을 했던 메모리 영역에 copy를 해준 뒤, 현재 실행하고 있던 cpu에 있는 B에게 다시 제어권을 넘겨줌
하지만 인터럽트를 너무 많이 당해서 cpu에서 실행중인 프로그램의 제어권이 자꾸 os로 넘어오는 문제 -> 메모리에 cpu도 접근하고 DMA controller도 접근할수 있도록 함. -> DMA controller를 통해 IO 값을 메모리에 접근 -> 이때 두 개가 동시에 메모리가 접근했을 때 데이터의 혼란을 막기위해 memory controller가 중간 역할
DMA = 작은 일 하나 하나마다 cpu가 인터럽트 걸리면 cpu가 제대로 작동하지 못하여 만들어진 컨트롤러 = dma가 메모리에 copy를 해주고 어느정도 블럭에 해당하는 요청이 끝나면 인터럽트를 걸어 cpu에게 끝났다고 알려줌 = 빠른 입출력장치를 메모리에 가까운 속도로 처리하기 위해 사용
Device controller - 해당 I/O 장치 유형을 관리하는 일종의 작은 CPU - local buffer를 가진다. I/O는 실제 device와 local buffer 사이에서 일어난다. Device Controller는 I/O가 끝났을 경우 interrupt로 cpu에 그 사실을 알린다.
만약 메모리 내에서 프로그램이 계속 반복하는 활동이라면 cpu에서 계속 독점할 수도 있음. -> 메모리에서 cpu로 instruction를 넘겨주기 전에 timer로 값을 세팅 후에 cpu를 독점하는 것을 막음 -> cpu의 제어권이 사용자 프로그램으로 부터 os로 다시 넘어감 -> 그 후 다음 프로그램으로 똑같이 timer를 세팅한 후 넘겨줌 -> cpu를 다 사용하면 다시 자동 반납
사용자 프로그램은 어떻게 I/O를 하는가? -> 시스템 콜 : 사용자 프로그램은 운영체제에게 I/O 요청 (운영체제에게 뭔가를 부탁할 때 ) -> 현재 사용 중인 cpu의 mode bit가 1이므로 os에게 IO 요청 불가 -> 따라서 직접 사용자 프로그램이 interrupt line에 값을 걸어서 제어권이 os로 가게끔 한 뒤 , os는 디바이스 컨트롤러에게 IO 작동하라고 시킴 = trap을 통한 인터럽트 -> 올바른 I/O 요청인지 확인 후 I/O 수행
I/O 요청을 할때는 소프트웨어 요청으로 하고 다 끝났을 때 하드웨어 요청으로 인터럽트를 검. => 현대의 운영체제는 인터럽트에 의해 구동 됨 인터럽트 벡터 = 해당 인터럽트의 처리 루틴 주소를 가지게 됨
Interrupt (넓은 의미) - Interrupt (하드웨어 인터럽트): 하드웨어가 발생시킨 인터럽트 - Trap(소프트웨어 인터럽트) : Exception: 프로그램이 오류를 범한 경우 System call : 프로그램이 커널 함수를 호출하는 경우
동기식 입출력 (synchronous I/O) - I/O 요청 후 입출력 작업이 완료 된 후에야 제어가 사용자 프로그램이 다음 일을 할 수 있음
구현방법 1 - I/O가 끝날 때 까지 CPU를 낭비시킴 -매시점 하나의 I/O만 일어날 수 있음
구현 방법 2 - 동기화지만 cpu를 낭비하지 않기 위한 구한 방법 - I/O가 완료 될 때 까지 해당 프로그램에서 CPU를 뺴앗음 - I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움 - 다른 프로그램에게 CPU를 줌
비동기식 입출력 (asynchronous I/O) - I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
* 두 경우 모두 I/O의 완료는 인터럽트로 알려준다.
cpu 저장장치 계층 구조 위로 갈수록 빠르고 , 단위 공간 당 가격이 비싸 용량이 적음 위로 갈수록 휘발성 매체
primary = cpu에서 직접 접근 가능(바이트 단위로 접근 가능한), 실행 가능 Secondary = cpu에서 직접 접근 불가능 Caching = 밑에서 위로 읽어 들여 놓아 빠르게 저장해두고 사용,
실행파일 -> 프로그램의 가상 메모리 생성 (주소 공간 형성) -> 물리적인 메모리에서 프로세스로 올라감
*이때 가상 메모리의 주소는 모든 메모리주소를 다 물리적 메모리에 올리는 것이 아니라 필요한 부분만을 올려놓아 메모리 낭비 방지 (나머지는 swap area라는 곳에 저장)
Virtual memory(가상 메모리) code: cpu에서 실행할 기계어 data: 프로그램에서 사용할 자료구조 stack: 데이터를 저장해두었다 꺼내가는 용도
가상메모리의 주소를 물리적 메모리의 주소로 알맞게 올리기 위한 Address translation 사용
PCB: 시스템 안에 프로그램이 돌아가면 관리하기 위한 구조 - 커널의 data위치에 존재
사용자 프로그램이 사용하는 함수
1. 사용자 정의 함수 : 자신이 프로그램에서 정의한 함수 2. 라이브러리 함수 : 가져다 쓴 함수 , 자신의 프로그램의 실행파일에 위치
3. 커널 함수 : 운영체제의 프로그램의 함수 커널 함수의 호출 = > 시스템 콜을 통해 호출
쓰레드(Thread) = cpu를 구성하는 단위, 경량화된 프로세스
쓰레드의 구성 1. program 2. register set 3. stack space
Thread가 동료 쓰레드와 공유하는 부분 (=task) 1. code section 2. data section 3.
쓰레드 사용의 장점 1. 하나의 프로세스에 여러개의 스레드를 두면 하나의 스레드가 블럭 상태일때 다른 스레드에서 cpu를 잡고 런하여 응답시간이 더 빨라지는 장점 => 응답성 (ex. 텍스트를 먼저 보여주고 이미지를 나중에 불러올 때 화면에라도 먼저 보여줌) 2. 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상 3. 병렬성 높일 수 있음 (cpu가 여러 개 일 때) 4. 공유 자원 -> 똑같은 일을 하는걸 프로세스를 통해 각각 만들어버리면 자원 낭비 5. economy -> 프로세를 하나 만들거나 프로세스끼리 문맥교환을 하는 것은 오버헤드가 큼 , 쓰레도끼리 하는게 훨씬 오버헤드가 적음
쓰레드는 프로세스의 pcb에서 cpu관련 정보(program counter, registers) 만 개개인 별로 가지고있음
프로세스의 주소공간인 code와 data부분은 공유하고 stack부분만 쓰레드 1, 쓰레드 2, 쓰레드 3 이런식으로 나누어 가짐
프로세스의 생성 (자식 프로세스) - 자식프로세스가 부모프로세스 복제 후 프로세스의 트리구조 형성 -운영체제로부터 필요한 자원 받음
주소공간 : 자식은 부모의 공간을 복사
프로세스와 관련한 시스템 콜
fork() : 시스템 콜이 새로운 프로세스 생성 pid = 0 => 자식 프로세스 pid > 0 => 부모 프로세스
exec() : 시스템 콜을 통해 새로운 프로세스를 메모리에 올림 execlp () => 기존 프로그램을 잊어버리고 “”이라는 새로운 프로레스로 덮어 씌움 *절대로 되돌아올수 없음*
wait() => blocked상태로 만듬 (긴 작업을 하는 경우) ex) 부모프로세스를 fork()하여 자식프로세스를 만드로 부모 프로세스에 wait()시켜놓아 자식 프로세스가 작업을 완료할 때까지 중지시킴
exit() : 프로세스 종료 1. 자발적 종료 해당 statement가 더 끝난후 시스템 콜을 통해 프로그램을 명시적으로 적어주지않아도 메인 함수 리턴되는 위치에 컴파일러가 자발적으로 넣어줌
2. 비자발적 종료 부모가 자식 프로세스 강제 종료 부모가 종료되는 경우 자식도 같이 종료 키보드로 kill, break친 경우
프로세스 간 협력
1. 원칙적으로 독립적 프로세스 (하나의 프로세스가 다른 프로세스의 수행에 영향 x) 2. 협력적 프로세스
IPC: 프로세스 간 협력 메커니즘
- 메세지 전달 방법 : 커널을 통해 메시지 전달 (message passing) • direct(커널을 통해 사용하려는 프로세스 이름을 명시적으로 표시) , indirect (mailbox를 통해 메시지 간접 전달) - 주소 공간을 공유하는 방법 • shared memory (커널에게 공유메모리를 사용하겠다 알린 후 두 프로세스의 공유) • thread : 프로세스 간 협력으로 보기 오렵지만 프로세스를 구현하는 스레드 건에는 주소 공간을 공유