进程概念
系统编程:进程概念-》进程控制-》基础io-》进程间通信-》多线程
冯诺依曼体系结构
–现代计算机硬件体系结构
计算机五大硬件单元
输入设备:键盘
输出设备:显示器
存储器:内存(中间缓冲,缓存数据,数据的吞吐量大)–外存()
运算器:cpu
控制器:所有设备都是围绕存储器工作的
操作系统
–一个软件安装在计算机硬件上
目的:为了让计算机更加好用—功能:合理统筹管理计算机上边的软硬件资源
管理:先描述,在组织
库函数和系统调用接口的关系:库函数是对系统调用接口的一层封装,他们是上下级的调用关系
管理:先描述(抽象结构体来描述硬件),在组织(多数用链表来组织)
进程
进程是什么:进程是一个运行中的程序,Linux是一个多任务操作系统,表示有大量的程序需要被cpu调度运行,这时侯cpu使用了分时技术,分别轮询处理每一个程序,在进程程序切换调度时,需要记录运行信息,因此操作系统在调度进程在cpu运行时,使用pcb对运行中的程序进行描述,通过调度pcb完成对进程的调度,因此进程是pcb–先描述(使用pcb描述进程使用双向链表将pcb串起来进行管理)–pcb–task_struct
操作系统通过pcb来控制一个进程的运行,这个pcb也叫做进程描述符,描述了一个运行中的程序,在操作系统角度,进程就是pcb-task_struct
pcb中存在一个内存指针,指向当前这个进程所要运行的程序和数据在内存中的位置;
进程查看
ps 查看系统中所有进程信息
-ef
aux/proc 保存系统正在运行的程序信息,
pid_t getpid() 获取调用进程pid
进程创建
创建一个进程就是创建一个pcb
fork() —通过复制调用进程(父进程)创建一个新的进程
(内存指针,上下文数据,程序计数器)
1 //进程创建
2 #include <stdio.h>
3 #include <unistd.h>
4
5 int main(){
6
7 printf("------head line------pid:%d\n",getpid());
8 fork();
9 printf("------tail line------pid:%d\n",getpid());
10 return 0;
11
12 }
复制父进程的pcb(意味着和父进程拥有一样的内存指针,程序计数器,上下文数据):和父进程运行相同的代码,相同的运行位置,相同的数据;
父子进程代码共享,数据独有
pid_t fork(void);
如何分辨父子进程?
通过返回值
父进程:返回子进程pid,pid>0
子进程:返回0
失败:返回-1
创建子进程的意义:
分摊压力,cpu资源足够的情况下,父子进程t同时处理数据
希望完成其他任务
进程状态
就绪,运行,阻塞
Linux进程状态
运行态®
可中断睡眠态(S)
不可中断睡眠态(D)
停止态(T):kill -9 pid
僵死态(Z)
死亡态(X)
追踪态(t)
僵尸进程(处于僵死态的进程)—进程退出但是资源没有完全释放(没有完全退出)
**如何产生僵尸进程:**子进程先于父进程退出,将自己的退出原因,保存在pcb中,操作系统检测到了子进程的退出,因为父进程有可能关注退出原因,所以不敢随意的释放所有资源,通知父进程子进程的退出,但是这是父进程可能还在执行其他任务,没有关注到这个通知,导致子进程退出了,但是资源一直没有释放,处于僵死状态,成为僵尸进程
#include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 int main(){
6 int pid=fork();
7 if(pid<0){
8 return 1;
9 }
10 else if(pid==0){
11 sleep(5);
12 exit(0);
13 }
14 while(1){
15 sleep(1);
16 }
17 return 0;
18 }
shell脚本查看进程代码
while [ true ] ;do clear; ps aux |grep zombie; sleep 0.5;done
危害: 资源泄露;一个用户能够创建的进程是有限的,可能导致新进程创建失败;
处理: kill父进程
如何避免: 进程等待
孤儿进程
父进程先于子进程退出,子进程成为孤儿进程,运行在后台;父进程就成为1 号进程
守护进程/精灵进程: 特殊的孤儿进程(脱离终端,脱离登陆回话的孤儿进程)
进程的优先级
通过一个评级来决定一个进程的cpu资源优先分配权
为了让计算机运行的更加合理(因为进程的性质各有不同–批处理/交互式)
查看: ps -l
PRI 优先级的值
修改:优先级无法直接修改,但是可以通过修改NI的值,来调整PRI的值
PRI =PRI + NI
renice -n ni_val -p pid
nice -n ni_val ./main
nice值的范围:-20~19
优先级更多的是针对cpu密集型程序(对cpu资源要求不高)
磁盘密集型程序因为本身对cpu资源要求就不是很高,因此大多情况下,没必要调整。
竞争性: 独立性: 并行 并发
环境变量:保存有设置操作系统并行环境参数的变量(键值对)
env 查看环境变量
echo
set 查看环境变量和普通变量
export:设置环境变量
unset:设置环境变量
其他环境变量 HOME SHELL PATH
环境变量在代码中的操作/特性
全局特性—继承
程序地址空间
地址:内存区域的编号
—进程的虚拟地址空间—内存描述符–mm_struct
操作系统通过mm_struct结构体给进程描述一个虚拟的地址空间
mm-struct{
ulong size;
ulong code_start
ulong code_end;
ulong data_start;
ulong data_end:
}
同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了 不同的物理地址!
虚拟地址空间+页表:提高内存利用率,对内存访问进行控制