精华内容
下载资源
问答
  • 进程管理

    千次阅读 2019-05-06 09:40:27
    进程是程序一次性运行,在处理器上顺序参与调度,运行的数据集合。 进程的特征 结构特性(PCB)进程控制块 ...进程管理 进程通信 管道 消息传递 共享存储区 宁可十年挖一口井,也不一年挖十个坑。 ...

    进程是程序一次性运行,在处理器上顺序参与调度,运行的数据集合。

    进程的特征

    1. 结构特性(PCB)进程控制块
    2. 动态性
    3. 并发性(在一段时间内,好几个程序共同执行)
    4. 独立性(不依赖其他的进程)
    5. 异步性

    进程的三大状态

    在这里插入图片描述


    进程管理

    在这里插入图片描述


    进程通信

    1. 管道
    2. 消息传递
    3. 共享存储区

    宁可十年挖一口井,也不一年挖十个坑。

    展开全文
  • 进程管理实验

    千次阅读 2016-10-10 19:35:34
    操作系统进程管理实验 用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能

    <p>用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。
    </p><p>
    </p><p>#define _CRT_SECURE_NO_DEPRECATE</p>
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    struct  PCB_type
    {
    	int pid;
    	int priority;
    	int cputime;
    	int state;
    };
    int shumu = 0;
    int pid_1;
    
    struct PCB_type neicun[20];
    struct PCB_type hc[10];
    
    int max = 0;int number = 0;
    
    void create();
    void run();
    void huanchu();
    void kill();
    	/*            创建新进程             */
    void create()
    {
    	if (shumu >= 20)
    	{
    		printf("neicun is full\n");
    	}
    	else
    	{
    		shumu++;
    		printf("请输入新进程的程序名\n");
    		scanf("%d", &neicun[shumu - 1].pid);
    		printf("请输入新进程的优先级\n");
    		scanf("%d", &neicun[shumu - 1].priority);
    		printf("请输入新进程的运行时间\n");
    		scanf("%d", &neicun[shumu - 1].cputime);
    		printf("创建进程时令其状态为就绪\n");
    		neicun[shumu - 1].state = 2;
    		printf("\n创建进程成功!\n");
    	}
    		
    
    }
    	/*          查看当前运行进程         */
    void run()
    {
    	int max = 0;
    	for (int i = 0;i<shumu;i++)
    	{
    		if ((neicun[i].state == 1) && (neicun[i].priority >= neicun[max].priority))
    			max = i;
    	}
    	neicun[max].state = 3;
    	printf("当前运行进程程序名:\n%d", neicun[max].pid);
    	printf("\n该进程的优先级:\n%d", neicun[max].priority);
    	printf("\n该进程的运行时间:\n%d", neicun[max].cputime);
    	printf("\n该进程的状态:\n%d", neicun[max].state);
    }
    	/*            换出            */
    void huanchu()
    {
    	int k;
    	printf("请输入要换出程序的程序名:");
    	scanf("%d", &k);
    	for (int j = 0;j<shumu;j++)
    	{
    		if (neicun[j].state == 1)
    		{
    			hc[number].pid = neicun[j].pid;
    			hc[number].state = neicun[j].state;
    			hc[number].priority = neicun[j].priority;
    			hc[number].cputime = neicun[j].cputime;
    			number++;
    			neicun[j].pid = 0;
    			neicun[j].state = 0;
    			neicun[j].priority = 0;
    			neicun[j].cputime = 0;
    			pid_1++;
    		}
    		else printf("进程%d无法换出的pid:%d\n", j,neicun[j].pid);
    
    		if (number != 0)
    		{
    			for (int i = 0;i < number;i++)
    			{
    				printf("当前运行进程程序名:\n%d", hc[i].pid);
    				printf("\n该进程的优先级:\n%d", hc[i].priority);
    				printf("\n该进程的运行时间:\n%d", hc[i].cputime);
    				printf("\n该进程的状态:\n%d", hc[i].state);
    			}
    		}
    	}
    	PCB_type temp = neicun[0];
    	for (k = 0;k <= shumu;k++)
    	{
    		if (neicun[k].priority>temp.priority)
    			temp = neicun[k];
    	}
    	neicun[k].state = 1;
    }
    	/*            杀死进程            */
    void kill()
    {
    	neicun[max].pid = 0;
    	neicun[max].priority = 0;
    	neicun[max].cputime = 0;
    	neicun[max].state = 0;
    	if (max == (shumu - 1))
    		shumu--;
    	else 
    	{
    		for (int j = max + 1;j<shumu;j++)
    		{
    			neicun[j - 1].pid = neicun[j].pid;
    			neicun[j - 1].priority = neicun[j].priority;
    			neicun[j - 1].cputime = neicun[j].cputime;
    			neicun[j - 1].state = neicun[j].state;
    		}
    		shumu--;
    	}
    	max = 0;
    	run();
    }
    int main()
    {
    	int n, a;
    	n = 1;
    	while (n == 1)
    	{
    		system("cls");
    		printf("\n**********************************************");
    		printf("\n*               进程演示系统                 *");
    		printf("\n**********************************************");
    		printf("\n     1.创建新的进程             2.查看运行进程");
    		printf("\n     3.换出某个进程             4.杀死运行进程");
    		printf("\n     5.退出系统                               ");
    		printf("\n**********************************************");
    		printf("\n请选择(1~5):");
    		scanf("%d", &a);
    		switch (a)
    		{
    		case 1:
    			create();
    			printf("\npress anykey to go on~");
    				//getch();
    			system("pause");
    			break;
    		case 2:
    			run();
    			printf("\npress anykey to go on~");
    			system("pause");
    				//getch();
    			break;
    		case 3:
    			huanchu();
    			printf("\npress anykey to go on~");
    			system("pause");
    				//getch();
    			break;
    		case 4:
    			kill();
    			printf("\npress anykey to go on~");
    				//getch();
    			system("pause");
    			break;
    		case 5:
    			exit(0);
    			default:
    			n = 0;
    			break;
    		}
    	}
    }
    很久不用VS,中途出现了几个小问题
    1.warning C4996: 'getch': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details.

    这种警告是因为VS的C函数库有更新的安全版本,
    如果源码只打算用VS编译可以改为使用安全版本
    比如scanf改为scanf_s
    如果需要使用其他编译器编译,就无视吧


    如果你getch() 是为了暂停程序以便观察结果,并且你的源码并不打算用其他编译器编译
    可以使用system("pause");替换getch();效果就是暂停程序并显示 "请按任意键继续. . ." 

    2.error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

    原因是Visual C++ 2012 使用了更加安全的 run-time library routines 。新的Security CRT functions(就是那些带有“_s”后缀的函数),请参见:


    《CRT函数的安全增强的版本》
    下面给出这个问题的解决方案:


    方法一:将原来的旧函数替换成新的 Security CRT functions。


    方法二:用以下方法屏蔽这个警告:


        1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:


           #define _CRT_SECURE_NO_DEPRECATE


        2. 或声明 #param warning(disable:4996)


        3. 更改预处理定义:


            项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加:


                _CRT_SECURE_NO_DEPRECATE


    方法三:方法二没有使用更加安全的 CRT 函数,显然不是一个值得推荐的好方法,但我们又不想一个一个地改函数名,这里还有一个更简便的方法:


    在预编译头文件 stdafx.h 里(同样要在没有include任何头文件之前)定义下面的宏:


    #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1


    在链接的时候便会自动将旧函数替换成 Security CRT functions 。


    注意:这个方法虽然使用了新的函数,但是不能消除警告(原因见红字),你还得同时使用方法二(-_-)。即实际应在预编译头文件 stdafx.h 里加入下面两句:


    #define _CRT_SECURE_NO_DEPRECATE


    #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

    展开全文
  • Linux进程管理与调度-之-目录导航

    万次阅读 多人点赞 2016-05-19 19:57:29
    日期 内核版本 架构 作者 GitHub CSDN 2016-05-19 Linux-4.5 ... Linux进程管理与调度 进程的描述 CSDN GitHub Linux进程描述符task_struct结构体详解–Linux进程的管理与调度(一) study/kernel/p
    日期 内核版本 架构 作者 GitHub CSDN
    2016-07-21 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度

    1 项目链接


    项目 描述
    KernelInKernel 一个运行在linux上的小巧内核, 修改了linux-kernel的start_kernel以启动我们自己的内核, 基于jserv/kernel-in-kernel(基于linux-4.1.0)和mengning/mykernel(基于linux-3.9.4), 适合学习和研究调度算法
    Linux进程管理与调度 CSDN博客–Linux进程管理与调度
    LDD-LinuxDeviceDrivers 与CSDN博客同步更新, 但是除了包含博客的内容, 还包含了一些以驱动方式实现的实验代码

    2 进程的描述


    CSDN GitHub
    Linux进程描述符task_struct结构体详解–Linux进程的管理与调度(一) study/kernel/01-process/01-task/01-task_struct
    Linux的命名空间详解–Linux进程的管理与调度(二) study/kernel/01-process/01-task/02-namespace
    Linux进程ID号–Linux进程的管理与调度(三) study/kernel/01-process/01-task/03-pid

    3 进程的创建


    CSDN GitHub
    Linux下的进程类别(内核线程、轻量级进程和用户进程)以及其创建方式–Linux进程的管理与调度(四) study/kernel/01-process/02-create/01-duplicate
    Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五) study/kernel/01-process/02-create/02-idel
    Linux下1号进程的前世(kernel_init)今生(init进程)----Linux进程的管理与调度(六) study/kernel/01-process/02-create/03-init
    Linux下2号进程的kthreadd–Linux进程的管理与调度(七) study/kernel/01-process/02-create/04-kthreadd
    Linux下进程的创建过程分析(_do_fork/do_fork详解)–Linux进程的管理与调度(八) study/kernel/01-process/02-create/05-do_fork
    Linux进程内核栈与thread_info结构详解–Linux进程的管理与调度(九) study/kernel/01-process/02-create/06-thread_info
    Linux内核线程kernel thread详解–Linux进程的管理与调度(十) study/kernel/01-process/02-create/07-kernel_thead

    4 进程的加载与运行


    CSDN GitHub
    Linux进程启动过程分析do_execve(可执行程序的加载和运行)—Linux进程的管理与调度(十一) study/kernel/01-process/03-execute/01-do_execve
    LinuxELF文件格式详解–Linux进程的管理与调度(十二) study/kernel/01-process/03-execute/02-elf
    ELF文件的加载过程(load_elf_binary函数详解)–Linux进程的管理与调度(十三) study/kernel/01-process/03-execute/03-load_elf_binary

    5 进程的退出


    CSDN GitHub
    Linux进程退出详解(do_exit)–Linux进程的管理与调度(十四)) study/kernel/01-process/04-exit/01-do_exit

    6 进程的调度


    CSDN GitHub
    Linux进程调度器概述–Linux进程的管理与调度(十五) study/kernel/01-process/05-schedule/01-introduction
    Linux进程调度策略的发展和演变–Linux进程的管理与调度(十六) study/kernel/01-process/05-schedule/02-develop
    Linux进程调度器的设计–Linux进程的管理与调度(十七) study/kernel/01-process/05-schedule/03-design
    Linux核心调度器之周期性调度器scheduler_tick–Linux进程的管理与调度(十八) study/kernel/01-process/05-schedule/03-design/02-periodic_scheduler
    Linux进程核心调度器之主调度器–Linux进程的管理与调度(十九) study/kernel/01-process/05-schedule/03-design/03-main_scheduler
    Linux用户抢占和内核抢占详解(概念, 实现和触发时机)–Linux进程的管理与调度(二十) study/kernel/01-process/05-schedule/03-design/04-preempt
    Linux进程上下文切换过程context_switch详解–Linux进程的管理与调度(二十一) study/kernel/01-process/05-schedule/03-design/05-context_switch
    Linux进程优先级的处理–Linux进程的管理与调度(二十二) study/kernel/01-process/05-schedule/03-design/06-priority
    Linux唤醒抢占----Linux进程的管理与调度(二十三) study/kernel/01-process/05-schedule/03-design/07-wakeup

    #7 调度普通进程-完全公平调度器CFS

    CSDN GitHub
    Linux进程调度之CFS调度器概述–Linux进程的管理与调度(二十四) study/kernel/01-process/05-schedule/07-cfs/01-cfs/
    Linux CFS调度器之负荷权重load_weight–Linux进程的管理与调度(二十五) study/kernel/01-process/05-schedule/07-cfs/02-load_weight/
    Linux CFS调度器之虚拟时钟vruntime与调度延迟–Linux进程的管理与调度(二十六) study/kernel/01-process/05-schedule/07-cfs/03-vruntime/
    Linux CFS调度器之队列操作–Linux进程的管理与调度(二十七) study/kernel/01-process/05-schedule/07-cfs/04-queue/
    Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程–Linux进程的管理与调度(二十八) study/kernel/01-process/05-schedule/07-cfs/05-pick_next/
    Linux CFS调度器之task_tick_fair处理周期性调度器–Linux进程的管理与调度(二十九) study/kernel/01-process/05-schedule/07-cfs/06-task_tick_fair/
    Linux CFS调度器之唤醒抢占–Linux进程的管理与调度(三十) study/kernel/01-process/05-schedule/07-cfs/07-task_new_fair/
    Linux CFS调度器之唤醒WAKE_AFFINE 机制–Linux进程的管理与调度(三十一) study/kernel/01-process/05-schedule/07-cfs/08-wake_affine

    7 公众号


    工作以后,很长时间,没写博客了。近期准备重新拾起来,知识是无界的,我最喜欢的就是把技术当笔记一样分享出来跟大家一起讨论,一些思考。

    近期开了公众号和知乎, 刚开始运营,欢迎大家多多支持。

    推荐大家关注下我的公众号,内核干货,谢谢。

    后期所有博文都将在这些平台同步推送,大家选择自己关注的平台即可。当然推荐大家把公众号关注了,谢谢。

    CSDN 公众号 知乎 自建站点
    kernel-csdn 内核干货 知乎 oskernellsb
    kernel-csdn 公众号 "内核干货" 知乎 在这里插入图片描述
    展开全文
  • Linux 进程管理

    千次阅读 2015-04-21 12:23:47
     在Linux的内核的五大组成模块中,进程管理模块时非常重要的一部分,它虽然不像内存管理、虚拟文件系统等模块那样复杂,也不像进程间通信模块那样条理化,但作为五大内核模块之一,进程管理对我们理解内核的运作、...

    引言:


           在Linux的内核的五大组成模块中,进程管理模块时非常重要的一部分,它虽然不像内存管理、虚拟文件系统等模块那样复杂,也不像进程间通信模块那样条理化,但作为五大内核模块之一,进程管理对我们理解内核的运作、对于我们以后的编程非常重要。同时,作为五大组成模块中的核心模块,它与其他四个模块都有联系。下面就对进程模块进行想写的介绍,首先要了解进程及其相关的概念。其次介绍进程的创建、切换、撤销等基本操作。除此之外,还给出了Linux内核是如何对进程进行调度管理的。


         一、进程及其相关概念


           进程:进程可以理解为程序执行的一个实例,它包括可执行程序以及与其相关的系统资源,比如打开的文件、挂起的信号、内核内部数据、处理器状态、内存地址空间及包含全局变量的数据段等。从内核的角度看,进程也可以称为任务。

           进程描述符:与进程相关的事情非常多,比如进程的状态、进程的优先级、进程的地址空间、允许该进程访问的文件等等,Linux内核为此专门设计了一个类型为task_struct的结构体,称之为进程描述符。进程描述符中包含了内核管理进程的所有信息,可以说,只要得到一个进程的进程描述符,就可以知道一个进程的所有信息。

           进程状态:进程描述符task_struct结构体中有一个state字段,表示进程当前的所处状态。从进程的创建到进程的删除,它可以经过5种不同的状态,分别是可运行状态、可中断的等待状态、不可中断的等待状态、暂停状态、跟踪状态。除此之外,当进程被终止时,还可能会变为僵死状态、僵死撤消状态。内核可以使用宏set_current_state(state)设置当前进程的状态,用set_task_state(task,state)设置某进程的状态。

           进程标示符:进程描述task_struct结构体中的pid字段可以标识唯一标识一个进程,称之为进程标识符PID。当创建一个新进程时,PID是按照顺序从小到大分配给新进程的。内核通过管理一个pidmap_array位图来表示当前已分配的PID和闲置的PID号。注意:在多线程组中,所有的线程共享相同的PID。除了进程标识符外,内核对进程的大部分访问时通过进程描述符指针进行的。

           进程关系:进程之间的关系有亲属关系和非亲属关系。亲属关系包括父子关系和兄弟关系等。其中由tast_struct结构体中的parent/children/real_parent/sibling等字段描述。除了亲属关系外,还有其他关系,比如,一个进程是一个进程组或登录会话的领头进程,可能是一个线程组的领头进程,这些关系由group_leader/tgid/signal->pgrp等字段描述。

           进程资源:为了防止进程过度的使用系统资源,内核为每个进程使用资源的数量进行了一些限制。其中包括进程地址空间的最大数、进程使用CPU的最大时间、堆的最大值、文件大小的最大值、文件锁数量的最大值、消息队列的最大字节数、打开文件描述符的最大数、进程拥有的页框最大数等。


           二、进程的创建、切换、撤销

           

           进程的创建:在Linux环境编程时,一般采用fork()函数来创建新的进程,当然,那是在用户空间的函数,它会调用内核中的clone()系统调用,由clone()函数继续调用do_fork()完成进程的创建。

           传统Unix系统中,创建的子进程复制父进程所拥有的资源,这种方法效率低,因为子进程需要拷贝父进程的整个地址空间。但是,子进程几乎不必读或修改父进程拥有的所有资源,因为很多情况下,子进程创建后会立即调用exec()一族的函数,并清除父进程仔细拷贝过来的地址空间。现代Unix系统用三种方式解决了这个问题:1、写实复制技术允许父子进程读相同的物理页。2、轻量级进程允许父子进程共享每进程在内核的很多数据结构。3、vfork()系统调用创建的进程能共享父进程的内存地址空间,为了防止父进程重写子进程需要的数据,阻塞父进程的执行,一直到子进程退出或执行一个新的程序为止。整个进程创建过程可能涉及到如下函数:

           fork()/vfork()/_clone----------->clone()--------->do_fork()---------->copy_process()

           上面的创建过程结束之后,就有了处于可运行状态的完整的子进程,新的子进程有了PID、进程描述符等各种数据结构,要想实际运行它,还需要调度程序把CPU交给新创建的子进程。


          除了进程外,还有内核线程(用kernet_thread创建)的概念。在Linux中,内核线程与普通进程存在以下两个方面的不同:

           1、内核线程只运行在内核态,而普通进程既可以运行在内核态,也可运行在用户态。

           2、因为内核线程只运行在内核态,它只使用大于PAGE_OFFSET的线性地址空间。另一方面,不管在用户态还是在内核态,普通进程可以用4GB的线性地址空间。


           撤销进程:进程终止后,需要通知内核以便内核释放进程所拥有的资源,包括内存、打开文件以及其他资源,如信号量。进程终止的一般方式是调用exit()库函数,该函数释放C函数库所分配的资源,执行编程者所注册的每个函数,并结束从系统回收进程的那个系统调用。

           除了进程自己终止自己外,内核可以有选择地强迫整个线程组死掉。这发生在:当进程接收到一个不能处理或忽视的信号时,或者当内核正在代表进程运行时再内核态产生一个不可恢复的CPU异常时。

            有两个终止用户态应用的系统调用:exit_group()系统调用,它终止整个线程组,即整个基于多线程的应用。do_group_exit()是实现这个系统调用的主要内核函数。exit()系统调用,它终止一个线程,而不管该线程所属线程组中的所有其他进程。do_exit()是实现这个系统调用的主要内核函数。


           进程切换:进程切换又称为任务切换、上下文切换。它是这样一种行为,为了控制进程的执行,内核挂起当前在CPU上运行的进程,并恢复以前挂起的某个进程的执行。

            跟函数的调用类似,进程切换时,一般要在CPU上装载要执行进程的进程上下文。进程的硬件上下文指:可执行程序上下文的一个子集,是进程恢复执行前装入寄存器的一组数据。其中一部分放在TSS段,即任务状态段,剩余部分存放在内核态堆栈中。进程的切换只发生在内核态,在执行进程切换之前,用户态进程使用的所有寄存器内容都已保存在内核态堆栈上。

            进程的切换有两种方法,一种是硬件切换,一种是软件切换。软件切换就是利用程序逐步执行切换,它的优点是,可以对切换时装入的数据进行合法性检查,执行时间虽与硬件切换大致相同,但仍有可改进的地方。


         进程切换使用schedule()函数完成,在本质上,每个进程切换由两部分组成:1、切换页全局目录以安装一个新的地址空间。2、切换内核态堆栈和硬件上下文,因为硬件上下文提供了内核执行新进程所需要的所有信息,包括CPU寄存器,主要有switch_to函数完成。


         三、进程调度


           调度策略:调度策略就是这样一组规则:决定什么时候以怎样的方式选择一个新进程运行的规则。Linux的调度基于分时技术:多个进程以“时间多路复用”方式运行,因为CPU的时间被分成“片”,给每个可运行进程分配一片。调度策略也是根据进程的优先级对它们进行分类。在Linux中,进程的优先级是动态的。调度程序跟踪进程正在做什么,并周期性地调整它们的优先级。根据不同的分类标准,可以把进程分成不同的类型。比如可以把一个进程看作是“I/O受限”或“CPU受限”。也可把进程区分为以下三类:交互式进程、批处理进程、实时进程。Linux的进程是抢占式的,无论是处于内核态还是用户态。时间片的长短对系统性能是很关键的:它既不能太长也不能太短。如果平均时间片太短,由进程切换引起的系统额外开销就变得非常高。如果平均时间片太长,进程看起来就不再是并发执行的。对时间片大小的选择始终是一种折中。Linux采用单凭经验的方法,即选择尽可能长、同时能保持良好响应时间的一个时间片。


           调度算法:早起的Linux中,调度算法是根据进程的优先级选择“最佳”进程来执行,它的缺点是时间开销与“可运行进程数量”有关。现代的Linux中,调度算法可以在固定时间内(与可运行进程数量无关)选中要运行的进程。首先,我们必须知道进程可以分为实时进程与普通进程。每个LInux进程总是按照如下的调度类型被调度:先进先出的实时进程、时间片轮转的实时进程、普通的分时进程。调度算法根据进程是普通进程还是实时进程而有很大不同。

           普通进程的调度:每个普通进程都有它自己的静态优先级(值是从100到139),调度程序使用静态优先级来估价系统中这个进程与其他普通进程之间调度的程度。静态优先级决定进程的基本时间片,即进程用完了以前的时间片时,系统分配给进程的时间片长度。普通进程除了静态优先级,还有动态优先级。动态优先级是调度程序在选择新进程来运行的时候使用的数。平均睡眠时间是进程在睡眠状态所消耗的平均纳秒数。即使具有较高静态优先级的普通进程获得了较大的CPU时间片,也不应该使静态优先级较低的进程无法运行。为了避免这个问题,提出了活动进程和过期进程的概念,活动进程指进程的时间片还未用完,过期进程指进程的时间片以用完,即使过期进程的优先级更高,也不能继续运行,除非等到所有活动进程都过期以后。

          实时进程的调度:每个实时进程都与一个试试优先级相关,实时优先级是一个范围从1到99的值。跟普通进程不同,实时进程总是被当作活动进程。


          调度程序所使用的主要数据结构:数据结构runqueue和进程描述符

           数据结构runqueue:runqueue数据结构中最重要的字段是与可运行进程 的链表相关的字段。其中的arrays字段是活动进程和过期进程的两个集合,active字段是指向活动进程链表的指针,expired字段是指向过期进程链表的指针。

           进程描述符:每个进程描述符都包括几个与调度相关的字段。其中的time_slice字段是在进程的时间片中还剩余的时钟节拍数。它由copy_process函数设置:父进程的剩余节拍数被划分为两等分,一份给父进程,一份给子进程。


         四、调度程序所使用的函数


           调度程序依靠几个函数来完成调度工作,其中最重要的函数如下:

            try_to_wake_up()函数通过把进程状态设置为TASK_RUNNING,并把该进程插入本地CPU的运行队列来唤醒睡眠或停止的进程。

            recalc_task_prio()函数更新进程的平均睡眠时间和动态优先级。

            schedule()憾事实现调度程序,它的任务时从运行队列的链表中找到一个进程,并随后将CPU分配给这个进程。schedule()可以由几个内核控制路径调用,可以采用直接调用或延迟调用的方式


           总结:

           Linux内核中的进程管理模块非常重要,它是连接其他4大模块的重要桥梁,它也非常复杂,理解它的一些基本原理,对于理解Linux内核非常重要,上面只是对它进行了一些简单的描述,并没有深入到具体实现细节,希望已有有机会能深入分析实现的细节。


    转自:懒人李冰

    展开全文
  • Linux系统进程管理

    千次阅读 2020-02-08 15:37:33
    Linux系统进程管理 1、什么是进程? Linux系统中的几乎任何行动都会以进程的形式进行。进程就是已启动的可执行程序的运行实例,进程是系统中正在运行的一个程序,程序一旦运行就是一个进程,进程有以下组成部分: 1...
  • 一文教你了解Linux进程管理

    千次阅读 多人点赞 2020-10-24 13:03:49
    Linux进程管理一. 什么是进程和程序二. 查看进程——ps,top,pstree三. 进程的启动方式四.进程的控制五.实训任务 一. 什么是进程和程序 进程:开始执行但是还没有结束的程序的实例 程序:包含可执行代码的文件 ...
  • 进程管理工具

    千次阅读 2016-11-07 14:38:43
    进程管理工具这一节我们介绍进程管理工具;使用进程管理工具,我们可以查询程序当前的运行状态,或终止一个进程;任何进程都与文件关联;我们会用到lsof工具(list opened files),作用是列举系统中已经被打开的...
  • 实验一 进程管理与进程通信 一、实验目的 1、掌握进程的概念,明确进程的含义。 2、认识并了解进程并发执行的实质,进程的阻塞与唤醒,终止与退出的过程。 3、熟悉进程的睡眠、同步、撤消等进程控制方法。 4、分析...
  • Linux进程管理父进程和子进程

    千次阅读 2014-10-09 19:26:43
    Linux进程管理对于电脑使用的玩家的常用软件,然后我就学习及深入的研究Linux进程管理,在这里和大家一起探讨Linux进程管理的使用方法,希望对大家有用。程序是为了完成某种任务而设计的软件,比如OpenOffice是程序...
  • 第二章 进程管理 - 进程、线程 进程的概念 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。(线程是调度的基本单位) 程序:是静态的,是一个存放在磁盘里的可执行文件,是一系列指令的集合 ...
  • Linux系列第五谈(Linux磁盘管理、Linux进程管理

    千次阅读 多人点赞 2020-08-04 19:13:46
    Linux磁盘管理、Linux进程管理
  • 操作系统进程管理-同步和互斥 在看了操作系统关于进程管理中的同步互斥机制章节之后,甚是困惑,今天通过视频、网上博客资料学习之后,整理一下相关知识点。 进程管理 一、进程互斥 由于进程具有独立性和异步...
  • 进程管理演示

    千次阅读 2015-01-20 23:13:20
    设计一个允许n个进程并发运行的进程管理模拟系统。该系统包括有简单的进程控制、同步与通讯机构,其进程调度算法可任意选择(优先级调度,时间片轮转,短进程优先中的一种)。每个进程用一个PCB表示,其内容根据具体...
  • Linux_系统进程管理

    千次阅读 2015-11-13 02:12:31
    进程管理 进程管理的指令 查看进程ps指令 pgreppidof指令查pid lsof查看系统中的进程 top系统进程管理器任务管理器 进程状态 top快捷键 top界面信息的意义 nice指令修改进程的nice值 kill指令结束进程进程管理进程的...
  • 操作系统实验一 进程管理

    千次阅读 多人点赞 2019-05-18 14:59:09
    实验一 进程管理 1.目的和要求 通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。 2.实验内容 用C语言编程模拟进程管理,...
  • Window进程管理

    千次阅读 2013-10-22 16:07:32
    Window进程管理 2011-05-19 10:25 243人阅读 评论(0) 收藏 举报 nullwindows磁盘网络tokenthread 可能大家对任务管理器里最熟悉的功能要数进程管理了,常常我们在怀疑中了病毒/木马的时候都会看看任务...
  • linux系统之进程管理

    千次阅读 2020-01-19 19:56:10
    我们拥有操作系统就是为了运行用户程序,程序的运行需要调动进程,因此进程管理就是所有操作系统的心脏。 实际上,进程就是正在执行的程序代码的时事结果。 进程的理解 进程: 进程是静态的文件,是运行中的程序的...
  • 实验一 进程管理与进程通信 一、实验目的 1、掌握进程的概念,明确进程的含义。 2、认识并了解进程并发执行的实质,进程的阻塞与唤醒,终止与退出的过程。 3、熟悉进程的睡眠、同步、撤消等进程控制方法。 4、分析...
  • 操作系统概论【二】- - 进程管理

    万次阅读 2020-08-16 20:53:24
    文章目录第二章、进程管理一、进程的描述1. 为什么要引入进程的概念?a.程序的顺序执行b.程序的并发执行c.进程的概念2. 进程的定义3. 进程的特征4. 进程与程序的比较5.进程控制块6. 进程的状态7. 进程的组织三种组织...
  • 进程管理命令一、查看用户信息w1、 w显示信息的含义 TTY:说明用户登录的方式,ttyN:表示以本地终端登录;pts/N表示以远程终端登录 JCPU:以终端代号来区分,该终端所有相关的进程执行时,所消耗的CPU时间会显示在这里  ...
  • 用psutil进行进程管理

    千次阅读 2017-09-09 01:15:58
    用psutil进程管理
  • Android内存管理的原理--进程管理

    千次阅读 2015-05-27 14:40:39
    Android内存管理的原理--进程管理 Android采取了一种有别于 Linux 的进程管理策略,有别于Linux的在进程活动停止后就结束该进程,Android把这些进程都保留在内存中,直到系统需要更多内存为止。这些保留在内存...
  • 本文是Android进程管理系列文章的第二篇,会讲解进程管理中的优先级管理。 进程管理的第一篇文章:《进程的创建》请跳转至这里。 本文适合Android平台的应用程序开发者,也适合对于Android系统内部实现感兴趣...
  • 计算机操作系统进程管理总结

    万次阅读 多人点赞 2018-06-07 11:57:03
    计算操作系统进程管理 一、进程与线程 1.1、进程 进程是资源分配的基本单位。 进程控制块PCB(Process Control Block)描述的是进程的基本信息以及进程的运行状态,我们说的创建及撤销进程都是对进程控制块...
  • Linux进程管理常用命令

    千次阅读 2019-04-28 14:33:22
    概述 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。...进程管理常用命令 进程的查看 ps 和 pstree命令 ps aux 查看系统中 所有...
  • Android应用程序进程管理

    千次下载 热门讨论 2013-10-23 01:21:26
    此外,组件管理服务ActivityManagerService和窗口管理服务WindowManagerService也会在适当的时候主动进行进程回收。每一个应用程序进程根据运行情况被赋予优先级,当需要回收进程的时候,就按照优先级从低到高的顺序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 100,597
精华内容 40,238
关键字:

进程管理