精华内容
下载资源
问答
  • 我们这里不在乎优先级怎么被使用(后续文章中会讲),我们这里只讨论,优先级怎么算,分几类,什么关系,到底那个起作用!抛弃你原有的一切关于优先级的概念,往下看:首先你要知道,优先级是用整数表示的,范围是:0-...

    首先明确下面这句话:

    linux中有两套调度类,实时调度和CFS调度,在不同的调度类中优先级的使用方法不同,但是他们的计算方法是一致的.我们这里不在乎优先级怎么被使用(后续文章中会讲),我们这里只讨论,优先级怎么算,分几类,什么关系,到底那个起作用!


    抛弃你原有的一切关于优先级的概念,往下看:

    首先你要知道,优先级是用整数表示的,范围是:

    d02620ef6a7463909ac2474985b3929a.png

    0-99称为实时优先级范围

    100-139称为普通优先级范围

    显然值越低优先级越高,实时进程的优先级一定在实时优先级范围,普通进程一般在普通优先级范围,但是可以提高到实时优先级范围,但是提高到实时优先级范围的普通进程依然是普通进程!

    实时进程永远比普通进程优先调度,获得实时优先级的普通进程,只是说将会比其他的普通进程更有话语权,这里就又涉及到CFS的调度策略了,我们不展开

    此外,普通优先级和nice(一个改变优先级的系统调用)值有对应关系,nice=0时优先级对应为120

    nice的范围是(-20到19,为什么这么诡异呢,这你就要问写这段代码的人了)

    好了,到目前为止,我们所说的优先级,即被调度类使用的优先级,他的真名叫做动态优先级,他是在task_struct中的一个项:task_struct->prio,类型是整数

    那么动态优先级怎么来的呢?继承自他的父进程的普通优先级,普通优先级也是task_struct中的一个项:task_struct->normal_prio,类型是整数

    那么普通优先级又是怎么来的呢:

    • 对于普通进程,他的值等于静态优先级
      • 静态优先级依然还是task_struct中的项,创建时指定,可以通过nice修改
    • 对于实时进程,他的值等于(99-实时优先级)
      • 注意这里的实时优先级同样是task_struct中的项,区别于上面说到的实时优先级范围,实时优先级取值范围是(0-99),值越大,优先级越高,因此在计算普通优先级时,需要用99去减,

    捋一下逻辑,和普通进程相关的有:静态优先级,普通优先级,和动态优先级

    他们的关系很明确:静态优先级=普通优先级=动态优先级

    那么既然他们都相等,还整三个干嘛呢?

    首先静态优先级是计算的起点,可以通过系统调用nice修改,当静态优先级改变时,普通优先级和动态优先级也会保持同步的修改.

    而动态优先级可能因为调度策略的影响,而临时调整.而这个调整我是不希望继承到子进程的,因此,在设置的时候我让动态优先级继承了普通优先级,而普通优先级.

    那为什么不直接继承静态优先级呢?因为还有实时进程呀!实时进程中静态优先级无效,起作用的是他的实时优先级,为了在继承的时候不区分实时进程/普通进程,就添加了普通优先级这个中间商,你明白了吗?

    我觉得你可能没有明白!

    展开全文
  • 进程启动优先级

    2020-12-26 02:13:59
    <div><p>大佬, 有些进程是有依赖其他进程的..怎么设置进程的启动优先级?</p><p>该提问来源于开源项目:codeskyblue/gosuv</p></div>
  • Linux操作系统的进程2

    千次阅读 热门讨论 2021-03-08 15:53:22
    程序地址空间1 进程优先级1.1 进程优先级的概念1.2 查看系统进程和优先级1.3 更改系统的优先级2 环境变量2.1 基本概念2.2 常见环境变量和查看环境变量的方法2.3 和环境变量相关的命令2.4 环境变量的组织方式2.5 设置...

    1 进程优先级

    1.1 进程优先级的概念

    cpu资源分配的先后顺序,就是指进程的优先权(priority)。
    优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
    还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

    1.2 查看系统进程和优先级

    在linux或者unix系统中,用ps –l命令则会类似输出以下几个内容:
    在这里插入图片描述
    我们很容易注意到其中的几个重要信息,有下:

    • UID : 代表执行者的身份
    • PID : 代表这个进程的代号
    • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
    • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
    • NI :代表这个进程的nice值

    关于PRI 和 NI

    • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小
      进程的优先级别越高
    • 那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
    • PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
    • 这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
    • 所以,调整进程优先级,在Linux下就是调整进程的nice值
    • nice其取值范围是-20至19,一共40个级别。
    • 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进
      程的优先级变化。
    • 可以理解nice值是进程优先级的修正数据

    1.3 更改系统的优先级

    用top命令更改已存在进程的nice
    进入top后按“r”–>输入进程PID–>输入nice值

    其他概念:

    • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高
      效完成任务,更合理竞争相关资源,便具有了优先级
    • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
    • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
    • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为
      并发

    2 环境变量

    2.1 基本概念

    • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
    • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但
      是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
    • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

    2.2 常见环境变量和查看环境变量的方法

    • PATH : 指定命令的搜索路径

    • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

    • SHELL : 当前Shell,它的值通常是/bin/bash。
      查看环境变量的方法:

    • echo $NAME //NAME为环境变量的名字
      将我们的程序所在路径加入环境变量PATH当中:

    • export PATH = $PATH:hello 程序所在路径

    2.3 和环境变量相关的命令

    和环境变量相关的命令:

    • echo:显示某个环境变量值
    • export:设置一个新的环境变量
    • env:显示所有环境变量
    • unset:清除环境变量
    • set:显示本地定义的shell变量和环境变量

    2.4 环境变量的组织方式

    在这里插入图片描述

    每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
    通过代码如何获取环境变量==>命令行第三个参数

    #include <stdio.h>
    int main(int argc, char *argv[], char *env[])
    {
     int i = 0;
     for(; env[i]; i++){
     printf("%s\n", env[i]);
     }
     return 0;
     }
    

    通过系统调用获取或设置环境变量

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
     printf("%s\n", getenv("PATH"));
     return 0;
    }
    

    常用getenv和putenv函数来访问特定的环境变量。

    2.5 设置&获取环境变量和环境变量的特性

    环境变量通常是具有全局属性的

    环境变量通常具有全局属性,可以被子进程继承下去

    3 进程地址空间(重点)

    我们在学习知识的时候要学会问自己3个问题?1、是什么?2、为什么?3、怎么办?
    做到知其然和知其所以然。

    3.1 地址空间的引入

    之前写过的C语言的博客,谈到过"程序地址空间",虽然这个说法是不对的,但是是为了为现在这个进程地址空间做铺垫的,
    在这里插入图片描述
    之前并没有内核空间。注意:代码区并不是从地址全零开始的。看下面的代码
    在这里插入图片描述
    创建子进程,在子进程中改变了全局变量的值。那么我们来看看运行结果:
    在这里插入图片描述
    我们发现g_val在父子进程的地址值是一样的,但是g_val的值却不一样,是不是很诡异?
    问自己个问题:内存中同一个地址的值,被不同的进程读取,有可能是不同的值吗?进程地址空间是内存吗?

    结论:

    • 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量。
    • 但是地址值是一样的,说明了该地址绝对不是物理地址。
    • 在Linux地址下,这种地址叫虚拟地址。
    • 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户是看不到的,有 OS 统一管理。

    所以之前说的"程序地址空间"是不准确的,应该是进程地址空间。"

    3.2 什么是地址空间

    描述进程所占有资源的一张表,在操作系统内核中就是一个结构体,把地址空间划分成若干区域,来看下Linux内核的源码

    在这里插入图片描述

    这是Linux的进程控制块的结构体定义,在最后一行就是进程的地址空间,我们看下其定义,
    在这里插入图片描述
    其中

        unsigned long total_vm, locked_vm, shared_vm, exec_vm;
    	unsigned long stack_vm, reserved_vm, def_flags, nr_ptes;
    	unsigned long start_code, end_code, start_data, end_data;
    	unsigned long start_brk, brk, start_stack;
    	unsigned long arg_start, arg_end, env_start, env_end;
    

    就划分了进程地址空间中的不同区域。

    3.3 为什么要有地址空间

    • if没有地址空间,进程读写的是实际的物理内存,那个一个进程去读写另一个的进程的数据,导致野指针问题,并且破坏了进程的独立性。
    • 进程数据的地址可能不连续,导致访问难度增大,异常访问的概率变大。

    3.4 地址空间怎么使用

    • 虚拟地址空间和物理内存之间建立映射关系—页表(虚拟地址和物理地址的映射关系)
    • 由用户去访问物理内存变成OS去访问,那么进程一些非法行为将被禁止,地址空间通过虚拟内存将空间连续化处理了,起到保护内存的作用。一旦进程越界访问到只读数据,程序会崩溃,会被OS干掉。

    3.5 页表的作用和进程地址空间的管理

    3.5.1 页表的作用

    1 问大家一个问题:为什么代码是只读的,字符串是只读的,数据是可读可写的?
    答:因为页表中有对应空间的访问权限,是可读的,可写的,还是可读可写的,就会限制进程对内存空间的访问。如果进程对只读数据进行写入,就会被OS终止,比如char * str = “chenzhihao”; *str = ‘C’;就会报错
    2 因为有页表这样的映射关系存在,所以一个进程是不可能越界去访问到另一个进程的数据的,因为页表中就没有这种映射关系,那么进程内部的越界访问是有可能有的

    3.5.2 程序地址空间的管理

    1、进程按照地址空间 和 页表中的虚拟地址和实际物理内存地址的映射关系拿到在物理内存中的数据和代码,进程得以运行。
    2、问题:每个进程都有一个进程地址空间,那么在系统中有很多的进程及其地址空间,那么要如何管理这些进程地址空间呢?

    还是先描述再组织。
    先描述:
    在这里插入图片描述
    在组织:
    在这里插入图片描述
    跟进程是强绑定的,在Linux源码里可以看出辣
    在这里插入图片描述
    mm_struct 结合页表完成映射
    在这里插入图片描述

    3.6 小结

    什么是进程谈谈你的理解?
    答:进程是加载进内存的程序,有进程常见的数据结构(struct task_struct(进程控制块) && struct mm_struct(进程地址空间)) 和 代码数据构成,从冯诺依曼体系机构来理解的话:一个程序从硬盘加载进内存,操作系统(OS),要给这个进程创建task_struct和 mm_struct ,二者用指针关联起来,然后通过页表和物理内存建立映射关系,执行代码和数据。

    展开全文
  • 需求是,有个后台的service,需要一直跑着,但是系统或者360一键清理后,整个应用进程就没了,service也就没了。如何重启?我看了一些资料,说的是写一个守护进程...怎么在一个APK中弄两个进程?求大牛指导下思路。
  • linux进程调度之nice函数

    千次阅读 2018-09-06 20:11:07
    总结: int nice(int inc); 进程调度优先级为,nice的取值范围是0~(2*NZERO)-1 一般头文件会定义:优先级的最大值NZERO;...输入:输入参数inc时,inc会以加的形式,设置优先级如:原理优先级为1,而inc为2,...

     

    总结:

    int nice(int inc);

    进程调度优先级为,nice的取值范围是0~(2*NZERO)-1

    一般头文件会定义:优先级的最大值NZERO;

     如果没有可以通过这个函数得到:sysconf(_SC_NZERO);

    不管其他书对nice函数的用法怎么说,下面是我通过实际测试得到的

    输入:输入参数inc时,inc会以加的形式,设置优先级如:原理优先级为1,而inc为2,则优先级为3,若inc为-1,则优先级为0

    输出:成功设置输出inc的值,错误返回-1

    下面的程序概述:

    1.创建一个子进程,打印父进程和子进程优先级,

    2.子进程通过nice函数设置进程优先级

    3.最后,两给进程运行10秒,在这10秒中,由于优先级的不同,两个进程分配的时间不同,则cout值就不同,优先级越大,cout的值越大

    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    #include <sys/time.h>
    #include <sys/resource.h>
    #define bufsize 20
    unsigned long long count;
    struct timeval end;
    void
    checktime(char *str)
    {
    	struct timeval tv;
    	gettimeofday(&tv, NULL);
    	if (tv.tv_sec >= end.tv_sec && tv.tv_usec >= end.tv_usec) 
    	{
    		printf("%s count = %lld\n", str, count);
    		exit(0);
    	}
    }
    int
    main(int argc, char *argv[])
    {
    	pid_t pid;
    	char *s;
    	int nzero, ret;
    	int adj = 0;
    	int errno = -1;
    	setbuf(stdout, NULL);
    #if defined(NZERO)
    	nzero = NZERO;
    #elif defined(_SC_NZERO)
    	nzero = sysconf(_SC_NZERO);
    #else 
    #error NZERO undefined
    #endif
    	printf("NZERO = %d\n", nzero);
    	if (argc == 2)
    		adj = strtol(argv[1], NULL, 10);
    	gettimeofday(&end, NULL);
    	end.tv_sec += 10; /* run for 10 seconds */
    	if ((pid = fork()) < 0) 
    	{
    		perror("fork failed");
    	} else if (pid == 0) 
    	{ /* child */
    		s = "child";
    		printf("current nice value in child is %d, adjusting by %d\n",nice(0)+nzero, adj);
    		errno = 0;
    		if ((ret = nice(adj)) == -1 && errno != 0)
    			perror("child set scheduling priority");
    		printf("now child nice value is %d\n", ret+nzero);
    		printf("current nice value in child is %d, adjusting by %d\n",nice(0)+nzero, adj);
    	} else 
    	{ /* parent */
    		s = "parent";
    		printf("current nice value in parent is %d\n", nice(0)+nzero);
    	}
    	for(;;) 
    	{
    		if (++count == 0)
    			printf("%s counter wrap", s);
    		checktime(s);
    	}
    }

    结果:

     

     

     

     

     

     

     

    展开全文
  • 进程调度方式是指当有更高优先级进程来时,怎么分配CPU。调度方式分为:可剥夺、不可剥夺。 三级调度 高级调度 中级调度 低级调度:又称“进程调度”,决定内存中的就绪进程哪个可以占用CPU 调度算法 先来...

    进程调度

    进程调度方式是指当有更高优先级的进程来时,怎么分配CPU。调度方式分为:可剥夺、不可剥夺。

    三级调度

    • 高级调度

    • 中级调度

    • 低级调度:又称“进程调度”,决定内存中的就绪进程哪个可以占用CPU

    调度算法

    • 先来先服务

    • 时间片轮转

    • 优先级调度
      每个进程都拥有一个优先数,调度时选择优先数大的占用CPU
      静态优先级和动态优先级

    • 多级反馈调度
      1、设置多个就绪队列,赋予不同优先级。优先级越低的时间片越长。
      2、新进程进入内存后,先投入队列1,按照FCFS算法调度;若某进程在进程在队列1的一个时间片内为执行完则投入队列2的末尾。
      3、仅当较高优先级队列为空,才调度较低优先级队列中的进程执行。如果进程执行过程中有新进程进入较高优先级的队列,则抢先执行新进程,并把被抢先的进程投入原队列的末尾。

    进程优先级的确定

    对I/O型进程,让其进入最高优先级队列。
    对计算型进程,每次都执行完时间片后进入更低优先级。
    I/O完成时,提高优先级;时间片用完时,降低优先级。

    展开全文
  • Windows系统进程全解剖

    2011-01-02 20:49:53
    问:进程中有一个“设置优先级”,我查看了一下,发现都是“标准”,那么是不是需要对那些进程手工调整一下呢? 答:优先级是系统自动来调整的,一般无需我们自己调整。不过遇到特殊情况,调整一下...
  • 怎么让 Android 程序一直后台运行

    千次阅读 2016-10-25 16:37:56
    Service设置成START_STICKY,kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样​通过 startForeground将进程设置为前台进程,做前台服务,优先级和前台应用一个级别​,除非在系统内存非常缺,否则此...
  • Linux:nice函数

    2018-09-27 20:12:50
    什么是nice函数? 在我们的系统中,进程调度依赖于进程优先级。如何获取或者设置优先级的值?这就是nice干的事情!...怎么设置? #include&lt;unistd.h &gt; int nice(int incr); 参...
  • 给每个进程设置优先级,根据优先级来选取下一个执行的进程。对于一些时间短的任务可以适当增加它的优先级,但是事先怎么知道它要执行多长时间也是个问题;而且如果一个人询问的时间越来越长怎么办?其实也就是不...
  • WinProc

    2006-03-16 00:00:00
    进程优先级设置:你可以主观上控制进程的CPU占用时间。 杀进程:WinProc提供多种杀进程方式。 1.在进程列表中直接双击可以结束选定进程; 2.在进程列表中右击选定进程,在弹出菜单中选择“结束该进程之后所有...
  • 怎么学? 关于这个,给大家看一份学习大纲(xmind)文件,每一个分支里面会有详细的介绍。 这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记可以看文末 初识多线程 介绍进程 回到线程 进程与...
  • MacOS的安装程序我不是Apple的未定义开发人员:)您应该短时间更改应用程序运行设置,依次转到“系统偏好设置”>“安全性和优先级”,然后设置Appstore和已确定的开发人员 无论您使用哪种系统,都可以选择适当的...
  •  在长期的开发实践中证明后台服务进程在某些机型,也有被杀死的可能,需要我们进一步需要进程优先级,怎么办,真正的“黑科技”来了,通过android系统提供的账号同步机制SyncAdapter来实现进程的优先级,...
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
  • 本书以其翔实知识面的覆盖、大量实用的示例和作者自身丰富的编程经验,阐述了从C语言编程基础、C++面向对象语法、MFC类库、控件及高级应用、进程和线程到异常处理等各个方面的诀窍,是一本系统而全面的编程经典图书...
  • 本书以其翔实知识面的覆盖、大量实用的示例和作者自身丰富的编程经验,阐述了从C语言编程基础、C++面向对象语法、MFC类库、控件及高级应用、进程和线程到异常处理等各个方面的诀窍,是一本系统而全面的编程经典图书...
  • 本书以其翔实知识面的覆盖、大量实用的示例和作者自身丰富的编程经验,阐述了从C语言编程基础、C++面向对象语法、MFC类库、控件及高级应用、进程和线程到异常处理等各个方面的诀窍,是一本系统而全面的编程经典图书...
  • 本书以其翔实知识面的覆盖、大量实用的示例和作者自身丰富的编程经验,阐述了从C语言编程基础、C++面向对象语法、MFC类库、控件及高级应用、进程和线程到异常处理等各个方面的诀窍,是一本系统而全面的编程经典图书...
  • 2、CSS样式定义优先级顺序是? 12 3、div和span的区别? 12 4、CSS选择器包括? 12 5、用css3语法中,如何实现一个矩形框的圆角效果和50%红色透明效果?,请写出关键脚本 12 6、Div与Table的区别 13 7、行级标签转...
  • Visual Studio程序员箴言中文扫描PDF

    热门讨论 2010-12-28 01:04:18
    技巧5.25 为任务列表中的用户任务分配优先级 118 技巧5.26 在任务列表中创建和查看todo注释 118 技巧5.27 在任务列表中创建快捷方式 119 技巧5.28 在任务列表中显示hack、undone和自定义标记 120 技巧5.29 ...
  • 3.1.9 什么情况下设置了索引但无法使用? 3.2.0 SQL语句的优化 3.2.1 数据库索引的底层实现原理和优化 3.2.2 HTTP和HTTPS的主要区别? 3.2.3 如何设计一个高并发的系统? 3.2.4 两条相交的单向链表,如何求他们的...
  • 英特尔面试专项准备

    2020-12-09 13:46:46
    有哪些影响进程优先级的因素 </li><li> 设备管理 </li><li> <p>Linux下常用命令 </li><li> 内存使用 </li><li> <p>linux中数据结构 </li><li> 图的DFS非递归算法的大概实现,和广度优先遍历非递归算法的实现 ...
  • Init 帮助 Android 应用调度复杂的任务流(如应用初始化流程),如下一节图示的那种任务流,处理类型、优先级、多进程(像是每个进程都会执行application的onCreate),任务依赖,提高应用启动效率。 尽管Init...
  • Visual Studio程序员箴言--详细书签版

    热门讨论 2012-10-16 20:37:39
    技巧2.7 设置文档、选定的文本或者只是当前行的格式 30 技巧2.8 保留制表符或者插入空格 30 技巧2.9 将空格转换为制表符和将制表符转换为空格 30 技巧2.10 从文本编辑器工具栏上增加或减少行缩进 31 技巧...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    SettingDlg.h 设置对话框类文件 LocalInfoDlg.h 查看本地信息对话框类文件 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 如题。 FTP、HTTP 多线程断点续传下载文件 源码 如题。 gdiplus应用实例 如...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

怎么设置进程优先级