之前对ucos有所了解,所以初步接触linux进程线程感觉还是很熟悉的,但具体的还是先沉下心来慢慢去学习。由于该部分非常重要,本章节分为四个部分:1、基本概念的介绍;2、进程编程;3、进程间的通讯;4、多线程编程。话不多说,直接入手。
1、任务
任务是一个逻辑概念,指由一个软件完成的活动,或者是为实现某个目的的一系列操作。通常一个任务是一个程序的一次运行,一个任务包含一个或多个完成独立功能的子任务,这个独立的子任务是进程或者是线程。例如,一个杀毒软件的一次运行是一个任务,目的是在各种病毒的侵害中保护计算机系统,这个任务包含多个独立功能的子任务(进程或线程),包括实时监控功能、定时查杀功能、防火墙功能以及用户交互功能等。任务、进程和线程之间的关系如图所示。
即任务 > 子任务 > 进程 > 线程
2 、进程
2.1 基本概念
进程是指一个具有独立功能的程序在某个数据集合上的一次动态执行过程,它是操作系统进行资源分配和调度的基本单元。一次任务的运行可以激活多个进程,这些进程相互合作来完成该任务的一个最终目标。
2.2 进程特性
进程的特性并发性、动态性、交互性和独立性
2.3 进程的分类
交互式进程:这类进程经常与用户进行交互,需要等待用户的输入(键盘和鼠标操作等)。当接收到用户的输入之后,这类进程能够立刻响应。典型的交互式进程有 shell 命令进程、文本编辑器和图形应用程序运行等。
批处理进程:这类进程不必与用户进行交互,因此通常在后台运行。因为这类进程通常不必很快地响应,因此往往不会优先调度。典型的批处理进程是编译器的编译操作、数据库搜索引擎等。
守护进程:这类进程一直在后台运行,和任何终端都不关联。通常系统启动时开始执行,系统关闭时才结束。很多系统进程(各种服务)都是以守护进程的形式存在。
2.4 进程结构
指令和数据,而且包括程序计数器和处理器的所有寄存器以及存储临时数据的进程堆栈。
因为 Linux 是一个多任务的操作系统,所以其他的进程必须等到操作系统将处理器使用权分配给自己之后才能运行。当正在运行的进程需要等待其他的系统资源时, Linux 内核将取得处理器的控制权,按照某种调度算法将处理器分配给某个正在等待执行的进程。
内核将所有进程存放在双向循环链表(进程链表)中,链表的每一项都是 task_struct,称 为 进 程 控 制 块 的 结 构 。 该 结 构 包 含 了 与 一 个 进 程 相 关 的 所 有 信 息 , 在<include/Linux /sched.h>文件中定义。 task_struct 内核结构比较大,它能完整地描述一个进程,如进程的状态、进程的基本信息、进程标识符、内存相关信息、父进程相关信息、与进程相关的终端信息、当前工作目录、打开的文件信息、所接收的信号信息等。
2.5 进程状态(需背记)
运行状态(TASK_RUNNING):进程当前正在运行,或者正在运行队列中等待调度。
可中断的阻塞状态(TASK_INTERRUPTIBLE):进程处于阻塞(睡眠)状态,正在等待某些事件发生或能够占用某些资源。
不可中断的阻塞状态(TASK_UNINTERRUPTIBLE):此进程状态类似于可中断的阻塞状态(TASK_INTERRUPTIBLE),只是它不会处理信号,把信号传递到这种状态下的进程不能改变它的状态。
暂停状态(TASK_STOPPED):进程的执行被暂停,当进程收到 SIGSTOP、 SIGTSTP、SIGTTIN、 SIGTTOU 等信号,就会进入暂停状态。
僵死状态(EXIT_ZOMBIE):子进程运行结束,父进程未退出,并且未使用 wait函数族(如使用 waitpid()函数)等系统调用来回收子进程的退出状态。
消亡状态(EXIT_DEAD):这是最终状态,父进程调用 wait 函数族回收之后,子进程彻底由系统删除,不可见。
2.6 进程标识符
Linux 内核通过唯一的进程标识符 PID 来标识每个进程。 PID 存放在 task_struct 的 pid 字段中。
在 Linux 中获得当前进程的进程号(PID)和父进程号(PPID)的系统调用函数分别为getpid()和 getppid()。
2.7 进程的创建、执行和终止
Linux 中进程的创建很特别,它把上述步骤分解到两个单独的函数中执行: fork()和 exec 函数族。首先, fork()通过复制当前进程创建一个子进程,子进程与父进程的区别仅仅在于不同的 PID、 PPID 和某些资源及统计量。 exec 函数族负责读取可执行文件并将其载入地址空间开始运行。
进程终止也需要做很多烦琐的收尾工作,系统必须保证进程所占用的资源回收,并通知父进程。 Linux 首先把终止的进程设置为僵死状态。这个时候,进程已经无法运行,它的存在只为父进程提供信息。父进程在某个时间调用 wait 函数族,回收子进程的退出状态,随后子进程占用的所有资源被释放
3 总结
其实现在还不是很清楚线程的概念,但是进程的任务切换非常的像ucos操作系统的切换。进行由fork函数创建后就被处于就绪态中等待CPU的执行。等CPU的时间片运行值该进程时便处于运行态。此时运行态的进程有4个选择,1、等待时间标志组、信号量等,即进入到等待态中。2、被中断打断,进入到中断服务态,。3、时间片到了,重新返回到就绪链表中。4、结束,进程被销毁。