{"id":28572429,"url":"https://github.com/user20252228/operating_system","last_synced_at":"2025-06-10T20:34:15.427Z","repository":{"id":138422978,"uuid":"605655718","full_name":"user20252228/Operating_System","owner":"user20252228","description":"컴퓨터공학과 운영체제 정리입니다.","archived":false,"fork":false,"pushed_at":"2025-03-14T02:21:51.000Z","size":1906,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-19T11:43:58.592Z","etag":null,"topics":["operating-system"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/user20252228.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-02-23T16:10:52.000Z","updated_at":"2025-03-14T02:21:55.000Z","dependencies_parsed_at":"2025-03-18T02:27:15.441Z","dependency_job_id":"688232ff-3e2a-494c-bd1a-443bb0abe91c","html_url":"https://github.com/user20252228/Operating_System","commit_stats":null,"previous_names":["wonttan/operating_system","wonchihyeon/operating_system","chihyunwon/operating_system","mr-won/operating_system","chihyeonwon/operating_system","user20252228/operating_system"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/user20252228%2FOperating_System","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/user20252228%2FOperating_System/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/user20252228%2FOperating_System/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/user20252228%2FOperating_System/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/user20252228","download_url":"https://codeload.github.com/user20252228/Operating_System/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/user20252228%2FOperating_System/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259146222,"owners_count":22812187,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["operating-system"],"created_at":"2025-06-10T20:34:14.286Z","updated_at":"2025-06-10T20:34:15.399Z","avatar_url":"https://github.com/user20252228.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 리버싱용 운영체제 복습\n\n# Operating_System\n컴퓨터공학과 운영체제 정리입니다.\n\n### 23.06 운영체제 종강\n![image](https://github.com/chihyeonWON/Operating_System/assets/58906858/82797894-dcc4-49fa-9d94-c3467f37a64e)\n```\n운영체제의 의의, cpu 스케줄링 알고리즘, 디스크 스케줄링 알고리즘, 교착상태, 가상메모리, 파일 시스템 등\n유닉스,리눅스,윈도우 등 운영체제의 이론과 실제를 배울 수 있었던 과목\n```\n## 1.1 운영체제란?\n\n```\n운영체제란 Operating System(OS) 컴퓨터를 운영하기 위한 수법과 절차를 모은 소프트웨어 체계입니다.\n운영체제의 가장 기본적인 역할 중의 하나는 사용자로 하여금 하드웨어인 입.출력 장치를 편리하게 사용할 수 있게 하는 것이다.\n만약 운영체제가 없다면 일반 사용자는 키보드, 마우스, 모니터, 프린터 등을 사용할 수 없어서 컴퓨터는 무용지물이 된다.\n\n운영체제는 시스템 콜이라고 부르는 서비스 요청 접속 창구를 라이브러리 형태로 제공한다.\n사용자는 시스템 콜 라이브러리를 호출하는 프로그램을 작성하여 실행함으로써 운영체제가 제공하는 서비스를 받을 수 있다.\n자주 사용되는 운영체제 서비스는 미리 작성되어 시스템에 탑재되어 있는 프로그램을 실행시켜 호출할 수 있는데 이러한 프로그램을 시스템 명령어라 부른다.\n```\n\n## 1.2 운영체제의 유형(발전과정)\n\n### 1. 단일 프로그래밍 일괄 처리 시스템(Single-stream Batch(일괄로 묶다) Processing)\n```\n단일 프로그래밍 일괄 처리 시스템 환경에서 사용자는 컴퓨터에 접근할 수 없었으므로 프로그램을 천공 카드에\n작성하여 관리자에게 제출하였고, 운영체제는 오직 하나의 프로그램만을 적재하여 차례차례 실행시켰다.\n\n적재된 프로그램이 오직 하나 밖에 없었으므로, 사용자 프로그램이 입출력을 요구했을 때 운영체제는 입출력이\n완료될 때까지 프로세서를 기다려야 했으므로 허비하는 시간(Idle Time)이 많았다.\n```\n\n### 2. 다중 프로그래밍 일괄 처리 시스템(Multiprogramming Batch Programming)\n```\n다중 프로그래밍 일괄 처리 시스템에서는 사용자 프로그램을 동시에 여러 개 적재시켜 실행중인 프로그램이\n입출력을 요구하면 그 입출력 작업이 진행되는 동안에 다른 프로그램을 실행시켜줌으로써 프로세서의 유후 시간을 줄였다.\n\n그러나 적재된 프로그램들의 완료 시간이 다른 프로그램의 입출력 요구 빈도에 따라 큰 영향을 받으므로 각 프로그램들의 완료시간\n편차가 심하다.\n```\n\n### 3. 시분할 시스템(Time-Sharing System)\n```\n시분할 시스템은 여러 개의 프로그램을 짧은 시간(타임 퀀텀) 동안 조금씩 번갈아 가면서 처리함으로써 사용자에게\n시스템을 독차지하고 있다는 느낌을 준다.\n\n시분할 시스템은 다수의 사용자들이 단말기를 통해서 컴퓨터에 동시 접속하는 대화적 처리 환경에 적합하다.\n```\n\n### 4. 병렬 처리 시스템(Parallel Processing Systems)\n```\n병렬 처리 시스템은 여러 개의 처리기(CPU)를 이용하여 여러 개의 프로그램들을 병렬로 처리한다.\n병럴 처리 시스템의 목적은 성능 향상과 신뢰성 향상(결함 허용)에 있다.\n병렬 처리(Parallel Processing)은 어느 시점을 기준으로 보았을 때 2개 이상의 프로그램을 처리하는 것을 말하고,\n병행 처리(Concurrent Processing)는 어느 시점을 기준으로 보았을 때는 오직 하나의 프로그램만을 처리하지만,\n이들을 번갈아 처리함으로써 일정 기간 동안 결국 여러 개의 프로그램을 처리하는 것을 말한다.\n\n병렬 처리를 위한 다중 처리기 시스템은 분산 처리 시스템의 일종으로 강결합(Tightly-coupled System)이라 부르기도 한다.\n다중 처리기 시스템은 처리기들 사이의 버스 연결 방식에 따라 단일 공유 버스, 다중 버스, 크로스바 스위치 버스, 계층적 버스\n다중 포트 메모리 버스 등으로 분류된다.\n\n처리기들이 독립적이지 않고 주어진 기계 명령어에 대하여 서로 긴밀하게 협조하여 서로 다른 데이터에 대한 동일한 연산 처리를\n수행하는 다중 처리기 형태가 있는데 배열(혹은 벡터) 처리기가 그 대표적인 예이다.\n```\n\n### 병렬 처리 시스템의 종류\n```\n병렬 처리 시스템은 대칭형과 비대칭형으로 나뉘는데 대칭형은 CPU가 모두 운영체제를 이용하게 될 때(경쟁 상황일 때)\n역할의 범위가 동등하여 운영체제의 부담이 커지게 된다. \n\n이러한 운영체제의 부담을 줄이기 위해서 비대칭 시스템이 있는데 비대칭 시스템은 마스터-슬레이브 관계가 되어\n마스터인 경우에만 운영체제를 사용할 수 있게 되어 운영체제의 구현이 간단해지는 장점이 있다.\n하지만 마스터가 고장나면 대책이 없다.\n```\n\n### 4. 분산 처리 시스템의 일종인 강결합 시스템(시스템 버스, 메모리 등이용)\n```\n1. 단일 공유 버스 : CPU들이(처리기들)이 하나의 버스를 공유하여 메모리에 접근하므로 경쟁 구도, 배타적인 성향을 띠며\nCPU를 추가해도 성능은 갈 수록 저하된다. 어느 순간 없는게 더 나을 수도 있다.\n\n2. 다중 버스 : CPU가 여러 개의 버스를 공유한다. 1:1 느낌 하지만 모든 버스가 사용중이면 기다려야 한다.\n\n3. 크로스바 스위치 버스 : 교차 지점에 스위치를 갖다두어 물리적인 버스의 수를 줄였다.\n\n4. 계층적 버스 : 로컬 버스(Local Bus와 시스템버스(Global bus)로 나누고 전용 메모리 처리기를 로컬 버스에 두고\n커버가 안되는 메모리를 컴파일러가 배분하고 배치하게 된다\n\n5. 다중 포트 메모리 : 예로 CPU -\u003e VRAM -\u003e GPU 를 들 수 있다. VRAM은 포트가 두개로 CPU와 GPU와의 버스 경쟁 없이\nVRAM의 내용을 읽어서 모니터에 디스플레이할 수 있는 장점이 있다.\n```\n\n### 분산 처리 시스템(Distributed Computing Systems)\n```\n분산 처리 시스템은 독립된 시스템들이 버스가 아닌 네트워크로 연결되어 병렬 처리 환경을 제공한다.\n분산 처리 시스템의 목적 및 효과로서 성능향상, 자원공유, 신뢰성 향상, 점진적 확장 등을 들 수 있다.\n분산 처리 시스템은 위치 투명성, 접근 투명성, 고장 투명성, 중복 및 이동 투명성 등의 기능이 제공되어야 한다.\n(어디 있는 지,중복인지, 이동이 되었는 지, 고장이 났는 지를 사용자는 그 내용을 인식할 필요가 없다는 뜻)\n분산 처리 시스템은 네트워크로 연결되므로, 버스로 연결되는 강결합 시스템에 대비되는 개념으로\n약결합 시스템 혹은 클러스터 시스템이라고 부른다.\n분산 처리 시스템의 연결 형태에는 하이퍼 큐브, 완전 연결, 성형, 링형 등이 있다.\n```\n\n### 분산 처리 시스템의 연결 형태\n```\n1. 하이퍼 큐브 : 노드 간의 평균 거리가 짧고 경로 배정이 비교적 간단하다. 노드 하나의 연결된 노드 수를 n이라고 할 때 총 노드의 수는\n2의 n승이 된다.\n\n2. 완전 연결 : 모든 노드들이 직접 1:1 통신을 할 수 있도록 연결한 연결 형태이다. 사이트 간 통신 속도가 빠르고 연결 경로가 많아\n통신 신뢰성이 높다는 장점이 있다. 하지만 초기 설치 비용과 확장 비용이 크다.\n\n3. 성형 : 중앙에 중계 시스템을 두는 형태로 초기 설치, 확장이 쉽지만 중개 역할이 고장나면 안되서 신뢰성이 낮다.\n\n4. 링형 : 성형 연결의 단점과 장점을 절충한 형태로 연결 반경이 좁고 새로운 노드 추가가 용히하나 두 개 이상의 노드가 다운되면 전체\n네트워크가 양분된다.\n```\n\n## 컴퓨터의 주요 구성 요소\n```\n컴퓨터의 주요 구성 요소는 시스템 버스, 즉 어드레스 버스, 데이터 버스, 제어 버스 등 3 종류의 버스로 연결되어 있다.\n```\n\n## 주기억 장치(Main Memory)\n```\n주기억장치는 비트(Bit) 8개의 묶음으로 이루어진 바이트(byte) 단위로 주소가 배정된다.\n읽기 쓰기는 바이트 단위의 배수로 가능한데, 어떤 CPU는 한꺼번에 접근하려는 바이트들의 시작주소가 특정 조건을 \n만족하도록 하는 메모리 얼라이먼트(Memory Alignment)를 요구하기도 한다.\n```\n\n## 기계 명령어(Machine Instruction)\n```\n기계 명령어(Machine Instruction)은 연산코드(Operation code)와 피연산자(Operand)로 구성되고, 연산코드 부분의\n크기는 연산 종류의 개수를, 피연산자 부분의 크기는 최대 메모리 용량을 결정한다.\n\n피연산자는 연산코드에 따라 주소, 상수, 레지스터 번호 등 다양하게 해석된다.\n```\n\n## 기계 사이클(Machine Cycle)\n```\n기계 사이클은 CPU가 반복적으로 처리하는 동작의 패턴으로서, 명령어 인출(Fetch), 명령어 해석(Decode),\n피연산자 인출(Operand), 연산 처리(Execution) 주기 등 크게 4개의 주 스텝으로 구성된다.\n하나의 명령어 연산이 완료되면 CPU는 자동적으로 PC 레지스터가 가르키는 다음 명령어 처리를 개시한다.\n```\n\n## 레지스터(Register)\n```\n레지스터(Register)란 소량의 데이터를 특별한 용도로 저장하는 곳으로, 크게 CPU 레지스터와 특수 레지스터(SFR),\n입-출력 레지스터로 분류된다.\n\nCPU 레지스터는 주로 연산을 위한 피연산자의 임시 저장 용도로, 특수 목적 레지스터는 컴퓨터의 상태 설정 등 특수 용도로,\n그리고 입 출력 레지스터는 주변 장치와의 입 출력 창구 용도로 사용된다.\n```\n\n## 주소 지정 모드(Addressing mode)\n```\n주소 지정 모드는 피연산자를 해석할 수 있는 유형을 말하고, 직접(Direct), 간접(Indirect), 절대(Absolute)\n상대(Relative), 주소(Address), 상수(Constant) 관점에서 분류된다.\n```\n\n## 인터럽트(Interrupt)\n```\n인터럽트가 발생하면 CPU는 처리 중이던 명령어 순서를 보관한 후, 사전에 설정된 주소로 점프하여 새로운 처리를 시작하게 되는데,\n이 부분을 인터럽트 서비스 루틴(ISR: Interrupt Service Routine) 혹은 인터럽트 핸들러(Interrupt Handler)라 부른다.\n```\n\n## 인터럽트 벡터(Interrupt Vector)\n```\n인터럽트들은 고유의 번호에 의해 식별되고, 이들 인터럽트들에 대응되는 인터럽트 핸들러들의 주소가 표 형태로 기록된\n부분을 인터럽트 벡터(Interrupt Vector)라 한다.\n\n인터럽트 벡터는 CPU에 따라 고정된 경우와 설정 가능한 경우가 있고, 그 크기는 보통 수십 ~ 수백 개 정도의 인터럽트를 \n지원할 수 있다.\n```\n\n## 인터럽트 우선순위(Interrupt Priority)\n```\n여러 개의 인터럽트가 동시에 발생하거나, 인터럽트 핸들러 처리 도중 다른 인터럽트가 발생하면 CPU 우선순위에 따라\n처리 순서를 결정한다.\n```\n\n## 인터럽트 사이클(Interrupt Cycle)\n```\nCPU는 기계 사이클 마지막 주기인 인터럽트 사이클(Interrupt Cycle)에서 인터럽트 발생을 조사한다.\n```\n\n## 인터럽트 유형 \n```\n1. 디바이스 인터럽트 : 입출력 장치 등과 같이 CPU 외부 하드웨어로 부터 발생하고 대부분의 인터럽트가 여기에 해당된다.\n2. 오류 인터럽트 : 0으로 나누는 등의 연산 불가 상황에서 오류 인터럽트 루틴에 가서 대응한다.\n3. 소프트웨어 인터럽트 : 기계 명령어에 의해 프로그램에서 인위적으로 발생되는 인터럽트를 소프트웨어 인터럽트라 하고 \n트랩이라고 부르기도 한다.\n```\n\n## 이중 모드 연산(Dual Mode Operation)\n```\n사용자 모드(사용자 프로그램 실행 모드)와 시스템 모드(운영체제 실행 모드)가 식별되는 경우를 이중 모드 연산\n(Dual Mode Operation)이라 하고, 시스템 모드에서만 실행 가능한 기계 명령어를 특권 명령어(Privileged Instruction)라 한다.\n```\n\n## 입출력 장치\n```\n장치 구동기(IO Device Driver) : 상태, 명령, 데이터 레지스터, 키보드\n\n상태 레지스터 : 입력 장치인 경우 입력되어있는 가의 여부 표시, 출력 장치인 경우 이전 데이터의 출력이 완료 되었는가를 표시\n \n명령 레지스터 : 입력 혹은 출력의 기본 명령과 기타 해당 장치 고유의 명령을 저장함으로써 명령을 전달한다.\n\n비동기적 입력(키보드 등) : 언제 들어올 지 모르는 명령을 처리\n동기적 입력(디스크 등) : 입력 명령에 따라 입력\n\n출력은 언제나 동기적\n\n데이터 레지스터 : 입력된 데이터나 출력될 데이터를 보관한다.\n```\n\n## 입출력 장치의 식별\n```\nCPU에서 메모리에 접근하는 것(주소 공간을 식별\n\n식별 방법\n\n1. 메모리 대응 입출력 : 레지스터 이름 -\u003e 입출력 포트 번호(수치)\n메모리 접근 명령와 동일한 기계 명령어(load, save)를 사용하여 입출력을 진행함\n\n2. 격리된 입출력 : 메모리 주소 공간과 입출력 포트공간이 같을 때는\n입출력 레지스터가 주기억 장치 영역과 완전히 분리되어\n다른 기계 명령어(in, out)을 사용하여 입출력을 진행함\n```\n\n## 컴퓨터 저장장치\n```\n레지스터 : \n\n캐시 : CPU -\u003e Memory의 데이터를 복사해두어서 다음에 같은 데이터를 가져올 때는 캐시메모리에서 가져온다.\n캐시 메모리는 비싸서 10% 차지 캐시가 다 차면 오래된 데이터를 비우고 새로운 데이터를 넣는다.적으로 일반적으로는 캐시는 cpu와 주기억장치 사이에서 주기억장츼를 돕는 저장장치를 말한다.\n\n주기억장치 : DRAM (Dynamic Random Access Memory): 일정 시간 지나면 저장되어 있는 것이 점점 사라짐 주기적으로 읽어줘야 해서 속도의 제한이 걸린다. 직접도를 더 높일 수 있어서 사용함..... 속도가 느리고\n\nSRAM (Static Random Access Memory) : Refresh가 필요없고 전원이 공급되는 한 저장값이 안정적으로 유지된다. 속도가 빠르다.\n\n전자 디스크 : SSD(Solid State Disk) : 하드디스크와 DRAM의 장점을 갖춘 플래시 메모리 기술 기반의 디스크 \n\n자기 디스크 :\n\n광 디스크 :\n\n자기 테이프\n```\n\n## 직접 입 출력 \u0026 간접 입 출력\n```\n직접 입출력 : 운영체제가 응용프로그램과 하드웨어 사이에서 데이터를 가공없이 그대로 전달\n\n간접 입출력 : 운영체제가 응용프로그램과 하드웨어 사이에서 데이터를 가공해서 전달(대부분)\n\n문자단위 입출력 : 바이트 단위 입출력(키보드, LAN 등),\n\n블록 입출력 : 디스크의 512바이트 단위 입출력과 같이 일정한 크기의 블록 단위 입출력\n```\n\n## 프로그램 입/출력\n```\n한 번에 이루어 질 수 있는 입출력량은 주변장치에 따라 다르나, 일반적으로 단말기와 같이 1바이트 단위로\n이루어지는 경우를 문자 입출력 장치, 하드 디스크와 같이 수십~수백바이트 단위로 이루어지는 경우를 \n블록 입출력 장치라고 함\n```\n\n## 프로그램 입출력 혹은 바쁜 대기 입출력(Programmed I/O or Busy Waiting I/O)\n```\n운영체제(CPU)가 입출력 상태 레지스터 값을 지속적으로 읽어서 입 출력의 진행 완료 유휴 등의\n상태를 확인하여 완료나 유휴 상태가 되면 입출력을 진행\n```\n\n## 인터럽트 기반 입출력(Interrupt-driven I/O)\n```\n운영체제는 입출력 명령 레지스터에 입출력 명령을 기록한 후 다른 사용자 프로그램으로 점프함으로써\n입출력이 진행되는 동안 CPU는 다른 일을 수행. 입출력이 완료되어 CPU에게 인터럽트가 전달되면\nCPU는 해당 인터럽트 핸들러에서 다음 입출력을 진행한 다음, 수행 중이던 원래 사용자 프로그램으로 복귀\n```\n\n## DMA 입 출력(DMA I/O) \n```\n운영체제는 입력 버퍼나 출력 데이터의 주소, 입출력 데이터 크기, 입력 혹은 출력 명령 등 세 가지를 DMA 처리기에\n설정하고 다른 사용자 프로그램으로 점프. DMA는 CPU 대신 인터럽트 기반으로 입출력을 진행하고, 전체 입출력이\n완료되면 CPU에 완료 인터럽트를 전달\n```\n\n## 입출력 채널\n```\n여러 개의 입 출력 장치를 관장하여 입출력을 처리하는 처리기를 입출력 채널이라고 하고,\n실렉터 채널, 멀티플렉서 채널, 블록 멀티플렉서 채널 등 세 가지 유형이 있음\n(DMA는 하나의 장치만 관리할 수 있는 단순 입출력 채널이라고 보면 됨)\n\n실렉터 채널(Selector Channel)은 입출력 명령을 하나씩 받아 처리, 즉 여러 장치에 대한 동시 입출력을 하지 않는데, \n그 이유는 입출력 장치들의 속도가 디스크와 같이 고속이기 때문임\n\n멀티플렉서 채널(Multiplexor Channel)은 입출력 명령을 여러 개 받아서 동시 진행 가능 \n장치들이 키보드, 프린터 등과 같이 저속인 경우에만 가능\n\n블록 멀티플렉서 채널(Block Multiplexor Channel)은 여러 개의 입출력 명령으로 구성된 명령어 집합(Block)을 받아 \n자동으로 차례차례 처리. 실렉터 채널과 멀티플렉서 채널 양쪽의 특성을 모두 가짐)\n```\n\n## 프로세스의 정의\n```\n프로세스 : 프로그래밍 언어로 작성된 후, 운영체제의 도움으로 주기억장치에 적재되어 실행중인프로그램\n```\n\n## 운영체제가 관리하는 프로세스 속성들\n```\n프로세스 고유번호(PID), 프로세스 메모리 정보, 프로세스 상태, 프로세스 진행지점,\n프로세스 문맥, 프로세스 우선순위, 프로세스 자원목록, 회계정보 등\n\n프로세스 문맥(Process Context) :  현재 진행중인 프로세스의 연산 명령어들에 의해\nCPU 안에서 생산되어 보관 중인 값들을 프로세스 문맥이라고 한다.\n\n문맥은 CPU가 진행 중이던 프로세스를 떠날 때 보관되었다가 나중에 처리를 재개하기 직전에\n복원되어야 한다. 이를 문맥 교환이라고 한다.\n```\n\n## 프로세스 관리 블록\n```\n프로세스가 운영체제에 의해 하나의 관리 개체로 등록됨을 의미한다. \n운영체제가 프로세스 관리를 위해 필요한 모든 정보를 기록하는 표를 PCB라고 하는데, \n그 수는 곧 생성 가능한 최대 프로세스 수를 의미한다. \nPCB는 주로 위에서 언급한 전형적인 프로세스 속성들이 저장된다.\n```\n\n## 프로세스 상태 (상태 천이)\n```\n운영체제는 프로세스의 처리과정에서 프로세스의 활동에 따라 해당 프로세스를 적절한 상태로 천이 시킨다.\n실행 상태가 아닌 모든 프로세스는 해당 상태의 대기열에 관리된다.\n\n프로세스 상태\n준비 상태\n실행 상태 dispatch : CPU를 어디에 할당할 지 배정하는 행위 \n대기 상태 Block State CPU 입출력을 기다리는\n보류 상태 CPU 배정 대상에서 제외, 시간을 기다리는 \n대기-보류 상태 큐(대기열) FIFO 큐의 개념 1순위 대기 상태에서 너무 오래 있으면 보류 상태로 만든다.\n종료 상태 : 완료 요청을 받고 제거 준비로 메모리에 남아있는 상태를 좀비(Zombie)라고 한다.\n```\n\n## 스레드 (Thread)\n```\n프로그램이 실행되는 흐름 줄기\n보통 프로세스는 하나의 실행 줄기, 즉 하나의 스레드를 가짐(단일 스레드 프로세스)\n```\n\n## 다중 스레드 프로세스(Multi-thread Process)\n```\n운영체제의 요청으로 스레드가 여러 개가 있을 수 있다.\nCPU가 반드시 여러 개일 필요는 없음\nCPU가 하나이거나 여러 개일 경우에는 스레드를 병렬 처리됨\n\n1+2+3+4 하려고 했는데 1+2 를 하나의 스레드로 3+4를 하나의 스레드로 나눠서 한다.\n스레드가 각각 독립적으로 실행된다.(cpu가 하나씩 붙어서) -\u003e 병렬 처리 (처리 시간을 단축시킬 수 있음)\nCPU가 각자 기계 사이클을 실행한다.\n```\n\n## 스레드 생성 및 제거\n```\n운영체제에게 스레드 생성을 요청할 수 있다. pthread_create(스레드할 함수)\npthread_exit() 해당 스레드를 소멸 자동 변수는 참조하는 메모리를 별도로 분리해서 얽히지않지만\n전역변수에 여러 스레드가 접근할 때는 경쟁 상황이 발생한다.\nthread_join 스레드가 종료될 때까지 기다림 \n```\n## 새로운 프로세스 생성과 제거\n```\n새로운 프로세서(Child)의 생성은 이미 생성되어 실행 중인 다른 프로세서(Parent 프로세서)가 운영체제에게 요청함으로써 이루어진다.\n정상적인 프로세서 제거는 해당 프로세스 스스로가 운영체제에 요청함으로써 이루어짐\n\nfork 부모는 fork \u003e 0 자식은 fork = 0 if(fork = 0)이라면 새로운 프로그램을 적재하면 프로그램을 덮어쓰게 됨\n```\n\n## 4장 프로세스 및 스레드 관리 과제\n\n### prog_04_10.c\n![image](https://user-images.githubusercontent.com/58906858/230433497-18a1bf3f-660f-42e9-9a80-75fde3e9adcf.png)\n\n### prog_04_11.c\n![image](https://user-images.githubusercontent.com/58906858/230434198-f40abb34-dad9-4f7b-b2f5-59681d63909e.png)\n\n## 프로세스 간 통신(Inter-Process Communication : IPC)\n```\n프로세스들은 완전히 분리 독립되어 있어서 서로 간에 간섭하거나 정보를 주고 받을 수 없다.\n거대한 프로그램을 여러 개의 작은 프로그램으로 분리할 경우, 이들 사이에는 통신할 수 있는 수단이\n필요하게 되는데,이를 프로세스 간 통신(IPC, Inter-Process Communication)이라 부른다.\nIPC의 대표적인 예로, 파이프, 메시지 큐, 공유 메모리, 세마포, 소켓 등을 들 수 있다.\n```\n## 프로세스 통제(Process Control)\n```\n운영체제는 사용자에게 실행 중인 프로그램을 통제할 수 있는 수단을 제공한다.\n프로세스 통제의 전형적인 유형으로 강제 종료, 일시 중지, 실행 재개, 약속 처리, 우선순위 변경 등을 \n들 수 있다.\n유닉스 리눅스에서는 프로세스 통제를 위해 kill() 시스템 콜과 kill 명령어를 제공한다.\n```\n## 단계별 처리 스케줄링\n```\n장기 스케줄링 : 대기 중인 프로그램들 중, 먼저 시작시킬 프로세스를 선택\n중기 스케줄링 : 적재된 프로세스들 중, 처리를 잠시 보류할 프로세스를 선택\n단기 스케줄링 : 준비 상태의 프로세스들 중, CPU를 먼저 할당할 프로세스를 선택\n```\n## CPU 스케줄링 전략의 목표 및 기준\n```\n사용자 관점에서의 CPU 스케줄링 목표 지표 3가지\n응답(반응) 시간(Response Time) : 사용자 데이터 입력 후, 출력이 이루어질 때까지의 소요 시간(부분 시간)\n\n반환 시간(Turnaround Time) : 프로그램 제출(혹은 시작) 후, 끝날 때까지 소요되는 총 시간 (전체 시간)\n\n대기 시간(Waiting Time) : 프로세스들이 준비 상태로 대기열에서 기다린 시간의 총합\n\n시스템 관점에서의 CPU 스케줄링 목표 지표\nCPU 이용률(CPU Utilization) : 총 경과 시간 대비 CPU가 순수하게 사용자 프로세스를 수행한 시간의 비 \n-\u003e 시스템을 운영하기 위해 하는 쓸 때 없는 작업(문맥 교환 등)\n\n처리율(Throughput) : 단위 시간당 처리하는 프로세스의 개수\n\n사용자 관점과 시스템 관점의 CPU 스케줄링 목표 지표는 상호 배타적 관계에 있는 경우가 일반적임\n\n기타\n\n가용성(Availability) : 전체 시간(서비스 시간 + 고장 시간 + 유지 보수 시간) 대비 서비스 시간의 비율로서 신뢰성(Reliability)이나\n가동률과 유사한 개념이다.\n-\u003e 특정 자원에 대하여 즉시 접근할 수 있는 정도(즉시 접근 가능 빈도 비율)\n```\n## CPU 스케줄링이 이루어지는 시기\n```\n1. 프로세스가 입출력을 요구할 때(printf(), gets())\n진행 중이던 프로세스가 입출력을 요구하면, 운영체제는 입출력 진행 동안 마냥 기다릴 수 없으므로 다른 프로세스를\n선택해서 CPU를 보내야한다 \u003c- 비선점 CPU 스케줄링\n\n2. 프로세스가 종료를 요구할 때 (exit())\n프로그램의 진행 절차상 모든 처리가 끝나 종료를 선언하면, 운영체제는 다른 프로세스를 선택하여 cpu를 보내야 한다.\n\u003c- 비선점 CPU 스케줄링\n\n3. 높은 우선 순위의 프로세스가 나타났을 때 \n높은 우선순위의 프로세스가 입출력을 마치고 준비상태로 전환되면, 운영체제는 현재 실행중인 프로세스를 보류하고, 더 높은\n우선순위의 프로세스에게 CPU를 보낼 수 있다.\n-\u003e 선점 cpu 스케줄링\n\n4. 주어진 CPU 실행시간이 초과되었을 때\n현재 실행 중인 프로세스에게 허용된 최대 실행시간(타임 퀀텀, 타임 슬라이스)이 초과되었을때 CPU는 다른 프로세스를 선택하여 cpu를 보낼 수 있다.\n-\u003e 선점 cpu 스케줄링\n\n비선점(Non-preemption) cpu 스케줄링 : cpu가 실행하고 있다가 다른 프로세스로 가는 데, 그 이유가 프로세스 자체적으로 cpu가 필요 없어져서\n강제로 뺏은 게 아니다.\n선점(Preemption : 빼앗다.) cpu 스케줄링 : 자율적 CPU 반납 + 타율적 cpu 반납, 더 실행 할 수 있는 데 높은 우선순위나 실행 시간이 초과되는 경우와\n같은 환경에서 강제로 뺏은 경우.\n\n용어 : 계산 위주 성향(CPU Bounds) 프로세스, 입 출력 성향(I/O Bounds) 프로세스\n비선점형 CPU 스케줄링 : 입출력이나 종료 등에 의한 자율적 CPU 반납만 실행 - 초창기\n선점형 CPU 스케줄링 : 더 높은 우선순위나 프로세스나 시간 초과 등에 의한 타율적(강제적) CPU 반납도 시행 - 시분할 \n```\n## CPU 스케줄링 전략들\n```\n선입 선처리(FCFS : First-Come First-Served) 스케줄링 : 평균 대기 시간 : (0 + 30 + 33) / 3 = 21 평균 응답 시간 : (30 + 33 + 39) / 3 = 34\n호위 효과(Convoy Effect) 먼저 온 거를 먼저 처리하게 될 때 먼저 온 것이 많은 시간을 할애하면 그 뒤의 작은 작업은 손해\n\nFCFS(First-Come First-Served) : 비선점형 CPU 스케줄링으로 호위 효과에 의해 입출력 장치나 CPU 이용률이 낮아질 수 있다.\nCPU 버스트 시간 반응시간(CPU를 사용하는 주기)\n```\n\n## 최단 작업 우선(SJF : Shortest Job First) 스케줄링\n```\nSPN(Shortest Process Next) \n\nCPU 버스트가 가장 짧은 프로세스에게 cpu를 먼저 할당하는 전략 평균 대기 시간: (0 + 3 + 9) / 3 = 4, 평균 응답 시간 = (3 + 9 + 39) / 3 = 17\n비선점형 cpu 스케줄링으로, 평균 대기 시간 및 평균 응답 시간은 매우 우사하지만, CPU 혹은 입출력장치의 이용률 저하 현상과 큰 프로세스 에 대한 cpu 할당이 \n지연되는 기아(Starvation) 현상이 나타날 수 있다.\n\n기아(Starvation) 현상 : CPU 버스트 시간이 긴 프로세스는 짧은 프로세스보다 서비스를 못 받고 지연되는 상황이 계속된다.\n```\n## 최단 잔여 시간 우선(SRTF: Shortest Remaining Time First) 스케줄링\n```\nSRTF : SJF의 선점형 스케줄링 전략으로, 평균 대기 시간 및 평균 응답 시간을 더욱 개선하고 cpu나 입출력장치의 이용률 저하 현상을 억제하지만, 큰 프로세스의 기아 현상은 더욱 악화시킬 수 있다.\n```\n## 최고 응답률 우선(HRRF: Highest Response Ratio First) 스케줄링\n```\nSJF나 SRTF 스케줄링의 기아 현상을 예방하기 위하여, CPU 버스트 시간 대비 상대적 응답 시간인\n응답률이 높은 프로세스를 먼저 처리한다.\n```\n## 라운드로빈(RR: Round Robin) 스케줄링\n```\n대화식 시스템에 적합하고, 타임 퀀텀의 크기가 목표 성능 지표에 영향을 미친다.\n```\n## 다단계 큐(MQ: Multi-level Queue) 스케줄링\n```\nMQ는 프로세스 특성별로 준비 큐 독립적으로 운영하고, 각 준비 큐에는 서로 다른 우선 순위와 타임퀀텀을\n설정한다. 각 준비 큐 내에서는 fcfs, rr 등 다른 스케줄링 전략을 적용한다.\n```\n## 다단계 피드백 큐(MFQ: Multi-level Feedback Queue) 스케줄링\n```\n프로세스 실행이 타임 퀀텀을 소진하지 못하면 입출력 성향 쪽으로 높은 우선순위와 짧은 퀀텀을 부여\n타임 퀀텀을 모두 소진하면 계산 성향 쪽으로 낮은 우선 순위와 긴 타임 퀀텀을 부여합니다.\n```\n## 병행처리와 병렬처리, 그리고 경쟁상황\n```\n다중 프로그래밍 환경에서는 여러 프로세스들이 동일 자원(동일 변수)에 접근하기 위해 경쟁한다.\n접근 경쟁 상황은 병행 처리와 병렬 처리 형태의 두 가지 형태로 나타난다.\n```\n## 병행처리와 경쟁상황\n```\n병행 처리(Concurrent Processing) : 하나의 CPU가 여러 개의 프로세스를 조금씩 빠른 속도로 번갈아 가면서 처리하는 형태\n병행처리 경쟁 상황(Race Condition) : 공유 변수가 포함된 수식 계산을 완전히 마치지 못한 상태에서 CPU 스케줄링이 일어날 때 발생\n```\n## 병렬처리와 경쟁상황\n```\n병렬 처리(Parallel Processing) : 두 개 이상의 CPU가 여러 프로세스들을 분담하여 독립적으로 동시에 처리하는 형태\n병렬 처리와 경쟁 상황 : 병렬 처리 환경에서 공유 변수를 참조하는 프로세스들이 처리될 때 발생\n```\n## 임계영역과 상호배제\n```\n임계영역(Critical Section) : 프로그램에서 경쟁상황이 일어날 수 있는 부분\n상호배제(Mutual Exclusion) : 관련된 임계구역에는 오직 하나의 프로세스만이 진입하게 하는 것\n상호배제 장치의 요건 : 계속진행, 상호배제, 대기한정\n상호배제 장치는 소프트웨어와 하드웨어 등 두 가지 방법으로 구현할 수 있음\n```\n\n## 미완성 소프트웨어 상호배제 시도들\n```\n공통 깃발 체크 방법 : 기계 명령어 수준의 경쟁상황으로 인해 임계영역을 보호하지 못한다.\n```\n\n## 자기 깃발 표시 방법\n```\n자기 깃발 표시 방법 : 역시 기계 명령어 수준의 경쟁상황으로 인해 임계영역을 보호하지 못하거나, 아예 진입이 불가능함\n```\n## 차례 지키기 방법\n```\n차례 지키기 방법 : 상호배제 자체는 이루어지지만, 임계영역이 비어있어도 진입할 수 없는 경우가 발생한다. (계속진행을 만족하지 못한다, 대기한정 역시도 충족 X)\n```\n## 교착 상태(Deadlocks) \n```\n고장난 자물쇠 -\u003e 나가지도 못하고, 나오지도 못함\n진퇴양난 -\u003e 영원히 기다리는 상황\n주요 원인 : 고장이나 기타 이유로 인한 자원의 부족\n\n컴퓨터 자원의 유형 : 하드웨어 자원(cpu, 메모리)과 소프트웨어(세마포) 자원\n선점 가능한 자원과 선점 불가능한 자원(메모리 관점)\n공유 가능 자원(사운드 카드)과 배타적 사용 자원\n```\n## 컴퓨터의 자원 관리 모델\n```\n요청 -\u003e 사용 -\u003e 반납\n\n프로세스들은 운영체제에게 필요한 자원을 요청(malloc(), 객체 생정자 new(메모리 공간을 할당))\n자원 요청은 시스템 콜을 사용하여 이루어짐\n유닉스/리눅스의 대표적인 자원 요청 시스템 콜은 open(), 자원 반납 시스템 콜은 close(), free(), java는 다른 주소 를 가리키는 순간 원래 있던 자원(dangling 객체, garbage)을 자동적으로 반납함\n\n205쪽 두 프로세스 간 교착 상태 발생하는 이유 : p1 a.txt, p2 b.txt 처리하다가 p1이 a.txt 쓰다가 운영체제에게 b.txt 쓰려고할 때 p2가 쓰고 있기 때문에 p1은 b.txt를 달라고 계속 요청하는 상황(교착상태)\np2는 b.txt 쓰다가 운영체제에게 a.txt 쓰려고 요청할 때 p1이 쓰고 있기 때문에 p2는 a.txt를 달라고 계속 요청하는 상황(교착상태)\n```\n## 교착 상태(Deadlock)    \n```\n교착 상태의 필요조건 (조건필수) 공통적으로 나타나는 4가지 특징들\n\n4가지 특징이 있으면 교착상태가 될수도 안될 수도 있다.\n1. 자원의 배타적 사용(Mutual Exclusion) : 자원 공유 x 독점\n2. 자원의 점유 대기(Hold \u0026 Wait) : 자원을 가지고 있으면서 또 요청을 한다.\n3. 자원 비선점(No Preemption) \n4. 자원에 대한 환형 대기(Circular Wait) : 자원을 기다리는 관계가 환형을 이룬다.\n```\n## 교착 상태 예방(Prevention)\n```\n교착 상태 예방(Prevention) : 교착 상태가 일어나지 않게 하는 사전적인 처리\n1. 자원의 배타적 사용 조건 제거(X) : 컴퓨터 자원의 대부분은 배타적으로 사용되어야 함\u003c- 도입 불가\n\n2. 자원의 점유 대기 조건 제거 : 사용될 자원 전체를 한꺼번에 할당할 수 있을때까지 기다림\n여러 종류의 자원이 필요한 프로세스의 기아 상태 가능성\n자원을 미리 확보함으로써 활용도 저하 \u003c- 도입 곤란\n\n3. 자원의 비선점 조건 제거\n자원이 부족하면 이지 점유 중인 자원을 강제 회수\n롤 백(진행하다가 중간에 자원을 뺏아가는 비용이 크다.) 등 큰 비용 방안 \u003c- 도입 곤란\n\n4. 자원에 대한 환형 대기 조건 제거\n모든 자원에 일련 번호를 부여하고, 자원의 카테고리에서 자원을 쓸려면 내부적으로 순서에 관계없이 일련 번호 순서대로 자원을 확보하고 진행한다. 자원 점유 순서를 우선 확보한다. 현실적으로 적용할 수 있는 방안이다. \n```\n## 교착 상태 회피(Avoidance) 자원 요청할때 그때그때마다\n```\n자원을 할당할 때마다 그때그때 회피하는 방법)\n안전(Safe) 상태와 불안전(Unsafe) \n안전 상태 :  자원 할당이 이루어지더라도 교착 상태가 결코 일어나지 않는 상태\n현재 남은 자원이 부족하더라도 점유 중인 프로세스 종료로 자원이 반납되어 모든 자원 할당 요구를 만족하는 시나리오가 존재하면 완전 상태\n\n불안전 상태 : 자원 할당이 이루어진 후, 이후의 모든 자원 할당을 만족시킬 시나리오가 존재하지 않는 경우\n\n자원 할당 그래프의 예약 간선\n현재 요청된 자원을 할당했다는 가정 하의 자원 할당 그래프\n예약 간섭이 포함된 자원 할당 그래프로부터 안정 상태 여부 판별\n안정 상태가 아니라면 자원 요청 보류\n\nDijstra 은행가 Banker's algorithm\n\n현황 관리표로 자원에 대한 잠재 수요 및 재고 현황으로부터 안전 상태 판별\n\n주고 난 후에 상황 파악 재고가 없으면 다 불만족이면 거절을 해야한다.\np0가 2개 요청해서 만족이 된 경우에는 교착상태가 아니므로 허용해야 한다.\np0는 언젠가 프로세스가 끝나고 현재 할당량 3개를 p1에게 줘서 p1이 끝날 수 있고\np1이 끝나고 방출된 p2에게 주면 되니까 운영체제가 기다리게 한다.(영원히는 x)\n```\n```\n2023-05-18일까지 과제\n다음과 같이 과제를 제출하기 바랍니다.\n\n- 과제 내용 : 교과서 160쪽 prog_06_12와 185쪽 prog_06_62를 분석 및 실험한 결과를 보고서로 작성하여 제출\n\n  * 경쟁 상황 및 상호 배제 실험입니다.  \n\n  * 교과서 소스를 수정하거나 삽입한 부분을 첨부 파일에 파란색으로 표시하였으니 이를 반영하기 바랍니다.\n\n  * 스레드 관련 헤더 파일은 algo.gwnu.ac.kr의 유닉스 운영체제 기준이므로, 다른 유닉스나 리눅스에서는 잘 살펴서 수정하기 바랍니다.\n\n  * 실행 파일을 여러 번 실행하여 결과를 관찰합니다.\n\n- 제  출  일 : 5월 18일 목요일 수업 시간\n```\n## 단일 프로그래밍 메모리 관리\n```\n특징 \n메모리에 오직 하나의 프로세스만 존재\n굳이 논리주소와 물리주소를 분리하거나 이곳저곳에 분산 적재할 필요성 없음\n메모리의 사용자 영역에 연속 할당\n다만, 프로그램의 크기가 메모리 용량을 초과할 경우에 대한 처리 방안 필요\n\n운영체제 보호\n사용자 프로세스가 운영체제 영역 침범 방지\n경계 레지스터에 경계 값을 설정하고, 주소가 이 범위를 벗어나면 예외 발생으로 프로세스 중단시킴\n\n오버레이(중첩, Overlay)\n프로그램의 크기가 메모리 용량을 초과하는 경우 처리 방법\n프로그램을 여러 개의 작은 부분으로 분리\n분리된 부분을 필요할 때마다 동일 장소에 교체하여 적재(동적 적재, Dynamic Loading)\n개발자의 설계에 따라 운영체제에 요청하여 삭제\n즉 프로그램의 분리 및 운영은 소프트웨어 개발자의 설계에 의해 \n\n고정 분할과 가변 분할\n고정 분할 : 메모리를 몇 개의 부분으로 고정 분할하여 프로세스를 적재\n목적 코드들은 특정 분할을 목표로 작성되거나 임의의 분할에 적재될 수 있도록 재배치 가능(Relocation)하게 작성되어야 함\n\n다중 프로그래밍(Multi-Programming) 환경에서는 어떤 형태로든 메모리를 분할하여 할당해야함\n메모리를 분할하여, 프로세스를 하나의 분할에 연속적으로 적재하는 방법으로 고정 분할과 가변 분할이 있음\n\n운영체제 및 다른 프로세스 보호\n다중 프로그래밍 환경에서는 운영체제 뿐만 아니라 프로세스들끼리도 보호가 필요함\n각 프로세스별로 자신의 영역을 벗어나 참조하는 것을 방지하기 위해서는 주소의 상하한을 설정하여 관리해야 함\n즉 상하한 경계 레지스터를 활용함\n\n고정 분할의 크기\n프로세스의 크기와 분할의 크기가 정확하게 일치하지 않아 메모리 일부가 낭비되는 내부 단편화(빈공간이 생겨서 남는 메모리가 남는)문제 발생\n내부 단편화를 최소화하기 위해서는 분할의 크기를 가급적 다양하게 함 (크기를 다양하게 해서 크기가 일치하는 쪽으로 주면 해소됨)\n분할을 너무 많게 하면 각 분할의 크기가 작아질 수 밖에 없음\n분할을 너무 크게 하면 분할의 수가 적어져서 다중 프로그래밍 정도(적재할 수 있는 프로세스의 수)가 낮아짐\n할당된 내에서 못쓰는 공간이 발생한다.\n\n가변 분할\n메모리 전체를 풀로 보고 필요할 때마다 정확한 크기로 분할하여 할당\n프로세스들이 분할된 할당 하나에 연속적으로 적재된다는 점은 고정 분할과 동일\n목적 코드들(프로그램들)은 (비어있는 공간이 어디에 있고 언제 빌지)어느 주소에 적재될 지 예측할 수 없으므로 반드시 재배치가 가능해야 함\n할당과 반납이 반복되면서 사용도가 극히 작은 빈 공간(홀 Hole)이 존재하는 외부 단편화 문제 대두\n메모리 군데 군데 작은 자투리로 비어있는 쓸모없는 공간이 발생할 수 있다.\n(병합과 통합 절차 필요)\n\n독립적으로 할당이 가능한 곳인데 못 쓰는 현상 외부에 독립적으로 낭비되는 공간\n\n가변 분할의 병합, 통합\n\n인접한 빈 분할들의 병합(Coalescing)\n할당되었던 분할이 반납되어 빈 분할이 되었을 때, 앞이나 뒤에 인접한 빈 분할이 존재하면 이들을 병합하여 하나의 큰 빈 분할로 관리\n외부 단편화 문제를 최소화시킬 수 있음\n\n분산된 빈 분할들의 통합(Compaction)\n여기저기 흩어져 있는 작은 분할들을 이동시켜서 하나의 큰 분할로 관리\n빈 분할 뿐만 아니라, 사용 중인 분할들도 이동이 불가피\n모든 프로세스들에 대한 실행을 중단하고 재배치 작업이 필요함\n사용하는 메모리를 위로 옮기거나 아래로 옮기는 등 이동해서 빈 공간을 합칠 수 있다.\n```\n## 가변 분할의 할당 정책\n```\n최적 적합(Best-fit) 할당 : 가장 가까운 거 가장 남는 공간이 적은 것\n\n최악 적합(Worst-fit) 할당 : 넣을 수 있으면서 가장 남는 공간이 많은 것\n\n최초 적합(First-fit) 할당 : 검색하는것도 시간 걸리니까 바로 넣음\n\n순차 적합(Next-fit) 할당 : 한 번 검색 한 다음에는 아까 할당한 것 다음부터 검색을 하는 방식 메모리 전체적으로 골고루 영향을 준다. 메모리 활용도가 고른 분포를 가지게 될 것이다.\n```\n## 비연속 할당\n```\n메모리 여러 군데를 합쳐서 총 사이즈만 맞춰주면 되는 할당\n\n페이징, 세그멘테이션\n프로그램을 원래 모양 그래도 적재하지 않음\n프로그램을 여러 개의 논리적 조각으로 분리하여 메모리의 이곳저곳에 분산하여 적재\n\n비연속 적재(할당) 정책\n\n프로그램의 일부만 적재하는 방버(가상 메모리)으로의 발전이 용이\n페이징과 세그멘테이션은 프로그램을 논리적으로 나누는 방법의 차이\n\n페이징\n개념 : 프로그램을 일정한 크기의 작은 조각으로 분리하고, 각각의 조각을 페이지(Page)라 함\n페이지의 크기는 운영체제 시스템에 따라 512 ~ 8k 바이트\n메모리 또한 페이지와 동일한 크기로 분할하여 각 분할을 페이지 프레임(Page Frame)이라 함\n프로그램의 페이지를 임의의 빈 페이지 프레임에 적재하고, 그 정보를 페이지 테이블로 관리\n페이지 테이블의 위치는 PTBR(Page Table Base Register)에 설정\n\n프로그램의 동일한 조각 페이지\n페이지와 동일한 크기의 메모리 조각은 페이지 프레임\n\n방법론 적재할 때 프로그램을 적재할 때 비어있는 페이지 프레임의 물리 메모리로 적재\n-\u003e 뒤죽박죽이니까 비연속 할당임\n\n페이지랑 프레임을 매핑하는 것을 페이지 테이블로 관리\n2번 번호를 가진 페이지는 몇번 프레임에 매핑이 되는지를 페이지 테이블로 관리한다.\n페이지 매핑 테이블\n\n논리주소 -\u003e 매핑\n\n0 ~ 999 0번페이지\n1000 ~ 1999 1번페이지\n2000 ~ 2999 2번페이지\n\n만약에 주소가 2475다 그럼 맨 앞자리 2를 보고 페이지 테이블을 보고 7에 매핑되네 \n2475를 7475로 바꿔주고 프레임 7번 주소를 본다. \n\n논리주소와 물리주소는 다르게 된다. 중간에 페이지 테이블에서 매칭되는 숫자로 주소를 변환하기 때문\n남은 짜투리는 어떻게 해석되는가 2번 페이지에서 475만큼 떨어지는 공간을 의미한다. \u003c- 이 개념을 offset이라고 한다. 또는 Displacement(변위) 즉 2번 페이지 시작점으로 부터의 거리가 475를 의미한다. 십진수로 해석한 것을\n\n2진수에서 offset 계산\n\n논리 주소의 물리 주소 변환\nCPU가 올린 논리 주소(기계 명령어 내의 피연산자 주소)는 MMU에 의해 대응되는 물리 주소로 변환됨\n논리 주소는 프로그램의 페이지 번호와 그 페이지 내에서의 거리로 구성됨\n즉 MMU는 논리 주소의 페이지 번호를 해당 페이지가 적재된 페이지 프레임 번호로 대치하면 됨\n1K = 10bit가 짜투리 부분\n2진수를 십진수로 변환하면 논리주소는 11277 = 1024 * 11 + 13\n\n페이징을 위한 MMU 메모리 관리 장치(Memory Management Unit)구조\nMMU의 절차에 따라 논리 주소를 물리 주소로 변환함\n페이지 크기가 2의 N이므로 페이지 번호, 페이지 내 거리, 페이지 프레임 번호를 다루기가 용이\n\n성능 개선을 위한 페이지 MMU 구조\n\n페이징의 가장 큰 단점은 메모리를 접근할 때마다 페이지 테이블을 참조해야 함 \n즉 두 번의 메모리 참조가 일어남 \u003c- 성능이 절반으로 저하됨\n이를 해결하기 위해, 한번 참조된 페이지 테이블 내용을 연관 메모리(Associative Memory) 소자로 구성된 TLB(Translation Lookaside Buffer)미리 보는 버퍼에 캐시시킴\nTLB 검색에서 실패한 경우에만 페이지 테이블을 참조\nTLB에서 성공한 비율을 적중률(Hit Ratio)라고하는데, 적은 용량으로 90%이상의 효과를 얻을 수 있음\n\n메모리에 접근할 때마다 TLB에서 성공하면 속도가 빠른 것 페이지 테이블을 참조하지 않고 TLB에서 참조하면 \u003c- 적중률 Hit ratio라고 한다.\nTLB (캐시 메모리에서 접근할 것인가) 페이지 테이블을 참조할 것인가\n\nTLB에서 참조하는 것이 더 빠르다. HIT RATIO 가 높다.\n\n페이징 시스템\n\n장점\n마지막 페이지에서의 내부 단편화 외에 단편화에 따른 메모리 낭비가 없음\n페이지 크기가 클수록 마지막 페이지의 내부 단편화는 커짐\n논리 주소와 물리 주소가 분리되므로, 모든 프로세스가 논리 주소 공간을 공유할 수 있고,\n재배치가 불필요함\n예를 들어 모든 프로그램의 목적 코드가 0번지부터 시작하더라도 대응되는 물리 주소는 다름으로 전혀 문제가 없음\n\n단점\n페이지 테이블을 위한 메모리 낭비가 존재함\n페이지 크기가 작으면 페이지 테이블 엔트리 수도 늘어나므로 페이지 테이블 크기도 증가함\n논리 주소의 물리 주소 변환을 위한 성능 저하가 존재함\n\n페이지의 보호와 공유\n페이지 테이블에 보호 비트(읽기, 쓰기, 실행 등)을 설정하여 해당 페이지 보호\n여러 페이지 테이블에서 동일한 페이지 프레임을 참조함으로써 여러 프로세스가 페이지 공유 가능\n즉 페이지 보호와 공유가 매우 용이함\n\n기계명령어 Text, 변수 Data, 지역 변수 Stack영역\n프로그램을 여러개 띄우면 기계명령어는 공유 즉 프레임 위치를 공유 \n데이터 부분만 프레임 위치를 다르게 설정하면 되니까 공유가 쉽다.\n\n공유 메모리 보안모드도 기계 명령어는 읽기와 실행만 가능하도록 쓰기는 불가능하도록하게 하고\n기계명령어가 fetch될 때 즉 실행될 때 페이지 테이블에 저장하도록 하게 해서 보안성을 높임\n\n세그멘테이션\n전체적인 할당 및 관리 방식은 페이징과 동일\n다만, 프로그램을 규격화된 페이지로 나누지 않고, 프로그램 이미지의 논리적인 특성에 따라 큰 덩어리 즉, 세그먼트 단위로 분리\n대표적인 세그먼트로 텍스트(Text), 데이터(전역 변수 부분), 스택(지역 변수 및 제어 스택 부분)등이 있다.\n각 세그먼트의 크기는 매우 다름\n따라서, 세그먼트 테이블에는 해당 세그먼트가 적재된 시작 주소와 크기를 명시\n\n세그먼트 번호에 따라서 MMU가 세그먼트 테이블에서 시작과 크기를 정해서 매핑하게 함\n페이징과 방식은 동일\n\n세그먼트의 보호 및 공유\n기본적인 방법은 페이징과 동일\n즉, 세그먼트 테이블에 보호 비트를 설정할 수 있고, 할당된 세그먼트를 여러 프로세스가 공유 가능\n세그먼트는 큰 덩어리를 따로따로 떼어서 적재한다.\n\n세그먼트의 장점\n페이지화된 세그먼트(Segementation with Paging)\n페이징의 단점은 적재 단위가 너무 작아 보호와 공유 관리를 위한 부담이 있음\n세그먼테이션의 단점은 가변 분할 방식의 메모리 할당 정책으로 외부 단편화 발생\n페이지화된 세그먼테이션은 분리된 각 세그먼트를 페이지 단위로 재구성하여 할당하고 적재함\n페이징과 세그먼테이션의 장점만을 취한 방법\n논리 주소에서 세그먼트 번호와 페이지 번호를 도출하고, \n세그먼트 테이블 및 페이지 테이블을 참조하여 물리 주소로 변환\n\n세그먼트 테이블 참조 -\u003e 그 세그먼트에 맞는 페이지 테이블을 참조 -\u003e 성능 저하(오버헤드)\n그것은 심각하지 않다. 변환하는 부분은 연관메모리(Associate Memory) 병렬로 메모리 매핑 (캐싱)\n한 번 참조된 부분은 locality PLB에 의해서 성능 저항이 페이징에 비해 떨어지는 게 없다.\n```\n\n## 가상 메모리(Virtual Memory)\n```\n사용자들이 실제 물리 메모리보다 훨씬 크게 사용하는 메모리\n프로그램 전체가 적재되어야 한다는 전체 하에서는 불가능\n프로그램 일부만 적재하려면, 프로그램의 분리 적재가 불가피\n페이징 기법에 기반\n프로그램의 적재되지 않은 부분은 디스크에 존재\n디스크와 메모리를 오가며 필요한 부분만이 적재됨(Swapping, 스와핑)\n```\n## 요구 페이징(Demand Paging)\n```\n페이징 기법의 확장으로, 페이지에 대한 참조가 일어날 때 실시간으로 적재\n페이지에 대한 참조 인식 및 적재는 인터럽트 매커니즘을 이용\n페이지 테이블에 해당 페이지의 적재 여부를 표시하고, 만약 적재되지 않은 페이지에 대한 참조가 \n일어나면 인터럽트(페이지 부재 트립, Page Fault Trap)가 발생\n해당 인터럽트 핸들러에서 페이지 적재(Swap in)\n참조가 일어나지 않은 페이지는 디스크에 저장하고(Swap out), 할당되었던 페이지 프레임 회수\n\n페이지 부재 트랩 처리 과정(ISR: 인터럽트 서비스 루틴)\n페이지 참조 시 부재 페이지일 경우 발생하는 인터럽트의 하나 (인터럽트 루틴은 운영체제 내에서) \n부재가 일어난 부분을 읽어들어야 한다.\n페이지 프레임을 할당하고, 그 곳에 디스크에 존재하는 해당 페이지를 입력\n부재 페이지 처리부담으로 인한 성능 저하는 불가\n```\n## 페이지 교체(Page Replacement) \n```'\n최적 페이지 교체 (OPT)\n개념 : 교체 대상 페이지로 이래에 사용되지 않거나 가장 오랫동안 사용되지 않을 페이지를 선택\nMIN(Minimal) 페이지 교체라고도 함\n미래를 예측하는 일은 불가능하기 때문에 구현 불가 \u003c- 비교 대상 방법으로서의 의미\n\nFIFO : 적제된 지 오래된 페이지를 선택하여 교체\n페이지별 적재 시간을 관리할 장치가 필요(큐 혹은 타임 스탬프)\n벨러디(Belady's anomaly) 모순 현상이 나타날 수 있음, \n\nNUR(Not Used Recently) : 근래 사용되지 않는 페이지를 선택하는 방법으로 '가장'이란 제한을 두지 않음\n즉, 가급적 근래 사용되지 않은 페이지를 선택하여 교체함\n근사 LRU(LRU Approximation)페이지 교체라고 부르기도 함\n\n기본 NUR 페이지 교체\n-\u003e 페이지 별로 참조 여부를 표시하는 참조 비트(Reference Bit)를 관리\n참조 비트를 주기적으로 청소\n일정 기간 동안 참조된 페이지와 참조되지 않은 페이지로 구분할 수 있음\n이중 참조 되지 않은 페이지 중에서 희생양(랜덤하게)을 선택함\n\n부가적 참조 비트(Additional Reference Bits) 사용 NUR 페이지 교체\n참조 비트를 여러 개 두어 보다 정교한 참조 패턴을 관리\n참조 회수 카운트 비트 사용\n이를테면 8개의 참조 비트를 두고, 시간대 별 참조 여부를 SHIFT로 표시\n00001111 : 초반 4번의 참조를 의미\n11110000 : 최근 4번의 참조를 의미\n결과를 8비트 정수로 보아 가장 적은 수의 페이지를 선택하여 교체\n\n변경과 참조 비트 사용 (R : 참조비트, C : 변경비트)\n페이지 하나 당 비트 두 개를 가지고 보호할 것인지 희생한 것인지를 결정\n변경 비트 : 적재된 후 변경이 있었는 지 표시 (디스크에서 올라온 페이지의 정보와 디스크의 정보를 비교해서\n페이지가 변경이 일어나면 디스크에 쓰기 작업이 필요한데 메모리에 페이지가 적재된 후에 변경이 없다면 \n디스크에 쓰기 작업이 필요 없다.) 변경이 있는 페이지를 희생양으로 삼는 것이 좋다.\n참조 비트 : 지난 일정 기간 동안 참조가 있었는지 표시\n변경 및 참조 모두 없는 경우(00), 단순 참조만 있는 경우(10), 변경만 된 경우(10)\n참조 및 변경 모두 있는 경우(11)로 분류하고, 그 결과를 2비트 정수로 보아 가장 적은 수를\n가진 페이지를 선택하여 교체\n\n희생양으로 삼아야 할 순위 (참조가 있으면 쫒아내면 안됨)\n\n참조와 변경이 없는 00 이 1순위\n참조없고 변경이 있는 01 이 2순위\n참조있고 변경이 없는 10 이 3순위\n참조와 변경이 있는 11 이 4순위 (보호)\n\n변경이 일어나는 경우 왼쪽으로 1 쉬프트\n참조가 일어나면 최상단비트를 1로, 참조가 안 일어나면 0 삽입\n앞쪽에 1인경우 최근에 참조가 많이 일어난 경우 -\u003e 쫒아내면 안됨\n뒤쪽에 1인경우 옛날에 참조가 일어난 경우 -\u003e 쫒아낸다.\n\n수가 크면 앞쪽 높은자리 수가 1인 경우가 많다 최근에 참조가 일어났다 -\u003e 보호해야 한다.\n수가 작다면 뒤쪽에 낮은자리 수가 1인 경우가 많다. 옛날에 참조가 일어났다. -\u003e 희생해야 한다.\n\n2진수로 바꾸면 큰 수면 보호, 작으면 희생\n\n2차 기회(Second Chance) 페이지 교체 (시계 페이지 교체)\n\nFIFO 교체 기법에서, 교체 대상인 페이지(가장 오래된 페이지)에 대한 참조가 있었다면 메모리에 머무를 수 있는\n기회를 최소한 한번 더 부여\n즉, 적재된 지 오래되었다고 해서 최근 한창 참조 중인 페이지를 교체하는 경우를 예방\n참조가 계속 이루어지면 메모리에 머무를 수 있는 기회가 계속 주어짐\n다만, 모든 페이지에 대한 참조가 일어났다면 해당 페이지를 선택하여 교체\n\nLFU(Least Frequently Used)와 MFU(Most Frequently Used)\n전체적인 참조 횟수를 기반으로 희생 페이지 선택(계수 기반 페이지 교체)\nLFU는 참조 횟수가 가장 적은 페이지를 선택 쓸모가 없는거 \nMFU는 참조 횟수가 가장 많은 페이지를 참조 쓸만큼 써서 쓸모가 없어졌다.\n참조 횟수에 대한 정확한 카운팅이 어려움\n\n최근 운영체제는 RC 변경, 참조 비트를 주로 사용한다.\n비트의 수에 대한 부담도 줄어들기 때문.\n```\n## 페이지 버퍼링\n```\n페이지 버퍼링\n페이지 교체 시점이 되어서야 희생 페이지를 선택하고 교체 작업을 진행하면 해당 프로세스의 \n진행 시간이 그만큼 지연됨 페이지의 부재를 해결할 수 있음\n평상 시 몇 개의 가용 (비어있는) 페이지 프레임을 미리 확보해 두면(풀, POOL), 페이지 교체 시간을 단축시킬 수 있음\n풀에서 할당된 수 만큼의 페이지 프레임은 사후에 희생 페이지를 선택하여 보충 (디스크 i/o가 한가할 때)\n페이지 클리닝(Page Cleaning)\n적재된 이 후 변경이 이루어진 페이지(Dirty Page)를 미리 디스크 복사본과 일치시켜(쓰기 작업, Cleaning 작업)\n풀로 관리하면, 페이지 교체 시 출력 작업이 불필요하여 페이지 교체시간을 크게 단축시킬 수 있음\n\n페이지 재할당\n페이지 풀에 관리 중인 페이지 프레임들이 어느 프로세스의 어느 페이지였는지를 관리 \n에 대한 적재가 필요할 때 그대로 할당할 수 있음\n```\n## 페이지 프레임 할당(Allocation of Page Frames)\n```\n페이지 프레임 할당 시 고려 사항\n각 프로세스에게 얼마만큼의 페이지 프레임을 할당할 것인가\n페이지 교체 시 희생 페이지를 어디서 구할 것인가?\n\n최소 할당 페이지 프레임 수\n\n기계 명령어(instruction) 구조 측면\n기계 명령어 자체의 크기 : 대부분의 기계 명령어는 2바이트 이상이므로 이들이\n두 페이지에 걸쳐 위치할 가능성이 높음 -\u003e 최소한 두 페이지 적재 필요\n\n피연산자의 최대 수\n기계 명령어의 피연산자가 두 개인 경우, 이들 피연산자들이 서로 다른 페이지에\n존재할 가능성이 있음 -\u003e 최소 두 페이지 적재 필요\n\n주소 지정 모드\n간접 주소 모드는 메모리를 두 번 접근하여 최종 피연산자 값을 얻음\n이 경우 직접 주소, 간접 주소가 서로 다른 페이지일 가능성이 있음\n피연산자 별로 두 페이지 적재 필요\n\n최소한 총 6페이지 이상이 적재되어야 함\n\n성능 향상 측면\n페이지 부재 처리는 상당한 처리 부담을 동반\n\n할당 페이지 프레임이 절대적으로 부족하여 페이지 부재 빈도가 높아지는 상황에서는 어떠한 \n방법으로도 보완 불가능\n\n즉, 페이지 부재 빈도가 적절한 범위를 벗어나지 않기 위해서는 최소한 페이지 프레임이 할당되어야 함\n\n최소한의 페이지 프레임 수를 찾는 방법으로 작업 집합 및 페이지 부재\n```\n## 균등 할당과 비례 할당\n```\n균등 할당 : 시스템 전체의 메모리 크기를 고려하여 모든 프로세스에게 동일한 수의 페이지 프레임을 할당\n\n비례 할당 : 프로그램의 전체 크기나 우선 순위 등 특정 지표를 기준으로 비례하여 할당\n불필요한 페이지가 적재되지 않도록 \n```\n\n## 지역 할당과 전역 할당\n```\n지역 할당\n희생 페이지를 해당 프로세스 내에서 구함\n이를테면 5개의 페이지 프레임이 할당된 프로세스에 페이지 교체가 필요하면\n이미 할당된 5개의 페이지 중에서 희생 페이지를 선택\n프로세스에게 할당되는 페이지 프레임 수가 일정하게 유지되므로 고정할당이라고도 함\n\n전역 할당\n교체할 페이지를 적재된 모든 페이지를 대상으로 하여 선택\n프로세스에게 할당되는 페이지 프레임 수가 줄어들거나 늘어날 수 있으므로 가변 할당이라고도 함\n다양한 요소를 고려할 수 있음\n자신의 처리시간이 영향을 받아 예측성이 떨어짐\n```\n## 스래싱(Threashing)\n```\n스래싱 : 페이지 부재가 너무 자주 일어나, 프로세스의 실행 보다는 페이지 교체에 더 많은 시간을 보내는 현상\n\n스레싱의 원인 : 다중 프로그래밍 정도(메모리에 올리는 프로그램의 수)가 너무 높아 \n프로세스에게 할당된 페이지 프레임 수가 너무 적음\n-\u003e 페이지 부재 빈도가 급격하게 높아짐 (너무 많은 프로그램을 메모리에 올리게 되면)\n\n스레싱의 예방 : 각 프로세스가 필요로 하는 최소한 페이지 프레임을 할당\n이를 위해서는 지역 할당 전략을 접목해야 함 \u003c- 작업 집합과 페이지 부재 빈도 이론\n```\n## 작업 집합\n```\n어느 프로세스가 특정 시간 동안 참조한 페이지들의 집합\nW(t, 델타t) : t~델타t ~ t 사이에 참조된 페이지들의 집합\n시간 t를 기준으로 델타t 동안 참조된 페이지들의 집합\n\n델타t동안 참조된 참조집합\n```\n## 파일 시스템\n```\n파일이나 폴더에 이름을 부여하여 사용자로 하여금 하드 디스크, USB, 메모리, CD-ROM, DVD 등과 같은\n저장 장치의 복잡한 하드웨어 구조에 관계 없이 편리하게 관리할 수 있또록 변환해 주는 운영체제 기능\n\n파일의 개념 : 종이 문서에 대응되는 컴퓨터 저장하는 문서의 저장단위\n파일 시스템에서 이루어지는 관리 단위\n\n파일의 속성들 : 파일 이름, 소유자, 보안 모드, 접근 시간, 파일 크기, 파일 공간\n\n파일과 디렉터리(폴더)\n운영체제는 파일들의 논리적 저장 체계를 디렉터리로 연결하여 구성\n현재 어떤 파일들이 보관되어 있는 지를 디렉터리에 관리\n즉, 디렉터리는 운영체제에 의해 관리되는 파일 정보를 보관하고 있는 특수 파일\n따라서, 디렉터리의 내용은 운영체제 만이 수정하고 변경할 수 있음\n다만, 디렉터리의 생성과 삭제는 사용자의 요청에 따라 운영체제에 의해 이루어짐\n사용자는, 운영체제가 작성한 디렉터리의 내용으로부터 파일들을 검색\n```\n## 경로명과 파일연산\n```\n경로명 : 파일시스템 내에서 어느 파일을 유일하게 지칭하는 문자열연결\n디렉터리 연결 체계 + 최정 파일 이름\n\n절대 경로명 : 뿌리 디렉터리부터 열거되는 경로명, 디렉터리 연결이 이루어질수록 경로명이 길어짐\n상대 경로명 : 현재 작업 중인 디렉터리부터 시작되는 경로명, 경로명이 짧아서 다루기가 용이\n```\n## 디렉터리 연산\n```\n디렉터리 연산 중, 개방과 읽기, 위치 조정 등은 파일과 동일한 연산을 사용한다.\n디렉터리 내용에 대한 사용자의 직접적인 출력(쓰기 및 변경)은 불가능하고, 파일의 생성이나 삭제 시\n운영체제가 자동적으로 해당 목록을 추가하거나 삭제함으로써 디렉터리의 관리를 대행해 준다.\n\n디렉터리의 생성과 삭제는 유닉스-리눅스의 mkdir(), rmdir()의 예와 같이 파일 연산과 식별되는 시스템 콜로\n이루어지고, 비어있지 않는 디렉터리는 삭제될 수 없다. 디렉터리를 생성하거나 삭제하기 위해 해당 시스템 콜을\n호출하는 프로그램을 작성하는 사용자들의 번거로움을 덜어주기 위해 일반적인 운영체제 환경은 그런 시스템 콜을\n대행해주는 명령어를 제공한다. 윈도우즈의 경우 마우스 우클릭 메뉴로 제공되고 리눅스, 유닉스의 경우\nmkdir, rmdir 명령어로 제공된다.\n```\n## 파일 타입\n```\n저장 바이트의 인코딩에 따른 분류\n텍스트(Text, 문자)파일\n문자를 의미하는 코드들을 저장하는 파일\n문자 코드는 아스키 코드, 유니 코드 등 다양함\n문자 코드에 따라 2바이트가 문자 하나를 의미하는 경우가 있음\n\n이진(바이너리, Binary) 파일\n이미지, 동영상 등과 같이 문자 코드가 아닌 0, 1의 비트 패턴에 의미를 두는 내용을 저장하는 파일\n한글이나 파워 포인트 등의 파일의 내용은 개념적으로 문서이지만 저장 내용에는 단순한 문자 코드 외에\n글씨체, 레이아웃, 색깔, 폰트 등 다양한 부수 정보가 0/1의 비트패턴임\n```\n## 파일 내용 접근 방식에 따른 분류\n```\n순차 접근(Sequential Access) 파일\n내용을 읽기 위해서는 반드시 처음부터 순차적으로 접근해야 하는 파일\n파일을 저장하고 있는 미디어나(a), 파일 내용 구성상(b) 어쩔 수 없는 경우\n\n예시 : 테이프, 불규칙한 규격의 레코드로 구성된 디스크\n\n직접 접근(Direct Access) = 상대 접근(Relative Access) 파일\n파일 저장 미디어나 내용의 구성상, 순서에 상관없이 파일 내 어떤 레코드라도 직접 접근할 수 있는 파일\n임의 접근(Random Acess) 파일이라고 함 \n예시 : 규격화된 규격이고 저장된 내용이 규칙적인 레코드일 때\n\n색인(Indexed Access) 접근 파일\nindex : 찾아보기, 첨자, 색인\n예시 : 색인파일(순차 접근) -\u003e 마스터파일(직접 접근)\n```\n## 디렉터리 구조\n```\n1단계 디렉터리\n시스템 전체적으로 디렉터리가 단 하나밖에 없는 경우\n관리되는 모든 파일들의 이름이 유일하게 식별되어야 함\n파일 이름이 길어지고 검색이 어려워 짐\n\n2단계 디렉터리\n사용자 목록을 관리하는 디렉터리와 사용자별 파일 관리 디렉터리로 구성\n사용자별로 파일 이름이 같아도 무방함\n각 사용자는 로그인 시 자동으로 자신의 디렉터리에 연결\n\n계층(트리, tree) 디렉터리\n디렉터리 연결 깊이가 3 이상으로 구성\n디렉터리의 자유로운 확장/축소 가능(운영체제는 디렉터리의 생성/삭제 서비스 제공)\n파일 시스템 내 모든 디렉터리와 파일들은 경로명으로 유일하게 식별함\n최상위 디렉터리를 뿌리(루트, root) 디렉터리라 함\n디스크를 초기화(포맷)하면 최초에 뿌리 디렉터리만 생성됨\n\n비순환 그래프(Acyclic Graph) 디렉터리\n파일/디렉터리 접근 경로를 여러 개 설정 가능\n장점 : 경로명을 단순화시킬 수 있음\n예 : 윈도우즈의 바로가기, 유닉스/리눅스의 심볼릭(Symbolic, Soft)링크, 하드(Hard) 링크\n```\n## 보안과 파일 보호(File Protection)\n```\n정보 보안의 목적\n비밀성\n무결성\n가용성\n\n정보 보안 서비스\n인증\n접근 제어\n데이터 기밀\n데이터 무결성\n부인 봉쇄\n\n정보 보안 매커니즘(방법, 수단)\n암호화 매커니즘(Encryption Mechanism)\n대칭키, 비대칭키 RSA 알고리즘\n\n접근 통제 행렬(Access Control Matrix) \n접근 주체(사용자)와 접근 객체(파일)을 행과 열에 나열하여 교차 지점에 접근 권한을 설정\n이 방법의 단점은 비어 있는 교차 지점이 많아 공간을 낭비\n\n접근 통제 리스트(Access Control List)\n접근 객체(파일)별로 접근 권한이 있는 사용자를 리스트 형태로 관리\n접근 통제 행렬의 단점을 보완하고 있으나, 공유 파일 등에는 모든 사용자를 나열해야 하므로\n여전히 비 현실적\n이를 해결하기 위해 대부분의 상용 운영체제는 접근주체를 '파일 소유지', '소유자와의 동일 그룹'\n'소유자와 관계없는 제 3자'등과 같이 간소화시켜서 적용\n유닉스/ 리눅스의 경우 모든 파일에 rwx 즉 총 9비트를 사용하여 사용자 별로 접근권한을 부여\n\n암호에 의한 파일보호는 파일마다 암호를 설정하여 접근 시 암호를 확인하도록 한다.\n접근 통제 행렬(Access Control Matrix)은 모든 파일과 사용자 사이의 접근 권한 관계를 테이블 형로 표시하므로\n그 용량이 매우 크다.\n접근 통제 리스트(ACL)는 파일별로 접근 권한이 있는 사용자들만을 리스트로 표시하여 접근 행렬의 단점을 보완한다.\n\n디스크 공간 구성\n마스터 블록(Master Block) : 512Byte\n물리 디스크 전체에 관한 정보 수록\n전형적으로, 디스크를 나누어 독립된 파일 시스템을 구축하기 위한 파티션 정보 기록\n보통 물리 디스크의 맨 첫 섹터에 위치\n\n부트 블록(Boot Blcok)\n파티션의 맨 첫 섹터에 위치\n해당 파티션에 설치된 운영체제의 부트 프로그램\nIPL(Initial Program Loader)라고도 함\n\n수퍼 블록(Super Block)\n파티션의 두 번째에 위치\n파일 시스템을 관리하기 위한 정보 기록(비어있는 블록들의 정보 등)\n\n디렉터리 블록(Directory Block)\n디렉터리 용으로 사용될 블록들\n\n데이터 블록(Data Block)\n파일의 내용 기록에 사용될 블록들\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuser20252228%2Foperating_system","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuser20252228%2Foperating_system","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuser20252228%2Foperating_system/lists"}