1 概述一个已经加载到内存中的程序windows的进程2 PCB2.1概述PCB程序控制块一种描述进程属性的结构体对象。linux 下被称为task_struct在Linux中可以去/proc系统文件查看进程或使用ps axj命令查看2.2 task_struct大概内容标示符: 描述进程的唯一标示符区别其他进程。状态: 任务状态退出代码退出信号等。优先级: 相对于其他进程的优先级。程序计数器: 程序中即将被执行的下一条指令的地址。内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据[休学例子要加图CPU寄存器]。IO状态信息: 包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等。其他2.3 pid和ppid进程idPID进程的唯一标示符父进程idPPID使用函数获得需要的库#include sys/types.h 定义了许多在系统编程中常用的数据类型。这些类型用于表示文件大小、时间、设备号、进程 ID 等#include unistd.h 包含下面这两函数返回值类型pid_t;getpid(void)返回调用这个函数的进程的pidgetpppid(void) 返回父进程pid2.4 fork()需要sys/types.h和unistd.hfork()用来创建一个子进程fork(void)返回值类型pid_t有两个返回值分别返回父进程和子进程对于父进程返回被创建的子进程pid返回-1说明创建失败对于子进程返回0父进程和子进程的代码共享但是各自开辟空间写时拷贝改多少父进程数据开多少空间重新存父子进程数据不干扰3 进程的状态3.1常见状态ps aux / ps axj 命令查看进程状态3.1.1运行运行态Rrunning进程正在运行或处于运行队列3.1.2阻塞进程在等其他设备睡眠态 (S) sleeping)进程在等待事件完成可中断磁盘休眠态D Disk sleep进程会等待IO结束不可中断3.1.3挂起等待了很久的进程被放进交换分区停止态T stopped僵死态Z(zombie)3.1.4其他死亡态Xdead一个返回状态不可见3.2僵尸进程和孤儿进程僵尸进程子进程的退出状态会被保持直到父进程接受返回父进程如果一直不读取子进程就会一直占用系统资源。孤儿进程子进程未结束父进程已结束子进程会被1号进程init进程接管并接受返回值。4 环境变量程序运行需要命令行参数表和环境变量表一个程序从main(int argc, char *argv[]))函数开始时会得到一串参数int argc, char *argv[]是个数组内容是命令行参数和环境变量。指程序开始后默认得到的参数。环境变量是一个全局变量所有在系统上运行的程序都会得到这个参数。5 进程地址空间5.1程序地址空间程序运行时被分配到的内存5.2地址空间指地址总线32位系统32个64位系统64个排列组合形成的地址范围32位系统大概4Gb5.3进程地址空间由cpu上的cr3寄存器保存的进程的页表的物理地址的起始地址代表在内存上真实占用的一段空间。6进程控制和替换6.1进程创建fork创建进程后父子进程可以进行页表映射实现代码和数据共享。6.2进程退出exit0退出进程。退出码及return的返回值,c语言提供会刷新缓冲区_exit系统提供的接口。不刷新缓冲区6.3进程等待wait/waitpid()对子进程进程进行检查和回收。只有用wait接收后子进程才不会变成僵尸进程。wait一次等待任意一个子进程没接收到子进程退出父进程就会进入阻塞等待状态waitpid可以指定等待进程id可以通过第二个参数获得子进程退出信息。第三参数决定等待方式阻塞等待/非阻塞轮询。6.4进程替换子进程要调用不同代码分支时使用exec函数替换代码和数据不创建新进程id不变进程替换后不再返回。若返回则说明调用失败。#include unistd.hint execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ...,char *const envp[]);int execv(const char *path, char *const argv[]);int execvp(const char *file, char *const argv[]);l(list) : 表示参数采用列表v(vector) : 参数用数组p(path) : 有p自动搜索环境变量PATHe(env) : 表示自己维护环境变量