基本概念
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度运行的基本单位。
描述进程PCB
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
- Linux操作系统下的PCB是: task_struct
task_struct-PCB的一种
- 在Linux中描述进程的结构体叫做task_struct
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
task_struct内容分类
- 标识符:描述本进程的唯一标识符,用来区别其他进程
- 状态:任务状态,退出代码,退出信号等
- 优先级:相对与其它进程的优先级
- 程序计数器:程序中即将被执行的下一条指令的地址
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子]。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
进程的重要特征
动态特征:进程对应于程序的运行,动态产生、消亡,在其生命周期中进程也是动态的。
并发特征:任何进程都可以同其他进程一起向前推进。
独立特征:进程是相对完整的调度单位,可以获得CPU,参与并发执行。
交往特征:一个进程在执行过程中可与其他进程产生直接或间接关系。
异步特征:每个进程都以相对独立、不可预知的速度向前推进。
结构特征:每个进程都有一个PCB作为他的数据结构。
进程最基本的特征是并发,异步和共享特征。
进程状态
- R运行状态(running):并不意味着一定在运行中,它表明进程要么是在运行中要么在运行队列里
- S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候叫做可中断睡眠)
- D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。
- T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。
- X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态
进程转状态查看
ps aux / ps axj 命令 //查看某个进程的pid
进程的状态与转换
-
进程的三种基本状态
a. 运行状态:获得CPU的进程处于此状态,对应的程序在CPU上运行着。 b. 阻塞状态:为了等待某个外部事件的发生(如等待I/O操作的完成,等待另一个进程发来消息),暂时无法运行。也成为等待状态。 c. 就绪状态:具备了一切运行需要的条件,由于其他进程占用CPU而暂时无法运行。
-
进程状态转换
a. 运行状态 ===> 阻塞状态:例如正在运行的进程提出I/O请求,由运行状态转化为阻塞状态。 b. 阻塞状态 ===> 就绪状态:例如I/O操作完成之后,由阻塞状态转化为就绪状态。 c. 就绪状态 ===> 运行状态:例如就绪状态的进程被进程调度程序选中,分配到CPU中运行,由就绪状态转化为运行状态。 d. 运行状态 ===> 就绪状态:处于运行状态的进程的时间片用完,不得不让出uCPU,由运行状态转化为就绪状态。
-
进程的类型
a. 系统进程:操作系统用来管理资源的进程,当系统进程处于运行态时,CPU处于管态,系统之间的关系由操作系统负责。 b. 用户进程:操作系统可以独立执行的的用户程序段,当用户进程处于运行态时,CPU处于目态,用户进程之间的关系由用户负责。
通过系统调用创建进程-fork初识
- 运行 man fork 认识fork
- fork 有两个返回值
- 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
- fork 之后通常要用 if 进行分流