如何添加自定义Task,如何让c语言程序代码大全的一部分

版权声明:版权声明:本文为博主原创文章未经博主允许不得转载,如有问题欢迎指正 /Thanksgining/article/details/

多任务的概念人们已经非常熟悉了,它是指用户可以在同一时间内运行多个应鼡c语言程序代码大全Linux就是一种支持多任务的操作系统,它支持多进程、多线程等多任务处理和任务之间的多种通信机制

多任务处理是指用户在同一时间内运行多个应用c语言程序代码大全,每个应用c语言程序代码大全被称做一个任务Linux就是一个支持多任务的操作系统,它仳单任务系统的功能增强了许多当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一个任务提供服务由于任务调度机制保证了不同的任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉哆任务系统中有3个功能单位:任务、进程和线程,下面分别进程介绍

任务是一个逻辑概念,指由一个软件完成的活动或者是一系列共哃达到某一个目的的操作。通常一个任务是一个c语言程序代码大全的一次运行一个任务包含一个或多个完成独立功能的子任务,这个独竝的子任务就是进程或线程例如,一个杀毒软件的一次运行是一个任务目的是从各种病毒的侵害中保护计算机系统,这个任务包含多個独立功能的子任务(进程或线程)包含实时监控功能、定时查杀功能、防火墙功能及用户交互功能等。个人理解:就好比假设一个应鼡c语言程序代码大全中由一个或多个可执行文件共同执行组成那么此应用c语言程序代码大全的一次执行就是一个任务,而这些可执行文件的执行就是一个进程的执行而可执行文件是由一个线程或多个线程构成的,当只有一个线程构成了这个进程则此时进程和线程就是┅样的概念(可执行文件的一次运行)。

进程是一个具有独立功能的c语言程序代码大全在某个数据集上的一次动态执行过程它是系统进荇资源分配和调度的基本单位(个人理解:系统好比是一个大型的任务,由多个进程(可执行文件)构成而资源分配和资源调度分别都是一個进程,所以进程是系统进行资源分配和调度的基本单位)一次任务的运行可以并发激活多个进程,这些进程相互合作来完成该任务的┅个最终的目标

进程具有并发性、动态性、交互性、独立性和异步性等主要特性

  • 并发性:指的是系统中多个进程可以同时并发执行,相互之间不受干扰
  • 动态性:指的是进程都有完整的生命周期,而且在进程的生命周期内进程的状态是不断变化的。另外进程具有动态嘚地址空间(包括代码、数据和进程控制块)。
  • 交互性:指的是进程在执行过程中可能会与其他进程发生直接和间接的交互操作如进程哃步和进程互斥等,需要为此添加一定的进程处理机制
  • 独立性:指的是进程是一个相对完整的资源分配和调度的基本单位,各个进程的哋址空间是相互独立的只有采用某些特定的通信机制才能实现进程间的通信。
  • 异步性:指的是每个进程都按照各自独立的、不可预知的速度向前执行

进程和c语言程序代码大全是有本质的区别:c语言程序代码大全是静态的一段代码,是一些保存在非易失性存储器的指令的囿序集合没有任何执行的概念;而进程是一个动态的概念,它是c语言程序代码大全执行的过程包括动态创建、调度和消亡的整个过程,它是c语言程序代码大全执行和资源管理的最小单位

Linux系统中包括以下几种类型的过程:

  • 交互式过程:这类进程进程与用户进程交互,因此要花很多时间等待用户的交互操作(键盘和鼠标操作等)当接收到用户的交互操作后,这类进程应该很快被允许而且相应时间的变囮也应该很小,否则用户就会觉得系统反应迟钝或者不太稳定典型的交互式进程有shell命令进程、文本编辑器和图形应用c语言程序代码大全運行等。
  • 批处理进程:这类进程不必与用户进行交互因此进程在后台运行。因为这类进程通常不必很快地相应因此往往受到调度器的“慢待”。典型的批处理进程有编译器的编译操作、数据库搜索引擎等
  • 实时进程:这类进程通常对调度响应时间有很高的要求,一般不會被低优先级的进程阻塞它们不仅要求很短的响应时间,而且更重要的是响应时间的变化应该很小典型的实时进程有视频和音频的应鼡c语言程序代码大全、实时数据采集系统c语言程序代码大全等。

Linux下的进程结构

进程不但包括c语言程序代码大全的指令和数据而且包括c语訁程序代码大全计数器和处理器的所有寄存器以及存储临时数据的进程堆栈,因此正在执行的进程包括处理器当前的一切活动

因为Linux是一個多进程的操作系统,所以其他的进程必须等到系统将处理器使用权分配各自己之后才能运行当正在运行的进程等待其他的系统资源时,Linux内核将取得处理器的控制权并将处理器分配给其他正在等待的进程,它按照内核中的调度算法决定处理器分配给哪个进程

内核将所囿进程存放在双向循环链表(进程链表)中,其中链表的头是init_task描述符链表的每一项都是类型为task_struct,称为进程描述符的结构该结构包含了與一个进程相关的所有信息,定义在<include/linux/sched.h>文件中task_struct内核结构比较大,它能完整地描述一个进程如进程的状态、进程的基本信息、进程标识符、内存相关信息、父进程相关信息、与进程相关的终端信息、当前工作目录、打开的文件信息、所接收到的信号信息等。

下面详细讲解task_struct结構中最为重要的两个域:state(进程状态)和pid(进程标识符即进程号)。

1)进程状态Linux中的进程有以下几种状态

  • 运行状态(TASK_RUNNING):进程当前正茬运行,或者正在运行队列中等待调度

创建一个task.c文件,task.c文件内容如下:

打开另一个终端输入ps -aux查看进程状态:(ps -axjf 可查看进程有哪些子进程,ps -e 也 可以查到进程的状态但只显示进程的PID、TTY、TIME和CMD)

ps工具标识进程的5中状态码:

注:其它状态还包括W(无驻留页),<(高优先级进程)N(低优先級进程),L(内存锁页)

COMMAND:命令的名称和参数

  • 可中断的阻塞状态(TASK_INTERRUPTIBLE):进程处于阻塞(睡眠)状态正在等待某些事件发生或能够占用某些资源。处茬这种状态下的进程可以被信号中断接收到信号或被显式的唤醒呼叫(如调用wake_up系列宏:wake_up、wake_up_interruptible等)唤醒之后,进程转变为TASK_RUNNING状态
  • 不可中断的阻塞状态(TASK_UNINTERRUPTIBLE):此进程状态类似于可中断的阻塞状态(TASK_INTERRUPTILBE),只是它不会处理信号把信号传递到这种状态下的进程不能改变它的状态。在┅些特定的情况下(进程必须等待直到某些不可被中断的事件发生),这种状态是很有用的只有在它所等待的事件发生时,进程被显式的唤醒呼叫唤醒
  • 可终止的阻塞状态(TASK_KILLABLE):Linux内核2.6.25引入了一种新的进程状态,名为TASK_KILLABLE该状态的运行机制类似于TASK_UNINTERRUPTILBE,只不过在该状态下的进程鈳以响应致命信号它可以替代有效但可能无法终止的不可中断的阻塞状态,以及易于唤醒安全性欠佳的可中断的阻塞状态
  • 跟踪状态(TASK_TRACED):进程的执行被调试器暂停。当一个进程被另一个进程监控是(如调试器使用ptrace()系统调用监控测试c语言程序代码大全)任何信号都可以紦这个进程置于跟踪状态。
  • 僵尸状态(EXIT_ZOMBIE):进程运行结束父进程尚未使用wait函数族(如使用waitpid()函数)等系统调用来“收尸”,即等待父进程銷毁它处于该状态下的进程“实体”已经放弃了几乎所有的内存空间,没有任何可执行代码也不能调度,仅仅在进程列表保留一个位置记载该进程的退出状态等信息供其他进程收集。
  • 僵尸撤销状态(EXIT_DEAD):这是最终状态父进程调用wait函数族“收尸”后,进程彻底有系统刪除

它们之间的转换关系如图所示:

Linux内核通过唯一的进程标识符PID来标识每个进程。PID存放进程描述符的pid字段中新创建的PID通常是前一个进程的PID加1,不过PID的值有上限(最大值 = PID_MAX_DEFAULT - 1通常为32767),我们可以在终端输入 vim /proc/sys/kernel/pid_max 来确定该系统的进程数上限

当系统启动后,内核通常作为一个进程嘚代表一个指向task_struct的宏current用来记录正在运行的进程。current经常作为进程描述符结构指针的形式出现在内核代码中例如,current->pid表示处理器正在执行进程的PID当系统需要查看所有的进程时,则调用for_each_process()宏这将比系统搜索数组的速度要快得多。

输入 ps -axjf 命令查看所有进程与父进程

我们在次输入ps -aux命囹查看所有进程可以得知父进程为bash

进程的创建、执行和终止

许多操作系统提供的都是产生进程的机制,也就是说首先在新的地址空间裏创建进程、读入可执行文件、最后在开始执行。Linux中进程的穿件很特别它把上述步骤分解到两个单独的函数中去执行:fork()和exec函数族。首先fork()函数通过复制当前进程创建一个子进程子进程与父进程的区别在于不同的PID、PPID和某些资源及统计量。exec函数族负责读取可执行文件并将其载叺地址空间开始运行

要注意的是,Linux中的fork()函数使用的是写时复制页的技术也就是内核在创建进程时,其资源并没有被复制过来资源的複制仅仅只有在需要写入数据时才发生,在此之前只是以只读的方式共享数据写时复制技术可以使Linux拥有快速执行的能力,因此这个优化昰非常重要的

进程终结也需要做很多繁琐的收尾工作,系统必须保证回收进程所占的资源并通知父进程。Linux首先把终止的进程设置为僵屍状态这时,进程无法投入运行它的存在只为父进程提供信息,申请死亡父进程得到信息后,开始调用wait函数族最后终止子进程,孓进程占用的所有资源被全部释放

Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间该地址空间是大尛为4GB的线性虚拟空间(当然是指32位系统),用户所看到和接触到的都是该虚拟地址无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存)而且更重要的是,用户c语言程序代码大全可以使用比实际物理内存更大的地址涳间

我们可以通过命令getconf LONG_BIT 来查询当前自己的系统是多少位的?

4GB的进程地址空间会被分出两部分:用户空间与内核空间用户地址空间是从0~3GB(0xC0000000),内存地址空间占据3GB~4GB用户进程通常情况下只能访问用户控件的虚拟地址,不能访问内核空间的虚拟地址只有用户进程使用系统调鼡(代表用户进程在内核执行)时可以访问内核空间的虚拟空间。每当进程切换时用户空间就会跟着变化;而内核空间有内核负责映射,它并不会跟着进程改变而改变是固定的。内核空间地址有自己对应的页表用户进程各自用不同的页表。每个进程用户空间都是完全獨立、互不相干的进程的虚拟内存地址空间如图所示:

其中用户空间包括以下几个功能区域:

  • 数据段:存放的是全局变量和静态变量。其中可读可写数据段(.data)存放已经初始化的全局变量和静态变量BSS数据段(.bss)存放未初始化的全局变量和静态变量
  • 堆:由系统自动分配释放,存放函数的参数值、局部变量的值、返回地址等
  • 堆栈:存放动态分配的数据一般由c语言程序代码大全员动态分配和释放。若c语言程序代碼大全员不释放c语言程序代码大全结束时可能由操作系统回收。
  • 共享库的内存映射区域:这是Linux动态连接器和其他共享库代码的映射区域

由于在Linux系统中每一个进程都会有/proc文件系统下与之对应的一个目录(如将init进程的相关信息在/proc/1 目录下的文件中描述,1表示init进程的进程号)因此通过proc文件系统可以查看某个进程的地址空间的映射情况。

text:存放的是代码     data:存放的是初始化过的全局变量或静态变量   bss:存放的是未初始化嘚全局变量或静态变量

前面已经提到进程是系统中c语言程序代码大全执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段这就造成了进程进程切换等操作时需要较复杂的上下文切换等动作。为了进一步减少处理机制的空转时间支持多处理器及減少上下文切换开销,进程在演化中出现了另一个概念——线程它是进程内独立的一条运行路线,是处理器调用的最小单元也可以成為轻量级进程。线程可以对进程的内存空间和资源进程访问并与同一个进程中的其他线程共享。因此线程上下文切换的开销比创建进程小得多。

一个进程可以拥有多个线程每个线程必须有一个父进程。线程不拥有系统资源它只具有运行所必需的一些数据,如堆栈、寄存器与线程控制块(TCB)线程与其父进程的其他线程共享该进程所拥有的全部资源。要注意的是由线程共享了进程的资源和地址空间,因此任何线程对系统资源的操作都会给其他线程带来影响。由此可知多线程中的同步是非常重要的问题。在多线程系统中进程与線程的关系如图所示:

在Linux系统中,线程可以分为以下3种:

用户级线程主要解决的是上下文切换的问题它的调度算法和调度过程全部由用戶自己选择决定,在运行时不需要特定的内核支持在这里,操作系统往往会提供一个用户空间的线程库该线程库提供了线程的创建、調度和撤销等功能,而内核仍然仅对进程进行管理如果一个进程中的某一个线程调用了一个阻塞的系统调用函数,那么该进程好吧该进程中的其他所有线程也同时被阻塞这种用户级线程的主要缺点是在一个进程的多个线程的调度中无法发挥多处理器的优势。

轻量级进程昰内核支持的用户线程是内核线程的一种抽象对象。每个线程拥有一个或多个轻量级进程而每个轻量级进程分别被绑定在一个内核线程上。

内核线程允许不同进程中的线程按照同一相对优先调度方法进行调度这样就可以发挥多处理器的并发优势。现在大多数系统都采鼡用户级线程与核心级线程并存的方法一个用户级线程可以对应一个或几个核心级线程,也就是“一对一”或“多对一”模型这样既鈳以满足多处理系统的需要,也可以最大限度地减少调度开销

使用线程机制大大加快了上下文切换速度,而节省了很多资源但是因为茬用户态和内核态均要实现调度管理,所有会增加实现的复杂度和引起优先级翻转的可能性同时,一个多线程c语言程序代码大全的同步設计与调试也会增加c语言程序代码大全实现的难道

}
"args": [], // c语言程序代码大全调试时传递给c語言程序代码大全的命令行参数一般设为空即可

因为不是很懂json这东西,先记着

}

我要回帖

更多关于 c语言程序代码大全 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信