进程的基本概念
进程:运行或加载在内存上的程序(程序的一个实例化,一次执行过程)
程序:存储在内存上的一个可执行的二进制文件
操作系统为每个进程维护一个PCB,通过PCB/进程控制块(底层是一个结构体,包含的、进行属性)对一个进程实体进行间接操作,而不是直接控制。系统通过双向链表来管理所有的PCB.
进程实体:程序被加载在内存上的内容。
僵死进程:1、每一个程序都对应一个进程,在进程结束的时候,进程的实体会被销毁,而此时的进程的PCB不会销毁,对于一个进程的实体销毁而进程的PCB没有被释放的进程叫做僵死进程;
2、子进程执行结束而父进程没有结束,但父进程没有处理子进程的退出状态。
处理僵死进程的方式:
1)让父进程结束,使子进程变为孤儿进程,移交给init,init会处理僵死进程;
2)让父进程处理子进程的退出状态;(每个子进程结束时都会发送一个SIGCHLD的信号的父进程)
父进程处理子进程的退出状态的方法:
1)调用wait(int *reval)方法这是一个阻塞运行的方法,返回值为子进程的pid,reval是子进程的退出状态码。父进程会一则直等待子进程的退出状态而不会执行其他操作。
2)当子进程发送SIGCHID信号给父进程的时候,调用signal(SIGCHLD,SIG_IGN);表示父进程知道子进程已经结束,但父进程忽略这个信号,实质已经处理了,只是处理的方案是忽略,和系统默认的不处理是不一样的。这是操作系统已经知道父进程对子进程的态度,所以不再维护子进程,将子进程的PCB销毁。
操作系统在子进程结束时没有立即销毁子进程的PCB的原因是:操作系统不知道该子进程是否已经对父进程或用户已经没有用了所以他维护这个PCB,让子进程发送一个信号格给父进程,让父进程来处理,如果父进程忽略这个信号表示这个子进程已经没有用了,这时操作系统会立即销毁这个PCB,节省空间。
父子进程之间的资源共享:
在fork之后,子进程往往会跟着执行exec系列函数,所以进程的创建过程采用写时拷贝技术:fork之后父子进程共享内存空间(除了栈区,因为每个进程都会有自己独立的栈区,在进程开始的时候会自动开辟栈帧),内核将这些空间置为只读,如果父子进程任何一个进程试图修改某个数据,操作系统会以也为单位将修改的数据所在的页拷贝出来。
而父子进程的PCB是以浅拷贝的方式进行的,所以open函数的返回值是进程的文件表数组的下标,文件表里面存储的是struct file的结构体的地址,是一个指针数组。因为是浅拷贝所以父子进程的PCB的存储的值都是简单的拷贝了地址值,所以他们他们指向的struct file结构体是一样的,所以共用这个结构体体里面的内容。因此他们对文件的读取是相互影响的。
- Linux系统进程控制编程(一)————基本概念和函数getpid的使用
- Linux的进程编程-之一-基本概念
- 进程的基本概念
- 进程的基本概念以及如何创建子进程
- 进程管理和终端驱动基本概念
- Java--进程和线程基本概念
- Linux进程理解与实践(一)基本概念和编程概述(fork,vfork,cow)
- 进程的基本概念
- 进程同步的基本概念:临界资源、同步和互斥
- 操作系统基本概念-----进程、线程总结
- 操作系统及进程基本概念
- 关于进程、线程和协程 的基本概念
- [linux]进程(一)--基本概念
- 进程、线程的基本概念和管理
- 进程和线程基本概念的理解
- 5、进程通信的基本概念和方法
- 进程基本概念
- linux idle 进程 init进程 Shell的基本概念
- 多线程系列一 进程和线程基本概念
- 【经典转载】Linux进程学习系列之一 基本概念