一、编程角度
标准IO --库函数 --FILE * (fopen)
文件IO --系统调用 --fd (open)
1、多任务编程
1.多进程
2.多线程
进程 进行中的步伐)--正在运行的步伐 (动态的) ---内存 步伐的一次执行过程!
步伐 -- a.out (可执行步伐) ---静态的
步伐源代码
步伐 加载 到内存 运行起来 成为了 进程。 (步伐 ---> ./a.out ----> 进程)
栈
堆
静态区
字符串常量区
代码段
main()
{
while(1)
{
}
} //单道 步伐
操作系统 //多道步伐
步伐1->|
步伐2->|--- [CPU]-->
步伐3->|
进程1->| 4G空间
进程2->|--- [CPU]-->
进程3->|
//CPU --- 单核的CPU
//宏观并行 微观串行
//并发 --- 同一时间 同时发生
二、进程概念
描述 记录 步伐运行过程中的 动态信息!
一个步伐 可以 对应到多个进程
[栈 ]
[堆 ]
[静态区(全局区)] //data --已初始化的 全局变量 或 静态变量
//bss --未初始化的 全局变量 或 静态变量
[字符串常量区 ]
[代码区 ] //text (正文) --代码段
./a.out -----> 进程 (开辟的)
并发: 某一时间,同时发生
正在执行的步伐 ---进程 (动态)
步伐 ----加载到内存去运行--- 进程
进程是 步伐运行的实体。
步伐中有: 步伐 = 数据+代码
linux: 步伐
bss --- 未初始化的数据 |
data --- 初始化了的数据 | 静态区 | ---数据
text --- 正文段(代码段)
进程: (占用 cpu ,内存相关的资源 ,IO资源(屏幕,键盘))。进程是步伐执行和资源管理的最小单位。
32位的平台
4G空间 (4G的虚拟地点空间(逻辑上的))
用户空间 [0-3G] //用户 3G
---------------------
内核空间 [3G-4G] //操作系统 1G
linux 怎么管理进程?
PCB (process control block)//账本 信息登记表
步伐角度:
task_struct {
PID, //进程标识符
PPID, //父进程ID号 parent
当前工作路径 //chdir
umask //0002
进程打开的文件列表 //文件IO中有提到
信号相关设置 //处理异步io, ---段错误
用户id,组id
进程资源的上限
}
三、进程的一生
创建进程、执行任务
(1).跟父进程雷同的任务 fork
(2).有本身的任务要做 比如: shell执行下令 fork + exec
进程竣事
exit()
(1).孤儿进程 --- 没有父亲
(2).僵尸进程 --- 有父亲,但是本身先挂了
1.进程的寄义
进程是一个步伐执行的过程,会去分配内存资源,cpu的调度
pcb 是一个布局体,Process Control Block
struct task_struct
{
PID,进程标识符
PPID,parent id (父亲)
当前工作路径 chdir
umask 0002
进程打开的文件列表 文件IO中有提到
信号相关设置 处理异步io,
用户id,组id
进程资源的上限
ulimit -a,显示资源上限。
}
//一个步伐运行之后(进程) 默认打开了三个文件
stdin
stdout
stderr
2.进程和步伐的区别
步伐:静态
存储在硬盘中代码,数据的聚集
进程:动态
步伐执行的过程,包括进程的创建、调度、灭亡
.c ----> a.out-----> process(pid)
1)步伐是永存,进程是临时的
2)进程有步伐状态的变革,步伐没有
3)进程可以并发,步伐无并发
4)进程与进程会存在竞争盘算机的资源
5)一个步伐可以运行多次,变成多个进程
一个进程可以运行一个或多个步伐内存的分布
0-3G,是进程的空间,
3G-4G是内核的空间,虚拟地点
虚拟地点 * 物理内存和虚拟内存的地点 映射表 1page=4k
进程分类:
1、交互式进程 shell进程
2、批处理进程 shell脚本 .bat
3、保卫进程 (配景进程) //前台进程
3.进程的作用
进程的一生: (linux内里进程的状态7种)
D uninterruptible sleep (usually IO)
R running or runnable (on run queue) ---就绪队列中
S interruptible sleep (waiting for an event to complete)
T stopped(暂停态),
either by a job control signal or because it is being traced.
*W paging (not valid since the 2.6.xx kernel)
*X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped(收尸) by its parent.
4.进程的状态
3个状态,就绪→执行态→阻塞(等待,睡眠)根本操作系统linux中的状态,运行态,睡眠态,僵尸,暂停态。
5.进程的调度
内核重要功能之一就是完成进程调度
宏观并行
微观串行
6.查询进程相关下令
1.ps aux | grep 进程名 (查看进程相关信息)
1.就绪态、运行态 R
2.睡眠态、等待态
可唤醒等待态 S
不可唤醒等待态 D
3.停止态 T
4.僵尸态 Z
5.竣局势
2.top
根据CPU占用率查看进程相关信息
3.kill和killall发送一个信号
kill PID发送信号+PID对应的进程,默认接收者关闭
kill -9 进程PID号
kill -l //查看信号列表
killall -9 进程名
发送信号 进程名对应的所有进程
killall a.out //通过 进程名 发信号
kill 信号编号 进程ID
4.pstree -sp [pid号] //查看某个进程的父子关系
四、相关函数
1.fork()
pid_t fork();
叉子
一次调用,会返回两次。
子进程先运行和是父进程先辈程,次序不确定。
变量不共享。
子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。
功能:通过该函数可以从当进步程中克隆一个同名新进程。
克隆的进程称为子进程,原有的进程称为 父进程。
子进程是父进程的完全拷贝。
子进程的执行过程是从fork函数之后执行。
子进程与父进程具有雷同的代码逻辑。
返回值:int 类型的数字。
在父进程中:乐成 返回值是子进程的pid号 >0
失败 返回-1;
在子进程中:乐成 返回值 0
失败 无
2.getpid()
pid_t getpid(void);
功能:
得到调用该函数进程的pid
参数:
缺省
返回值:
进程的pid
3.getppid()
pid_t getppid(void);
功能:
得到调用该函数进程的父进程pid号
参数:
缺省
返回值:
返回父进程id号
五、进程的执行
1.举例 fork (//子承父业)
复制父进程 和 父进程做同样任务 。
2.子进程创建好之后 fork+exec 函数组 //独立创业
子进程有本身独立任务要做。
说明:
如果打开文件的操作 在fork之前,则 子进程会继续父进程已打开的文件的相关信息(文件表项)
此时,父子进程共享 (文件表项),实现对同一个文件的操作。
如果fork之后,各自打开,则父子进程,各自拥有各自的文件描述符 及 对应的文件表项,各自独立操作该文件。
此时,可能存在文件内容被覆盖。
[进程表项]
{
pid
文件描述符 -----------> [文件表项](文件的状态,文件的偏移量) ------> hello.c
}
[进程表项]
{
pid
文件描述符 -----------> [文件表项](文件的状态,文件的偏移量) ------> hello.c
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |