Linux源码阅读笔记08-进程调度API系统调用案例分析

news2024/12/23 18:54:59

kthread_create_on_node

kthread_create_on_node函数功能:指定存储节点创建新内核线程。源码如下:

操作实战

#include <linux/module.h>
#include <linux/pid.h>
#include <linux/sched.h>
#include <linux/kthread.h>
#include <linux/wait.h>

int MyThreadFunc(void* argc) {

    printk("MyThreadFunc\n");

    printk("MyThreadFuncPID: %d\n", current->pid);

    printk("Exit MyThreadFunc\n");

    return 0;
}

static int __init KthreadCreateOnNodeInit(void) {

    struct task_struct* pts = NULL;

    printk("KthreadCreateOnNodeInit\n");

    pts = kthread_create_on_node(MyThreadFunc, NULL, -1, "ktconode.c");
    
    printk("New thread PID: %d\n", pts->pid);

    wake_up_process(pts);

    printk("Curretn thread PID: %d\n", current->pid);

    return 0;
}

static void __exit KthreadCreateOnNodeExit(void) {

    printk("Exit kernel: KthreadCreateOnNodeExit\n");
}

MODULE_LICENSE("GPL");
module_init(KthreadCreateOnNodeInit);
module_exit(KthreadCreateOnNodeExit);

wake_up_process

wake_up_process函数功能:唤醒处于睡眠状态的进程,状态转换为RUNNING状态,让CPU重新调度处理。

  • 唤醒成功返回1
  • 唤醒失败(该线程已经是RUNNING状态)返回0

源代码如下:

操作实战

#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/wait.h>
#include <linux/module.h>
#include <linux/pid.h>
#include <linux/list.h>
#include <linux/delay.h>

struct task_struct* pts_thread = NULL;

int MyThreadFunc(void* argc) {

    int iData = -1;

    printk("MyThreadFunc\n");

    printk("MyThreadFunc PID: %d\n", current->pid);

    //查看父进程状态
    printk("初始化函数状态为: %ld\n", pts_thread->state);
    iData = wake_up_process(pts_thread);

    printk("wake_up_process之后父进程状态: %ld\n", pts_thread->state);
    printk("wake_up_process返回结果为: %d\n", iData);

    printk("Exit MyThreadFunc\n");

    return 0;
}

static int __init WakeUpProcessInit(void) {

    int res = 1; // 保存wake_up_process结果

    char cName[] = "wakeup.c%s";
    struct task_struct* pResult = NULL;
    long time_out;

    wait_queue_head_t head;
    wait_queue_entry_t data;

    printk("WakeUpProcessInit\n");

    //指定节点,创建新的内核线程
    pResult = kthread_create_on_node(MyThreadFunc, NULL, -1, cName);
    printk("New thread PID: %d\n", pResult->pid);
    printk("Current thread PID: %d\n", current->pid);

    init_waitqueue_head(&head);
    init_waitqueue_entry(&data, current);
    add_wait_queue(&head, &data);
    pts_thread = current;

    res = wake_up_process(pResult);
    printk("wake_up_process唤醒新线程之后的结果为: %d\n", res);

    time_out = schedule_timeout_uninterruptible(2000*10);

    res = wake_up_process(current);

    printk("唤醒当前线程的结果为: %d\n", res);
    

    printk("调用sched_timeout_uninterruptible返回结果为: %ld\n", time_out);

    printk("Exit WakeUpProcessInit\n");

    return 0;
}

static void __exit WakeUpProcessExit(void) {

    printk("Exit WakeUpProcessExit\n");
}

module_init(WakeUpProcessInit);
module_exit(WakeUpProcessExit);

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

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

相关文章

Docker 镜像导出和导入

docker 镜像导出 # 导出 docker 镜像到本地文件 docker save -o [输出文件名.tar] [镜像名称[:标签]] # 示例 docker save -o minio.tar minio/minio:latest-o 或 --output&#xff1a;指定导出文件的路径和名称[镜像名称[:标签]]&#xff1a;导出镜像名称以及可选的标签 dock…

一招解决 | IP地址访问怎么实现https

没有域名的情况下&#xff0c;使用IP地址实现HTTPS访问是可以的&#xff0c;但相比使用域名会有些许限制&#xff0c;需要通过部署专用于IP地址的SSL/TLS证书来实现。 IP地址实现HTTPS访问的过程与使用域名类似&#xff0c;但有几个关键的区别。以下是使用IP地址实现HTTPS访问…

CrimsonEDR:一款恶意软件模式识别与EDR策略评估工具

关于CrimsonEDR CrimsonEDR是一个功能强大的开源项目&#xff0c;该项目旨在帮助广大研究人员识别特定的恶意软件模式&#xff0c;以此来优化终端检测与响应&#xff08;EDR&#xff09;的策略方案。通过使用各种不同的检测方案&#xff0c;可以加深开发人员与研究人员加深对安…

Nginx 配置文件

Nginx的配置文件的组成部分&#xff1a; 主配置文件&#xff1a;nginx.conf子配置文件&#xff1a;include conf.d/*.conf 全局配置 nginx 有多种模块 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错误日志记录 、配置文件解析 、事件驱动机…

python基础语法 004-2流程控制- for遍历

1 遍历 1.1 什么是遍历&#xff1f; 可以遍历的元素&#xff1a;字符串、列表、元组、字典、集合字符串是可以进行for 循环。&#xff08;容器对象&#xff0c;序列&#xff09;可迭代对象iterable 例子&#xff1a; 1 &#xff09;、for遍历字符串&#xff1a; name xiao…

Ubuntu20.04 安装 cudatookit 12.2 + cudnn 安装

最简约的部署Ubuntu20.04深度学习环境的教程 1. 安装Ubuntu20.04 系统 B站详细的安装教程 简约安装版 2. 安装Nvidia显卡驱动 我参考了各种资料&#xff0c;重装系统&#xff0c;完美解决开机显示器黑屏无法进入桌面的情况 黑屏问题主要是由linux内核更新导致&#xff0c;…

携程礼品卡能转出去吗?

携程的卡好像只能在旅游的时候用 像买车票啊&#xff0c;机票啊&#xff0c;酒店&#xff0c;景点门票啥的&#xff0c;但是如果我没有出游计划的话 这个卡是不是就要被闲置下来&#xff1f; 这个问题一直让我感到很苦恼&#xff0c;还好有收卡云&#xff0c;不然我的携程卡…

你还搞不懂串口的格式转换问题吗?

相信大多数人在使用串口传输不同单片机之间的数据时都会运到数据格式怎么对应起来的问题&#xff0c;今天我们就来聊聊&#xff01; 在开始之前我插一个内容&#xff0c;就是不同的单片机之间的电平可能不相同&#xff0c;是不能直接使用杜邦线连接通信的&#xff0c;需要进行电…

centos7搭建zookeeper 集群 1主2从

centos7搭建zookeeper 集群 准备前提规划防火墙开始搭建集群192.168.83.144上传安装包添加环境变量修改zookeeper 的配置 192.168.83.145 和 192.168.83.146 配置 启动 集群 准备 vm 虚拟机centos7系统zookeeper 安装包FinalShell或者其他shell工具 前提 虚拟机安装好3台cen…

私域打造朋友圈秘诀

内容比例把控 朋友圈内容应遵循9:1原则&#xff0c;即90%的人设内容与10%的营销内容。 朋友圈的内容比例非常关键。大部分内容应聚焦在展示个人形象和生活&#xff0c;以此建立信任&#xff0c;而仅有10%的内容用于营销&#xff0c;实现商业价值。 人设内容构建 通过生活圈、工…

从新手到高手:Scala函数式编程完全指南,Scala 数据类型(4)

1、Scala 数据类型 Scala 与 Java有着相同的数据类型&#xff0c;下表列出了 Scala 支持的数据类型&#xff1a;

【鸿蒙学习笔记】基础组件Progress:进度条组件

官方文档&#xff1a;Progress 目录标题 作用最全属性迭代追加进度赋值风格样式 作用 进度条组件 最全属性迭代追加 Progress({ value: 20, total: 100, type: ProgressType.Linear }).color(Color.Green)// 颜色.width(200)// 大小.height(50)// 高度.value(50)// 进度可更…

多域名聊天:TTKefu如何助力企业实现高效沟通与灵活扩展

在当今数字化时代&#xff0c;企业与客户之间的沟通方式已经发生了翻天覆地的变化。随着互联网的普及和移动设备的普及&#xff0c;企业越来越依赖于线上聊天工具来与客户建立联系。而在这个背景下&#xff0c;TTKefu作为一款先进的多域名聊天工具&#xff0c;凭借其强大的功能…

大促前夕即高点,综合电商平台的“稀缺”魔法正在消失?

新一期618大促早已结束良久了&#xff0c;但似乎其产生的余韵却仍旧未消散。 从最直观的资本市场走势来看&#xff0c;自这一波618大促陆续开展之后&#xff0c;包括京东、阿里巴巴、拼多多等港美股股价就一改此前的上行态势&#xff0c;持续下滑至今。 事实上&#xff0c;早…

JAVA各版本-安装教程

目录 Java安装包下载 Java安装步骤 Java环境配置 Java安装包下载 到Oracle官网下载自己需要的版本 Oracle Java下载&#xff1a;Java Archive | Oracle Hong Kong SAR, PRC 下拉选择自己需要的版本&#xff08;本教程以Windows环境下&#xff0c;JAVA11为例&#xff09; 注…

MySQL的简介和安装目录

今日总结到此结束&#xff0c;拜拜&#xff01;

Chapter 8 Feedback

Chapter 8 Feedback 这一章我们介绍feedback 反馈运放的原理. 负反馈是模拟电路强有力的工具. 8.1 General Considerations 反馈系统如下图所示 Aolamp open-loop gain即开环增益. Aolxo/xi β \beta β 是 feedback factor, 注意方向. β x f x o \beta\frac{x_{f}}{x_{o…

香港优才计划真的要烂尾了吗?该如何防止这种情况发生!

香港优才计划真的要烂尾了吗&#xff1f;该如何提前应对避免烂尾&#xff01; 香港优才计划的“烂尾”说法主要源于对大量申请者可能面临的续签和转永居挑战的担忧。虽然2023年申请人数激增&#xff0c;但并非所有获得身份的人都能顺利过渡到永久居留。 以下是几个关键点&…

解析QAnything启动命令过程

一.启动命令过程日志 启动命令bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat。输入日志如下所示&#xff1a; rootMM-202203161213:/mnt/l/20230918_RAG方向/QAnything# bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat From …

Vulkan学习——渲染3D模型

摘要&#xff1a;本文简要描述了Vulkan渲染一个3D模型需要做的事情&#xff0c;不会对太细节的内容进行深究。   关键字&#xff1a;Vulkan,Render,3D 源码 1 简介 1.1 Vulkan简介 Vulkan是一个低开销、跨平台的二维、三维图形与计算的应用程序接口&#xff08;API&#x…