Linux操作系统实验3——进程切换

news2024/10/5 17:19:43

实验要求:

1.编写用户态程序,程序中需设计能引起进程状态发生变化的流程。

2.编写内核态模块,定时获取输入参数指定进程的运行状态。

3.通过内核态的记录指定进程运行状态变化的情况,需记录三种以上。

实验原理:

1. linux系统中进程的状态及其切换条件,linux系统状态转换图及每种状态转换的触发条件,找到对应进程状态定义的宏定义。

Linux系统中的进程主要有以下5种状态:

(1)TASK_RUNNING(可运行状态)。正在运行的进程或在可运行进程队列(run_queue)中等待运行的进程处于该状态。它实际上包含一般操作系统原理教材中所谓进程三种基本状态中的运行态和就绪两种状态。

当CPU空闲时,进程调度程序只在处于该状态的进程中选择优先级最高的进程运行。Linux中运行态的进程可以进一步细分为3种:内核运行态、用户运行态和就绪态。

(2)TASK_INTERRUPTIBLE(可中断阻塞状态)。处于可中断阻塞状态的进程排成一个可中断阻塞状态进程队列,该队列中的阻塞进程在资源有效时,能被信号或中断唤醒进入到运行态队列。

(3)TASK_UNINTERRUPTIBLE(不可中断阻塞状态)。不可中断指的是进程不响应信号。处于不可中断阻塞状态的进程排成一个不可中断阻塞状态进程队列。该队列中的阻塞进程,不可被其他进程唤醒,只有被使用wake_up()函数明确唤醒时才能转换到可运行的就绪状态。

(4)TASK_STOP/TASK_TRACED(暂停状态)。当进程收到信号SIGSTOP、SIGTSTP、SIGTTIN或SIGTTOU时就会进入暂停状态。可向其发送SIGCONT信号,让进程转换到可运行状态。

(5)TASK_DEAD-EXIT_ZOMBIE(僵尸状态)。表示进程停止但尚未消亡的一种状态。此时进程已经结束运行并释放掉大部分资源,但父进程尚未收回其PCB。在进程退出时,将状态设为TASK_ZOMBIE,然后发送信号给父进程,由父进程再统计其中的一些数据后,释放它的task_struct结构。处于该状态的进程已经终止运行,但是父进程还没有询问其状态。

转换图:

宏定义:

2. 用户态程序中显式的改变进程运行状态的变化

调用sleep函数可以进入阻塞态,空循环为运行状态,gdb设置断点并在断点停止运行为暂停状态


参考代码: 

 exam.c:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(){
	printf("pid=%d\n",getpid());//得到进程号
	sleep(6);//进入睡眠状态
	printf("睡眠完成,开始运行\n");
while(1){}//一直运行
}

timer.c:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/hrtimer.h>

#include<linux/init.h>
#include<linux/interrupt.h>
#include<linux/sched.h>
#include <linux/version.h>
#include <linux/ktime.h>
#include <linux/kallsyms.h>
#include <linux/sched.h>

struct hrtimer timer;
long laststate=0xff;
//unsigned int laststate=0xff;
static int pid;
module_param(pid,int,0644);

static void print_task_state(void)
{
struct task_struct *p;
	
	p=pid_task(find_vpid(pid),PIDTYPE_PID);
	
		if (p->state != laststate){
			laststate=p->state;
			if(p->state==0)
			//printk("%x\t%s\n",p->state,ktime_get());
			//printk("%x\t\n",p->state);
			printk("R (running)\n");
			else if(p->state==1)
			printk("S (sleeping)\n");
			//else if(p->state==0x6C)
			//printk("t (tracing stop)\n");
			else
				printk("t (tracing stop)\n");
		}		

}
 
enum hrtimer_restart hrtimer_func(struct hrtimer *t)
{
	//printk("----hrtimer_func----\n");
       print_task_state();
 
    //实现循环定时,5秒一次
	hrtimer_forward_now(t, ktime_set(5,1000));
 
	return HRTIMER_RESTART;
}
 
 
static int __init test_drv_init(void)
{		
	hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	timer.function = hrtimer_func;
 
	hrtimer_start(&timer, ktime_set(1,1000), HRTIMER_MODE_REL);
	
	return 0;
}
 
 
static void __exit test_drv_exit(void)
{
	hrtimer_cancel(&timer);
	
	printk("----test_drv_exit----\n");
}
 
module_init(test_drv_init);
module_exit(test_drv_exit);
 
 
MODULE_LICENSE("GPL");
 

timer.c对应的Makefile文件:

#Makefile文件注意:假如前面的.c文件起名为first.c,那么这里的Makefile文件中的.o文
#件就要起名为first.o    只有root用户才能加载和卸载模块
obj-m:=timer.o                          #产生task_struct模块的目标文件
#目标文件  文件  要与模块名字相同
CURRENT_PATH:=$(shell pwd)             #模块所在的当前路径
LINUX_KERNEL:=$(shell uname -r)        #linux内核代码的当前版本
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)

all:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules    #编译模块
#[Tab]              内核的路径       当前目录编译完放哪  表明编译的是内核模块

clean:
	make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean      #清理模块

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/125924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

有向图的拓扑序列

848. 有向图的拓扑序列 - AcWing题库 昨天看了这道题L3-031 千手观音 拓扑排序哈希表_他不是混子QAQ的博客-CSDN博客 就想着也用这道题的stl方法来试下 先来我的这个笨笨的方法&#xff0c;就当练习stl了&#xff0c;后面还有一个简便的stl STL知识点(刚知道&#xff1a; 对于…

linux系统中uboot的基本原理与实现方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;U-boot的操作与实现方法。 目录 第一&#xff1a;U-boot基本简介 第二&#xff1a;u-boot烧写与启动方法 第三&#xff1a;uboot中信息查询命令 第一&#xff1a;U-boot基本简介 linux系统启动必须要有一个bootloade…

举个栗子~Tableau 技巧(248):使用参数和轴实现图表坐标轴的缩放

实际业务分析场景中&#xff0c;使用折线图来呈现业绩趋势分析时候&#xff0c;经常会遇到这样问题&#xff1a;某一段时间的业绩数值波动范围较小&#xff0c;折线图趋于平缓&#xff08;如下图&#xff09;&#xff0c;很难判断业绩的波动差异&#xff0c;也很难一眼看出哪个…

vulnhub DC系列 DC-3

总结&#xff1a;joomscan工具的使用&#xff0c;cve-2016-4557内核提权或者cve-2021-4034内核提权 下载地址 漏洞分析 信息收集 sql注入 写马 提权 反弹shell 内核提权 cve-2016-4557 cve-2021-4034 下载地址 Download:http://www.five86.com/downloads/DC-3.zip 使用…

npm发布自己的组件UI包(详细步骤,图文并茂)

目前做前端项目&#xff0c;一直采用npm install XXX 的方式去引用别人的组件包&#xff0c;调用方法。 其实在开发中&#xff0c;每个开发者基本都写过单独的组件&#xff0c;如何让自己的组件能够重复的利用&#xff0c;如何让别人也享受到您的成果&#xff0c;这里将一步一步…

【KMP算法】

KMP算法核心剖析&#xff1a; 关于KMP算法&#xff0c;建议先了解 BF算法 KMP算法是用来解决字符串匹配问题的高级算法&#xff0c;看完这篇文章&#xff0c;你应该能理解KMP算法。 KMP算法和BF算法唯一的区别在于&#xff1a;主串的&#xff49; 并不会回退&#xff0c;子…

java: “abstract 抽象类” 与 “ interface 接口” 的妙用之道

java: “abstract 抽象类” 与 “ interface 接口” 的妙用之道 每博一文案 有句很扎心的话&#xff0c;我对这世间唯一的不满就是这世间总是让更懂事的人承受的更多。 生活中&#xff0c;往往你越善解人意&#xff0c;就越没人在乎你的委屈&#xff0c;时间&#xff0c;让你学…

Linux下使用nginx搭建文件服务器

搭建后访问效果图 安装nginx 1、安装依赖 yum install -y gcc pcre-devel zlib-devel openssl openssl-devel 2、下载nginx mkdir -p /www/nginx cd /www/nginx wget http://nginx.org/download/nginx-1.21.0.tar.gz tar -xvf nginx-1.21.0.tar.gz 3、安装nginx cd nginx…

redis远程操作常见问题

Connection error: Connection refused 出现该错误的原因是未开启远程连接&#xff0c;将本地ip注释掉&#xff1a; Connection error: The remote host closed the connection 出现该错误的原因是&#xff0c;需要关闭安全模式&#xff0c;才可运行其他ip访问&#xff1a; 当…

websocket简单实现

websocket简单实现 websocket是HTML5下一种新的协议&#xff0c;本质上websocket是一个基于tcp的协议。它实现了浏览器与服务器之间的双向通信&#xff0c;能更好的节省服务器资源和宽带并实现实时的通信。 websocket的几个优点? 1、使用的资源少&#xff0c;因为它的头更小。…

Footprint Analytics 如何帮助区块链研究人员进行数据研究

管理一个人的数字资产是区块链技术提供的主要应用&#xff0c;但管理的另一面是责任。 就像区块链让任何人都能完全保管他们的加密货币一样&#xff0c;如果你被骗、被黑或被诈骗&#xff0c;几乎没有追索权。链上研究是预防为主&#xff0c;解决问题的方法并不存在。 例如&a…

个推TechDay治数训练营直播回顾 | 企业级标签体系建设实践

标签作为当下最普遍的数据资产类型之一&#xff0c;对企业洞察用户画像、开展精细化运营等具有重要的支撑作用。企业标签体系的建设并非一蹴而就的&#xff0c;需要结合业务视角进行整体的规划&#xff0c;更涉及到复杂的数据治理和数据资产管理等工作。 本文对个推TechDay“治…

复习 [kuangbin带你飞]专题5 并查集

目录1. poj 2236 Wireless Network2. poj 1611 The Suspects3. hdu 1213 How Many Tables4. hdu 3038 How Many Answers Are Wrong5. poj 1182 食物链6. poj 1417 True Liars7. poj 1456 Supermarket8. poj 1733 Parity game9. poj1984 Navigation Nightmare10. poj 2912 A Bug…

MYSQL IN EXISTS LEFT JOIN 结果不同的问题?

随着问问题的同学越来越多&#xff0c;公众号内部私信回答问题已经很困难了&#xff0c;所以建立了一个群&#xff0c;关于各种数据库的问题都可以&#xff0c;目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS 等&#xff0c;期待你的加入&#xff0c;加群请添加微信li…

智慧园区建设面临挑战,该如何应对?

随着全球物联网、移动互联网、云计算等新一轮信息技术的迅速发展和深入应用&#xff0c;“智慧园区”建设已成为发展趋势。近年来&#xff0c;我国的产业园区也向着智慧化、创新化、科技化转变。中国经济正在进入转型升级的关键时期&#xff0c;各地产业竞争态势越发激烈。可以…

ClickHouse 大数据量的迁移方式

关于Clickhouse 备份方式&#xff0c;其官方网站上就提供了多种备份方式可以参考&#xff0c;不同的业务需求有不同的使用场景&#xff0c;需要使用不同的备份方式&#xff0c;不存在一个通用的解决方案可以应对各种情况下的ClickHouse备份和恢复。今天这个文字&#xff0c;我们…

Qt+第三方库开发遇到的坑---kalrry

Qt依赖UG库开发遇到的坑---kalrry一、依赖引入坑二、Qt在Debug时报错1、编译器是 **MSVC** 还是 **MinGW**2、编译器 32位 还是 64位三、QtMSVC编译后中文乱码四、不能将const char*类型的值分配到const* 类型的实体五、debug编译后再发布程序无法运行六、Qt 环境配置提示警告警…

Spring @Transactional注解事务六大失效场景

Transactional事务失效场景1&#xff1a;注解在非public修饰的方法上。 原因&#xff1a;Spring强制的要求。 代码示例&#xff1a; Transactionalprivate void createOrder(){} Transactional事务失效场景2&#xff1a;注解在被final关键字修饰的方法上。 原因&#xff1a;Spr…

推荐一款好用的设备维护管理系统,你用过了吗

设备维护管理系统层出不穷&#xff0c;找到一款好用的适配的&#xff0c;也要花费大量的时间去挑选&#xff01; 对于企业来说&#xff0c;一个好的设备管理系统应该能够&#xff1a; 1. 适应企业高度场景化的设备管理工作&#xff0c;覆盖设备的采购、常规检查、养护、添装、…

“三刷”牛客网844道Java题目,易错知识点总结,带你清扫Java基础面试障碍

目录 前言 1、子类通过哪些办法&#xff0c;可以调用继承自父类的方法&#xff1f; 2、volatile、Lock、transient 哪个关键字不能用来处理线程安全 3、Hashtable 和 HashMap 的区别是&#xff1f;&#xff08;容易忽略的两点&#xff09; 4、如何声明了一个适合于创建50个字…