首页 > 其他分享 >学习笔记6

学习笔记6

时间:2023-10-23 15:26:31浏览次数:27  
标签:文件 int 系统 笔记 学习 sh 进程 PROC

苏格拉底挑战


第三章 Unix/Linux 进程管理

一.知识点归纳

(一)多任务处理

  • 多任务处理是所有操作系统的基础。总体上说,它也是并行编程的基础。

(二)进程的概念

  • 进程是对映像的执行。

在操作系统内核中,每个进程用一个独特的数据结构表示,叫作进程控制块(PCB)或任务控制块(TCB)等。在本书中,我们直接称它为 PROC 结构体。

(三)多任务处理系统

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

1.type.h 文件

type.h 文件定义了系统常数和表示进程的简单 PROC 结构体。

/*********** type.h file ************/
#define NPROC   9
#define SSIZE 1024
// PROC status
#define FREE    0
#define READY   1
#define SLEEP   2
#define ZOMBIE  3
typedef struct proc{
    struct proc *next;
    int *ksp;
    int pid;
    int status;
    int priority;
    int  kstack [SSIZE];
}PROC;

2.ts.s 文件

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

3.queue.c 文件

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

4.tc.c 文件

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

5.多任务处理系统代码介绍

(1)虚拟 CPU:MT 系统在 Linux 下编译链接为
gcc -m32 t.c ts.s

然后运行 a.out。

(2)init():当 MT系统启动时,main()函数调用init()以初始化系统。init()初始化 PROC 结构体,并将它们输入 freeList()。它还将 readyQueue()初始化为空。然后使用 proc[0]创建 P0,作为初始运行进程。P0的优先级最低,为0。所有其他任务的优先级都是1,因此它们轮流从 readyQueue 运行。

(四)进程同步

1.睡眠模式:ksleep(int event)

当某进程需要某些当前没有的东西时,它就会在某个事件值上进入休眠状态。为实现休眠操作,我们可以在 PROC结构体中添加一个event字段,并实现ksleep(int event)函数,使进程进入休眠状态。接下来,我们将假设对 PROC结构体进行修改以包含加粗显示的添加字段。

2.唤醒操作:kwakeup(int event)

当某个等待时间发生时,另一个执行实体(可能是某个进程或中断处理程序)将会调用 wakeup(event)。唤醒正处于休眠状态等待该事件值的所有程序。如果没有任何程序休眠等待该程序,kwakeup()就不工作,即不执行任何操作。

(五)进程终止

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

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

在这两种情况下,当进程终止时,最终都会在操作系统内核中调用 kexit()。

(六)MT系统中的进程管理

  • 完善基础MT系统,实现MT系统的进程管理函数:

(1)用二叉树的形式实现进程家族树。
(2)实现 ksleepO()和kwakeup()进程同步函数。
(3)实现kexit()和kwait()进程管理函数。
(4)添加“w”命令来测试和演示等待操作。

(七)Unix/Linux中的进程

1.进程来源

  当操作系统启动时,操作系统内核的启动代码会强行创建一个PID=0的初始进程。然后系统执行它。在初始化系统后,P0复刻一个子进程P1,并把进程切换为以用户模式运行P1。

2.INIT和守护进程

  P1的大部分子进程都是用来提供系统服务的。它们在后台运行,不与任何用户交互。它们被称为守护进程。

3.登录进程

  除了守护进程,P1复刻了许多登录进程,每个终端上一个,用于用户登录。每个登录进程打开三个与自己的终端相关联的文件流(stdin, stdout, stderr).

4.sh进程

  当用户成功登录时,LOGIN 进程会获取用户的 gid 和 uid,从而成为用户的进程。它将目录更改为用户的主目录并执行列出的程序,通常是命令解释程序 sh。现在,用户进程执行sh,因此用户进程通常称为 sh 进程。它提示用户执行命令。一些特殊命令,如cd(更改目录)、退出、注销等,由sh 自己直接执行。其他大多数命令是各种 bin 目录(如/bin、/sbin、/usr/bin、/usr/local/bin 等)中的可执行文件。对于每个(可执行文件)命令,sh 会复刻一个子进程,并等待子进程终止。子进程将其执行映像更改为命令文件并执行命令程序。子进程在终止时会唤醒父进程 sh,父进程会收集子进程终止状态、释放子进程 PROC 结构体并提示执行另一个命令等。除简单的命令之外,sh 还支持 I/O 重定向和通过管道连接的多个命令。

5.进程的执行模式

(1)中断:中断是外部设备发送给 CPU的信号,请求 CPU 服务。当在 Umode 下执行时,CPU 中断是启用的,因此它将响应任何中断。在中断发生时,CPU 将进入 Kmode 来处理中断,这将导致进程进人 Kmode。
(2)陷阱:陷阱是错误条件,例如无效地址、非法指令、除以0等,这些错误条件被 CPU识别为异常,使得 CPU 进入 Kmode 来处理错误。在 Unix/Linux 中,内核陷阱处理程序将陷阱原因转换为信号编号,并将信号传递给进程。对于大多数信号,进程的默认操作是终止。
(3)系统调用:系统调用(简称syscall)是一种允许 Umode 进程进入 Kmode 以执行内核函数的机制。当某进程执行完内核函数后,它将期望结果和一个返回值返回到 Umode,该值通常为0(表示成功)或-1(表示错误)。如果发生错误,外部全局变量errno(在 errno.h中)会包含一个 ERROR 代码,用于标识错误。

(八)I/O重定向

1.文件流和文件描述符

  每个文件流对应Linux内核中一个打开文件。它们都用一个文件描述符表示。
stdin、stdout、stderr的文件描述符分别为0、1、2。

2.管道与管道命令

  管道是用于进程交换数据的单向进程间同此你通道。有一个读取端和一个写入端。
在Unix/Linux中,命令行cmd1|cmd2包含一个管道符号“|”。Sh将通过一个进程运行cmd1,另一个运行cmd2。

(九)管道

  管道是用于进程交换数据的单向进程间通信的通道。管道有一个输入端、一个输出端。在之前我们使用man -k | grep xx时,就用到管道的功能。
  管道的使用可以通过程序完成,也可以在命令行中处理完成。

标签:文件,int,系统,笔记,学习,sh,进程,PROC
From: https://www.cnblogs.com/hosf/p/17782511.html

相关文章

  • Hive学习笔记:多列求最大值、最小值
    一、最大值当在Hive中需要对多列数据求最大值时,可以使用函数greatest(a,b,c,d)实现。selectgreatest(a,b,c)from( select10asa,20asb,30asc)dd;--结果:30举个具体栗子:计算用户消费时,如果用户套餐有最低消费129元的话,不满12......
  • 云计算要学习哪些技术?
     学习云计算需要涉及多个技术领域和相关的工具、平台和框架。以下是一个详细的介绍,帮助您了解学习云计算所需的技术。1.虚拟化技术虚拟化是云计算的基础,因此了解虚拟化技术至关重要。学习虚拟化技术时,需要掌握以下知识点:-操作系统虚拟化:了解基于宿主机和客户机的虚拟化技......
  • CSAPP 第一章 笔记
    硬件组成总线I/O设备键盘,鼠标,显示器,磁盘...主存处理器(CPU)寄存器hello程序的生命周期源文件hello.c文本文件:位序列字节:8个位为一组ASCII码可执行目标文件Unix:通过编译器驱动程序完成编译系统预处理器‘#’,hello.i编译器‘main’,hello.s汇编器翻译成......
  • Git学习
    Git学习ref1(简洁)ref2(详细)ref3(撤销)ref4(stash)ref5(rebase)Git-Book(官方)git原理理解原理之后亲手实践对遇到的各种问题才能更快解决。并且了解原理之后再去玩那个学习git的游戏,效果才会更好。LearnGitBranchinggit四个区域远程仓库,本地仓库,暂存区(Index/s......
  • Java学习之路(二)
    Java学习之路(二)1、流程控制语句1.1、顺序结构顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。执行流程:1.2、分支结构1.2.1、if语句格式一:单分支if(关系表达式){语句体; }执行流程:①......
  • 图机器学习:从图谱角度来理解图增广
    1导引图对比学习(GraphContrastiveLearning,GCL)[1][2][3]旨在以自监督的方式学习图的节点表征,其流程如下图所示:具体而言,先以特定方式对原图\(\mathbf{A}\)进行增广,得到两个增广后的视图(view)\(\mathbf{V}_1\)和\(\mathbf{V_2}\)做为对比对(也可以是原图和增广后的视图做为......
  • 《动手学深度学习 Pytorch版》 10.1 注意力提示
    10.1.1生物学中的注意力提示“美国心理学之父”威廉·詹姆斯提出的双组件(two-component)框架:非自主性提示:基于环境中物体的突出性和易见性自主性提示:受到了认知和意识的控制10.1.2查询、键和值注意力机制与全连接层或汇聚层区别开来的元素:是否包含自主性提示在......
  • 笔记:Qt开发之多线程同步互斥机制
    目标:了解Qt多线程开发中常用的同步互斥类,使用场景和特点 实现线程互斥和同步常用的类互斥锁:QMute、QMutexLocker条件变量:QWaitCondition信号量:QSemaphore读写锁:QReadLocker、QWriteLocker、QReadWriteLock 1,QMutex特点:QMutex是Qt框架提供的互斥锁类,用于保护共享资......
  • 第三周阅读笔记|人月神话————为什么巴比伦塔会失败
    巴比伦塔的管理教训巴比伦塔是人类继诺亚方舟之后的第二大工程壮举,但巴比伦塔同时也是第一个彻底失败的工程。现在,其实也是这样的情况。因为左手不知道右手在做什么,所以进度灾难、功能的不合理和系统缺陷纷纷出现。随着工作的进行,许多小组慢慢地修改自己程序的功能、规模和速度,他......
  • ServerLess学习笔记-Fnproject搭建
    ServerLess学习笔记-搭建FnProject介绍官方文档:https://fnproject.io/tutorials/Fn是一个事件驱动的开源功能即服务FaaS计算平台,您可以在任何地方运行,它的一些主要特点开源原生Docker:使用任何Docker容器作为你的函数支持所有语言随处运行公有云、私有云和混合云......