SSE3044: Operating Systems (Fall 2014)

TA Office Hour : Wed 15:00~17:00 / Thu 15:00~17:00 85557

[2014. 12. 3 Notice]

Project Score

OSproject Score

기여도는 50%에 대해 10%마다 2%의 추가점수(혹은 감점으로) 채점되었습니다. Oral test에 따라 Project 3에서 -20~+10의 점수가 감점 혹은 추가되었습니다. Code Data영역에 대한 Lazy loading 구현 안했을 시, sys 서버에서 받은 3-2점수에서 15점이 감점됩니다.

테스트 점수 비율은 project 1이 1:3, project 2가 1:6, project 3이 1:1로 채점됩니다. 각 프로젝트마다 주석 및 보고서의 점수 비율은 30%입니다.

[2014. 12. 3 Project Notice]

Project 3 oral test 신청

https://docs.google.com/spreadsheets/d/1-8fMzOLqDOrC8z7BC7zP0lfro-Iv-k-aoPWn3M8tFd8/edit?usp=sharing


[2014. 11. 25 Project Notice (11.26 수정)]

project 3-2가 업로드 되었습니다. 테스트 시간이 최대 30분정도까지 늘어날 수 있습니다. (보통은 5~10분 정도입니다. 모든 테스트에서 100초가 넘어가면 30분정도 걸릴 수 있습니다.) 마지막 날에 급하게 테스트하지 마시고, 미리미리 테스트해 보시기 바랍니다.

swap read/write 횟수와, 시간 측정은 지터를 적용하지 않은 테스트에 의해 진행됩니다. 따라서 지터 적용한 테스트가 fail이어도 가산점을 받을 수 있습니다.

시간측정은 tick으로 출력되며, swap은 read/write횟수가 출력됩니다. 출력되는 위치는 예전에 FAIL을 확인하던 success 버튼에서 확인 할 수 있습니다.

pool의 크기는 조절 할 수 없습니다.(수정)


[2014. 11. 24 Project Notice]

mmap을 구현 못하신분들도 끝까지 하시기 바랍니다. 3-2에서 mmap과 관련된 테스트는 하나뿐입니다.

[2014. 11. 24 Project Notice]

project3-2

[2014. 11. 19 Project Notice]

vm/Make.vars 에서 --qemu 를 --bochs로 바꿔주세요. 안 그러면 채점서버에서 채점이 되지 않습니다.

[2014. 11. 18 Project Notice]

project3-1에 multi-oom은 포함되지 않습니다. 참고바랍니다. (통과하지 않아도 감점 대상이 아닙니다.)

[2014. 11. 17 Project Notice]

아직 2의 Doc 점수는 반영이 안 되었습니다.

Project1, 2 Score

[2014. 11. 12 Project 3-1 Notice]

project 3-1에서 새로운 파일 만들어도 됩니다.

제한 조건 : filesys/ , vm/ , userprog/, thread/ 의 내부와 Makefile.* Make.*를 고칠 수 있음. tests/폴더는 변경해도 반영 안 됨.


프로젝트 3 전체 순서

페이지폴트에서 메모리 할당할때 (palloc 할때) PAL_USER flag를 붙여야 합니다.

1. 스택 growth 부터 작성

  -스택 페이지 폴트가 났을 때 새로운 physical page 할당하고,
  -페이지 테이블에 맵핑해줌
  -판단은 페이지 폴트 났을 때 esp와 유저모드->커널모드 전환시 스택 포인터

2. mmap/munmap system call

  -자료구조는 자유이나, 프로세스마다 하나씩 있는 supplemental page table(스왑에서도 동일한 테이블 사용)이 필요함 

(페이지 폴트시 mmap 영역인지 아닌지 판단 여부와, 그 위치, 프로세스 죽을 때 해제 여부 판단)

  -어떤 파일이 매핑되었고 그 길이가 얼마인지 프로세스마다 정보 필요

3. code/ data lazy loading (project 3-2)

  -load_segment 함수에서 palloc을 모두 빼고, 페이지 폴트를 통해서만 페이지 할당
  -code data여부는 load함수에서 load_segment를 부를 때 한 루프에 해당함.

4. frame table 구현 (project 3-2)

  -page 할당될때마다 어떤 물리페이지인지 주소 모두 저장(커널 주소로)
  -메모리가 부족할 때 페이지를 회수(reclaim)하는 메커니즘을 위해 필요

5. page_replacement 구현 (project 3-2)

  -회수 대상이 되는 페이지는 유저 페이지
  -backing storage가 있으면 dirty할때만 writeback. clean이면 버림.
  -backing storage가 없으면 swap


[2014. 11. 10 Project 3-1 Notice]

다음 수업은 11.24입니다. project 2-2는 11월 11일 밤 12시(12일로 넘어가는 밤)까지 제출입니다.


프로젝트 3 팁

1. 페이지 폴트(exception.c) 혹은 pagedir_get_page 함수에서 NULL이 나오면

  -> 페이지가 없다. 다른 의미로 페이지 엔트리의 비트맵(PTE_P)이 클리어 된 상태이다.

2. mmap된 페이지에서 unmap(3-1) 혹은 eviction(3-2)될 때 해당 페이지 테이블이 dirty하면 writeback하고, clean하면 원본이 파일과 같으므로 그냥 회수(free)한다. dirty인 경우 clear해줘야 한다.

3. dirty 검사를 할때 커널 페이지 테이블(init_page_dir)도 dirty한지 검사해 줘야 한다. (user page는 커널과 유저 모두 공유(share)하고 있음. 하지만 페이지 테이블은 따로 있음.)

4. 2에서도 bad ptr 처리를 모두 page fault에서 exit -1 하면 된다고 얘기했었는데, 3에서 "페이지 폴트를 핸들링해서 물리 페이지를 할당한다는 의미"는 페이지 폴트가 난 시점과 exit -1하기 전 사이에 처리를 해주면 된다는 의미입니다.


[2014. 11. 9 Project 3-1 Notice]

project3-1

project 2 oral test

https://docs.google.com/spreadsheets/d/1x82lwoKArfYEU2IPZ-HQIVXpOR8dlO6JK1KRaMpdpZk/edit?pli=1#gid=0

[2014. 11. 7 Project 2-2 Notice]

thread.c에서 thread preemption을 빼는 것은 금지입니다. 이 부분을 뺄 경우 그와 관련된 모든 테스트가 통과하지 않았다고 판단하겠습니다. (자식 쓰레드를 부르는 모든 테스트에 대해서 통과하지 않았다고 판단함)

[2014. 11. 6 Project 2-2 Notice]

  • 채점 서버에서 execution의 success 버튼을 누르면 어떤 테스트가 fail 됐는지 알 수 있습니다.

[2014. 10. 27 Project 2-2 Notice]

시험 성적 확인하실 분들은 수요일 오후(1~5시)에 오시면 됩니다.

  • 하나 잘못 알려드린 부분이 있습니다. 커널 모드에서 유저 어드레스를 접근할 수 없는 것처럼 설명해 드렸는데, 접근할 수 있고, 굳이 함수(pagedir_get_page)를 써서 커널어드레스로 바꿀 필요가 없습니다.(여전히 유저모드에서는 커널 어드레스에 접근 할 수 없습니다.) 하지만 잘못된 주소 접근 시에, 페이지 폴트로만 핸들링하는지 함수를 써서 핸들링 하는지에 따라서 나중에 project3에서의 구현이 조금 차이가 날 수 있습니다.
  • read/write구현은 제가 수업에서 말한 것 처럼 하지 않아도 시스템 콜에서 user address 로 접근하면 됩니다. 단지 project3에서 핸들링 하는 방법에서 바뀌게 됩니다.

[2014. 10. 27 Project 2-2 Notice]

project2-2

[2014. 10. 17 Project 2-2 Notice]

userprog/Make.vars 에서 SIMULATOR = --bochs 로 수정해주시기 바랍니다.

채점은 bochs 시뮬 환경에서 진행됩니다.

[2014. 10. 16 Project 2-1 Notice] (수정, 추가부분 있음)

Tip


1. argument passing 은 프로세스 스택이 만들어진 직후(페이지가 할당한 직후)에 시행해야 합니다.

2. syscall_handler에서 f->esp는 user stack이고 kernel address로 바꾸어 주어야 합니다. 각 esp에서 0, +4, +8 한 값이 어떤 것인지 printf로 찍어보면 금방 알 수 있습니다. 리턴 값(예, open일 경우 fd / write,read인 경우 성공한 바이트 수) 은 f->eax에 넣으면 됩니다.

3. argument passing없이 일단 exit / wait 부터 하고 싶으면 문서에도 있는데, esp = PHYS_BASE; 를 esp = PHYS_BASE-12; 로 바꾸고 하시면 됩니다.

4. exit /wait는 initial value 0인 semaphore를 이용하시는 게 좋습니다. condition variable 이용해도 구현 할 수는 있습니다.

5. 당장은 필요없겠지만 process loading할때도 sync를 맞춰줘야 하는 부분이 있습니다.물론 짜기 나름이겠지만, (예, 프로세스가 execute 하는 과정에서 오류가 나면 exit(-1)하고 exec가 pid -1을 리턴해야하는데, exec가 pid를 미리 리턴해버린 경우) initial value 0인 semaphore를 이용하는 게 좋습니다.

6.fd 0번은 표준 입력(standard input), 1번은 표준 출력 (standard output), 2번은 에러 출력입니다. fd 0,1,2 중에 1번만 처리하면 project 2 전체에서 표준 입출력은 통과합니다.

7. address로 덧셈, 뺄셈, 비교 연산할 때 unsigned int 로 연산하시기 바랍니다.(예 0xc0000000는 signed int 범위 넘음)

8. load 함수에서 실행할 파일을 열 때 argument의 첫 번째 토큰을 파일이름으로 해서 열어야 합니다.

9. project 2-1에서 각각의 테스트는 점수가 같습니다. 비율은 모두 동일합니다. 2-2에는 변경될 수 있습니다.


[2014. 10. 15 Project 2-1 Notice]

이번 과제는 build폴더 밑에서 make check하셔야 됩니다.

userprog 폴더에서 make 먼저 한번 하고

cd build

make check

로 하셔야 테스트가 되고, 개별적인 테스트도 모두 build 폴더 아래에서 해 주시기 바랍니다.

[2014. 10. 10 Project 2-1 Notice]

project2-1

[2014. 10. 10 Project 1-2 Notice]

mlfqs 에 대한 질문이 많습니다.

thread.h 에

extern bool thread_mlfqs 이라는 글로벌 변수가 선언 되어 있습니다.

-mlfqs옵션을 주면 thread_mlfqs가 true값을 가지게 되어서 해당 옵션을 줬을 때만 특정 메커니즘을 동작시킬 수 있습니다. 그래서, 다른 테스트와 독립적으로 동작하려면 thread_mlfqs가 참일 때만 aging(priority, recent cpu, load avg ... 계산)을 시켜줘야 합니다.

다음은 make check 할 때 나온 로그 중에 커맨드 하는 부분을 긁은 부분입니다.

pintos -v -k -T 480 --bochs -- -q -mlfqs run mlfqs-load-60 < /dev/null

위 커맨드 처럼 하시면 개별적으로 다 테스트를 할 수 있습니다.

[2014. 10. 2 Project 1-2 Notice]

multiple-donate-nest2라는 테스트 케이스가 서버에 추가 되었습니다. 현재 핀토스 multiple-donate-nest 케이스를 보면 3개의 쓰레드에서 두개의 락만 중첩해서 걸린 케이스만 통과하면 되는데, nest2 테스트는 그 이상의 쓰레드가 중첩될 때도 priority-donate를 적절하게 수행해 주어야 합니다.

[2014. 9. 30 Project 1-2 Notice]


 tests/threads/mlfqs-recent-1
 tests/threads/mlfqs-fair-2
 tests/threads/mlfqs-fair-20
 tests/threads/mlfqs-nice-2
 tests/threads/mlfqs-nice-10

다음 프로젝트에서 jitter를 적용한 5개의 테스트는 채점에 제외하도록 하겠습니다. (지터를 적용하지 않은 부분에 대해서는 여전히 통과해야 합니다.)

semaphore에 대해서도 donation을 통과해야하지만 multiple/nested에 대한 부분은 inital value가 1인 케이스에 대해서만 통과하시면 됩니다.

[2014. 9. 26 Project 1-1 Notice]

주석은 이번 프로젝트에서는 한글 혹은 영어로 달아주시면 됩니다.

리눅스 한글 사용법에 대해서 질문하시는 분들이 많은데

nabi 라는 툴을 이용하시면 됩니다.

sudo apt-get install nabi

우분투 14.04의 경우 Ubuntu의 language support 메뉴 - keyboard input method system에서 hangul/(nabi가 있다면 nabi) 선택 - Ubuntu 다시 시작

다른 리눅스 버전도 비슷할텐데, 그부분은 찾아보시기 바랍니다.

다음 프로젝트부터는 일괄적으로 한글로 달아주시면 됩니다.

[2014. 9. 22 Project 1-2 Notice] (~10/12 23:59:59)

project1-2

미리 하실분들은 미리 sys.skku.edu에 올리셔도 무방합니다.

[2014. 9. 22 Project 1-1 Notice]

Hint : 더 높은 priority를 가진 thread가 create 되거나 change 되면 즉시, thread_current를 그 thread로 바꾸어야 합니다.

[2014. 9. 21 Project 1-1 Notice] (~9/28 23:59:59)

TA시간 때 2 가지 빠뜨린 점이 있어서 알려드립니다.

Hint : init_thread와 thread_create가 따로 있습니다. init_thread는 가장 처음에 한번만 실행되는 부분이며, 두 부분 모두, thread를 초기화하는 부분이니 차이점을 잘 살펴보시기 바랍니다.

Hint : 4 Tick 마다 thread_tick함수가 자동으로 thread_yield를 하게끔 되어 있고, 그때마다 cpu를 점유하고 있던 thread들이 바뀌게 됩니다.

[2014. 9. 21 Project 1-1 Notice] (~9/28 23:59:59)

project1-1

앞으로 제출은 sys.skku.edu를 통해서 받겠습니다. sys.skku.edu 에 가입하시면 제가 권한을 승인해 드립니다. 이미 컴퓨터 시스템 개론은 듣고 계신 분들은 재가입하실 필요 없습니다.

제출 방법 : 로그인후, 해당과목(Operating System) 세션의 Assignment -> Submit & Test 클릭 -> Source code 라디오 버튼 -> Choose File-> Submit -> 해당 파일 Run

주의사항 : 반드시 make clean 하시고 업로드 하시고 src 폴더만을 압축해서 올려야 합니다.

               압축파일을 풀면 src 폴더만 딱 나와야 합니다.

제한사항 : 15초 제한시간 내에 7개의 테스트가 모두 통과할 것. (make 하는 시간 포함, testcase는 2번의 테스트를 각각 15초 내에 통과해야 점수를 얻게 되어 있습니다.) 시간 오버시, 그 때까지 나온 테스트를 통해 점수를 반영.

src/devices/, src/threads/ 디렉토리 외에 수정 사항은 채점에 반영되지 않음.

소스코드만 제출하시고, 문서는 모두 project1이 종료될 때 받는 것으로 하겠습니다. 소스코드의 주석은 잘 달아주셔야 됩니다.

조확인

1 장인수 이태혁 2 김현석 조성혁 3 김대현 이동윤 4 신석하 강경문 5 안성기 김인선 6 한상훈 오창현 7 김경훈 김진수 8 김민수 이재호 9 김민우 이창근 10 김용해 한동빈 11 이선종 이종열 12 조현광 이규선 13 박주연 홍시내 14 김승주 김종화 15 최창호 16 고재현 김상훈


GDB 사용방법 :

       0. utils/pintos-gdb파일에서 위쪽의 경로를 자신의 홈폴더로 바꾼다.
       1. 커널을 make한다.
       2. 터미널을 두 개 켠다.
       3. 하나의 터미널에서 pintos --gdb -- run alarm-multiple 을 친다.
       4. 다른 하나의 터미널에서 src/thread/build 폴더에서 pintos-gdb kernel.o 수행한다.
       5. gdb가 뜨면 target remote localhost:1234를 입력한다.
       6. 명령어는 appendix E: Debugging Tools에 수록되어 있다.

[Project 0 Notice] (~9/21 23:59:59)

Make sure that you should "make clean" on Pintos and only compress a src directory. The mail that includes binary files or other executable scripts will not be sent to TA !!!!

Please send TA your team members (2 people) , if you do not until next Monday, TA will make groups at random.'

project 0 제출명단

김민수, 김승주, 김상훈, 김인선, 강경문, 이종열, 김용해, 장인수, 이선종, 김대현, 김경훈, 조성혁, 최창호, 신석하, 이동윤, 고재현, 김진수, 이창근, 오창현, 안성기, 김종화, 김현석, 한동빈, 박주연, 조현광, 김민우, 이규선, 한상훈, 홍시내, 이재호

제출확인못함 : 이태혁

[Projects]

  • We will use the Pintos instructional operating system. To successfully complete these projects, you must have excellent C programming skills and be familiar with the Linux platform.
  • TA Class

Place : 400202 Time : 7 pm. Monday

Overview

[Project 0] (~9/21 23:59:59)

  • Install Pintos on your computer
  • Create new test case on your source code
  • Make sure that you compress the 'src' directory, not 'pintos' directory

project 0

coding sytle & tool

[ install instruction ](Ubuntu 14.04 64bits)

1. 루트 권한 획득

 $ sudo su

2. 필수 유틸 설치

 $ apt-get install g++ xorg-dev ncurses-dev vim

3. pintos 다운 및 압축풀기

 $ wget http://csl.skku.edu/uploads/SWE3004S14/pintos.tar.gz

 $ tar xzf pintos.tar.gz

4. bochs 다운로드

http://bochs.sourceforge.net

– Make sure you are downloading v2.2.6 (bochs-2.2.6.tar.gz)

압축은 풀지 않는다. 5번에서 알아서 압축을 해제한다.

5. pintos 내부 스크립트 이용해 bochs 설치

pintos/pintos/src/misc 에서

예시)

sudo env SRCDIR=/home/topcoder2/Downloads/ PINTOSDIR=/home/topcoder2/pintos/pintos/ DSTDIR=/usr/local/ ./bochs-2.2.6-build.sh

SRCDIR = bochs 다운로드 받은 tar.gz 파일이 있는 디렉토리 PINTOSDIR = pintos 루트 디렉토리

6. pintos 경로 설정

export PATH=$PATH:/home/topcoder2/pintos/pintos/src/utils

- "~/.bashrc"에 추가해두면 이후에 이 구문을 작성하지 않아도 된다.

- vi ~/.bashrc 해서 가장 마지막 줄 추가 (주의 : root권한(sudo su 했을 때)과 일반계정의 파일이 따로 있음), 이경우 반드시 터미널을 다시 켤것

7. test 해보기

pintos/pintos/src/threads에서

$make

$pintos run alarm-multiple

$make check

$make grade

8. cscope 설정

$apt-get install cscope

src 디렉토리에서

$cscope -R

$vi ~/.vimrc

 set cst 

 cs add /home/topcoder2/pintos/pintos/src/cscope.out /home/topcoder2

/pintos/pintos/src/

경로에 맞춰 추가 한 후

:wq 로 저장

[Project 1]