Operating System Structure
프로그램을 돌다가 IO를 사용하게 되면 CPU는 작동하지 않지만 그 동시에 다른 일을 하게 만들면 더 많은 일을 할 수 있게 한다는 것이 동기이다. Multiprograming의 중요한 성질은 IO를 기다리는 상황에서 CPU가 더이상 사용할 수 없는 상황에 Switching을 하는 것을 의미한다. Multiprogramming은 CPU가 IO를 기다려야 하는 상황, 즉 멈춰야 하는 상황에서 스위칭을 하는 것이다.
Multitasking == TImesharing
스위칭을 빨리하는 것을 의미한다. CPU가 하나 있고 친구 두명이서 각 프로그램을 돌린다고 해보자. 번갈아가면서 스위칭하면서 프로그램 2개를 돌린다고 하면 끊기지 않고 병렬처리 하는 기분을 들게 할 수 있다. Interactive한 컴퓨팅을 가능하게 한다. 일단 스위칭이 빨라야 한다. 일정 시간마다 스위칭을 한다는 차이점이 존재한다. 스케줄링의 개념이 필요하게 된다. 전체 시스템에는 여러 개의 프로그램이 있다. 디스크에 존재하게 되는데 일부를 선택해서 메인 메모리로 로드하게 된다. 선택하는 모듈은 운영체제의 일부이고 Job scheduler 라고 부른다. 제한된 리소스를 훨씬 더 많은 프로그램한테 나눠주는 것을 스케줄러라고 한다 ,정말 그 리소스를 사용하게 만드는 것을 스케줄러이다. 선택하는 모듈인 것. 두 가지 종류의 스케줄러가 존재한다. 디스크에서 메모리로 올리는 스케줄러 == Job scheduler 이고 가끔 실행이 된다.그래서 Long term scheduler라고 부른다. 두 번째의 스케줄러는 CPU scheduler라고 한다. Ready jobs == Ready Queue는 프로그램들이 기다리는 장소이다. 10개의 프로그램이 있다면 그 중에 하나를 골라서 실행을 해야 하는데 그것을 CPU scheduler의 역할이다. 1초에 100번 이상 실행되게 된다. shorterm scheduler라고 부른다.
Virtual Memory 9장에 나오는 내용
시스템의 Utilization을 위해서 메모리에 여러 개의 프로그램을 로드한다고 말했다.
메인 메모리에 4개의 job을 올렸다고 하자. 하지만 용량이 너무 부족하다. 그럼 5번째 Job을 로드할 수 없는데 그럴 때는 안쓰고 있는 job을 디스크 쪽으로 내려버리게 된다. 메모리의 부족을 보충하기 위해서 content를 디스크로 보내는 작업을 swapping이라고 한다. 적은 프로세스를 돌려서 사용하는 것을 의미한다.
Virtual Memeory는 swapping 에다가 더 복잡한 기능을 추가한 것을 의미한다. (아래서 계속 설명)
Virtual Memory
메인 메모리 용량보다 큰 프로그램을 돌릴 수 있는가? 하드디스크에는 더 큰 용량을 저장할 수 있다. 어플을 사용할 때 굉장히 큰 메모리의 용량을 쓰는 것과 같은 효과를 낼 수 있다. Physical 메모리가 메인메모리에 제한이 된다고 하더라도 디스크를 함께 사용하면 사용할 수 있는 느낌을 줄 수 있다. Multiprogram과 Multitask를 하면 여러 개의 메모리가 필요한데 이때 디스크를 활용해서 문제를 해결할 수 있다고 알고 있으면 된다.
Operating System Operations
여러 개의 프로그램이 공유된 Resource를 사용하면 어떻게 될까. 노래방에서 노래를 부를 때 누가 stop을 누르는 경우. 마이크를 독점하는 경우. 두 가지의 Issue가 생긴다. 리모콘을 특정한 사람이 안전하게 지키고 있어야 한다. 그 지키는 역할을 하는 것이 Kernel이 된다. kernel만이 stop 버튼과 번호를 누를 수 있다. Kernel이 리모콘을 가지고 있다는 것이 중요한데, 다른 사람이 그 리모콘을 누를 수 없다는 것이 제일 중요한 사실이다. 두 번째의 경우는 일정한 시간마다 손을 들어주는 장비 == 타이머가 존재한다.
위험한 Instruction == dual mode operation이라고 부른다. 일정 시간마다 term을 바꾸는 것을 타이머가 한다.
Dual Mode Operation
하나는 User mode이고 하나는 Kernel mode이다.
리모콘을 가지고 있으면 kernel mode이고 마이크를 가지고 있으면 User mode이다. Privileged Instruction이라는 것이 존재한다. 타이머를 건드릴 수 있는 명령은 아무한테나 주어지면 안됀다. 그런 명령들을 의미한다. user mode에서는 권한이 없다.
User mode에서 돌고 있고, Priviledged Instruction의 권한이 없으므로 IO Device를 사용하고 싶으면 OS의 kernel한테 부탁을 하게 된다. kernel mode로 실행을 해서 Priviledged Instruction을 사용해서 IO Instruction을 사용하게 된다. mode_bit가 0이면 Priviledged Instruction를 사용할 수 있다. Kernel mode로 가게 되면 Priviledged Instruction가 0으로 변환된다. Priviledged Instruction가 1로 변환되면 user mode로 안전한 모드에서 사용될 수 있다.
Advantage of dual mode operation
하나의 프로그램이 이상한 짓을 하더라도 다른 프로그램은 영향을 받지 않게 된다. Mode를 Violate하면 어떻게 되는가. 그때 Exception이 발생하게 된다. divide by 0와 같은 경우를 Exception이라고 부른다. 그 Exception이 interrupt인데 Interrupt가 발생하면 kernel이 Interrupt Handler를 사용하게 된다. Interrupt Handler는 Kernel의 일부이다. Kernel mode에서 작동한다. Exception -> Kernel -> Interrupt Handler (Abnormal Termination == 해당 프로그램만 죽인다). 이렇게 처리를 하게 된다.
Timer
하나의 프로그램이 CPU를 오래 잡고있는 것을 막기 위한 테크닉이다. CPU scheduler가 User process를 선택하려고 한다. 일정 시간 이후에 Interrupt가 날라가도록 Timer를 설정한다. 일정 시간보다 더 CPU를 사용하게 되면 Interrupt Handler가 Scheduler를 실행시켜서 Switching을 시킨다.
Multi-Mode Operation
Process Management
Process
프로그램을 눌렀을 때 실행되는 것을 프로세스라고 한다. (실행되고 있어야 한다) 기본적인 Job의 단위를 말한다. Acitve 한 entity를 의미한다. Resource를 포함한 개념이다. 변수는 프로그램의 일부가 아니라 데이터가 된다. 즉, 데이터 메모리를 차지하는데 그것 모두 프로세스에 해당하게 된다., Dynamic Block도 프로세스의 일부가 된다라는 것이다.
싱글 프로세스 프로그램은 프로그램 카운터가 하나이다. 10개의 프로세스가 기다리고 있다면 위치를 가리키고 있는 Address가 따로 저장되어야 한다. 이런 경우 PC는 10개가 존재해야 한다. 래지스터, 각 주소를 담고있는 추상적 설명이 된다. 스위칭을 할 때 다음 프로세스의 실행 주소를 PC에 넣어서 실행을 하게 된다.
일을 하는 Unit으로 Job이라고 불린다. 프로세스들은 다른 프로세스들로 부터 독립되도록 설정한다.
Thread
워드를 두 개 띄운 경우 프로세스는 2개가 돌아간다. 워드 하나를 프린트 하는 중 수정이 가능한가? 가능하다. 두 개의 흐름이 존재하고 있다. VSCode의 경우 내가 코딩을 작성할 때 계속 내 코드에 에러가 있는 지 확인하는 프로그램이 하나가 계속 돌아가고 있다. 흐름이 여러 개 존재한다. 하나의 프로세스 안에 여러 개의 Thread가 존재할 수 있다. Thread는 프로세스보다 작은 단위이다. Thread와 Process의 차이점은 Resource가 공유되는가 아닌가의 차이점이다. 워드를 보게 되면 하나의 파일은 다른 파일에 영향을 미치지 않는다. 프린트를 할 경우 두 파일 모두 접근할 수 있는데 이는 하나의 프로세스 안에서 두 개의 파일이 공유되고 있는 자원이기 때문이다. Thread 의 ID는 TID라고 불린다. word 하나에 Editing Thread와 Printing Thread 두 개 있으면 PC가 2개 존재한다.
Task
Linux의 경우 새로운 THread와 Process를 만들 때 공유 자원을 부분적 할당을 할 수 있다. 그래서 Task라고 퉁쳐서 부른다. Linux에서 많이 사용되는 말이다.
Process Management
제일 중요한 것은 프로세스를 만들어 내는 것이다. 하나만 빼고 모든 프로그램을 Kernel이 샐행을 한다. 메모리 빈 공간을 확보하고 프로그램을 로드하는 것이 프로그램을 시작할 때 필요하다. 프로세스를 만들기 위해서 PID가 필요하다. 프로세스가 만들어졌을 때 프로세스 정보를 다 저장할 수 있는 표가 있어야 한다. Process Control Block이라고 한다.
Ready Queue 실행할 준비가 된 프로세스가 실행을 하기 시작하고 Delete Process까지 진행되게 된다. 종료를 할 경우 kernel이 Interrupt Handler로 Ready Queue에서 거꾸로 꺼내고 전부 해제하는 작업을 해야 한다.
Suspend라는 것은 정지하는 것이다. pause 버튼이 suspend에 해당한다. (일시정지 버튼에 해당한다고 이해하면 됨)
Process Sychronization이라는 것은 Shared Resource를 사용하는데, 독점적인 사용이 아니므로 해당 정보를 맞추는 작업을 의미한다.
Process management
가끔 2개 이상의 프로세스가 하나 이상의 미션을 수행하는 경우가 있다. 두 프로세스는 협력을 해야 한다. 프로세스는 완벽하게 독립된 존재라고 했는데 서로 침범할 수 없는 관계이다. 소통이 안되는 것이다. OS가 기본적으로 두 프로세스에 대해서 어떤 기능을 통해서 통신을 가능하게 만들어준다. 그 기능을 Kernel이 제공한다. A라는 프로세스가 B라는 프로세스에 메시지를 발생할 수 있다.
프로세스에서 리소스로 가는 화살표는 해당 리소스를 필요로 한다는 것이다. 리소스에서 프로세스로 향하는 화살표는 해당 프로세스가 리소스를 이미 사용하고 있다는 것이다. 프로세스가 프로세스를 기다리는 상황이라는 것인데.. 불편한 이유가 밝혀졌다. A는 B를 기다리고 B는 A를 기다린다. 둘다 앞으로 나갈 수 없고 저 상태로 멈춰있는데 그 상태를 Dead Lock이라고 부른다.
Memory Management
여러 개의 프로그램이 돌아야 하는데 제한된 메모리를 사용하면서 돌아가게 된다. 메모리의 모든 정보를 OS가 가지고 있어야 한다. Keep track 해야 한다.