Labをクリア

11417 ワード

Lab 4

  • 3プロセスのPIDが0、2、5、優先度が25、20、30の場合、q=60はready list、3プロセスはready listの場合、nprocテーブルは
  • を描画する

  • int 32とuint 32の範囲は?
    2^31 -1 >= int32 >= -(2^31)
    2^32 -1 >= uint32 >= 0

  • priority bitが-8~+8だとQtabで何位?
    5ビット(11000~01000)

  • 次の関数のパラメータがbadnumbersのmacroであるかどうかを確認します.
  • pid32 getfirst(qid16 q)
    pid32 getlast(qid16 q)
    pid32 getitem(pid32 pid)
    getfirstとgetlastの開始点でisbadqid(q)を呼び出します.次にgetitemでisbaddpid(x)を呼び出します.
    #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 범위를 넘어섰을 때)
    */
  • 過程の個数は50個で、細い麻の花の魚の数は20個の時のNQENT値ですか?
    50+20 x 2(細い麻の布の頭、尾)+(1+1)x 2(ready list,sleep list head,tail)
    = 94
  • List個数はhead、tailに2を乗じなければならない

  • NQENTは54で、プロセス数が30の時、何個のリストがQtabに割り当てられますか?
    54 - 30 = 24
    ここlistのheadとtailの数は2倍で、
    12個のlist(1個ready list、1個sleep list、10個の細い麻布リスト)
  • lab 4の作成
    $ mkdir temp
    tempフォルダの作成
    $ cd temp
    $ cp/home/xinu/xinu/system/main.c f1.txt
    tempからxinuシステムのmainに移動cはf 1である.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は、上記コードのパラメータf 1としてa.outを生成する.txtとf 2もしあなたが私にtxtをくれたら、何も現れません.f 2.txtにf 1を加える.txtコンテンツがコピーされました
  • configフォルダからNPROCの数を知るにはどうすればいいですか?
  • grep:検索コマンド


    grepコマンド
    grep NPROC *

    xinuフォルダをxinu lab 5フォルダにコピーする


    $ cp -r xinu xinu_lab5