一.进程
- 进程与程序的区别
- 只是二进制的文件,仅占用磁盘空
- 进程是启动后的程序,所有参数的数据都存放在内存当前,同时还会占用系统的资源(例如cpu,物理内存等)
- 并行和并发
- 并发:在一个时间段中,有多个程序处于运行状态,且都在同一个处理机上运行,并不是同时进行,而是CPU在快速的切换任务,造成一种“同时进行”的假象。
- 并行:系统有多个CPU,每个CPU执行不同的进程,不同进程之间不会相互抢占CPU资源
- 二者的差异主要在:是同时间点发送还是在同时间段发送,是否会相互抢资源,多CPU或者多核CPU
- PCB(Proces Control Block):进程控制块---结构体类型
每一个进程都有自己独立的PCB,用于维持进程的状态和信息,以便操作系统能够更高效的管理和调度进程
主要包括:唯一进程标志信号(id),存储进程状态,资源原理,调度和切换
1.进程标志信息:包括进程id(PID),父进程id(PPID),用户id和组id
2.进程状态:进程状态:初始态,就绪态,运行态,挂起态和终止态

3.进程上下文信息:切换任何时需要恢复和保存进行的状态
cpu寄存器,程序计数器,处理器状态字(PWS)
4.内管管理信息
5.资源管理信息
6.进程调度信息
7.进程间通道信息
如果看过FreeRTOS源码,对任务调度有一定的了解的话,对于这部分应该很好了解,整体的内容大致一样
4.创建进程
fork函数:创建子进程,子进程与父进程基本一致
数原型: pid_t fork(void);
为什么要建立父子进程?
服务器与多个客户端连接,为了避免客户端之间数据干扰,可以建立父子进程分别运行保存各自的数据
vfork();也是创建进程
vfork()和fork()的区别:
vfokr可以直接使用父进程存储空间,不拷贝。保证子进程先运行,当子进程exit()退出后,父进程才执行
5.ps(Process Statu):查看进程信息
常见的指令: a :显示中断所有程序 u:以用户为主的显示程序状态 x:显示所有程序,不区分终端机(有时会开启多个终端,每个终端运行不同给的文件)
| 命令 | 风格 | 主要用途 | 关键字段(部分) |
ps ajx | BSD 风格 | 查看进程间关系(父子、会话、组) | PID、PPID、PGID、SID、TTY、STAT、COMMAND |
ps aux | BSD 风格 | 查看进程资源占用(CPU、内存) | USER、PID、%CPU、%MEM、VSZ、RSS、COMMAND |
-
ps ajx更适合分析进程结构和关系; -
ps aux更适合查看资源占用和性能分析。
6.kill:向指定的进程发送信息,默认是发送 终止信号(SIGTERM,编号 15),但也可以用于发送其他信号。
kill [信号] <PID>
<PID>:进程号(Process ID)
[信号]:可选,默认为 SIGTERM(15)
7.父子进程间的数据共享
需要注意:在读取同一个变量时,不会产生独立的物理地址,读数据时共享
但是在写数据时,父子进程都会产生各自的物理地址,先拷贝再修改--写数据不共享
https://blog.youkuaiyun.com/ALIANG2000/article/details/152282974?spm=1001.2014.3001.5501https://blog.youkuaiyun.com/ALIANG2000/article/details/152282974?spm=1001.2014.3001.5501
https://blog.youkuaiyun.com/ALIANG2000/article/details/152282974?spm=1001.2014.3001.55018.exec函数族:让父子进程来执行不想干的操作,即替换进程地址空间的代码.text段,执行另外的程序,不需要创建额外的地址空间,相当在程序中调用另外一个应用程序(个人感觉有点像函数指针+回调函数的效果,都是在一个函数中执行另外一个函数)
9.孤儿进程:父进程退出,但是相对应的子进程还在运行,子进程会被init进程(进程号1)收养
僵尸进程:子进程已经终止,但父进程还没有调用 wait() 来读取它的退出状态,导致该子进程的 PCB(进程控制块)仍保留在内核的进程表中,PID 等资源未被释放。僵尸进程以终止态保存在进程表中,一直等待父进程读取退出状态的代码
僵尸进程是“已死但未收尸”的子进程,
父进程不 wait(),它就赖在进程表里不走,
唯一的办法是:让父进程负责收尸,或者干掉父进程让 init 来收。
孤儿进程和僵尸进程都是子进程
10:进程回收 :用于回收子进程退出状态的系统调用,是防止僵尸进程的关键
wait(int *wstatus)
waitpid(pid_t pid, int *wstatus, int options)
| 特性 | wait() | waitpid() |
| 阻塞等待 | 是(阻塞到任意一个子进程退出) | 可选(可阻塞,也可非阻塞) |
| 指定子进程 | 否(任意子进程) | 是(可指定 PID 或进程组) |
| 非阻塞支持 | 否 | 是(通过 WNOHANG) |
| 返回值 | 成功:退出的子进程 PID | 成功:退出的子进程 PID(或 0 非阻塞时) |
| 错误返回 | -1(无子进程或出错) | -1(出错) |
wait() 是“随便等一个儿子”,
waitpid() 是“指定等哪个儿子,还可以不等”,
写健壮的多进程程序,优先用 waitpid()。
11:进程退出:分为 正常退出 和 异常退出 两种状态
正常退出: main函数调用retur;进程调用exit();进程调用_exit();进程最后一个线程返回;最后一个线程调用 pthread_exit(POSIX 线程库(libpthread) 提供的函数,用来主动终止当前线程);
异常退出:调用abort函数;当进程收到某些信号时(ctrl+c);最后一个线程对取消(cancellation)请求做出反应
不管什么退出,都会释放进程所使用的寄存器等资源
在异常终止情况下,内核(不是进程本身)产生一个指示其异常终止原因的终止状态(terminationstatus)

被折叠的 条评论
为什么被折叠?



