Linux进程的学习的笔记

进程的概念

 进程是一个可并发执行的程序在一个数据集上的一次运行。简单来说,进程就是程序的一次运行程序。

程序与进程的概念既是相互关联又相互区别。程序是进程的一个组成部分,是进程的执行文本。而进程是程序的执行过程。程序和进程有以下的关系:

  • 一个进程可以顺序执行多个程序。
  • 一个程序可以对应多个进程。

进程的特性

 进程具有以下的几个特性:

  • 动态性:进程由“创建”而产生,由“撤销”而消亡,因“调度”而运行,因“等待”而停顿。
  • 并发性:在同一个时间内有多个进程在系统中活动。它们宏观上是并发运行的,而微观上是在交替 运行的。
  • 独立性:进程是可以独立运行的基本单位,是由操作系统分配资源和调度管理的基本对象。因此,每个进程都独立地拥有各种必要的资源,独立地占有cpu。
  • 异步性:每个进程都是独立地执行,各自按照不可预知的速度向前推进。进程间的协调运行由操作系统负责。

进程的运行状态

 进程有3个基本的状态:

  • 就绪态:进程已经分配到了除cpu之外的所有资源,这时的进程状态称为就绪状态。处于就绪状态的进程,一旦获得cpu便可立即执行。系统中通常会有多个进程处于就绪状态,它们排成一个就绪队列。
  • 运行态:进程已经获得cpu,正在运行,这时的进程状态称为运行态。在单cpu系统中,任何时刻只能有一个进程处于运行态。
  • 等待态:进程因某种资源不能满足,或希望的某事件尚未发生而暂停执行时,则称它处于等待态。系统中常常会有多个进程处于等待态,它们安按等待的事件分类,排成多个等待队列。

进程的基本状态

 进程状态转换状态图:


image.png

引起状态转换的原因如下:
(1)运行态 →等待态:正在执行的进程因为等待某件事而无法执行下去,例如,进程申请某种资源,而资源恰好被其他进程占用,则该进程将交出cpu,进入等待状态。
(2)等待态→就绪态:处于等待状态的进程,当其申请的资源得到满足,则系统将分配资源给它,并将其状态变为就绪态。
(3)运行态→就绪态:正在执行的进程的时间片用完了,或者有更高优先级的进程到来,系统会暂停该进程的运行,使其进入就绪态,然后调度其他进程运行。
(4)就绪态→运行态:处于就绪状态的进程,当进程调度程序选中后,即进入cpu运行。此时该进程的状态变为运行态。

Linux系统中的进程

Linux进程的状态:

 Linux系统的进程状态与上面说的进程转态会有一点区别,下面我们来看一下Linux系统的进程转态:
 Linux系统中的有5中基本状态:运行,就绪,可中断睡眠,不可中断睡眠,暂停和僵死。状态转换图如下:


image.png

 (1)可执行态:可执行态实际包含了上述基本状态的运行和就绪两种状态。处于可执行态的线程均已具备运行条件。它们或在运行,或准备运行。
 (2)睡眠态:即等待态。进程在等待某个时间或某个资源。睡眠态又细分为可中断的和不可中断两种。它们的区别在于,在睡眠过程中,不可中断状态的进程会忽略信号,而处于可中断状态的进程如果收到信号会被唤醒而进入可执行状态,待处理完信号后再次进入睡眠状态。
 (3)暂停态:处于暂停态的进程是由运行态转换而来,等待某种特殊处理,当进程收到一个暂停信号时则进入暂停态,等待恢复运行的信号。
 (4)僵死态:进程运行结束或因某些原因被终止时,它将释放除PCB外的所有资源。这种占有PCB但已经无法运行的进程就处于僵死态。

查看进程消息

 查看进程命令是ps命令:

格式 ps [选项]
-e 显示所有进程
-t tty 显示终端tty上的进程
-f 以全格式显示
-o 以用户定义的格式显示
a 显示所有终端上的所有进程。
u 以面向用户的格式显示
x 显示所有不控制终端的进程
-C cmd 显示命令名为cmd的进程。
n 显示PID为n的进程。

Linux进程间的通信

  • (1) 管道及有名管道:管道可用于具有亲缘关系进程间的通信,有名管道客服了管道没有名字的限制,因此,除具有管道所有具有的功能外,它还允许无系的进程间的通信。
  • (2)信号是比较复杂的通信方式,用于通知接受进程某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction。
  • (3)报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读取队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • (4)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,达到进程间的同步以及互斥。
  • (5)信号量:主要作为进程间以及同一进程不同线程之间的同步手段。
  • (6) 套接字:更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但是现在一般可以移植到其他的Unix系统上:Linux和System V的变种都支持套接字。

进程间的通信详情可参考Linux进程间通信

进程空间划分

一个进程空间分为用户空间和内核空间,Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。

内核空间和用户空间的区别
  • 进程之间的用户空间的数据是不可共享的,所以用户空间=不可共享空间
  • 进程之间的内核空间的数据是可共享的,所以内核空间=共享空间。

 进程内用户空间和内核空间进行交互需要通过系统的调用:主要通过以下两个函数:

1.copy_from_user():将用户空间的数据拷贝到内核空间。
2.copy_to_user():将内核空间的数据拷贝到用户空间。

示意图:


image.png

你可能感兴趣的:(Linux进程的学习的笔记)