《信息安全系统设计与实现》学习笔记6

发布时间 2023-10-21 22:42:52作者: 20211417黄琪凯

第三章 Unix/Linux进程管理

多任务处理

  • 一般来说,多任务处理指的是同时进行几项独立活动的能力。
  • 多任务处理是所有操作系统的基础。总体上说,它也是并行编程的基础。

进程的概念

  • 进程的正式定义:进程是对映像的执行。
  • 操作系统内核将一系列执行视为使用系统资源的单一实体。在操作系统内核中,每个进程用一个独特的数据结构表示,叫作进程控制块(PCB)或任务控制块(TCB)等。本书中称为PROC结构体。
    • next是指向下一个PROC结构体的指针
    • ksp字段是保存的堆栈指针
    • pid是一个进程的进程编号
    • status是当前状态
    • priority是进程调度优先级
    • kstack是进程执行时的堆栈

多任务处理系统

  • type.h文件

    • 文件定义了系统常熟和表示进程的简单PROC结构体

      #define FREE 0
      #define READY 1
      #define SLEEP 2
      #define ZOMBIE 3
      typedef struct proc
      { 
         struct proc *next;
         int *ksp;
         int pid;
         int ppid;
         int status;
         int priority;
         int kstack[SSIZE];
      }
      
  • ts.s文件

    • ts.s在32位GCC汇编代码中可实现进程上下文切换.

    • queue.c文件

      • queue.c文件可实现队列和链表操作函数。
      • enqueue() 函数按优先级将 PROC输入队列中在优先级队列中,具有相同优先级的进程按先进先出(FIFO)的顺序排序。
      • dequeue()函数可返回从队列或链表中删除的第一个元素。
      • printList()函数可打印链表元素。
  • t.c文件

    • t.c文件定义MT系统数据结构、系统初始化代码和进程管理函数。

Unix/Linux中的进程

  • 进程来源
    • 当操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0初始进程。
  • INIT和守护进程
    • 当进程P1开始运行时,它将其执行映像更改为INIT程序。因此,P1通常被称为INIT进程 因为它的执行映像是init程序。P1 开始复刻出许多子进程。P1的大部分子进程都是用来提供系统服务的。它们在后台运行,不与任何用户交互。
  • 登录进程
    • 除了守护进程之外,P1还复刻了许多LOGIN进程,每个终端上一个,用于用户登录。每个LOGIN进程打开三个与自己的终端相关联的文件流。
  • sh进程
    • 当用户成功登录时,LOGIN进程会获取用户的gid和uid,从而称为用户的进程。他将目录更改为用户的主目录并执行列出的程序,通常是命令解释程序sh。
  • 进程的执行模式
    • 在Unix/Linux中进程以两种不同的模式执行,即内核模式和用户模式,简称Kmode和Umode。在每种执行模式下,一个进程有一个执行映像。

进程管理的系统调用

  • fork()

    • Usage: int pid = fork();
    • fork()创建子进程并返回子进程的pid,如果fork()失败则返回-1。
  • 进程执行顺序

    • 在folk()完成后,子进程与父进程和系统中所有其他进程竞争CPU运行时间。
  • 进程终止

    • 正常终止
      退出值0通常表示正常终止。
    • 异常终止
      内核的异常处理程序将陷阱错误类型转换为一个幻数,称为信号,将信号传递给进程,使进程终止。
  • 等待进程终止

    • 在任何时候,一个进程都可以使用int pid = wait(int *status)系统调用,等待僵尸子进程。
  • Linux中的subreaper进程

  • exec():更改进程执行映像

    • 进程可以使用exec()将Umode映像更改为不同的(可执行)文件。exec()库函数有几个成员。

      int execl(const char *path, const char *arg, ...);
      int execlp(const char *file, const char *arg,...);
      int execle(const char *path, const char *arg,..., char * const envp[]);
      int execv(const char *path, char *const argv[]);
      
  • 环境变量

    • 环境变量是为当前sh定义的变量,由子sh或进程继承。

    • 一些重要的环境变量

        SHELL=/bin/bash
        TERM=xterm
        USER=kcw
        PATH=/usr/1oca1/bin:/usr/bin:/bin:/usr/local/games:/usr/games:./
        HOME= / home /kcw
      

I/O重定向

  • sh进程有三个用于终端I/O的文件流:stdin(标准输入)、stdout(标准输出)、stderr(便准错误)。

  • 文件流I/O和系统调用

    • scanf("%s",&item);
  • 重定向标准输入

  • 重定向标准输出

管道

  • 管道是用于进程交换数据的单向进程间通信通道。

  • Unix/Linux中的管道编程

    • 在Unix/Linux中,一系列相关系统调用为管道提供支持。
      int pd[2];
      int r = pipe(pd);
  • 管道命令处理

    • cmd1 | cmd2包含一个管道命令符号“|”。
  • 命名管道

    • 在sh中,通过mknod命名创建一个命名管道:
      mknod mypipe p
    • 或在c语言中发出mknod()系统调用:
      int r = mknod("mypipe",S_IFIFO,0);

苏格拉底挑战

关于进程的苏格拉底挑战

关于进程管理的系统调用的苏格拉底挑战

遇到的问题

问题:进程管理的系统调用中,如何处理子进程的退出状态?
解决:询问GPT
GPT的回答