Linux多任务编程(一) 任务、进程、线程

Linux下多任务介绍

首先,先简单的介绍一下什么叫多任务系统?任务、进程、线程分别是什么? 它们之间的区别是什么?,从而可以宏观的了解一下这三者,然后再针对每一个仔细的讲解。

什么叫 多任务系统?多任务系统指可以同一时间内运行多个应用程序,每个应用程序被称作一个任务。

任务 定义:任务是一个逻辑概念,指由一个软件完成的任务,或者是一系列共同达到某一目的的操作。

进程 定义:进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度 的最小单元。

线程定义:线程是进程内独立的一条运行路线,是处理器调度的最小单元,也可以成为轻 量级进程。

看了定义,有点晕,还是通俗的说一下它们的区别吧。①通常一个任务是一个程序的一次 执行,一个任务包含一个或多个完成独立功能的子任务,这个独立的子任务就是进程或线程。②一个进程可以 拥有多个线程,每个线程必须有一个父进程。

任务

任务是一个逻辑概念,指由一个软件完成的 任务,或者是一系列共同达到某一目的的操作。通常一个任务是一个程序的一次执行,一个任务包含一个或多 个完成独立功能的子任务,这个独立的子任务就是进程或线程。例如,一个杀毒软件的一次运行是一个任务, 目的是从各种病毒的侵害中保护计算机系统,这个任务包含多个独立功能的子任务(进程或线程),包括实时监 控功能、定时查杀功能、防火墙功能及用户交互功能等。任务、进程和线程之间的关系如图1所示

进 程

进程的基本概念

进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它 是系统进行资源分配和调度的基本单元。一次任务的运行可以并发激活多个进程,这些进程相互合作来完成该 任务的一个最终目标。

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

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

Linux下的进程结构

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

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

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

时间: 2024-10-02 10:42:42

Linux多任务编程(一) 任务、进程、线程的相关文章

线程-求救高手。。linux c编程,用进程池实现shell命令cp

问题描述 求救高手..linux c编程,用进程池实现shell命令cp 现在状态是,复制单个文件没问题,复制一个目录且目录里没有子目录也没问题. 如果目录里有一个子目录,这样貌似没有问题,但是如果有多个子目录,就会出现各种问题. 弄了一个晚上了,各种惆怅,求救各位老大帮忙看看. 本人新手,代码比较乱真的非常抱歉. //code start #include #include #include #include #include #include #include #include #inclu

Linux多任务编程(二) fork()函数及其基础实验

fork()函数 在 Linux 中创建一个新进程的唯一方法是使用fork()函数.fork()函数是 Linux 系统中 一个非常重要的函数,和咱们以前遇到过的函数由一些区别,因为它看起来执行一次却返回两个值,这又作何 解释?不着急,慢慢看. 函数说明 fork()函数用于从已存在的一个进程中创建一个新的进程 ,新进程称为子进程,而原进程称为父进程.使用fork()函数得到的子进程是父进程的一个复制品,它从父进 程处继承了整个进程的地址空间,包括进程上下文.代码段.进程堆栈.内存信息.打开的文

Linux多任务编程(七) Linux守护进程及其基础实验

守护进程概述 守护进程,又叫daemon进程(不知怎的,我突然想起来吸血鬼日记中的达蒙了,很好 看的美剧),是Linux中的后台服务进程.他是一个生存期较长的进程,通常独立于控制终端并且周期性地执行 某种任务或者等待处理某些发生的事件.守护进程常常在系统引导载入时启动,在系统关闭时终止.Linux有 很多系统哦服务,大多数服务都是通过守护进程实现的.同时,守护进程还能完成许多系统任务,例如,作业 规划进程cronf.打印进程lqd等(这里的结尾字母 d 就是 daemon的意思). 在Linux

Linux多任务编程(六) 编写多进程程序及其代码

实验目的 通过编写多进程程序,熟练掌握fork().exec().wait()和waitpid()等函数的使用,进一步 理解在Linux中多进程编程的步骤. 实验内容 该实验有3个进程,其中一个为父进程,其余两个 是该父进程创建的子进程,其中一个子进程运行"ls -l"指令,另一个子进程在暂停5s后异常退出.父进程 先用阻塞方式等待第一个进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第2个子进程结 束的消息后,父进程就返回. 实验步骤 该实验的流程图如下 实验源代码 先看

Linux多任务编程(四) exit()函数及其基础实验

exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止 进程则使用exit()和_exit()函数.当进程执行到exit()或_exit()函数时,进程会无条件的停止剩下的所有操 作,清除各种数据结构,并终止本进程的运行.但是,这两个函数还是有区别的,其调用过程如图1所示: 从图1可以看出,_exit()函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其 在内核中的各种数据结构:而exit()函数则在这些基础上做了一些包装,在执行

linux多线程编程详解教程(线程通过信号量实现通信代码)_linux shell

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

Linux多任务编程(五) wait()、waitpid()函数及其基础实验

wait()和waitpid() 函数说明 wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到 一个子进程结束或者该进程接收到了一个指定的信号为止.如果该父进程没有子进程或者它的子进程已经结束 ,则wait()函数就会立即返回. waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子 进程(它可以指定需要等待终止的子进程),它还有若干选项,如可提供一个非阻塞版本的 wait()功能,也 能支持作业控制.实际上,wait()函数只是 waitpid()函数

Linux多任务编程(三) exec函数族及其基础实验

exec函数族 函数族说明 fork() 函数用于创建一个新的子进程,该子进程几乎复制了父进程的全 部内容,但是,这个新创建的子进程如何执行呢?exec 函数族就提供了一个在进程中启动另一个程序执行的 方法.它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段.代码段和堆栈 段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了.另外,这里的可执行文件 既可以是二进制文件,也可以是Linux下任何可执行的脚本文件. 在 Linux 中使用exec函数族主

linux多线程编程中如何等待过个线程退出

问题描述 linux多线程编程中如何等待过个线程退出 linux多线程编程中,如果线程A创建了线程B,我知道用pthread__ join可以令线程A 阻塞然后等待线程B的退出.如果线程A创建了三个线程B,C,D,执行完的先后顺序不知.想让A必须等待三个线程都退出后再退出,应该怎么做? 连用pthread__join三次吗???但是第一次用了pthread__join后,A不就阻塞了吗? 解决方案 多线程编程(一):线程创建和退出Linux多线程编程(创建线程)Linux多线程编程(创建线程)