Linux第3章

发布时间 2023-10-22 21:33:58作者: maple、kite

第三章学习笔记

Unix/Linux进程管理

多任务处理

计算机技术概念中的多任务处理指的是同时执行若干独立任务。无论是在多处理机系统还是单处理机系统都可以实现多任务处理。对于单处理机系统,多任务处理的实现依靠着多路复用技术,通过上下文的快速切换实现逻辑上的多任务并行处理。这种并行性被称为并发。

进程的概念

进程是对映像的执行。一个进程是一个对资源的动态利用的过程,系统内核通过一个独特的数据结构来表示,它被称为进程控制块PCB或任务控制块TCB。在本章中直接称之为PROC结构体。

多任务处理系统

多任务处理系统,简称MT,由以下几个部分组成。

  • type.h文件,定义了系统常数和简单的PROC结构体
  • ts.s文件,32汇编代码,用于实现上下文切换
  • queue.c文件,可实现队列和链表操作函数
  • t.c文件,定义MT系统数据结构、系统初始化代码和进程管理函数

进程同步

进程同步是指控制和协调进程交互以确保其正确执行所需的各项规则和机制。最简单的进程同步工具是休眠和唤醒操作。

进程终止

  • 正常终止:进程调用exit(value),发出_exit(value)系统调用来执行在操作系统内核中的kexit(value)。

  • 异常终止:进程因某个信号而异常终止。

MT系统中的进程管理

​ MT系统管理函数的一般格式:

  • 用二叉树实现的进程家族树
  • 实现 ksleep() 和 kwakeup() 进程同步函数
  • 实现 kexit() 和 kwait() 进程管理函数
  • 添加 "w" 命令来进行测试或演示操作

Unix/Linux中的进程

进程来源

  1. 当操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0初始进程。
  2. 执行初始进程P0
  3. P0继续初始化系统,包括系统硬件和内核数据结构
  4. 挂载一个根文件系统,使系统可以使用文件。
  5. 在初始化系统之后,P0复刻出一个子进程P1,并把进程切换为以用户模式运行P1。

INIT和守护进程

当进程P1开始运行时,它将其执行映像更改为INIT程序。因此,P1通常被称为INIT进程,因为它的执行映像是init程序。P1 开始复刻出许多子进程。
P1的大部分子进程都是用来提供系统服务的。它们在后台运行,不与任何用户交互。这样的进程称为守护进程

登陆进程

除了守护进程之外,P1还复刻了许多LOGIN进程,每个终端上一个,用于用户登录。

sh进程

当用户成功登录时,LOGIN进程会获取用户的gid和uid,从而称为用户的进程。他将目录更改为用户的主目录并执行列出的程序,通常是命令解释程序sh。

进程的执行模式

在Unix/Linux中进程以两种不同的模式执行,即内核模式和用户模式,简称Kmode和Umode。在每种执行模式下,一个进程有一个执行映像。

I/O重定向

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

I/O重定向符号和功能说明

  • [n]<&m:将标准输入或文件描述符n重定向到文件描述符m

  • [n]<file:将标准输入或文件描述符n重定向到文件file。特别的<file将标准输入重定向到文件file

  • <file:将标准输入重定向到文件file。[n]<file 的特例

  • [n]>&m:将标准输出或文件描述符n重定向到m。特别的2>&1将标准错误重定向到标准输出

  • 2>file:将标准错误重定向到文件file(覆盖方式)

  • 2>>file:将标准错误重定向到文件file(追加方式)

  • &>或>&:同时重定向标准输出和标准错误输出

  • <<:即时文档输入符

管道

管道是用于进程交换数据的单向进程件通信通道。管道有一个读取端和一个写入端。

  • 管道命令处理
    在Unix/Linux中,命令行
    cmd1 | cmd2
    sh将通过一个进程运行cmd1,并通过另一个进程运行cmd2,他们通过一个管道连接在一起,因此cmd1的输出变为cmd2的输入。
  • 命名管道
    命名管道又叫做FIFO。
    在sh中,通过mknod命令创建一个命令管道:
    mknod mypipe p

苏格拉底挑战

Unix/Linux进程管理知识



Unix/Linux进程知识



chatgpt答疑

在Unix/Linux中,进程是如何创建的?请详细描述一下进程的创建过程。

error: ‘stderr’ undeclared (first use in this function)

8 |   fprintf(stderr,"fork failed");

代码实现