说明:
本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
QQ 群 号:513683159 【相互学习】
内容来源:
《Linux系统编程》、《Linux网络编程》、《Linux内核设计与实现》、《Unix环境高级编程》
目录:
1.进程引入的原因:
多用户、多任务操作系统环境下,必须能够实现资源共享和程序并发执行,从而使程序的执行出现并行、动态和相互制约的新特征,为反应这些新特征而引入进程概念。
2.程序与进程的概念:
程序(program):若干函数组成的可执行文件,是一个静态的文件,存放在磁盘上。
进程(process):[ 有时也叫任务(task) ]
特定程序的一个实例,可执行文件的具体实现,正在执行的程序的映像。
源程序经过编译器编译得到可执行程序,交由操作系统递交给处理器运行的状态称为进程。
操作系统会分配资源为进程运行提供环境,属于系统管理的实体。
(资源:内存、CPU时间片、打开的文件、挂起的信号、内核内部数据、全局变量等)
①操作系统执行的基本单位。
②(硬件提供)系统资源分配的基本单元。
③顺序执行其实例化程序的基本单位。
④具有一定的生命周期
程序与进程的关系:一个进程对应一个程序,一个程序可对应多个进程。
总结:程序不是进程,进程是处于执行状态的程序及相关资源的总称
3.进程的组成:
1️⃣程序段:存放程序代码。
2️⃣数据段:运行过程中产生的各种数据。
①用户栈区(供用户程序使用的信息区)
②用户数据区(包括用户工作数据和非可重入的程序段);
③系统数据区(包括系统变量和对换信息)。
3️⃣进程控制块(PCB):
①进程描述信息:PID、UID
②进程控制和管理信息:CPU、磁盘等使用情况统计,进程当前状态。
③资源分配清单:文件、内存区域、I/O设备
④处理及相关信息。
4.独立的进程对象——标识符:
(1)PID的概念:
PID = Process ID = 进程标识符
系统给每个进程定义了一个标识该进程的32位无符号整数。
(2)PID的特点:
①保证唯一:任何时刻,一个标识符所代表的进程是唯一的。
②重复利用:当某一进程终止后,其标识符可重新用作另一进程的标识符(短期内不会)。【延迟重用算法】
③常规变化:新创建进程PID通常为前一进程PID+1.
④最大编号大小:为保持16位硬件平台的兼容,最大PID号:32767。
⑤调整最大编号:系统管理员可设置/proc/sys/kernel/pid_max
的值突破限制,可能会牺牲兼容性。
(3)两个重要的PID:
① 进程 0 - idle process - 空闲进程(调度进程/交换进程/系统进程):
在没有其他进程运行时,内核所运行的进程,并不执行任何程序,按一定的原则把处理机分配给进程使用。
② 进程 1 - init process - 初始化进程 :(所有孤儿进程的父进程)
<1> 内核运行的第一个进程(所有用户态进程的产生进程)。(进程树的根)
<2> UNIX 系统中进程的祖先,进程结构的最终控制者,决不会终止。
<3>该进程会寻找一个合适的init程序,如:/sbin/init
(最有可能),/etc/init
,/bin/init
,/bin/sh
。
<4>通常读与系统有关的初始文件(/etc/rc*
文件或/etc/inittab
文件或/etc/init.d
文件)
5.进程之间的关系(层次结构:进程树):
新进程的产生是由现有进程调用fork()
创建。
1.现有进程称为:父进程(parent process),
2.新产生进程称为:子进程(child process)。
3.若父进程产生多个子进程,子进程之间关系称为:兄弟进程(sibling process)。
PS:
①除第一个进程以外,所有进程均有父进程,且该关系存入进程的ppid中。
②每个进程都被用户和组所拥有,该从属关系用于实现访问控制。
③每个进程都是某进程组的一部分,简单表明与其他进程的关系。(子进程通常属于父进程所在的组)
可通过指令pstree
来查看进程树
6.进程的基本状态:
为充分利用资源,系统对进程区分了不同的状态,有以下五种状态:
1.新建(New)表示进程刚创建,还未加入可执行进程组中。
2.就绪(Ready)表示进程已准备好,只要分配到CPU就能够立即运行。
3.执行(Running)表示进程正在执行。
4.阻塞(Block)表示进程正在等待某一事件(I/O请求,申请缓存区失败受到阻塞)而不能执行。
5.退出(Exit)表示进程已结束,系统正回收资源。
/* Used in tsk->state: */
#define TASK_RUNNING 0x0000 (可运行状态)正在执行/在运行队列中等待执行(该进程可被调度执行)
#define TASK_INTERRUPTIBLE 0x0001 (等待状态 可中断/浅度睡眠 )正睡眠/被阻塞 等待条件达成投入运行(对信号/软中断响应)
#define TASK_UNINTERRUPTIBLE 0x0002 (等待状态 不可中断/深度睡眠)正睡眠/被阻塞 等待条件达成投入运行(不对信号响应)
#define __TASK_STOPPED 0x0004 (暂停状态)执行被暂停
#define __TASK_TRACED 0x0008 被其他进程跟踪的进程
/* Used in tsk->exit_state: */
#define EXIT_DEAD 0x0010
#define EXIT_ZOMBIE 0x0020 (僵死状态)已终止,但留有信息
#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD)
...
7.一些特殊进程名称:
①僵死进程(zombie):(目的:父进程可获取终止的子进程信息)
父进程未终止,子进程先终止,将终结的子进程设置为僵死进程。
僵死进程只保留最小的概要信息——一些保存着有用信息的内核数据结构。
作用:等待父进程查询自己信息,若父进程获取子进程信息,则子进程消失(彻底清除信息),否则保持僵死状态。
长时间存在的僵死进程被称作:②鬼魂进程(ghosts)
③孤儿进程:
父进程先于子进程终止,留下的子进程称作:孤儿进程。
存在问题:若孤儿进程结束则将会永远处于僵死状态。
解决方案:为孤儿进程找父进程(先在进程组中寻找,若没有则init进程作为父进程)
④守护进程(daemon):详细请点击:进程篇——守护进程
守护进程又叫精灵进程,是一种生存期较长的进程,用于执行日常事务活动。
常在系统自举时启动,仅在系统关闭时才终止,不与任何控制终端相关联(tty = ?),故在后台运行。
8.进程间通信(IPC):
详细请点击:进程篇——进程间通信(IPC)汇总
多个进程间进行相互沟通的一种方式,每个进程都有自己独立的内存空间,通过IPC实现数据共享。
进程间通信方式:
(1)管道(pipe):操作方式为文件的内存缓冲区。
(2)消息队列(Message Queue):内核地址空间中的内部链表。
(3)信号量数组(Semaphore Arrays):一种计数器,用来控制对多个进程共享的资源所进行的访问
(4)共享内存(Shared Memory Segments):多个进程之间共享内存区域。
9.进程组与会话:
1️⃣进程组
1.进程组是一个或多个进程的集合,通常与同一作业关联,可接收来自同一终端的各种信号。
2.每个进程组都可有一个组长进程,标识是:进程组ID = 进程ID
,组长进程可创建一个进程组,创建组中的进程,然后终止。
3.只要进程组中有一个进程存在,则进程组就存在。(与组长进程是否终结无关)
4.一个进程只能为自己或子进程设置进程组ID,子进程在调用exec()
后则不可改变进程组ID。
5.进程组API:
①pid_t getpgrp(void);
:获取调用进程的进程组ID
②pid_t getpgid(pid_t pid);
:获取进程pid
的进程组ID。若pid=0
则等同于①
③int setpgid(pid_t pid,pid_t pgid);
:加入现有的组或创建新进程组
2️⃣会话
1.会话是一个或多个进程组的集合。
2.会话API:
①pid_t setsid(void)
:创建一个新会话
②pid_t getsid(pid_t pid)
3️⃣会话与进程组的一些特性(控制终端):
1.一个会话可由一个控制终端
2.建立与控制终端连接的会话首进程被称为:控制进程。
3.一个会话中的几个进程组可被分成一个前台进程组以及一个或几个后台进程组。(若有控制终端则则为前台进程组)
4.若控制终端键入中断键(DELETE/Ctrl+C)或退出键(Ctrl+\)则会发给前台进程组中所有进程。
5.若控制终端检测到调制解调器(或网络)已断开,则将挂断信号发给控制进程(会话首进程)
6.相关API
①pid_t tcgetpgrp(int filedes);
:返回前台进程组的进程组ID
②int tcsetpgrp(int filedes,pid_t pgrpid)
:将前台进程组ID设置为pgrpid.
③pid_t tcgetsid(int filedes)
:获取会话首进程的进程组ID。
10.进程与线程的关系:
一个进程中可拥有至少一个线程。
编号 | 进程 | 线程 |
---|---|---|
1 | 资源分配最小单位 同一个进程的所有线程共享该进程所有资源 | 系统调度最小单位 CPU真正运行的是线程 |
2 | 独立的堆栈空间和数据段 独立的地址空间 | 独立的堆栈空间,共享进程代码段和资源 无独立的地址空间,共享所属进程数据空间地址 |
3 | 进程间共享信息共享和通信较难 | 线程间共享信息共享和通信较难 |
4 | 创建和销毁代价大,安全性高 | 更节俭,开销小,切换速度快,效率高。 |