[운영체제] 4. 병행 ν”„λ‘œμ„ΈμŠ€

1. 병행 ν”„λ‘œμ„ΈμŠ€μ˜ κ°œλ…

병행성

  • μ—¬λŸ¬κ°œμ˜ ν”„λ‘œμ„ΈμŠ€ ν˜Ήμ€ μ“°λ ˆλ“œκ°€ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” μ‹œμŠ€ν…œμ  νŠΉμ„±μ„ μ˜λ―Έν•œλ‹€.
  • CPU(μ½”μ–΄)κ°€ ν•œκ°œλΌλ©΄ 짧은 μ‹œκ°„λ™μ•ˆ λ²ˆκ°ˆμ•„κ°€λ©° μ‹€ν–‰ν•˜λ©° μ•„λ‹ˆλ©΄ μ—¬λŸ¬κ°œμ˜ CPUλ₯Ό 각각의 ν”„λ‘œμ„ΈμŠ€ ν˜Ήμ€ μ“°λ ˆλ“œκ°€ μ‚¬μš©ν•œλ‹€.
  • λ©”λͺ¨λ¦¬ ꡬ쑰에 따라 κ°•κ²°ν•© λ©€ν‹°ν”„λ‘œμ„Έμ„œ ν˜Ήμ€ μ•½κ²°ν•© λ©€ν‹°ν”„λ‘œμ„Έμ„œλ‘œ λ‚˜λ‰œλ‹€.
    • κ°•κ²°ν•©: μ—¬λŸ¬ CPUκ°€ ν•˜λ‚˜μ˜ λ©”λͺ¨λ¦¬λ₯Ό 곡유 (ν•˜λ‚˜μ˜ 운영체제)
    • μ•½κ²°ν•©: 각 μ‹œμŠ€ν…œμ΄ λ…λ¦½λœ μš΄μ˜μ²΄μ œμ™€ λ©”λͺ¨λ¦¬λ₯Ό 가지고 μ„œλ‘œ 톡신링크λ₯Ό 가짐

단일 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ˜ 병행성

단일 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ 병행성은 μš°μ„ μˆœμœ„ κ·Έλž˜ν”„, Fork/Join ꡬ쑰, 병행문 등을 톡해 μ„€λͺ…ν•œλ‹€.

ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 병행성

  • ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ λ³‘ν–‰μ„±μ—μ„œ μƒν˜Έ ν˜‘λ ₯ν•˜λŠ” 경우λ₯Ό 비동기적이라고 ν•œλ‹€.
  • 비동기 병행 ν”„λ‘œμ„ΈμŠ€λŠ” μ„œλ‘œ μžμ›μ„ κ³΅μœ ν•˜λ©° 영ν–₯을 끼칠 수 μžˆλ‹€.

2. 동기화와 μž„κ³„ μ˜μ—­

  • ν”„λ‘œμ„ΈμŠ€ λ™κΈ°ν™”λž€ 2개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€μ˜ 처리 μˆœμ„œλ₯Ό κ²°μ •ν•˜λŠ” 것을 λ§ν•œλ‹€.
  • μž„κ³„ μ˜μ—­μ΄λž€, ν”„λ‘œμ„ΈμŠ€κ°€ 곡용 λ³€μˆ˜λ₯Ό μ½κ±°λ‚˜, ν…Œμ΄λΈ”μ„ κ°±μ‹ ν•˜κ±°λ‚˜, νŒŒμΌμ— μ“°λŠ” λ“±μ˜ μž‘μ—…μ„ ν•˜λŠ” μ½”λ“œ μ„Έκ·Έλ¨ΌνŠΈλ₯Ό μ˜λ―Έν•œλ‹€.
  • μž„κ³„ μ˜μ—­μ„ κ°–λŠ” ν”„λ‘œμ„ΈμŠ€μ˜ 일반적 κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό κ°™λ‹€.
    1. μ§„μž… μ˜μ—­ : μž„κ³„ μ˜μ—­μ— μ§„μž…ν•  수 μžˆλŠ”μ§€ 확인
    2. ν•΄μ œ μ˜μ—­ : μž„κ³„ μ˜μ—­μ—μ„œ μž‘μ—…μ„ 마치고 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ μ§„μž…μ„ ν—ˆμš©
    3. μž”λ₯˜ μ˜μ—­ : λ‚˜λ¨Έμ§€ μ˜μ—­
  • μž„κ³„ μ˜μ—­μ˜ 동기화 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒκ³Ό 같은 쑰건이 ν•„μš”ν•˜λ‹€.
    1. μƒν˜Έλ°°μ œ : μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μž„κ³„μ˜μ—­μ—μ„œ λ™μ‹œμ— μž‘μ—…μ„ ν•  수 μ—†λ‹€.
    2. 진행 : μž„κ³„μ˜μ—­μ— μ§„μž… ν•  ν”„λ‘œμ„ΈμŠ€λ₯Ό 적절히 μ„ νƒν•œλ‹€. 이 μž‘μ—…μ€ λ¬΄ν•œνžˆ 미루어 질 수 μ—†λ‹€.
    3. μ œν•œλœ λŒ€κΈ° : μ–΄λ– ν•œ ν”„λ‘œμ„ΈμŠ€κ°€ μž„κ³„μ˜μ—­μ„ μš”μ²­ν•˜λ©΄ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μ§„μž…ν•  수 μžˆλŠ” 횟수λ₯Ό μ œν•œν•΄μ•Ό ν•œλ‹€.

Test - and - Set

  • μƒν˜Έλ°°μ œμ˜ ν•˜λ“œμ›¨μ–΄μ  ν•΄κ²° 방법이며, 뢄리가 λΆˆκ°€λŠ₯ν•œ 단일 λͺ…령어이닀. μ€„μ—¬μ„œ TS라고도 ν•œλ‹€.
  • λ©”λͺ¨λ¦¬ λ‚΄μ˜ ν•˜λ‚˜μ˜ λΉ„νŠΈλ₯Ό key 둜 μ‚¬μš©ν•˜μ—¬ busy μƒνƒœλ₯Ό ν‘œν˜„ν•œλ‹€.
  • λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ μž„κ³„μ˜μ—­μ— μ§„μž…ν•˜κΈ° 전에, ν•΄λ‹Ή μ˜μ—­μ΄ 점거 μƒνƒœμΈμ§€ μ²΄ν¬ν•˜κ³  μ‚¬μš©μ΄ λλ‚œ ν”„λ‘œμ„ΈμŠ€λŠ” key λΉ„νŠΈλ₯Ό 0으둜 리셋해쀀닀.
  • λͺ¨λ“  μ ˆμ°¨λŠ” μΈν„°λŸ½νŠΈ λ˜μ§€ μ•Šκ²Œ μ›μžμ μœΌλ‘œ μˆ˜ν–‰λœλ‹€.
  • TS λ©”μ»€λ‹ˆμ¦˜μ—λŠ” 두가지 결점이 μžˆλ‹€.
    • λ§Žμ€ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— μž„κ³„μ˜μ—­μ— λ“€μ–΄κ°€κΈ°λ₯Ό μ›ν•˜λ©΄ ‘κΈ°μ•„’μƒνƒœκ°€ λ°œμƒν•œλ‹€. (μ“°λ ˆλ“œκ°€ ν•„μš”ν•œ μžμ›μ„ 할당받지 λͺ»ν•˜κ³  계속 λŒ€κΈ°ν•¨)
    • λŒ€κΈ° ν”„λ‘œμ„ΈμŠ€λŠ” λΉ„ 생산적이고 μžμ›λ§Œ μ†ŒλΉ„ν•˜λŠ” busy wating μƒνƒœμ— μžˆλ‹€.

μ„Έλ§ˆν¬μ–΄(semaphore)

  • TS 기법보닀 쑰금 더 μΌλ°˜ν™”μ— μš©μ΄ν•˜λ„λ‘ λ‹€μ΅μŠ€νŠΈλΌκ°€ μ œμ‹œν•œ μƒˆλ‘œμš΄ 동기화 도ꡬ이닀.
  • 검사연산인 P(s) μ—°μ‚°κ³Ό 증가 연산인 V(s) μ—°μ‚°μœΌλ‘œ λ‚˜λˆ„μ–΄ 진닀.
  • P, V 연산은 각각 μ›μžμ  μ—°μ‚°μœΌλ‘œ κ°„μ£Όλœλ‹€. (도쀑에 μΈν„°λŸ½νŠΈ λ˜μ§€ μ•ŠλŠ”λ‹€.)

3. ν”„λ‘œμ„ΈμŠ€μ˜ μƒν˜Έ ν˜‘λ ₯

  • λͺ‡ 개의 ν”„λ‘œμ„ΈμŠ€κ°€ κ³΅ν†΅μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•΄ μ„œλ‘œ ν˜‘λ™ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.
  • 두 가지 유λͺ…ν•œ μ˜ˆμ œκ°€ μžˆλŠ”λ° μƒμ‚°μžμ™€ μ†ŒλΉ„μž, νŒλ…기와 기둝기 μ˜ˆμ œμ΄λ‹€.

μƒμ‚°μžμ™€ μ†ŒλΉ„μž 문제

  • κ°œμš”
    • κ³ μ •λœ 크기λ₯Ό 가진 버퍼λ₯Ό 사이에 두고 버퍼가 λΉ„μ–΄ μžˆλ‹€λ©΄ μ†ŒλΉ„μžκ°€ κΈ°λ‹€λ¦¬κ²Œ 되고 버퍼가 가득 차게 되면 μƒμ‚°μžκ°€ κΈ°λ‹€λ¦¬κ²Œ λœλ‹€.
  • μƒν˜Έλ°°μ œ
    • ν•œ μˆœκ°„μ— ν•œ ν”„λ‘œμ„ΈμŠ€λ§Œ 버퍼λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • 동기화
    • 생산이 이루어져야 μ†ŒλΉ„κ°€ 이루어지며, 버퍼 μš©λŸ‰ μ΄μƒμœΌλ‘œ μƒμ‚°ν•˜λ©΄ μ•ˆλœλ‹€.
  • μƒμ‚°μž ν”„λ‘œμ„ΈμŠ€ μ˜μ‚¬μ½”λ“œ
repeat
    ...         
    nextp에 데이터 ν•­λͺ©μ„ 생산함
    ...         
    P(empty);
    P(mutex);
    ...
    nextpλ₯Ό 버퍼에 λ„£μŒ
    ...
    V(mutex)
	V(full)
until false;
  • μ†ŒλΉ„μž ν”„λ‘œμ„ΈμŠ€ μ˜μ‚¬μ½”λ“œ
repeat
    P(full);
    P(mutex);
    ...
    λ²„νΌμ—μ„œ 데이터 ν•­λͺ©μ„ κΊΌλ‚΄ nextc에 λ„£μŒ
    ...
    V(mutex);
    V(empty);
    ...
    nextxc에 μžˆλŠ” 데이터 ν•­λͺ© μ†ŒλΉ„
    ...
until false;

νŒλ…κΈ°/기둝기 문제

  • κ°œμš”
    • 데이터 μ˜€λΈŒμ νŠΈμ— λŒ€ν•΄ 읽고자 ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό νŒλ…κΈ°(reader), μ“°κ³ μž ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό 기둝기 (writer) 라고 ν•œλ‹€. 이에 λŒ€ν•΄ 볡수의 νŒλ…κΈ°κ°€ λ™μ‹œμ— κ³΅μœ κ°μ²΄μ— μ ‘κ·Ό ν•˜λŠ” 것은 λ¬Έμ œκ°€ λ˜μ§€ μ•Šμ§€λ§Œ, ν•˜λ‚˜μ˜ 기둝기와 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€κ°€ λ™μ‹œμ— κ³΅μœ κ°μ²΄μ— μ ‘κ·Όν•˜λŠ” 것은 λ°°νƒ€μ μœΌλ‘œ 이루어져야 ν•œλ‹€.
  • 제 1νŒλ…κΈ° 문제
    • 기둝기의 κΈ°μ•„ μƒνƒœλ₯Ό μœ λ°œν•  수 μžˆλ‹€.
    • 기둝기가 곡유객체λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν—ˆκ°€λ˜μ§€ μ•ŠλŠ”λ‹€.
  • 제 2νŒλ…κΈ° 문제
    • νŒλ…κΈ°μ˜ κΈ°μ•„ μƒνƒœλ₯Ό μœ λ°œν•  수 μžˆλ‹€.
    • 기둝기가 μ€€λΉ„ λ˜μ—ˆλ‹€λ©΄ μ΅œλŒ€ν•œ 기둝을 κ°€λŠ₯ν•œ ν•œ 빨리 μˆ˜ν–‰ν•˜λ„λ‘ ν•œλ‹€.

4. ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 톡신

κ³΅μœ κΈ°μ–΅μž₯치 기법

μ•žμ„œ 닀룬 μœ ν•œλ²„νΌ λ¬Έμ œμ™€ 같이 곡유 λ³€μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ ν†΅μ‹ ν•˜λŠ” 기법이닀. 톡신기λŠ₯을 μ œκ³΅ν•˜λŠ” μ±…μž„μ€ μ‘μš© ν”„λ‘œκ·Έλž˜λ¨Έμ—κ²Œ 있고, μš΄μ˜μ²΄μ œλŠ” λ‹¨μˆœνžˆ 곡유 λ³€μˆ˜λ§Œμ„ μ œκ³΅ν•œλ‹€.

λ©”μ‹œμ§€ μ‹œμŠ€ν…œ 기법

두 개 μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€κ°€ κ³΅μœ λ³€μˆ˜μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ μ„œ λ©”μ‹œμ§€λ₯Ό 주고받을 수 μžˆλ„λ‘ 톡신 링크λ₯Ό μ„€μΉ˜ν•œλ‹€. μ†ŒλŸ‰μ˜ 데이터λ₯Ό μ£Όκ³ λ°›λŠ”λ° μ΅œμ ν™” λ˜μ–΄μžˆκ³ , 톡신에 λŒ€ν•œ μ±…μž„μ€ ν”„λ‘œμ„ΈμŠ€μ— μžˆλ‹€.

  1. 직접 톡신
    • 톡신을 μ›ν•˜λŠ” λͺ¨λ“  ν”„λ‘œμ„ΈμŠ€ 쌍 사이에 톡신 링크가 μ„€μ •λ˜μ–΄μ•Ό ν•œλ‹€.
    • 톡신을 μœ„ν•΄ μƒλŒ€μ˜ 신원을 μ•Œμ•„μ•Ό ν•œλ‹€.
    • ν•˜λ‚˜μ˜ λ§ν¬λŠ” 두 ν”„λ‘œμ„ΈμŠ€ μ‚¬μ΄μ—λ§Œ μ—°κ²°λœλ‹€.
    • λ§ν¬λŠ” μ–‘λ°©ν–₯이닀.
  2. κ°„μ ‘ 톡신
    • μš°νŽΈν•¨ 객체λ₯Ό 톡해 λ©”μ‹œμ§€λ₯Ό μ£Όκ±°λ‚˜ 받을 수 μžˆλ‹€.
    • μ†‘μ‹ μž/μˆ˜μ‹ μžλ₯Ό λΆ„λ¦¬ν•˜λ―€λ‘œ ν†΅μ‹ μ˜ μœ μ—°μ„±μ΄ μ˜¬λΌκ°„λ‹€.
    • ν•œ λ§ν¬λŠ” λ‘κ°œ μ΄μƒμ˜ ν”„λ‘œμ„ΈμŠ€λ“€κ³Ό 연관될 수 μžˆλ‹€.
  3. 링크의 μš©λŸ‰
    1. μš©λŸ‰μ΄ μ—†λŠ” 경우
    2. λ§ν¬λŠ” μ–΄λ–€ λ©”μ‹œμ§€λ„ κ°€μ§ˆ 수 μ—†μœΌλ―€λ‘œ λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•  λ•Œ κΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•œλ‹€.
    3. μ œν•œλœ μš©λŸ‰
    4. λ§ν¬λŠ” μœ ν•œ 길이 n을 가진닀. λ”°λΌμ„œ 큐가 가득 μ°¨λ©΄ μ†‘μ‹ μžλŠ” λŒ€κΈ°κ°€ λ°œμƒν•œλ‹€.
    5. λ¬΄μ œν•œ μš©λŸ‰
    6. 링크의 νλŠ” λ¬΄ν•œν•œ 길이λ₯Ό 가지고 μžˆμœΌλ―€λ‘œ μ†‘μ‹ μžλŠ” κ²°μ½” λŒ€κΈ°κ°€ μ—†λ‹€.
    • μš©λŸ‰μ΄ μ—†λŠ” 경우λ₯Ό κ°€λ¦¬μΌœ ‘비버퍼링 λ©”μ‹œμ§€ μ‹œμŠ€ν…œ’ 이라고도 ν•œλ‹€.
    • μš©λŸ‰μ΄ μ‘΄μž¬ν•˜λŠ” 경우 솑신과 μˆ˜μ‹ μ΄ λΆ„λ¦¬λ˜λ―€λ‘œ λΉ„ 동기적 톡신이라고도 ν•œλ‹€.
  4. μ˜ˆμ™Έμ‘°κ±΄
    • 이런 λ©”μ‹œμ§€ μ‹œμŠ€ν…œμ€ 보톡 λΆ„μ‚° ν™˜κ²½μ—μ„œ κ΅¬μ„±ν•˜λŠ”λ°, 톡신과 처리 κ³Όμ •μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•  κ°€λŠ₯성이 단일 μ‹œμŠ€ν…œλ³΄λ‹€ 크닀.
    • μ˜ˆμ™Έλ₯Ό 미리 잘 μ˜ˆμƒν•˜μ—¬ κ³ μž₯ 회볡이 μΌμ–΄λ‚˜μ•Ό ν•œλ‹€.
    • 일어날 수 μžˆλŠ” μ˜ˆμ™Έ
      1. ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ
        1. 이미 μ’…λ£Œλœ ν”„λ‘œμ„ΈμŠ€λ‘œμ— λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄κ±°λ‚˜, ν”„λ‘œμ„ΈμŠ€λ‘œλΆ€ν„° λ©”μ‹œμ§€λ₯Ό 기닀릴 수 μžˆλ‹€. 이 경우 ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ 사싀을 μƒλŒ€ ν”„λ‘œμ„ΈμŠ€μ— μ•Œλ €μ•Ό ν•œλ‹€.
      2. λ©”μ‹œμ§€ 상싀
        1. 톡신 λ„€νŠΈμ›Œν¬ λ‚΄μ—μ„œ λ©”μ‹œμ§€κ°€ 상싀될 수 μžˆλ‹€. 보편적으둜 μ‹œκ°„ μ œν•œ 기법을 μ΄μš©ν•΄ 이λ₯Ό νƒμ§€ν•˜λ©°, 상황에 따라 λ©”μ‹œμ§€λ₯Ό 재 솑신할 수 μžˆλ‹€.
      3. λ©”μ‹œμ§€ ν˜Όν•©
        1. λ©”μ‹œμ§€κ°€ 솑신 도쀑 λ³€μ§ˆλ˜λŠ” 경우λ₯Ό λ§ν•œλ‹€. 이런 ν˜•νƒœμ˜ 였λ₯˜ 탐지λ₯Ό μœ„ν•΄ 검사 합계(CheckSum)λ₯Ό μ΄μš©ν•œλ‹€.