• Linux的资源和限制


    1.limits.h文件限定了操作系统许多常量
    比如:给文件命名的最大名字长度NAME_MAX,char类型的位数CHAR_BIT,int类型的最大值INT_MAX
    用户可以在limits.h中查看

    2.在头文件sys/resource.h中提供了操作方面的定义,比如对程序长度,执行优先级和文件资源等方面限制和设置的函数
    int getpriority(int which,id_t who); 获取优先级
    int setpriority(int which,id_t who, int priority); 设置优先级
    int getrlimit(int resource, struct rlimit *r_limit); 获取系统资源的限制
    int setrlimit(int resource,struct rlimit *r_limit);设置系统资源的限制
    int getrusage(int who, struct rusage *r_usage);获取CPU时间

    (1)getrusage函数可以用来获取CPU时间
    结构体struct rusage的两个成员如下
    struct timeval ru_utime 使用的用户时间
    struct timeval ru_stime 使用的系统时间
    而struct timeval 定义在sys/time.h中,它包含了成员tv_sec和tv_usec,代表的是淼和微淼
    一个程序耗费的CPU时间可分为用户时间(程序执行自身的指令所耗费的时间)和系统时间(操作系统为程序执行所耗费的时间)
    int getrusage(int who, struct rusage *r_usage)的who可以选择各种其他的常量,使用相关函数可查用手册
    比如下面两种情况
    当who取RUSAGE_SELF,函数只计算当前程序的使用信息
    当who取RUSAGE_CHILDREN 函数还要返回子进程的使用信息
    函数会把CPU时间写入到struct rusage结构参数中

    (2)而对于int getpriority(int which,id_t who); int setpriority(int which,id_t who, int priority);(3
    which代表优先级,对于普通用户,只能降低优先级。
    每一个程序的运行都有自己的优先级,优先级越高,分配的CPU时间也就越多
    PRIO_PROCESS who参数是进程标识符
    PROI_PGRP who参数是进程组
    PROI_USER who参数是用户标识符
    优先级的取值范围是-20-20,默认优先级是0,数值越大则优先级越低

    (3)getrlimit和setrlimit函数是读取和设置系统资源的。
    struct rlimit结构体有两个成员
    rlim_t rlim_cur    当前的软限制
    rlim_t rlim_max 硬限制
    rlim_t是一个整型,表示某些资源的大小
    软限制是建议性的限制,如果超越这个值,系统则会返回一个信号终止程序运行

    还有很多资源可以限制,查看sys/resource.h。

    以其中文件大小资源为例子

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. void task()
    9. {
    10. FILE* f = tmpfile();//创建一个临时文件
    11. int i;
    12. double x = 4.5;
    13. for(i = 0; i < 10000; i++)
    14. {
    15. fprintf(f,"输出一些东西\n");
    16. if(ferror(f))
    17. {
    18. perror("输出到临时文件错误\n");
    19. return ;
    20. }
    21. }
    22. for(i = 0; i < 10000; i++)
    23. {
    24. x = log(x * x + 3.21);
    25. }
    26. }
    27. int main()
    28. {
    29. struct rusage r_usage;
    30. struct rlimit r_limit;
    31. int priority;
    32. task();//执行一些任务
    33. getrusage(RUSAGE_SELF,&r_usage);//获取执行时间
    34. printf("CPU使用时间:用户使用时间=%ld.%ld,系统执行=%ld.%ld\n",\
    35. r_usage.ru_utime.tv_sec, r_usage.ru_utime.tv_usec,\
    36. r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec);
    37. priority = getpriority(PRIO_PROCESS,getpid());//获取当前程序的优先级
    38. printf("当前程序的优先级=%ld\n",priority);
    39. getrlimit(RLIMIT_FSIZE,&r_limit);//获取文件大小限制
    40. printf("当前的文件限制:软限制=%ld,硬限制=%ld\n",r_limit.rlim_cur,r_limit.rlim_max);
    41. r_limit.rlim_cur = 2048;
    42. r_limit.rlim_max = 4096;
    43. printf("重新设置文件限制\n");
    44. setrlimit(RLIMIT_FSIZE,&r_limit);//重新设置文件资源
    45. task();
    46. return 0;
    47. }

    执行结果:

    1. CPU使用时间:用户使用时间=0.0,系统执行=0.1603
    2. 当前程序的优先级=0
    3. 当前的文件限制:软限制=-1,硬限制=-1
    4. 重新设置文件限制
    5. File size limit exceeded (core dumped)
  • 相关阅读:
    数据结构 —— 二叉树(超详细图解 & 接口函数实现)
    关于mysql本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止问题
    R语言ggHoriPlot包绘制地平线图
    【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter24-编写简单的脚本实用工具
    (附源码)计算机毕业设计SSM教师业绩考核和职称评审系统
    某东员工面试被问自动化测试,11:00进去的,11:05就出来···
    11 盛水最多的容器
    基于PSO粒子群优化的第四方物流的作业整合算法matlab仿真,计算最低运输费用、代理人转换费用、运输方式转化费用和时间惩罚费用(含完整matlab代码)
    Git代码上传
    SaaSBase:什么是环信?
  • 原文地址:https://blog.csdn.net/weixin_42581560/article/details/127827578