1.进程
网络编程
进程(process):
进行中的程序 ----正在运行中的程序
进程 -- -程序的一次执行的过程
进程 是程序的一个实例
进程 vs 程序
程序是在内存中运行的
- 进程是跑起来的程序
- 一个程序可以对应多个进程
程序 --- 静态 --- 硬盘
进程 --- 动态 --- 内存
为什么需要进程?
单道程序
多道程序
为了描述和管理 程序运行 动态过程
进程
进程调度
操作系统为了 管理 程序的动态运行过程 --- 进程
PCB (process control block)
进程的组成
程序的组成
.c 程序源代码
a.out 可执行程序
Linux下程序在内存中的典型布局
栈
堆
Bss
Data
Text
可执行程序 a.out 进程 = Pcb + 进程实体(text/data/baa/堆栈)
Pid:process id//进程Id号
Pr:进程优先级
Nice:亲密度,亲密度越高优先级越高
S:status 状态
Top命令:Linux上的任务管理器
进程的生命周期
进程的状态
宏观并行,微观串行
浅度睡眠:是可以被打断的
深度睡眠:不可被打断
暂停:适用于调试阶段
僵死:进程实体已经结束,但pcb还在
Ps:
Ps aux | head -1 :ps aux是一个运行状态。|:管道符
表示将前一个进程的运行效果传递给后面那个进程
Kill :杀死 --- 给进程发送信号
Eg:kill -l 查看kill可以发送的信号
-9 结束进程
-18 继续运行
-19 暂停
Kill all:可以指定进程名称。这种方式发送信号
前台进程组:
总结:1.进程概念
- 进程和程序
- 进程组成
Pcb + text|data|baa|堆|栈 = 进程
进程状态:
三态 模型 ---- 操作系统理论
Linux系统:
R:运行或可运行 --就绪态
S:可中断的睡眠
D:不可中断的睡眠
T:暂停态
Z:僵尸态
进程的编程:
进程 --- 为了实现多任务
- 创建进程
- 进程的执行
- 进程结束
- 进程结束时资源的回收 ---- 僵尸态的处理
进程的创建
Fork() //叉子 - 树杈
Pid_t fork(void); calling process:调用的函数
功能:
创建一个进程(child process子进程)
通过复制 调用进程复制的子进程 复制的是进程的实体text|data|bss|堆栈
返回值:
成功:
在父进程中,返回 子进程的pid号
在子进程中,返回0
失败:
-1 并且没有 子进程被创建0
注:pid号 实际上是一个 非负 整数
最小的pid号是 ----0
Fork一次调用,分别在子进程与父进程之间反回了一个值
注意:
1.在32为操作系统中,每一个进程都拥有独立的4G空间(虚拟的)
2.每个进程运行在各自独立的4G内存空间中
3.父子进程间,数据相互独立,互不影响
4.父子进程运行的顺序,不确定 取决于操作系统 --- 先调度谁
Getpid()获取当前所在进程的pid号
输出重定向
干掉父进程,只留下子进程,那么子进程就会被系统收养(32为系统init,64为系统systemd),从而成为后台进程,此时无法在终端进行操作结束子进程
n次fork,就生成2^n个进程