操作系统实验二

操作系统实验报告,适用与大一大二学生 实 验 报 告 册 课 程 操作系统 批阅教师签名 学 院 信息工程学院 专 业 计算机科学与技术 班 级 2018计科2班 学 号 201805050257 ... 阅读详情

实验二 进程控制
1.实验目的:
加深对进程概念的理解,明确进程和程序的区别。
掌握Linux系统中的进程创建,管理和删除等操作。
熟悉使用Linux下的命令和工具,如man, find, grep, whereis, ps, pgrep, kill, ptree, top, vim, gcc,gdb, 管道|等。

2.基础知识:

进程的创建
Linux中,载入内存并执行程序映像的操作与创建一个新进程的操作是分离的。将程序映像载入内存,并开始运行它,这个过程称为运行一个新的程序,相应的系统调用称为exec系统调用。而创建一个新的进程的系统调用是fork系统调用。

exec系统调用
#include <unistd.h>
int execl (const char *path, const char *arg,…);

execl()将path所指路径的映像载入内存,arg是它的第一个参数。参数可变长。参数列表必须以NULL结尾。
通常execl()不会返回。成功的调用会以跳到新的程序入口点作为结束。发生错误时,execl()返回-1,并设置errno值。

例 编辑/home/kidd/hooks.txt:

int ret;
ret = execl (”/bin/vi”, ”vi”,”/home/kidd/hooks.txt”, NULL);
if (ret == -1)
perror (”execl”);

fork系统调用
#include <sys/types.h>
#include <unistd.h>
pid_t fork (void);
成功调用fork()会创建一个新的进程,它与调用fork()的进程大致相同。发生错误时,fork()返回-1,并设置errno值。

例:
pid_t pid;
pid = fork ();
if (pid > 0)
printf (”I am the parent of pid=%d!\n”, pid);
else if (!pid)
printf (”I am the baby!\n”);
else if (pid == -1)
perror (”fork”);

终止进程
exit()系统调用:
#include <stdlib.h>
void exit (int status);

进程挂起
pause() 系统调用:
int pause( void );

函数pause会把进程挂起,直到接收到信号。在信号接收后,进程会从pause函数中退出,继续运行。

wait(等待子进程中断或结束)
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait (int * status);

wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。
如果在调用 wait()时子进程已经结束,则wait()会立即返回子进程结束状态值。
子进程的结束状态值会由参数status返回,而子进程的进程识别码也会一起返回。
如果不在意结束状态值,则参数status可以设成 NULL。

VIM常用命令速查

在这里插入图片描述

3.实验题目:
根据课堂所学内容和基础知识介绍,完成实验题目。
1、打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。
首先打开终端输入vi
在这里插入图片描述
打开新的终端输入 ps -ef
在这里插入图片描述
可以看到vi进程为2690 父进程为2665
父进程搜索顺序2665->2657->1909->1348->986->1

在这里插入图片描述
在这里插入图片描述
使用pstree -p所得为
在这里插入图片描述
在这里插入图片描述
两种方法所得相同

2、编写程序,首先使用fork系统调用,创建子进程。在父进程中继续执行空循环操作;在子进程中调用exec打开vi编辑器。然后在另外一个终端中,通过ps –Al命令、ps aux或者top等命令,查看vi进程及其父进程的运行状态,理解每个参数所表达的意义。选择合适的命令参数,对所有进程按照cpu占用率排序。
首先编写程序fork.c
代码
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
int pid;
pid=fork();
switch(pid)
{
case -1:
printf(“fork error!\n”);
exit(1);
case 0:
execl("/usr/bin/vi",“vi”,"/home/warmllll/Desktop",NULL);
printf(“fail!\n”);
exit(1);
default:
for (int i=0;;i++){};
printf(“vi successed!\n”);
exit(1);
}
}

在这里插入图片描述

查阅资料可知

ps el各相关信息的意义为:

F 代表这个程序的旗标 (flag), 4 代表使用者为 superuser;

S 代表这个程序的状态 (STAT);

#UID 代表执行者身份

PID 进程的ID号!底下的 PPID 则父进程的ID;

C CPU 使用的资源百分比

RI指进程的执行优先权(Priority的简写),其值越小越早被执行;

NI 这个进程的nice值,其表示进程可被执行的优先级的修正数值。

ADDR 这个是内核函数,指出该程序在内存的那个部分。如果是个执行

SZ 使用掉的内存大小;

WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;

TTY 登入者的终端机位置啰;

TIME 使用掉的 CPU 时间。

CMD 所下达的指令名称

Ps aus指令
• USER:该进程属于那个使用者账号
• PID :该进程的进程ID号。
• %CPU:该进程使用掉的 CPU 资源百分比;
• %MEM:该进程所占用的物理内存百分比;
• VSZ :该进程使用掉的虚拟内存量 (Kbytes)
• RSS :该进程占用的固定的内存量 (Kbytes)
• TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
• STAT:该程序目前的状态,主要的状态有:
R :该程序目前正在运作,或者是可被运作;
S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。
T :该程序目前正在侦测或者是停止了;
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
• START:该进程被触发启动的时间;
• TIME :该进程实际使用 CPU 运作的时间。
• COMMAND:该程序的实际指令

使用ps -AL截图
在这里插入图片描述
使用Ps aux截图
在这里插入图片描述
使用ps auxw --sort=%cpu查看进程按cpu占有率排序
在这里插入图片描述
占有了全部cpu
3、使用fork系统调用,创建如下进程树,并使每个进程输出自己的ID和父进程的ID。观察进程的执行顺序和运行状态的变化。
在这里插入图片描述
创建程序fork2.c代码为
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <time.h>
#include <stdarg.h>
#include <sys/types.h>
#define HASPRO -10
char *a;

int main()
{
pid_t p1,p2,p3,p4,p5;

int cnt=0;

while((p1=fork()) == -1);

if(!p1)
{
    while((p2=fork()) == -1);

    if(!p2)
    {
        while ((p4=fork())==-1);
        if (!p4)
        {
            while(1)
            {	sleep(1);
               printf(" p4 de  pid shi %d,  fu p2 de pid shi%d\n",getpid(),getppid());
             
            }
        }
        else
        {
            while ((p5=fork())==-1);

            if (!p5)
            {
                while(1)
                {sleep(1);
                    printf(" p5 de pid shi%d,  fu p2 de pid shi%d\n",getpid(),getppid());
                 
                }

            }
            else
            {
                ;
            }

        }

        while(1)
        {
			sleep(1);
            printf("p2 de pid shi %d,  fu p1 de pid shi %d\n",getpid(),getppid());
            
        }
    }
    else
    {
        while ((p3=fork())==-1);

            if (!p3)
            {
                while(1)
                {sleep(1);
                   printf("p3 de  pid shi%d,  fu p1 de pid shi %d\n",getpid(),getppid());
                    
                }

            }
            else
            {
                ;
            }
    }

    while(1)
    {sleep(1);
       printf("p1  de pid shi %d,  parent de  pid shi %d\n\n",getpid(),getppid());
        
    }
}

return 0;

}
输出为
在这里插入图片描述

由此可见 p1的进程号为35265 其父为1909
P2进程号为35266其父为35265
P3进程号为35267其父为35265
P4进程号为35268其父为35266
P5进程号为35269其父为35266

4、修改上述进程树中的进程,使得所有进程都循环输出自己的ID和父进程的ID。然后终止p2进程(分别采用kill -9 、自己正常退出exit()、段错误退出),观察p1、p3、p4、p5进程的运行状态和其他相关参数有何改变。

通过第三题可知p2进程号为35266
1、使用kill-9 35266结束进程p2
’在这里插入图片描述
使用ps -ef查看进程

可以看到p4与p5的父进程变成了1909和p1相同。
2、自己正常退出
在p2中加入exit(0);
在这里插入图片描述
可以看到p4与p5的父进程变成了1909和p1相同。
两种方法所得相同

github 链接:https://github.com/warmllll/-

超详细汇编注释 操作系统实验二 操作系统的引导(哈工大李治军) 实验二 操作系统的引导 哈工大李治军 超级详细的汇编代码,一字一句带你解读源码 实验前必看 阅读详情

相关推荐

哈工大操作系统实验二:进程管理与内存分配

在探索现代计算机系统的根基时,操作系统的角色不可忽视。它是连接硬件和应用软件的桥梁,管理着计算机资源并提供各种服务。本章旨在概述操作系统实验的目的、重要性以及它在现代计算机系统中的作用。

weixin_35754676的博客 757

linux内核模块之简单进程遍历

了解linux内核中常用的数据结构进程控制块—task_struct; 了解include/linux/sched.h中的函数和宏; 初步掌握内核宏定义for_each_process ()、list_entry()的功能。 实现的内容 编写一个内核模块,打印出系统中所有的进程的进程名、PID号和进程状态,即实现进程的遍历,类似ps命令。 操作如下 (注:内核进程此处称为内核线程,其实都是task_struct) 一、编写代码(list.c) #include <linux/init.h> .

qq_41246458的博客 4796

杭电操作系统实验

实现两个模块,第一个模块列出系统中所有内核线程的程序名、PID、进程状态、进程优先级、父进程的PID。通过`for_each_process`来遍历进程列表;用`task_struct->mm`判断是否为内核线程;用`get_task_parent`来获得父进程; 第二个模块输入一PID输出该进程的家族信息、包括父进程、兄弟进程和子进程的程序名、PID、进程状态。

Linux系统进程输出与统计模块

tip:需要用上list_for_each()和list_entry()内核函数。

jojojojoi的博客 615

Vue项目实战:用DataV的dv-scroll-board打造高颜值滚动表格(附完整代码)

本文详细介绍了如何在Vue项目中使用DataV的dv-scroll-board组件打造高颜值滚动表格。从基础集成到高级配置,包括动态数据处理、深度样式定制、性能优化策略以及交互增强方案,帮助开发者快速实现企业级数据展示需求。特别针对样式优化和滚动表格的常见问题提供了实用解决方案。

weixin_30892037的博客 497

为什么你的单细胞数据总有问题?可能是忽略了scDblFinder这个神器

本文深入剖析了单细胞数据分析中异质性双细胞这一常见但易被忽视的痛点,并重点介绍了scDblFinder这一神器。scDblFinder通过机器学习模型,能精准识别并过滤同一样本内的异质性双细胞,有效解决其导致的聚类模糊、信号混淆等问题,从而显著提升数据洁净度与下游分析结果的可靠性。

brandy的博客 453

Linux内核模块编程(打印所有内核线程的程序名、PID号,进程状态,及进程优先级,父进程的PID)

转自:https://blog.youkuaiyun.com/SweeNeil/article/details/87646244 1. 设计一个模块,要求列出系统中所有内核线程的程序名、PID 号、进程状态及进程优先级、父进程的PID。 首先,我们开始编写模块代码,这是Linux内核编程的核心代码,代码如下: #include &lt;linux/init.h&gt; #include &lt;linux...

qq_22613757的博客 7944

PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现

PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现 BRDF简介 再介绍BRDF之前我们要引入渲染方程这个东西: 其中L表示辐射率,其公式为: 它表示了一个拥有辐射强度Φ的光源在单位面积A,单位立体角ω上的辐射出的总能量。 辐射率是辐射度量学上表示一个区域平面上光线总量的物理量,它受到入射光线与平面法线间的夹角θ的余弦值cosθ的影响:当直接...

小龙虾的博客 1万+

操作系统实验:Linux内核进程

文章来源: https://blog.youkuaiyun.com/qq_43561345/article/details/110420372 https://www.cnblogs.com/nanfengnan/p/14931891.html 任务一:练习在内核模块中打印linux PCB中的关键信息 任务要求: (1)遍历系统中的所有task,打印每个task的PID、其父进程PID、进程优先级、进程静态优先级、进程状态信息(十六进制打印),每个task信息占一行,要求打印出的信息清晰美观。 (2)统计系统中当前

weixin_46048542的博客 1583

Codex入门00-初识神器(小白入门:到底什么是Codex CLI,和ChatGPT写代码有什么不同?)

OpenAI Codex CLI 是 OpenAI 于2025年推出的终端原生AI编程代理,不是在网页里聊天写代码,而是直接在你的终端里自主读代码、改文件、跑命令。它拥有三种安全模式、/goal 持久化任务、云端沙箱执行等独特能力。本文从零介绍 Codex CLI 的核心概念、与 ChatGPT 写代码的本质区别、典型使用场景和费用说明,让你全面认识这个改变开发方式的神器。

yueyeguzhuo的专栏 302

【电源专题】案例:对比不同电池在不同电流下的电池放电曲线

无

一点硬件 2840

内核模块打印task_struct的进程号,优先级,调度策略,状态,CPU和进程名

打印task_struct的进程号,优先级,调度策略,状态,CPU和进程名 pcb.c #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/sched.h> #include "policy.h" #include ...

weixin_44395686的博客 923

让 PyCharm 代码“发光”:高亮插件与特效全攻略

PyCharm 作为一款强大的 Python IDE,支持多种插件让代码“发光”——无论是动态输入特效、彩虹括号,还是霓虹主题,都能让你的代码脱颖而出!进入 File → Settings → Editor → Color Scheme → Rainbow Brackets。进入 File → Settings → Appearance & Behavior → Material Theme。进入 File → Settings → Editor → Color Scheme → General。

qq_43580271的博客 3835

操作系统实验二 进程创建

第二次PS命令显示有1个名字中含有os2-2的程序,状态为S+,可以看出,这个进程和第一次ps命令的第三行是同一个名字,这行的意思是我们查询的grep命令本身。让子进程和父进程并发同时在每个进程中显示其子进程与父进程的PID号。问题1:程序中红色部分的作用可以让执行该语句的进程等待一秒钟后继续执行,当不添加改语句时程序的运行结果是什么?加上sleep(1)后,程序会等待1秒,将CPU让给其他线程,但是不会释放锁,因此sleep(1)后自动恢复。(1)显示所有进程,找出使用当前进程的进程ID号,查看其状态。

xl_xaio的博客 4161

大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略

本篇文章是《Spring AI实战》专栏的第一篇开发入门文章,我们将借助一个完整的OpenAI聊天应用示例,详细介绍如何运用Spring Boot和Spring AI快速搭建一个支持OpenAI API的聊天服务,全面涵盖基础对话、流式对话、多提供商配置等核心功能。

寻道AI,探索AI无限可能! 6866

使用LSTM进行多任务学习:共享模型预测多个目标

多任务学习是一种机器学习方法,旨在通过同时学习多个相关任务来提高模型的学习效率和泛化能力。MTL的核心思想是共享模型的参数,从而在不同任务之间捕捉到共享的特征。长短期记忆网络(LSTM)是循环神经网络(RNN)的一种改进版本,专门用于解决传统RNN在处理长序列时出现的梯度消失和梯度爆炸问题。LSTM通过引入多个门控机制(输入门、遗忘门和输出门)来控制信息的流动。本文详细探讨了如何使用LSTM进行多任务学习。我们介绍了多任务学习的理论基础、LSTM的特点,以及如何构建和训练一个多任务LSTM模型。

斌擎科技 1152

操作系统实验二——时间片轮转

实验原理 时间片轮转算法: q = 1和q = 4时进程的周转时间 流程图 时间片轮转过程: 流程图: 源程序 #include <iostream> #include <string> #define MAX 20 using namespace std; //进程数据结构 struct PCB { string name; int arrive; int need;

风华正茂百花洲 6799

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【操作系统】实验二 进程控制实验

本人一直想找时间系统整理一下之前做过的一些实验,便于后续用到的时候可以尽快的使用,po出来也便于大家交流学习,有问题欢迎交流指正,与诸君共勉!操作系统实验二,进程控制。

AGATHA_66的博客 4864

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

操作系统实验二-16281141

qq_41936609的博客 158

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

操作系统实验——实验1《CPU Scheduling》&&实验二《Allocation & Reclaim》

操作系统实验——实验1《CPU Scheduling》&&实验二《Allocation & Reclaim》实验一实验目的实验内容实验方法实验步骤需求分析概要设计详细设计运行结果实验二实验目的实验内容实验方法实验步骤需求分析概要设计详细设计运行结果实验代码pcb.hwidget.hpcb.cppwidget.cppmain.cpp实验小结实验一实验二 注:以下代码为实验一和实验二的结合体,即为实验二的最后结果 实验一 实验目的 多道系统中,当就绪进程数大于处理机数时,须按照某种策略决

weixin_45727777的博客 2573

操作系统——实验二内存分配及回收(附源码)

实验2《Allocation & Reclaim》 一、实验目的   帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收。 二、实验内容   主存储器空间的分配和回收   在可变分区管理方式下,采用最先适应算法实现主存空间的分配和回收。 三、实验方法   本实验以实验1——处理机调度为基础,再在其上进行修改与增加,实验工具是NetBeans IDE 8.2,采用图形界面和代码实...

渣渣的夏天 8681

山东大学操作系统实验二

【代码】山东大学操作系统实验二。

px0405的博客 249
上一篇: 操作系统实验一
下一篇: 操作系统试验三
warmllll
博客等级 码龄9年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值