Search
💡

프로젝트 개발 노트

[목차]
[필요한 정보]

프로젝트 진행

Pintos 부팅 과정
시뮬레이터 실행 파라미터 입력 값 파싱하여 중앙 관제 노드 및 물류 로봇들에 대한 스레드 생성
central에서 명령할 때, 그냥 대기 만 하도록 세팅하고 전체 사이클을 먼저 구현해보는 것은 어떨까?
전체 흐름
메모장
[에러] robots를 생성했는데, for문 밖에서 robots을 printf로 찍어보면, R5만 나옴 - 해결
N개의 로봇 생성 & 1개의 센터 생성
스레드 간 데이터전송을 위한 Block, Unblock 함수 구현
create thread
sema_down & sema_up
메시지 전달 구현
thread_create()에서 스레드 인덱싱 주의
[해결] cnt와 robots 간 block/unblock을 통해 핑퐁 구현
[해결] message 전달하기
로봇 제어

프로젝트 개요

중앙 관제 노드와 자율 주행 물류 로봇들을 통해 물류 창고 자동화
자율 주행 물류 로봇들이 물건을 적재 후 정확한 위치에 하역하는 시나리오 수행
시뮬레이터에서 사용하는 물류 센터는 6x7 크기의 2차원 배열로 구성 (aw_manager.h/.c에 정의)
중앙 관제 노드
자율 주행 물류 로봇 (이하 물류 로봇)

프로젝트 요구사항

0. Pintos 환경에서 빌드 및 실행

본 프로젝트는 Pintos 기반으로 수행
projects/automated_warehouse 디렉토리의 파일을 수정 및 사용 + 추가적인 파일 생성 가능
*automated_warehouse.c 파일의 run_automated_warehouse 함수가 진입점
개발 파일 외 다른 파일을 수정할 경우 수정한 근거를 레포트로 작성
다음 파일을 참고하는 것을 권장:
threads 디렉토리의 init.c, synch.h, synch.h, thread.h, thread.c 및 기타 필요 코드
VMWare Workstation Player 다운로드 링크

1. 시뮬레이터 실행 파라미터 입력 값 파싱하여 중앙 관제 노드 및 물류 로봇들에 대한 스레드 생성

시뮬레이터는 threads/build 디렉토리에서 실행하며 (2), (3) 파라미터를 파싱하여 사용할 물류 로봇의 정보 획득
(1) project/automated_warehouse.c에 구현된 시뮬레이터 실행을 위한 파라미터
(2) 물류 로봇의 개수
(3) 각 물류 로봇이 필요로 하는 물건의 번호와 하역 장소를 가지는 리스트
:’로 구분되며 예시에서 총 5개의 물건 번호와 하역 장소의 쌍을 가짐
해당 파라미터를 여러 개 케이스로 채점할 예정
중앙 관제 노드와 N대의 물류 로봇들의 스레드를 생성해야 함
중앙 관제 노드
1대의 중앙 관제 노드 생성 (메인 스레드로 활용 가능)
물류 로봇
입력 값에 따라 N대 생성
i번 물류 로봇의 스레드 이름은 “Ri”로 명명 ex) 1번 물류 로봇 스레드의 이름은 “R1”
관련 코드는 threads/thread.h, threads/thread.c 파일 참고
스레드 생성 및 block, unblock, yield 등과 같은 상태 관리 함수 존재

2. 스레드 간 데이터 전송을 위한 Block, Unblock 함수 구현

요구사항 3의 운송 로봇과 중앙 관제 노드 간의 데이터 전달을 위해 projects/automated_warehouse/aw_thread.h/.c에 정의된 빈 함수 block_thread, unblock_threads 구현해야 함
block_threads
Block 시킨 스레드를 struct list blocked_threads에 저장
현재 Block만 되는 기능만 구현되어 있으므로 수정 필요
unblock_threads
struct list blocked_threads에 저장되어 있는 Block된 스레드들을 전부 Unblock
선점을 막기 위해 intr_disable(), intr_set_level()가 필요하며, 이 두 개는 반드시 쌍을 맺어야 함
intr_disable()만 호출하고 intr_set_level()을 호출하지 않으면 선점이 불가능한 상황 발생
참고 : threads/synch.h/.c에 있는 sema_up, sema_down 함수 참고

3. block_thread 및 unblock_threads를 통한 스레드 간 데이터 전달 시스템 구현

스레드 간 데이터의 일관성을 보장하기 위해 데이터 전달 시스템 외 데이터 공유를 제한해야 함
aw_message.h/.c 파일에 작성된 message, message_box 구조체를 활용하여 전달 시스템 구현 필요
개발의 편의를 위해 중앙 관제 노드로부터 오는 메시지, 물류 로봇으로부터 오는 메시지를 구분하고 통합하여 관리
message, message_box의 수정이 필요할 경우 해당 방식을 유지하는 것을 권장
boxes_from_central_control_node에 각 물류 로봇들이 중앙 관제 노드로부터 메시지 박스 배열을 동적 할당해주어야 함
boxes_from_robots에 중앙 관제 노드가 각 물류 로봇들에게 받는 메시지 박스 배열을 동적 할당해주어야 함
데이터 전달 제어 방식 정의 필요
물류 로봇이 중앙 관제 노드로 데이터를 전달한 후에는 Block되어야 함
중앙 관제 노드가 모든 물류 로봇에게 데이터를 전달 받은 후에는 Block 상태의 물류 로봇 스레드들을 Unblock 해야 함

4. 중앙 관제 노드를 통한 N개의 물류 로봇 제어

물류 로봇 제어 필요
요구 사항
물류 로봇 배열은 automated_warehouse.c에 “robots”로 선언되어 있으며 동적 할당 필요
해당 물류 로봇이 요구하는 물건 적재 지역을 거쳐 정해진 하역 장소까지 도달해야 함
초기 물류 로봇은 W에 위치해야 함
모든 물류 로봇은 한 번의 스탭 중에 대기 혹은 이동 중 하나의 행동만 가능해야 함
물류 로봇이 하역 장소나 대기 장소에 있어도 상태 정보 전달 필수
참고 사항
물류 로봇에 대한 구조체는 robot.h/.c에 정의
중앙 관제 노드 제어 필요
물류 로봇이 이동할 수 있는 조건을 고려하여 모든 물류 로봇들이 각자 하역 장소까지 도달하게 해야 함
한 번에 하나씩 물류 로봇을 제어해서 미션 수행 가능
모든 물류 로봇에게 상태 정보를 전달 받을 때까지 대기(Wait) 후, aw_manager.h/.c에 정의된 print_map() 호출
print_map 수정 X & 호출 때, 스레드는 반드시 Block (그렇지 않으면, 감점)
이후 상태 정보들을 기반으로 각 물류 로봇에게 대기 혹은 상하좌우 이동 행동 지시 후 aw_manager.h/.c에 정의된 increase_step() 호출
모든 물류 로봇들을 Unblock 필수
모든 물류 로봇이 물건을 운송하였으면 시뮬레이션 종료

5. 물류 센터에 동시에 여러 물류 로봇 제어

물류 센터에 동시에 여러 물류 로봇을 제어할 경우 가산점 부과
동시 제어시에도 물류 로봇의 이동 조건을 어길 시 감점

6. 보고서 작성

본인이 작성한 코드에 대한 구현 방법
트러블 슈팅 과정
결과에 대해 설명하는 보고서

프로젝트 계획

[1] Pintos 빌드 및 실행
[2] 시뮬레이터 실행 파라미터 입력 값 파싱