πŸ¦• κ³΅λ£‘μ±…μœΌλ‘œ μ •λ¦¬ν•˜λŠ” 운영체제 Ch.2

System Structures

챕터1μ—μ„œ 닀룬 μ‹œμŠ€ν…œμ— λŒ€ν•΄ 보닀 μžμ„Ένžˆ λ‹€λ£¨λŠ” 챕터인데, κ·Έλ ‡κ²Œ μ–΄λ ΅μ§€λŠ” μ•Šλ‹€. λ³΅μž‘ν•œ λ‚΄μš©μ΄ λ³„λ‘œ μ—†μ–΄μ„œ μ‰½κ²Œ 읽을 수 μžˆλ‹€.

Operating-System Services

μš΄μ˜μ²΄μ œλŠ” μ‚¬μš©μžμ™€ μ‹œμŠ€ν…œμ—κ²Œ λ‹€μ–‘ν•œ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•œλ‹€.

운영체제 μ„œλΉ„μŠ€ μ‹œμŠ€ν…œ ꡬ쑰.

  • UI(User Interface): UIλŠ” λ§κ·ΈλŒ€λ‘œ μ‚¬μš©μžμ™€ 컴퓨터 μ‹œμŠ€ν…œμ΄ λ§Œλ‚˜λŠ” 지점을 λ§ν•œλ‹€. ν‚€λ³΄λ“œ νƒ€μ΄ν•‘μ΄λ‚˜ 마우슀 클릭과 같은 ν–‰λ™μœΌλ‘œ μ‚¬μš©μžλŠ” 컴퓨터λ₯Ό μ‘°μž‘ν•  수 μžˆλ‹€. μΈν„°νŽ˜μ΄μŠ€λŠ” 크게 CLI(Command-Line Interface)와 배치 μΈν„°νŽ˜μ΄μŠ€(Batch interface), 그리고 GUI(Graphical User Interface)둜 λ‚˜λˆŒ 수 μžˆλ‹€. CLIλŠ” μ‚¬μš©μžκ°€ ν…μŠ€νŠΈ λͺ…령을 톡해 λͺ…령을 λ‚΄λ¦¬λŠ” μΈν„°νŽ˜μ΄μŠ€λ‹€. 그리고 μ΄λŸ¬ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μ…Έ(Shell)이라고 λΆ€λ₯Έλ‹€.κ³Όκ±° MS-DOSλ‚˜ μ• ν”Œμ†Œν”„νŠΈ 베이직이 CLIλ₯Ό 기반으둜 ν–ˆλ‹€. 배치 μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ…령을 νŒŒμΌμ— 넣어두고, 파일이 μ‹€ν–‰λ˜λ©΄μ„œ λͺ…령을 μ‹€ν–‰ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ‹€. CLIκ°€ 널리 쓰이기 이전, 40~60λ…„λŒ€ μ»΄ν“¨ν„°λŠ” μ΄λŸ¬ν•œ 방식을 μ‚¬μš©ν–ˆλ‹€. GUIλŠ” ν˜„μž¬ κ°€μž₯ ν”ν•˜κ²Œ μ°Ύμ•„λ³Ό 수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ‹€. GUI ν™˜κ²½μ—μ„œ μ‚¬μš©μžλŠ” ν‚€λ³΄λ“œ 타이핑, 마우슀 클릭, 손가락 ν„°μΉ˜ λ“± λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ 화면에 λ„μ›Œμ§„ κ·Έλž˜ν”½μ„ μ‘°μž‘ν•˜λ©°, 이λ₯Ό 톡해 μ»΄ν“¨ν„°μ—κ²Œ λͺ…령을 λ‚΄λ¦°λ‹€.
  • ν”„λ‘œκ·Έλž¨ μ‹€ν–‰(Program execution): μ‹œμŠ€ν…œμ€ ν”„λ‘œκ·Έλž¨μ„ λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•˜κ³ , 이λ₯Ό μ‹€ν–‰ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€. λ˜ν•œ ν”„λ‘œκ·Έλž¨μ€ μ •μƒμ μœΌλ‘œλ“  그렇지 μ•Šλ“  싀행을 끝낼 수 μžˆμ–΄μ•Ό ν•œλ‹€.
  • μž…μΆœλ ₯ λͺ…λ Ή(I/O operations): λ§Œμ•½ ν”„λ‘œκ·Έλž¨μ΄ μž…μΆœλ ₯을 ν•„μš”λ‘œν•œλ‹€λ©΄, μš΄μ˜μ²΄μ œλŠ” μž…μΆœλ Ή λͺ…령을 μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€. μ΄λ•Œ 효율과 λ³΄μ•ˆμ„ μœ„ν•΄ μš΄μ˜μ²΄μ œλŠ” μ‚¬μš©μžκ°€ 직접 μž…μΆœλ ₯ μž₯치λ₯Ό μ‘°μž‘ν•˜μ§€ μ•Šκ³ , μžμ‹ μ„ κ±°μΉ˜λ„λ‘ν•œλ‹€.
  • 파일 μ‹œμŠ€ν…œ μ‘°μž‘(File-system manipulation): νŒŒμΌμ„ μ“°κ³ , 읽고, λ§Œλ“€κ³ , μ§€μš΄λ‹€. λ˜ν•œ μ‚¬μš©μžκ°€ νŒŒμΌμ— μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 막기도 ν•œλ‹€.
  • 톡신(Communications): μ–΄λ–€ ν”„λ‘œμ„ΈμŠ€κ°€ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ™€ 정보λ₯Ό κ΅ν™˜ν•΄μ•Ό ν•˜λŠ” μƒν™©μ—μ„œ μš΄μ˜μ²΄μ œλŠ” 곡유 λ©”λͺ¨λ¦¬(Shared memory)λ‚˜ 메세지 νŒ¨μ‹±(Message passing)μ΄λΌλŠ” 방법을 μ‚¬μš©ν•œλ‹€. 곡유 λ©”λͺ¨λ¦¬λŠ” μ—¬λŸ¬κ°œμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ λ©”λͺ¨λ¦¬μ˜ ν•œ 뢀뢄을 κ³΅μœ ν•˜λ„λ‘ ν•˜λŠ” 것이고, 메세지 νŒ¨μ‹±μ€ ν”„λ‘œμ„ΈμŠ€ 간에 정보 νŒ¨ν‚·(Packets)을 μ£Όκ³  λ°›λŠ” 것을 λ§ν•œλ‹€. (곡유 λ©”λͺ¨λ¦¬ 방식보닀 메세지 νŒ¨μ‹± λ°©μ‹μ˜ 속도가 더 λŠλ¦¬λ‹€.)
  • μ—λŸ¬ 탐지(Error detection): μš΄μ˜μ²΄μ œλŠ” CPUλ‚˜ λ©”λͺ¨λ¦¬μ™€ 같은 ν•˜λ“œμ›¨μ–΄, μž…μΆœλ ₯μž₯치, 그리고 μ‚¬μš©μž ν”„λ‘œκ·Έλž¨ λ“±μ—μ„œ μΌμ–΄λ‚˜λŠ” μ—λŸ¬λ₯Ό νƒμ§€ν•˜κ³ , λ°”λ‘œ μž‘μ•„μ•Ό ν•œλ‹€.

μš΄μ˜μ²΄μ œλŠ” μ‚¬μš©μžμ—κ²Œ 직접적인 도움은 μ•ˆ λ˜μ§€λ§Œ, μ‹œμŠ€ν…œμ„ μœ„ν•œ μž‘μ—…λ„ μˆ˜ν–‰ν•œλ‹€.

  • μžμ› ν• λ‹Ή(Resource allocation): μ—¬λŸ¬ μ‚¬μš©μžλ‚˜ μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€λ©΄, μ»΄ν“¨νŒ… μžμ›μ€ 각각 잘 λ°°λΆ„λ˜μ–΄μ•Ό ν•œλ‹€. μ΄λŸ¬ν•œ μƒν™©μ—μ„œ μš΄μ˜μ²΄μ œλŠ” λ‹€μ–‘ν•œ μ’…λ₯˜μ˜ μžμ›μ„ κ΄€λ¦¬ν•œλ‹€.
  • νšŒκ³„(Accounting): μ‹œμŠ€ν…œμ€ μ–΄λ–€ μœ μ €κ°€ μ–΄λ–€ μ’…λ₯˜μ˜ μžμ›μ„ μ–Όλ§ˆλ‚˜ μ‚¬μš©ν•˜κ³  μžˆλŠ”μ§€ 계속 좔적해야 ν•œλ‹€. 이 기둝은 νšŒκ³„λ‚˜ μ‚¬μš©λŸ‰ 톡계λ₯Ό μœ„ν•΄ μ‚¬μš©λ  수 μžˆλ‹€. μ§μ—­ν•˜λ©΄ νšŒκ³„μ§€λ§Œ, λŒ€λž΅ 관리, 톡계 μ •λ„λ‘œ 받아듀이면 될 것 κ°™λ‹€.
  • λ³΄ν˜Έμ™€ λ³΄μ•ˆ(Protection and security): λͺ‡ λ²ˆμ„ 말해도 λͺ¨μžλž„ μ •λ„λ‘œ μ€‘μš”ν•œ 뢀뢄이닀. μΈν…”μ˜ CPU게이트λ₯Ό μƒκ°ν•΄λ³΄μžβ€¦

System Calls

μ‹œμŠ€ν…œ μ½œμ€ 컀널과 μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ„ μ΄μ–΄μ£ΌλŠ” μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•œλ‹€. μ’€ μƒμ†Œν•˜κ²Œ 느껴질 μˆ˜λ„ μžˆκ² μ§€λ§Œ, κ·Έλƒ₯ 둜우 레벨 μž‘μ—…μ„ ν•˜λŠ” μ½”λ“œλΌκ³  μƒκ°ν•˜λ©΄ λœλ‹€.

μ‚¬μš©μž μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ open() μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•΄ νŒŒμΌμ„ μ—¬λŠ” κ³Όμ •.

μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ΄ λ””μŠ€ν¬μ— μžˆλŠ” νŒŒμΌμ„ μ—°λ‹€λŠ” 것은 파일 μ‹œμŠ€ν…œμ— μ ‘κ·Όν•œλ‹€λŠ” μ˜λ―Έλ‹€. μ‹œμŠ€ν…œμ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” 컀널 λͺ¨λ“œλ‘œ μ „ν™˜λ˜μ–΄μ•Ό ν•˜λŠ”λ°, μ΄λ•Œ μ‹œμŠ€ν…œ μ½œμ„ μ‚¬μš©ν•œλ‹€. λ©”λͺ¨λ¦¬μ˜ νŠΉμ • μ£Όμ†Œ λ²”μœ„μ—λŠ” μ–΄λ–€ λ™μž‘λ“€μ΄ ν• λ‹Ήλ˜μ–΄ μžˆλ‹€. 이것을 μ‹œμŠ€ν…œ 콜 ν…Œμ΄λΈ”(System call table)이라고 λΆ€λ₯΄λ©°, μΈν„°λŸ½νŠΈ 벑터(Interrupt vector)라고도 λΆ€λ₯Έλ‹€. 예λ₯Ό λ“€μ–΄ fopen() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€λ©΄, μš΄μ˜μ²΄μ œλŠ” νŒŒμΌμ„ μ—¬λŠ” ν•¨μˆ˜λ₯Ό μ°ΎκΈ° μœ„ν•΄ μ‹œμŠ€ν…œ 콜 ν…Œμ΄λΈ”μ„ μ°Έμ‘°ν•œλ‹€. μ‹œμŠ€ν…œ 콜 ν…Œμ΄λΈ”μ€ λ©”λͺ¨λ¦¬ μ£Όμ†Œμ˜ λͺ¨μŒμΈλ°, ν•΄λ‹Ή λ©”λͺ¨λ¦¬ μ£Όμ†ŒλŠ” μΈν„°λŸ½νŠΈ μ„œλΉ„μŠ€ 루틴(Interrupt service routine)을 가리킀고 μžˆλ‹€. μΈν„°λŸ½νŠΈ μ„œλΉ„μŠ€ 루틴은 일반적으둜 C둜 μ§œμ—¬μ§„ μ½”λ“œμ΄λ©°, μ‹œμŠ€ν…œ 콜 ν…Œμ΄λΈ”μ΄ κ°€λ¦¬ν‚€λŠ” νŠΉμ • λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ ꡬ체적으둜 μ–΄λ–€ λ™μž‘μ„ν• μ§€ μ •μ˜ν•΄λ†“μ€ 것이닀.

μ‹œμŠ€ν…œ μ½œμ—λŠ” fork(), exit(), read(), write()와 같은 ν•¨μˆ˜λ“€μ΄ μžˆλ‹€. ν•˜μ§€λ§Œ κ°œλ°œμžκ°€ 이것을 직접 μ‘°μž‘ν•˜λŠ” 것은 λΆˆνŽΈν•˜κ³  μœ„ν—˜ν•œ μΌμ΄λ―€λ‘œ, ν‘œμ€€ 라이브러리(Standard library)λ₯Ό μ‚¬μš©ν•œλ‹€. stdio.hκ°€ κ·Έ 일쒅이닀.

μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ΄ μš΄μ˜μ²΄μ œμ—κ²Œ λ§€κ°œλ³€μˆ˜λ₯Ό λ„˜κΈ°λŠ” 방법은 3가지가 μžˆλ‹€.

  1. Call by value: λ§€κ°œλ³€μˆ˜μ˜ κ°’ 자체λ₯Ό λ³΅μ‚¬ν•΄μ„œ CPU λ ˆμ§€μŠ€ν„°μ— μ „λ‹¬ν•œλ‹€.
  2. Call by reference: κ°’μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•œλ‹€. λ§Žμ€ 값을 μ „λ‹¬ν•œλ‹€λ©΄ μ΄λ ‡κ²Œ ν•˜λŠ” 것이 νš¨μœ¨μ μ΄λ‹€.
  3. ν”„λ‘œκ·Έλž¨μ—μ„ 톡해 μŠ€νƒ(Stack)에 λ§€κ°œλ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜κ³ , 운영체제λ₯Ό 톡해 값을 λΊ€λ‹€.

Types of System Calls

μ‹œμŠ€ν…œ μ½œμ€ 크게 6κ°€μ§€λ‘œ λΆ„λ₯˜ν•  수 μžˆλ‹€.

  • ν”„λ‘œμ„ΈμŠ€ μ œμ–΄: end, abort, load, execute
  • 파일 관리: create, delete, open, close, read, write
  • μž₯치 관리: read, write, request, release
  • 정보 μœ μ§€: get/set time or date
  • 톡신: send/receive messages, transfer status
  • 보호

Operating System Structure

ν˜„λŒ€ μš΄μ˜μ²΄μ œλŠ” 계측을 λ‚˜λˆ μ„œ μ‹œμŠ€ν…œμ„ κ΄€λ¦¬ν•œλ‹€.

Simple Structure

MS-DOS λ ˆμ΄μ–΄ ꡬ쑰.

κ³Όκ±°μ—λŠ” 사싀상 계측이 κ΅¬λΆ„λ˜μ–΄ μžˆμ§€ μ•Šμ•˜λ‹€. MS-DOSμ—μ„œλŠ” μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ΄ μž…μΆœλ ₯ 루틴에 μ ‘κ·Όν•΄ λ””μŠ€ν”Œλ ˆμ΄μ™€ λ””μŠ€ν¬ λ“œλΌμ΄λΈŒμ— 직접 μ“°κΈ°λ₯Ό ν•  수 μžˆμ—ˆλ‹€. λ”°λΌμ„œ λ§Œμ•½ μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ— λ¬Έμ œκ°€ 생기면 전체 μ‹œμŠ€ν…œμ— λ¬Έμ œκ°€ 생겼닀. UNIX μ‹œμŠ€ν…œμ€ 이것을 κ°œμ„ ν–ˆλ‹€.

전톡적인 UNIX μ‹œμŠ€ν…œ ꡬ쑰.

전톡적인 UNIX μ‹œμŠ€ν…œ κ΅¬μ‘°λŠ” MS-DOS에 λΉ„ν•΄ κΈ°λŠ₯이 λΆ„λ¦¬λ˜μ—ˆμ§€λ§Œ, μ—¬μ „νžˆ ν•˜λ‚˜μ˜ 계측이 λ„ˆλ¬΄ λ§Žμ€ 일을 ν–ˆλ‹€. ν•˜λ“œμ›¨μ–΄ 계측 μœ„, μ‚¬μš©μž 계측 μ•„λž˜μ— μžˆλŠ” 컀널이 λͺ¨λ“  κΈ°λŠ₯을 μ œκ³΅ν–ˆλ‹€. μ΄λŸ¬ν•œ λͺ¨λ†€λ¦¬λ”•(Monolithic) κ΅¬μ‘°λŠ” κ΅¬ν˜„κ³Ό μœ μ§€λ³΄μˆ˜κ°€ 쉽지 μ•Šμ•˜λ‹€.

Layered Approach

λ ˆμ΄μ–΄λ“œ 운영체제 ꡬ쑰.

운영체제λ₯Ό 더 μ„ΈλΆ„ν™”ν•΄ 계측을 λΆ„λ¦¬ν•œ 것이 계측적 μ ‘κ·Ό(Layered approach) 방식이닀. κ°€μž₯ μ•„λž˜μ— μžˆλŠ” 계측(λ ˆμ΄μ–΄ 0)은 ν•˜λ“œμ›¨μ–΄κ³ , κ°€μž₯ 높은 계측(λ ˆμ΄μ–΄ N)은 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ‹€. 이 방식은 μœ μ§€λ³΄μˆ˜κ°€ μ•„μ£Ό νŽΈν•œλ°, ν•˜λ‚˜μ˜ κ³„μΈ΅μ—λ§Œ μ‹ κ²½μ“°λ©΄ λ‹€λ₯Έ κ³„μΈ΅μ—λŠ” μ•„λ¬΄λŸ° 신경을 쓰지 μ•Šμ•„λ„ 되기 λ•Œλ¬Έμ΄λ‹€.

Microkernels

λ§ˆμ΄ν¬λ‘œμ»€λ„(Microkernel)은 μ»€λ„μ—μ„œ 핡심적인 μš”μ†Œλ§Œ 남긴 κ°€λ²Όμš΄ 컀널을 λ§ν•œλ‹€. 컀널이 컀질수둝 λ¬Έμ œκ°€ 생길 κ°€λŠ₯성이 높아지고, μœ μ§€λ³΄μˆ˜κ°€ νž˜λ“€μ–΄μ§€κΈ° λ•Œλ¬Έμ— 컀널을 더 κ°€λ³κ²Œ λ§Œλ“€ ν•„μš”κ°€ μžˆμ—ˆλ‹€. λ§ˆμ΄ν¬λ‘œμ»€λ„μ€ μ½”λ“œ 양이 훨씬 적어 컴파일, ν…ŒμŠ€νŠΈ μ‹œκ°„μ΄ 비ꡐ적 짧고, λ‹€λ₯Έ μ‹œμŠ€ν…œμ— 이식(Porting)ν•˜κΈ°λ„ 쉽닀. λ‹€λ§Œ μ‹œμŠ€ν…œ ν”„λ‘œκ·Έλž¨μ„ μΆ”κ°€ν•΄ κΈ°λŠ₯을 λŠ˜λ¦¬λ €ν•˜λ©΄ 속도가 λŠλ €μ§„λ‹€.

OS X의 컀널(Darwin)의 일뢀가 λ§ˆμ΄ν¬λ‘œμ»€λ„ Machλ₯Ό 기반으둜 λ§Œλ“€μ–΄μ‘ŒμœΌλ©°, IoT에도 λ§ˆμ΄ν¬λ‘œμ»€λ„μ΄ μ‚¬μš©λœλ‹€.

Modules

λͺ¨λ“ˆμ€ 컀널을 ν™•μž₯ν•˜κΈ° μœ„ν•œ 기술둜, OOPμ—μ„œ λ§ν•˜λŠ” κ·Έ λͺ¨λ“ˆν™”와 같은 κ°œλ…μ΄λ‹€. ν”„λ‘œμ„ΈμŠ€μ— μ‹€μ‹œκ°„μœΌλ‘œ λͺ¨λ“ˆμ„ λΆ™μ—¬ μž‘λ™μ‹œν‚¬ 수 있고, 각 κΈ°λŠ₯듀을 λ…λ¦½μ μœΌλ‘œ 관리할 수 μžˆμ–΄ 효과적으둜 μ‹œμŠ€ν…œμ„ μœ μ§€ν•  수 μžˆλ‹€. μž₯치 λ“œλΌμ΄λ²„λŠ” λͺ¨λ‘ λͺ¨λ“ˆλ‘œ κ΅¬ν˜„λ˜μ–΄ 있으며, μœˆλ„μš°μ—μ„œ .dll파일이 λ°”λ‘œ λͺ¨λ“ˆμ΄λ‹€.

Hybrid Systems

μŠ€λ§ˆνŠΈν°μ€ OS ꡬ쑰의 μ΅œμ‹ νŒμ΄λΌκ³  ν•  수 μžˆλ‹€. ν•˜μ΄λΈŒλ¦¬λ“œ μ‹œμŠ€ν…œμ€ μ»€λ„μ˜ ν•΅μ‹¬λ§Œ 남기고 λ‚˜λ¨Έμ§€λŠ” λ”°λ‘œ κ΅¬ν˜„ν•œ μ‹œμŠ€ν…œμ΄λ‹€. OS X의 경우 BSDκ°€ ν•΅μ‹¬μ΄μ§€λ§Œ λ‚˜λ¨Έμ§€λŠ” λͺ¨λ‘ μ• ν”Œμ΄ 자체 κ΅¬ν˜„ν–ˆλ‹€. μ•ˆλ“œλ‘œμ΄λ“œλŠ” λ¦¬λˆ…μŠ€ μ»€λ„μœ„μ— 자체 κ΅¬ν˜„ν•œ 라이브러리λ₯Ό 올린 μ‹œμŠ€ν…œμ΄λ‹€.