首页 > 其他分享 >第六周学习笔记

第六周学习笔记

时间:2023-10-27 16:58:57浏览次数:38  
标签:学习 cmd queue 笔记 next 第六周 sh 进程 PROC

Linux进程管理

多任务处理

在编程中,多任务处理是指同时执行多个任务或进程的能力。这种能力可以通过并发编程来实现,其中任务可以是同时执行的线程、进程或协程。

进程的概念

进程:进程是对映像的执行
在操作系统内核中,每个进程用一个独特的数据结构表示,叫作进程控制块(PCB)或任务控制块(TCB)等。

多任务处理系统

多任务处理系统简称MT

多任务处理系统的组成部分

type.h文件
/*********** type.h file ************/
#define NPROC   9 //number of PROCs
#define SSIZE 1024 //stack size 4KB
// 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;

ts.s文件

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

/*********** ts.s file ************/
.globl running, scheduler, tswitch
tswitch:
SAVE: pushl %eax
pushl %ebx
pushl %ecx
pushl %edx
pushl %ebp
pushl %esi
pushl %edi
pushfl
movl running,%ebx # ebx -> PROC
movl %esp,4(%ebx) # PORC.save_sp = esp
FIND: call scheduler
RESUME: rnovl running,%ebx # ebx -> PROC
movl 4(%ebx) ,%esp #esp= PROC.saved_sp
popfl
popl %edi
popl %esi
popl %ebp
popl %edx
popl %ecx
popl %ebx
popl %eax
ret

queue.c文件

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

/*********** queue.c file ************/
int enqueue(PROC **queue,PROC *p)
{
    PROC *q = *queue;
    if(q == 0 || p->priority> q->priority){
        *queue = p;
        p->next = q;
    }
    else{
        while(g->next && p->priority <= q->next->priority)
            q = q->next;
        p->next = q->next;
        q->next = p;
    }
}
PROC *dequeue (PROC **queue)
{
    PROC *p = *queue;
    if (p)
        *queue =(*queue)->next;
    return p;
}
int printList(char *name,PROC *p)
{
    printf("%s = ",name);
    while(p){
        printf("[8d %d]->",p->pid,p->priority);
        p = p->next;
    }
    printf("NULL\n");
}

t.c文件

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

进程同步

睡眠模式

当某进程需要某些当前没有的东西时,它就会在某个事件值上进入休眠状态,该事件值表示休眠的原因。为实现休眠操作,我们可在PROC结构体中添加一个event字段,并实现 ksleep(int event)函数,使进程进入休眠状态。

唤醒操作

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

进程终止

正常终止:进程调用 exit(value),发出_exit(value)系统调用来执行在操作系统内核中的 kexit(value)。
异常终止:进程因某个信号而异常终止。当进程终止时,最终都会在操作系统内核中调用 kexit()。

MT系统中的进程管理

实现过程:

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

Unix/Linux中的进程

进程来源

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

INIT和守护进程

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

登录进程

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

sh进程

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

sh模拟器

带有I/O重定向的单命令

  • 提示用户输入命令行,形式为:
    cmd arg1 arg2 arg3 ··· argn
  • 处理简单命令:
    cmd = "cd" :chdir(arg1) OR chdir(HOME) if no arg1;
    cmd = "exit" : exit(0) to terminate;
  • 对于所有其他命令:
    创建子进程;
    等待子进程终止;
    打印子进程的退出状态码;
    继续执行步骤1;
  • 子进程:首先,假设命令行中没有管道。
    1.处理I/O重定向:
cmd arg1 arg2 ... < infile  // take inputs from infile  
cmd arg1 arg2 ...> outfile  // send outputs to outfile  
cmd arg1 arg2... >> outfile  // APPEND outputs to outfile  

2.通过execve()执行cmd,传递参数
char *myargv[ ], char *env[ ]
至cmd文件,其中myargv[]是一个字符数组*;

myargv[0]->cmd,  
myargv[1]->arg1,  
End with a NULL pointer  

sh可以在PATH环境变量目录中搜索可执行命令,因此sh模拟器也必须这样做。为此,模拟器程序必须将PATH变量标记到用于定位命令文件的各个目录中。

带有管道的命令

  • 在验证了mysh适用于简单命令之后,将其扩展到处理管道。如果命令行有一个符号 |,把它分为头部和尾部,如:
    cmd1 < infile | cmd 2 > outfile
    head= "cmd < infile";tail = "cmd 2 > outfile"
    然后通过以下步骤实现管道。
    1.创建管道
    2.复刻出一个子进程来共享管道
    3.安排一个进程作为管道的写进程,另一个进程作为管道的读进程。
    然后,让各进程execve()其命令(可能带有I/O重定向)。
    多管道:如果命令行包含多个管道符号,则通过递归实现管道。

标签:学习,cmd,queue,笔记,next,第六周,sh,进程,PROC
From: https://www.cnblogs.com/qi-yu-lin/p/17792705.html

相关文章

  • 第七周学习笔记
    并发编程并行计算导论顺序算法与并行算法顺序算法:begin  step_1  step_2  ……  step_nend//nextstep并行算法:cobegin  task_1  task_2  ……  task_ncoend//nextstep并行性与并发性在单CPU系统中,一次只能执行一个任务。不同的任务只能......
  • 按摩学习笔记
    特点按摩,以经络和解剖作为理论基础。具有:经济简便,随时随地,简单有效的特点。能够起到:放松肌肉,舒筋活血,振奋精神,消除病痛等作用。亲身体会以上特点,是我个人经过亲身体会,比较认同的部分。最深刻的体会有:1.个人因为工作经常久坐,导致翻译搜索复制......
  • 《用户故事与敏捷方法》阅读笔记(三)
    用户故事具有多种好处:①用户故事强调口头沟通:自古以来,口头表达是十分重要的。而且相比于书面书写的易产生歧义,口头表述更见简单明了,需求文档也是如此。②人人都可以理解用户故事:相比于一些墨守成规的软件需求里的技术术语,用户故事使用的语言更容易使用户理解,简......
  • 【论文解读】RLAIF基于人工智能反馈的强化学习
    【论文解读】RLAIF基于人工智能反馈的强化学习一、简要介绍人类反馈强化学习(RLHF)可以有效地将大型语言模型(LLM)与人类偏好对齐,但收集高质量的人类偏好标签是一个关键瓶颈。论文进行了一场RLHF与来自人工智能反馈的RL的比较(RLAIF)-一种由现成的LLM代替人类标记偏好的......
  • 群签名学习笔记
    群签名算法模型如图所示,群签名包括3个参与主体,群管理、群成员以及验证者。群管理负责群证书的创建管理、群成员管理以及在验证方发起挑战时对成员进行验证追踪群成员加入群后可获得群管理颁发的群证书,并使用证书对某信息进行签名。验证方可验证群签名的合法性。     在群签名......
  • tornado——关于tornado的异步操作学习
    关于tornado的异步操作学习yieldhttp_client.fetch和yieldtornado.gen.Task(http_client.fetch的区别实际上,yieldhttp_client.fetch和yieldtornado.gen.Task(http_client.fetch)是等价的,它们在功能上是相同的。tornado.gen.Task是Tornado4.0版本之前的写法,而yieldh......
  • 易语言银行余额虚拟生成器制作,提供源码思路,仅供学习
    今天这边带来的是一个图片生成器,是用易语言进行开发的,整个代码我算了一下不超过10行,然后就需要一个图片框组件和三个编辑框,三个标签,一个按钮就能实现,真的非常非常简单,大家可以照猫画虎哈,这也仅仅只是为大家做的一个演示示范。软件截图:程序集源码分享:.版本2.程序集窗口程......
  • MySQL学习(10)基于规则的优化
    前言MySQL为了更高的执行效率,会将客户端发送的SQL语句进行优化。条件化简MySQL优化器会对SQL语句中的表达式进行简化处理,以提高执行效率。移除不必要的括号。常量传递。a=5ANDb>a可优化为a=5ANDb>5。移除没用的条件。优化器会移除掉明显为TRUE或FALSE的表......
  • 易语言开发银行流水生成器,分享源码仅供学习
    小编我是做技术开发的,易语言的话学了将近有10年左右,然后看网上很多人都在找这个玩意,然后就是有一个人卖9000多,感觉那种人就是向前想疯了,我分析了一下它的软件源码,也就是辅助生成数据,并不是一键它会生成文档,就是给你按参数生成固定的数据,然后需要你自己复制粘贴,这个原理的实现真的......
  • 学习过的网站记录
      https://www.jianshu.com/p/ba9d45b4e592?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes  IOS-地图之CLLocation的使用   https://blog.csdn.net/songzhuo1991/article/details/115626992 iOS-UIStackView布局详解   http://devce......