プロセス・スレッド - XV6は、ソースコードを読み取ります

Exercise1ソースコードリーダ

1.基本ヘッダファイル:types.hでparam.h memlayout.h defs.h x86.h asm.h mmu.h elf.h

  • types.hで:ちょうど定義されたUINT、USHORT、UCHAR pde_t別名。
typedef unsigned int   uint;
typedef unsigned short ushort;
typedef unsigned char  uchar;
typedef uint pde_t;
  • parame.h使用マクロは、プロセスは、いくつかのファイル記述子を開くことができるプロセスの最大数、プロセスのカーネル・スタック・サイズ、CPUの最大数を定義します。
#define NPROC        64  // maximum number of processes
#define KSTACKSIZE 4096  // size of per-process kernel stack
#define NCPU          8  // maximum number of CPUs
#define NOFILE       16  // open files per process
#define NFILE       100  // open files per system
#define NBUF         10  // size of disk block cache
#define NINODE       50  // maximum number of active i-nodes
#define NDEV         10  // maximum major device number
#define ROOTDEV       1  // device number of file system root disk
#define MAXARG       32  // max exec arguments
#define LOGSIZE      10  // max data sectors in on-disk log
  • memlayout.h:メモリマクロ定義の変換範囲、及びオフセットアドレス等を用いて、
  • defs.h:前方の内側には、これらの機能を実現するグローバル関数の数は、グローバルモジュールで定義されているという記述が使用され、多くのステートメントが含まれています。
  • x86.h:Cコードは、アセンブラ命令の数は、ユーザ・モード・カーネルモード構造体trapframeにデータ構造を定義する、インタラクティブな機能を抑制定義します。
  • asm.h:アセンブラマクロ定義。
  • mmu.h:メモリ管理ユニット、プロセスのアドレス空間の詳細なデータ構造。
  • elf.h:データ構造ELF形式のオブジェクトファイルに関する声明。

2.プロセスねじ部:vm.c proc.h proc.c swtch.S kalloc.c及びコードに関連する他のドキュメント

  • vm.c:その上、このようなアプリケーションのページテーブルとしてメモリ管理インタフェース、ページテーブル解放され、変換ページディレクトリ、結合プロセスCPUと、
  • proc.h:宣言されたCPU、プロセス、および他のプロセスコンテクストデータ構造;
    swtch.S内部コンテキストスイッチ命令は、コンパイルされ、格納場所は、プロセスがローディングサイトをスワップされ、プロセスをスワップアウト。
  • kalloc.c:アプリケーションと物理メモリの解放。メインインターフェイス:ボイドkinit1(ボイド* VSTART、ボイド*、販売)、kinit2(ボイド* VSTART、ボイド*、販売)、CHAR * kalloc(ボイド)、ボイドkfree(CHAR * V)。

読書とExercise2問題

1.プロセスとは何ですか?スレッドとは何ですか?単位は何のオペレーティング・システム・リソースの割り当てとスケジューリング単位ですか?どのようなプロセスやそれぞれのスレッドのXV6、それを達成していること?

  • 処理後、各ジョブや概念の導入のためにシステム内の活動パターンを説明するために、マルチチャンネルプログラミングシステムの出現です。プロセスは、以下の3つの基本的な状態には、ランニング、準備及び待機状態を、プロセスは、活動の最初の実行上のデータ収集プログラムの独立した機能です。
  • スレッドは軽量プロセス、スレッド、実行プロセス内の比較的独立したユニットであり、プロセスは、タスクが呼び出された場合、スレッドは、サブタスクアプリケーションを実行することです。
  • ユニットオペレーティング・システム・リソース割当てプロセスは、プロセッサ・スケジューリング・ユニットは、スレッドです。
  • xv6オペレーティングシステムは、プロセスベース(実装されていないスレッド)は、単純なプロセス管理機構を実装します。CPUのXV6のデータ構造とプロセスはproc.h.を見ます
// proc.h 
// 上下文切换现场
struct context {
  uint edi;
  uint esi;
  uint ebx;
  uint ebp;
  uint eip;
};
// 枚举进程状态
enum procstate { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };

// Per-process state
struct proc {
  uint sz;                     // Size of process memory (bytes)
  pde_t* pgdir;                // Page table
  char *kstack;                // Bottom of kernel stack for this process
  enum procstate state;        // Process state
  volatile int pid;            // Process ID
  struct proc *parent;         // Parent process
  struct trapframe *tf;        // Trap frame for current syscall
  struct context *context;     // swtch() here to run process
  void *chan;                  // If non-zero, sleeping on chan
  int killed;                  // If non-zero, have been killed
  struct file *ofile[NOFILE];  // Open files
  struct inode *cwd;           // Current directory
  char name[16];               // Process name (debugging)
};

2.プロセスは、どのようなデータ構造で管理ですか?WindowsやLinuxでは、XV6は、それぞれあなたの名前は何ですか?これは何が含まれていますか?オペレーティング・システムは、データ構造を管理するプロセスを管理する方法ですか?彼らはどのように初期化されますか?

  • プロセス管理のデータ構造は、プロセス制御ブロック(PCB)です。
  • Linuxでは、プロセスを管理するために必要な各種情報を含む内部/include/linux/sched.hたstruct task_struct、です。あなたは、新しいプロセス、メモリ内のtask_struct空のシステムアプリケーションを作成し、必要な情報を入力する場合。ポインタは、タスク構造[]配列内に充填されています。現在指示する[] current_set PCBポインタ配列を有するプロセスを実行します。Linuxは、マルチプロセッサシステム、同時にプロセスを実行して複数のシステムに存在してもよく、それはcurrent_setポインタ配列として定義されているサポートしているためです。
  • EPROCESS(実行可能なプロセスオブジェクト)で表されるWindowsで、PCBはまた、カーネルプロセスブロックKPROCESS(すなわちKPROCESSカーネル・プロセス・オブジェクト)、カーネル空間とKPROCESSでEPOCESSと呼ばれます。
  • プロセスID、プロセスの状態、親プロセス、コンテキスト、CPU記録されたアドレスのメモリとスタックポインタを含む文のPROC .H XV6、。()プロセス制御及びget_raw_procによって管理XV6について、get_raw_proc()メソッドは、新しいプロセスを作成するプロセスは、割り当てプロセスのページ・テーブルとカーネルスタックを初期化します。

状態の?プロセス状態XV6変換チャートを描画し3.XV6プロセス。Linuxでは、プロセスを含め、それぞれの状態は?なぜあなたはデザイナーがアイデアを設計し、そのようなオペレーティングシステムがそこにあるものだと思いますか?

  • 各状態遷移図でXV6プロセスを次のように

  • LinuxプロセスのステータスがR(TASK_RUNNING)、実行可能な状態に分けることができ、S(TASK_INTERRUPTIBLE)は、睡眠を中断することができ、D(TASK_UNINTERRUPTIBLE)無停電睡眠、T(TASK_STOPPEDまたはTASK_TRACED)は、状態またはトラッキング状態をサスペンド、Z (TASK_DEAD - EXIT_ZOMBIE)終了ステータスが、資源は、と呼ばれるゾンビプロセス、X(TASK_DEAD - EXIT_DEAD)リサイクルではない終了ステータスを、プロセスが破壊されようとしています。
  • この設計のこの設計の目的は、状態のCPUより良いスケジューリングに従って処理を行うCPU使用率を向上させ、CPUの浪費を避けるために、IO集約型とCPU集約型のプロセスを適応する能力です。

プロセスのどのなぜオペレーティングシステムは、最大CPUプロセスをサポート制限は何?スケジューリングアルゴリズムを、複数のプロセスをスケジュールする方法は?(子プロセスを作成する)マルチプロセスを開始するために数4?XV6最大数はどのくらいですか?ハンドオーバ処理を実行する方法は?プロセスのコンテキストは何ですか?マルチプロセスとマルチCPU関係は何ですか?

  • 親プロセスは、フォーク()関数は、複数のサブプロセスを作成し使用することができます。まず、それぞれの新しい子プロセスに無料proc構造体を割り当て、子供に固有の識別PIDを与える;第二に、(コピー・オン・ライト牛を使用して)親プロセスのアドレス空間に1ページをコピーするには、子供へのアクセスは、株式を継承ポインタリソースは、最終的には子供がキューに参加する準備ができていると、子プロセス識別子0が返され、子は親プロセスpidに返されます。
  • レディキューでCPU使用指定されたスケジューリングアルゴリズムの実行は、通常のスケジューリングアルゴリズムからコースを選択:ラウンドロビンスケジューリングを、まず最初に来る、短い運転優先スケジューリングポリシー、優先度ベースのプリエンプティブスケジューリングポリシーを、サーブ、優先度ベースのノンプリエンプティブスケジューリングポリシー、最短第アルゴリズム、多段フィードバックキューアルゴリズムよりも高いことに応答して、時間の最初のアルゴリズムを残り。
  • 一是内存空间有限,如果读入的进程数量过多,势必会吃掉大量的内存空间,而cpu在调度过程中也会从栈或堆上申请空间,如果申请失败则无法继续运行。二是增加了缺页中断的可能性,会导致cpu不断的执行页面换入换出,使得大部分时间浪费在无意义的事情上;
  • XV6的最大进程数见param.h文件中的#define NPROC 64,最大64;
  • 进程切换是一个进程让出处理器,由另一个进程占用处理器的过程。进程的切换是由进程状态的变化引起的,而进程状态的变化又与出现的事件有关。当有事件(中断或异常)发生时,当前运行进程暂停,保存当前进程的现场,然后根据调度算法从就绪队列选一个进程换入CPU,同时加载换入进程的现场进行执行;
  • 进程的上下文包括当前进程的程序计数 器PC和当前运行的CPU中各个寄存器的内容。当进程切换和发生中断的时候这些信息要保存下来以便于下次运行时使用;
  • 同一时刻每个cpu上只能有一个进程被执行,且同一时刻一个进程只能被一个cpu调度,同一时刻多个cpu可以同时调度不同的进程,同一时间段内每个cpu可以调度多个进程。

5.内核态进程是什么? 用户态进程是什么? 它们有什么区别?

  • 多数系统将处理器工作状态划分为内核态和用户态。前者一般指操作系统管理程序运行的状态,具有较高的特权级别,又称为特权态、系统态或管态;后者一般指用户程序运行时的状态;具有较低的特权级别,又称为普通态、目态。区分了用户态和内核态就是限定用户什么操作可以做,什么操作不能让用户直接做。如果遇到不能让用户直接做的操作,用户就必须请求操作系统做系统调用,这样操作系统就会进入内核态进行系统操作。内核态的进程就是系统进入内核态之后进行系统操作所产生的进程;
  • 用户态进程是用户通过请求操作而产生的进程;
  • 区别: 运行在不同的系统状态,用户态进程执行在用户态,内核态进程执行在内核态;进入方式不同,用户态进程可直接进入,内核态必须通过运行系统调用命令;返回方式不同,用户态进程直接返回,内核态进程有重新调度过程;内核态进程优先级要高于用户态进程,并且内核态进程特权级别最高,它可以执行系统级别的代码。

6.进程在内存中是如何布局的? 进程的堆和栈有什么区别?

  • 内存分为内核空间和用户空间,内核空间一般运行操作系统程序,而用户空间一般运行用户程序。主要目的是对系统程序进行包含。进程在内存中包含堆、栈、数据段、代码段。代码段 : 保存程序的执行码,在进程并发时,代码段是共享的且只读的,在存储器中只需有一个副本。数据段 : 此段又称为初始化数据段,它包含了程序中已初始化的全局变量、全局静态变量、局部静态变量。
  • 栈 : 程序执行前静态分配的内存空间,栈的大小可在编译时指定,Linux环境下默认为 8M。栈段是存放程序执行时局部变量、函数调用信息、中断现场保留信息的空间。程序执行时,CPU堆栈段指针会在栈顶根据执行情况进行上下移动。
  • 堆 : 程序执行时, 按照程序需要动态分配的内存空间,使用malloc、 calloc、realloc函数分配的空间都在堆上分配。

参考文献

[1] xv6进程与内存管理-CSDN
[2] linux进程地址空间-博客园
[3] xv6进程线程-百度文库
[4] 操作系统-进程线程模型课件

おすすめ

転載: www.cnblogs.com/icoty23/p/10993807.html