第三章学习笔记

发布时间 2023-10-22 18:15:36作者: 20211113

第三章学习笔记

一、Linux进程管理

1.多任务处理

  • 在计算机技术中,多任务处理指的是同时执行几个独立的任务。
  • 在单处理器(单CPU)系统中,一次只能执行一个任务。
  • 多任务处理是通过在不同任务之间多路复用CPU的执行时间来实现的,即将CPU执行操作从一个任务切换到另一个任务。
  • 不同任务之间的执行切换机制称为上下文切换,将一个任务的执行环境更改为另一个任务的执行环境。如果切换速度足够快,就会给人一种同时执行所有任务的错觉。这种逻辑并行性称为“并发”。
  • 在有多个CPU或处理器内核的多处理器系统中,可在不同CPU上实时、并行执行多项任务。此外,每个处理器也可以通过同时执行不同的任务来实现多任务处理。
  • 多任务处理是所有操作系统的基础。总体上说,它也是并行编程的基础。

2.进程的概念

  • 操作系统是一个多任务处理系统。在操作系统中,任务也称为进程。在实际应用中,任务和进程这两个术语可以互换使用。在第2章中,我们把执行映像定义为包含执行代码、数据和堆栈的存储区。
  • 进程是对映像的执行。
  • 操作系统内核将一系列执行视为使用系统资源的单一实体。系统资源包括内存空间以及最重要的CPU时间。在操作系统内核中,每个进程用一个独特的数据结构表示,叫作进程控制块(PCB)或任务控制块(TCB)等。在本书中,我们直接称它为PROC结构体。与包含某个人所有信息的个人记录一样,PROC结构体包含某个进程的所有信息在实际操作系统中,PROC结构体可能包含许多字段,而且数量可能很庞大。

3.进程管理的系统调用

1)创建

系统在最开始启动后并不会有太多的进程,需要有一个系统调用能够在接下来的使用中创建更多的进程。例如我们的shell,可以在shell中使用命令创建一个进程。

  • 做一份进程完整的复制(内存、寄存器运行现场)
  • 父进程返回子进程的pid,子进程返回0
  • 那么创建一个进程叫做叉子。以刚才的qq进程为例,如果它调用了fork,系统调用就会在当前系统中多出一个进程,而这个进程是之前qq进程的拷贝,它包括几乎所有的进程当前的状态(除了返回值pid),包括内存、寄存器。原来的进程也叫父进程和新创建的进程也叫子进程都可以继续向下执行,所以说它像一个叉子,走着走着就分了个叉。父进程返回值是子进程的pid,子进程的返回值是0。

2)execve系统调用

除了能够对进程进行创建,还需要能够执行别的程序,execve系统调用就是这样一个功能,将当前运行的进程“替换”成另一个程序,从头开始执行。fork以后得到的进程是与父进程相同的,但是跟多的时候我们创建子进程是为了让他执行不同的程序,去做别的工作。execve就是启动一个新程序的系统调用。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。
execve(filename,argv,enpv)
//执行名称为filename的程序
//分别传入参数v,环境变量e
一个进程调用execve以后,它没有创建新的进程,而是从传入的可执行程序中加载代码和静态数据,并用它覆写自己的代码段、堆、栈,以及其他内存空间也会被重新初始化。然后操作系统就执行该程序。所以对execve的成功调用永远不会返回,只有在发生错误的时候才会返回-1,从原程序的调用点接着往下执行。

4.I/O重定向

  1. fork()操作:
  2. 进程终止
  • 正常终止:每个C程序的 main()函数都是由C启动代码 crt0.o调用的。如果程序执行成功,main()最终会返回到 crt0.o,调用库函数 exit((0)来终止进程。首先,exit(value)函数会执行一些清理工作,如刷新 stdout、关闭I/O流等。然后,它发出一个_exit(value)系统调用,使进入操作系统内核的进程终止。
  • 异常终止:在执行某程序时,进程可能会遇到错误,如非法指令、越权、除零等,这些错误会被 CPU识别为异常。当某进程遇到异常时,它会进入操作系统内核。内核的异常处理程序将陷阱错误类型转换为一个函数,称为信号,将信号传递给进程,使进程终止。

5.管道

  • 管道是用于进程交换数据的单向进程间通信通道。管道有一个读取端和一个写入端。可从管道的读取端读取写入管道写入端的数据。自从管道在最初的Unix 中首次出现以来,已经被用于几乎所有的操作系统中,有许多变体。一些系统允许双向管道,在双向管道上,数据可以双向传输。普通管道用于相关进程。命名管道是不相关进程之间的 FIFO通信通道。但是,如果管道不再有读进程,写进程必须将这种情况视为管道中断错误,并中止写入。

  • Unix/Linux中的管道编程
    管道中断状况并不具有对称性。这是一种只有读进程没有写进程的通信通道。实际上,管道并未中断,因为只要管道有数据,读进程就仍可继续读取。

二、知识点挑战

1.I/O重定向

2.linux进程管理