linux线程阻塞中CPU的占用率

2023-05-16

linux线程阻塞中CPU的占用率

一、简介

总所周知Linux系统下,我们编写的程序进入阻塞后,系统把任务挂起,交给内核进行处理,此时我们的进程CPU占用率不高,可以说是占用率0.0%,让CPU资源交给其他进程处理,这样系统执行效率就很高,系统也很安全。
在这里插入图片描述
使用top命令产看到列表中,CPU占用率较高的也就是0.7%。

二、线程阻塞sleep

实现秒延时的函数

unsigned int sleep(unsigned int seconds);

现在做一个测试,在mian()加入一个延时sleep()函数,同时创建一个线程也在里面键入延时函数sleep(),测试代码如下。

#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <pthread.h>

unsigned char I_ucRunning = 0;

static void *Timer_routine(void *arg){
	//死循环执行
    while (I_ucRunning != 0) {
        printf("I'm pthread,is running\n");
        sleep(1);
        /* code */
    }
}


int main(void)
{
    int k = 0;
	//设定线程执行死循环
    I_ucRunning = 1;
    pthread_t t;
	//开启线程
    int ret= pthread_create(&t, NULL, Timer_routine, NULL);
    if(ret){
        exit(ret);
    }
    //循环处理
    for(k = 0;k < 10;k++)
    {
      sleep(1);
      printf("I'm main process.\n");
    }
    //退出线程中的死循环
    I_ucRunning = 0;
    //等待退出线程
    pthread_join(t, NULL);
    //销毁进程
    exit(0);
}

先来看看执行效果!!
在这里插入图片描述

看看CPU的占用率!!
在这里插入图片描述
在运行同时刷新了连续几十次,找不到这个进程,原因是CPU占用率太低,都排不上这个列表…
好!非常好!CPU占用率低!
但是这个函数似乎有点延时太长了

三、加重CPU负担

于是我把线程里面的sleep()给去掉后,重新编译运行,代码如下。

#include <stdio.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>

unsigned char I_ucRunning = 0;

static void *Timer_routine(void *arg)
{
    while (I_ucRunning != 0)
    {
        printf("I'm pthread,is running\n");
        //sleep(1);
        /* code */
    }
}


int main(void)
{
    int k = 0;

    I_ucRunning = 1;
    
    pthread_t t;

    int ret= pthread_create(&t, NULL, Timer_routine, NULL);
    if(ret){
        exit(ret);
    }

    //
    for(k = 0;k < 30;k++)
    {
      sleep(1);
      printf("I'm main process.\n");
    }
    
    //
    I_ucRunning = 0;

    //
    pthread_join(t, NULL);

    //
    exit(0);
}

运行效果是CPU的占用率达到32.7%,非常不好!!
由于我使用虚拟机运行,这种程序对我的电脑是九牛一毛,如果是放到嵌入式系统中,CPU占用率可能到达99.99%,后果是系统很卡,导致其他线程无法合理运行使得。
在这里插入图片描述

四、总结

合理运用阻塞函数sleep()使得线程阻塞,让出CPU资源给其他进程使用,才是高效运行系统做法,提高了系统安全性和实时性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux线程阻塞中CPU的占用率 的相关文章

随机推荐

  • go语言编译前端静态文件到可执行文件 -statik

    statik 安装 go get github com rakyll statik statik 使用 1 把安装好的包 里面的 statik go 文件编译好 然后运行 2 编译好的statik go文件 src 61 你的静态文件路径
  • goLand全局修改时区

    两种方法 第一种 xff1a loc 61 time FixedZone 34 UTC 34 8 3600 time Local 61 loc 第二种 loc err 61 time LoadLocation 34 America Atka
  • python之Pyperclip模块

    python之Pyperclip模块 下面介绍一下 xff0c python中的Pyperclip模块 xff0c 它的简单又实用 xff0c 主要用法就2点 xff1a 1 用于复制剪贴板里的内容 2 向剪贴板写入内容 一 Pypercl
  • 利用栈判断一个字符串是否是回文

    利用栈判断一个字符串是否是回文 问题描述 编写一个程序 xff0c 判断一个字符串是否为回文 xff08 顺读和倒读都一样的字符串称为回文 xff09 输入形式 长度小于100的任意字符串 输出形式 如果输入字符串是回文 xff0c 则输出
  • Java把String转换成Date类型(Date转换成String类型)

    1 String转换成Date类型 span class token class name SimpleDateFormat span ft span class token operator 61 span span class toke
  • 微信小程序开发自学笔记 —— 七、性能优化

    性能优化 启动 在小程序启动时 xff0c 微信会为小程序展示一个固定的启动界面 xff0c 界面内包含小程序的图标 名称和加载提示图标 此时 xff0c 微信会在背后完成几项工作 xff1a 下载小程序代码包 加载小程序代码包 初始化小程
  • Error: failed to unmarshal json. invalid character “*”looking for beginning of value解决方案

    IPFS config时出现 Error failed to unmarshal json invalid character looking for beginning of value 在Win10 命令行执行ipfs config命令
  • Jsp的四种作用域范围

    首先要声明一点 xff0c 所谓 34 作用域 34 就是 34 信息共享的范围 34 xff0c 也就是说一个信息能够在多大的范围内有效 JSP的四种范围 xff0c 分别为page request session application
  • go 调用shell命令 两种方式(有无返回值)

    阻塞方式 需要执行结果 适用于执行普通非阻塞shell命令 xff0c 且需要shell标准输出的需要对shell标准输出的逐行实时进行处理的 非阻塞方式 不需要执行结果 官网的标准中文库 阻塞方式 需要执行结果 主要用于执行shell命令
  • linux内核链表应用--笔记

    Windows 应用linux内核链表 一 从网上现在linux kernel代码 linux内核版本有2种 稳定版 次版本为偶数 xff0c 开发版 次版本为奇数 版本号 主版本 次版本 释出版本 修改版本 内核下载连接网站 xff1a
  • STM32单片机产生PWM信号

    STM32单片机产生PWM信号 1 开发环境 目标单片机 STM32F407VET6芯片 xff0c 系统时钟高达168Mhz 开发平台 xff1a KEIL 5 编写程序借助ST公司的标准函数库 xff0c 不过现在已经不更新这个写函数库
  • 应用linux内核链表

    一 STM32应用linux内核链表 在此之前 xff0c 已经对Linux内核链表已经移植过一次 不过是针对Windows平台 xff0c 下面是链接 xff1a https blog csdn net qq 36883460 artic
  • 数据结构与算法 ---- C/C++

    数据结构与算法 C C 43 43 学习数据结构的目的 xff1a 针对不同的情况使用不同数据结构 xff0c 去解决不同的问题 一 线性表 线性表一般有几个函数 xff08 宏定义 xff09 xff1a 初始化线性表 List Init
  • 单片机低功耗

    单片机低功耗 如何减低整个系统功耗 xff1f 从两个方面下手 xff1a 软件 xff1f 硬件 xff1f 软件 xff1a 减少外设使用 xff08 不需要的就关掉 xff09 xff0c 减低时钟频率 xff0c 尽量选择低功耗模式
  • RS485通讯---Modbus数据链路层与应用层(二)

    前言 RS485通讯 Modbus物理层 xff1a https blog csdn net qq 36883460 article details 105630712 Modbus RTU通讯协议中OSI模型 xff0c 数据链路层和应用
  • 【笔记】MySQL 5+ 相同用户的数据,取最新登记日期的那条

    需求 xff1a MySQL5 43 处理 xff0c 下面表中 xff0c 用户名相同的数据 xff0c 取最新登记日期的登记号码 表名 xff1a userinfo 用户名 username 登记号码 regis num 登记时间 re
  • STM32F4应用DMA——串口收发不定长数据

    STM32F4应用DMA 串口收发不定长数据 使用STM32自带DMA传输数据 xff0c 可以减轻CPU负担 xff0c 只需设置一些参数即可发送想要发送的数据 xff0c 以下是STM32F407VE芯片测试过的部分代码 xff0c 可
  • Kotlin-----UDP客户端网络编程代码

    一 Kotlin编程简介 Kotlin可以说是Java的进阶版本 xff0c 基本上兼容了Java所有代码 xff0c 就连网络编程与Java的方式一致 xff0c 你可以看到下边是调用Java的库去完成网络编程 二 UDP客户端网络编程代
  • mime.type文件内容

    span class token macro property span class token directive hash span span class token expression This is a comment span
  • linux线程阻塞中CPU的占用率

    linux线程阻塞中CPU的占用率 一 简介 总所周知Linux系统下 xff0c 我们编写的程序进入阻塞后 xff0c 系统把任务挂起 xff0c 交给内核进行处理 xff0c 此时我们的进程CPU占用率不高 xff0c 可以说是占用率0