Home 운영체제 - Synchronization
Post
Cancel

운영체제 - Synchronization

- 정리의 기반은 학교 강의 노트와 [Operating System Concepts]를 참고하였습니다.

22-1학기 운영체제를 들으면서 중간고사에 대비하면서 정리해놓은 개념들입니다…ㅎ 다른 핵심 내용이나 기본이라고 생각되는 내용들은 제외하고 제가 시험에서 중요하다고 생각하는 것들만 중구난방으로 정리되어있습니다.


Critical section

  • 둘 이상의 스레드가 동시에 접근해서는 안 되는 공유 자원에 접근하는 코드의 일부


Spinlock

  • software lock
  • context switch
  • 계속 기다림

    busy waiting = 무한 루프를 돌면서 다른 스레드에게 CPU를 안내어 주는 것

  • lock과 unlock 과정이 짧아서 락하는 경우가 드물 때 사용
  • 싱글 코어에서는 무의미함(락을 풀려면 context switch가 어차피 일어나기 때문에 cpu를 낭비할 수 있다.)

  • Spinlock으론 Synchronization 문제를 해결하기엔 부족하므로 High-level Synchronizaion이 필요하다 -> Semaphores, Mutexes

    High-level Synchronization : 하드 웨어 기반 해결책은 프로그래머가 사용할 수 없으므로 상위 수준의 소프트웨어 도구 존재


Peterson’s Solution


증명 조건


1. 상호 배제

1
2
3
* 프로세스 P(i)가 반드시 flag[j] == false 이거나, turn == i 라면 1 번은 항상 만족하게 된다.
* 만약 flag[0], flag[1]이 모두 true라고 하더라도, turn 값에 따라 임계 구역에 한 프로세스만 진입 가능하므로 위 코드의 while문을 두 프로세스가 모두 통과할 수 없다.
* 또한 정해진 프로세스가 임계 구역에 있을 동안 flag과 turn 값이 변경되지 않으므로, 상호 배제 조건은 지켜진다.


2. 진행에 대한 요구 조건을 만족한다는 사실(progress)


3. 대기 시간이 한없이 길어지지 않는다는 사실(bounded waiting)


  • 2, 3번은 동시에 증명 가능
  • 이 방법은 최신 컴퓨터 아키텍처에서 작동한다고 보장되지 않는다.


Semaphores


1. 가용한 자원의 개수로 초기화 2. wait() 연산 수행, 세마포어의 값 감소 3. 자원 방출, signal() 연산 수행, 세마포어 값 증가

  • if 세마포어 값 == 0, 모든 자원 사용중
  • wait() :
    • busy-waiting 대신 프로세스가 자신을 일시 중지
    • value가 0보다 작으면, 모든 자원이 사용중이기 때문에 sleep모드로 들어감
  • sleep() : sleep()모드인 프로세스는 다른 프로세스가 signal 연산을 실행하면 재시작(wait 큐 -> ready 큐)
  • value값이 음수 = 대기흐고 있는 프로세스들의 수




Mutexes(Binary Semaphores라고도 불린다.)


1. 임계 구역 진입 전 락 획득
2. 탈출할 때 락 반환

  • acuire()이 락 획득
  • realse()가 락 반환
  • available이라는 boolean 변수 : lock 가용 여부

Bounded-buffer 문제

생성자 프로세스가 버퍼 중 빈 곳에 데이터를 쓸 때 인터럽트가 발생하면 다른 프로세스에게 공유 자원이 넘어가고, 그러면 이 두 프로세서 중 하나 이상은 데이터가 유실될 수 있다.

공유 버퍼에 락을 걸고, 데이터를 넣은 후 비어있는 위치를 바꾸고 락 해제

소비자 프로세스에서도 어떤 프로세스가 데이터를 꺼낼 때 인터럽트가 발생하여 공유 자원이 다른 프로세스에 넘어가게 되면 두 프로세스가 하나의 데이터를 가져간다.

공유 버퍼에 락 걸고, 데이터를 꺼낸 후 내용이 있는 버퍼 위치를 찾아 이동 후 락 해제



Reader-Writer 문제

데이터베이스에서 Writer가 임계 구역에 있을 때 Reader가 와서 데이터를 꺼내가거나 다른 Writer가 있으면, 데이터가 이상해진다. Read는 다수여도 되지만, Writer는 한명이 접근하면 그 외에는 접근 불가로 만들어야 한다.

This post is licensed under CC BY 4.0 by the author.