内核功用:进程管理、内存管理、文件系统、网络功能、驱动程序、安全功能等
一、程序和进程的关系
1、程序
- 保存在硬盘、光盘等介质中的可执行代码和数据
- 静态保存的代码
2、进程
- 在CPU及内存中运行的程序代码
- 动态执行的代码
- 父、子进程
- 每个程序可以创建一个或多个进程
3、进程的 特征
-
动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
-
并发性:任何进程都可以同其他进程一起并发执行;
-
独立性:进程是系统进行资源分配和调度的一个独立单位;
-
结构性:进程由程序、数据和进程控制块三部分组成。
2、进程、线程和协程
1.进程
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。
进程一般由程序、数据集合和进程控制块三部分组成。
2.线程
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间。
3.协程
是一种基于线程之上,但又比线程更加轻量级的存在,这种由程序员自己写程序来
管理的轻量级线程叫做『用户空间线程』,具有对内核来说不可见的特性。
4.进程与线程的区别
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
- 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
5.如何确定是单线程还是多线程
- 需要去/proc找到程序进程号,然后使用cat /proc/该程序的pid号文件夹/status,可以查看该进程的线程数量
- 或grep -i threads /proc/该程序的pid号文件夹/status,可以查看该进程的线程数量
- 或 prtstat 该程序的pid号,可以查看该进程的线程数量
- 或prtstat 该进程的pid号 | grep -i threads,可以查看该进程的线程数量
二、进程状态
1、进程的基本状态
-
创建状态:进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
-
就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
-
执行状态:进程处于就绪状态被调度后,进程进入执行状态
-
阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
-
终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
2、状态之间转换6种情况
①运行---->就绪
1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;
2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,
②就绪---->运行
运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
③运行------阻塞
正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如 发生了I/O请求。
④阻塞------就绪
进程所等待的事件已经发生,就进入就绪队列
⑤阻塞-----运行
即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
⑥就绪------阻塞
就绪态根本就没有执行,谈不上进入阻塞态
3、进程更多的状态
-
运行态:running
-
就绪态:ready
-
睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
-
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
-
僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态 的子进程
当一个进程结束的时候,父进程会回收子进程的硬件资源;如果子进程出现意外关闭,父进程无法收回资源,这样只回收了父进程,子进程资源无法回收就是僵尸进程。
示例:
[root@localhost ~]#bash
[root@localhost ~]#echo $BASHPID
1809
[root@localhost ~]#echo $PPID
1436
#将父进程设为停止态
[root@localhost ~]#kill -19 1436
#杀死子进程,使其进入僵尸态
[root@localhost ~]#kill -9 1809
[root@localhost ~]#ps aux #可以看到上面图示的结果,STAT为Z,表示为僵尸态
#方法1:恢复父进程
[root@localhost ~]#kill -18 1436
#方法2:杀死父进程
[root@localhost ~]#kill -9 1436
#再次观察,可以僵尸态的进程不存在了
[root@localhost ~]#ps aux
4、进程之间的通讯
同一主机:
pipe 管道
单向传输 cmd1 | cmd 2
socket 套接字文件
双工通信
Memory-maped file 文件映射将文件中的一段数据映射到物理内存,多个进程共享这片内存
shm shared memory 共享内存
signal 信号
Lock 对资源上锁如果资源已被某进程锁住,则其它进程想修改甚至读取这些资源,都将被阻塞,直到锁被打开
semaphore 信号量,一种计数器
不同主机:socket=IP和端口号
RPC remote procedure call 远程调用
5、进程的优先级 os
进程优先级调整
- 静态优先级:100-139
-
进程默认启动时的nice值为0,优先级为120
-
只有根用户才能降低nice值(提高优先性)
6、进程分类
操作系统分类:
-
协作式多任务:早期 windows 系统使用,即一个任务得到了 CPU 时间,除非它自己放弃使用CPU ,否则将完全霸占 CPU ,所以任务之间需要协作——使用一段时间的 CPU ,主动放弃使用
-
抢占式多任务:Linux内核,CPU的总控制权在操作系统手中,操作系统会轮流询问每一个任务是否需要使用 CPU ,需要使用的话就让它用,不过在一定时间后,操作系统会剥夺当前任务的 CPU 使用权,把它排在询问队列的最后,再去询问下一个任务
进程类型:
-
守护进程: daemon,在系统引导过程中启动的进程,和终端无关进程
-
前台进程:跟终端相关,通过终端启动的进程
注意:两者可以相互转化
7、进程资源使用分类:
-
CPU-Bound: