• 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)
  • 相关阅读:
    Python基于Django的电影推荐系统和论坛项目完整源码
    【Akka】学习资料整理
    高校教室预约使用管理系统(PHP+Mysql)毕业论文+项目源码+数据库sql文件
    23种设计模式(二十一)备忘录模式(阁瑞钛伦特软件-九耶实训)
    Vue04/Vue组件通信、Vue组件父传子 props 传值 及 props 介绍
    uni-app开发小程序时ucharts图表如何使用
    【计算机视觉】图像分割与特征提取——基于Log、Canny的边缘检测
    事件循环原理
    【Mybatis源码】XPathParser解析器
    非关系型数据库技术课程 第二周作业(Redis中字符串和列表数据类型练习)
  • 原文地址:https://blog.csdn.net/weixin_42581560/article/details/127827578