Lab 정리

권나영·2020년 10월 13일

임베디드 시스템

목록 보기
2/2

Lab 4

  1. 3개의 process의 PID가 0,2,5 이고 priority는 25, 20, 30 일 때, q = 60이 ready list이고, 세 process는 ready list에 있을 때, nproc table 그리기

  1. int32 와 uint32의 범위?
    2^31 -1 >= int32 >= -(2^31)
    2^32 -1 >= uint32 >= 0

  2. priority bit가 -8~+8이면 몇 비트가 Qtab에 있는 것?
    5비트 (11000 ~ 01000)

  3. 아래 함수들의 인자들이 bad numbers가 아닌지 확인하는 macro?

pid32 getfirst(qid16 q)
pid32 getlast(qid16 q)
pid32 getitem(pid32 pid)

isbadqid(q)를 getfirst와 getlast의 시작점에서 불러준다. 그 후에, isbadpid(x)를 getitem에서 불러준다.

#define isbadpid(x) 
( ((pid32) (x) < 0 || ((pid32) (x) >= NPROC) || 
(proctab[(x)].prstate == PR_FREE) )
/* pid가 0보다 작거나 NPROC 이상일 때,
(즉, proc table 범위를 넘어섰을 때)
혹은 이미 해제된 (PR_FREE) process일 때
*/
#define isbadqid(x) ( ((int32) (x) < 0 || (int32)(x) >= NQENT -1)
/* qid가 0보다 작거나 NQENT 이상일 때,
(즉, Qtab 범위를 넘어섰을 때)
*/
  1. process의 개수가 50개이고, 세마포어 수가 20개일 때 NQENT 값은?
    50 + 20x2(세마포어 head, tail) + (1+1)x2(ready list, sleep list head, tail)
    = 94

list 개수는 반드시 head, tail 때문에 2를 곱해줘야 함

  1. NQENT가 54이고 프로세스 개수가 30개일 때, 몇 개의 list가 Qtab에 할당 돼?
    54 - 30 = 24
    여기서 list는 head, tail 개수가 2배로 취급되니까,
    12개의 list(1개 ready list, 1개 sleep list, 10개 세마포어 리스트)

lab4 만들기
$ mkdir temp
temp 폴더 만들어줌
$ cd temp
$ cp /home/xinu/xinu/system/main.c f1.txt
temp로 이동해서 xinu system의 main.c를 f1.txt로 temp 폴더에 복사해옴
$ vi lab4.c
lab4.c를 만들어줌

#include <fcntl.h>
#include <stdio.h>

extern void copy(int, int);
char buffer[2048];
int version = 1; 

int main(int argc, char *argv[]) /* argc : 운영체제가 이 프로그램을 실행했을 때 전달되는 인수의 갯수. 프로그램을 실행할 때 인수를 전달받을 수 있음(도스에서 파일 카피, 이동과 같은 명령 시행 시 처럼) argv 갯수 (argv의 첫번째는 무조건 프로그램 실행 경로라서 무조건 1개이상), *argv[] : main 함수에 전달되는 실제적인 데이터. */
{ 
  int fdold, fdnew; 

  if (argc != 3) { /* 명령 라인의 인수가 3개가 아니면, 에러 */
     printf("Usage: a.out f1 f2\n”);
     exit(1);
  }     
  fdold = open(argv[1], O_RDONLY); /* open source file argv[1] read only */ 
  if (fdold == -1) { /*fdold 파일 식별자가 반환되지 않았을 때, 에러*/
     printf ("cannot open file %s\n", argv[1]); 
     exit(1); 
  } 
  fdnew = creat(argv[2], 0666); /* create target file argv[2] rw for all */ 
  if (fdnew == -1) { /*fdnew 파일 식별자가 생성 되지 않았을 때 에러*/
     printf ("cannot create file %s\n", argv[2]); 
     exit(1); 
  } 
  copy (fdold, fdnew); /*fdnew를 fdold로*/
  exit(0); /* 정상 종료*/
}

void copy (int old, int new) 
{ 
  int count; 
  while ((count = read(old, buffer, sizeof(buffer))) > 0) /*read(open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호, 파일에서 읽은 데이터를 저장할 메모리 공간(void *buf), 읽을 데이터의 크기(Byte 단위)) : 파일 읽기 성공했을 때(EOF 아닐 때) 0보다 큰 수
즉, old 파일이 EOF되지 않는다면, while문은 계속 동작*/
write (new, buffer, count); /*write(open() 시스템 콜로 열린 파일을 가리키는 파일 지정 번호, 파일에 쓸 데이터를 저장하고 있는 메모리 공간, 파일에 쓸 데이터의 길이): 파일 쓰기 성공했을 때 0 반환*/
}
/*즉, copy function은 old 파일에서 read해 온 내용을 buffer에 담아 두었다가, new file에 write해주는 역할*/

$ gcc lab4.c
컴파일
$ ./a.out f1.txt f2.txt
lab4.c를 컴파일해서 a.out이 생긴 것인데, 위 코드의 매개변수로 f1.txt와 f2.txt를 주면, 아무것도 나타나지 않고 f2.txt에 f1.txt내용이 copy됨

  • config 폴더에서 어떻게 NPROC 수를 알 수 있을까?

grep : 찾기 명령어

grep 명령어
grep NPROC *

xinu 폴더를 xinu_lab5폴더에 그대로 복사하기

$ cp -r xinu xinu_lab5

profile
나영

0개의 댓글