Skip to content

Implement "Dining philosophers" by multi process and thread with C99

Notifications You must be signed in to change notification settings

dudcks0994/Philosoper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Philosoper

과제 목표 : C98의 제한된 함수들을 이용해 식사하는 철학자 문제 구현

세부 요구사항 및 제한사항은 여기

운영체제

  • 운영체제가 프로세스를 실행할 때 사용하는 스케줄링에 대한 기본적인 이해
  • 코어와 스레드, 멀티프로세스와 멀티쓰레드의 차이 이해

병행성

  • 여러명의 철학자들이 각자 포크를 들거나 먹고 자는것이 동시에 이루어지기 위해서 멀티쓰레드와 멀티쓰레드를 사용하여 구현
  • 순서가 보장되지 않기에 데이터레이스가 일어날수 있어 뮤텍스를 사용해 임계구역을 만들어 원자적 실행 보장(혹은 멀티프로세스 시 세마포어)
  • 시간순으로 각 철학자의 행동을 출력해야 하는데, 누군가 죽었을 때 출력이 멈춰야하고, 시간순서대로 출력이 나와야하므로 모든 출력부도 뮤텍스로 원자성 보장
  • 철학자들의 죽음을 피해야하므로 데드락 발생을 막아야함
    • 각 포크의 사용상태를 변수로 두고 각각 뮤텍스를 만들어 확인할때 반드시 임계구역을 만들어서 확인후 집거나 포기하며, 한개를 들더라도 두개를 들수없다면 내려놓게끔 처리
    • 반드시 왼쪽 포크부터 집게끔 하고, 처음 프로그램 시작 시, 홀수번째 철학자들을 짝수번째 철학자들이 먼저 먹을 수 있게끔 기다리게 처리
  • 철학자 수가 많아지면서 컨텍스트 스위칭 횟수가 늘어날수록 시간 밀림현상이 증가하므로, 이를 위해 밥먹는 시간, 자는시간 등의 지연처리 시 해당 스레드를 확인하지 않게 usleep에 적당한 긴 시간을 줌
  • 멀티프로세스는 힙과 데이터영역이 공유되지 않아서 비교적 프로그래밍이 쉬움 -> 이 과제에서 먹는 횟수를 만족시 종료되어야 하는데, 이를 공유하기 위한 IPC함수가 사용불가능으로 세마포어를 싸이클마다 post하며 카운트를 세게끔 처리

배운점

  • sleep(usleep)의 매개변수 시간은 해당 프로세스(혹은 쓰레드)의 최소 실행유예시간을 보장한다 -> 정확히 그 시간이 지나고서의 실행이 보장되지 않음
  • 컨텍스트 스위칭 자체에 PC,레지스터 값 변경 등에 따른 자원(시간)소모가 있어, 시간 밀림현상을 줄이기 위해 오히려 sleep(usleep)에 조금더 긴 시간을 주어야 함
  • 운영체제에서 CPU가 프로세스를 처리할 때 사용하는 PCB에 대한 개념 습득 및 스케줄링에 대한 이해
  • 컨텍스트 스위칭의 자원소모, 쓰레드 혹은 프로세스를 만드는 것 자체도 시간이 걸리며 공유데이터를 관리하기위한 방법(뮤텍스,세마포어등을 통한 원자적실행과 IPC)의 단점이 명확함
  • 아파치보다 nginx가 더 커넥션 성능이 좋은 이유가, 멀티프로세스 혹은 멀티쓰레드를 사용할 경우 소모되는 자원과 시간으로 인해 싱글스레드 멀티플렉싱 방식을 선택한 것이라는 것
  • 웹서버 과제에서 CGI를 구현할 때 fork를 통한 멀티프로세스 방식을 nginx는 FAST-CGI 방식을 사용한 이유 추측 가능

About

Implement "Dining philosophers" by multi process and thread with C99

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published