帝国cms建站实例教程,二级域名前缀大全,wordpress安,vs做网站链接sql进程 进程PCB进程的定义进程的组成进程模式进程的状态进程的运行进程的创建进程的结束孤儿进程僵尸进程僵尸进程的危害 进程的创建pidforkwait案例 进程
PCB 从操作系统理解进程概念-------先描述#xff0c;后组织 为了使参与并发执行的程序能独立的运行#xff0c;必须为之… 进程 进程PCB进程的定义进程的组成进程模式进程的状态进程的运行进程的创建进程的结束孤儿进程僵尸进程僵尸进程的危害 进程的创建pidforkwait案例 进程
PCB 从操作系统理解进程概念-------先描述后组织 为了使参与并发执行的程序能独立的运行必须为之配置一个专门的数据结构-----task_struct称为进程控制块PCB。进程信息被放在一个叫做进程控制块的数据结构中可以理解为进程属性的集合。 系统利用PCB来描述进程的基本情况和运行状态进而控制和管理进程也就是组织进程。 相应地由程序段、相关数据段和PCB三部分构成了进程映像进程实体。所谓创建进程实质上是创建进程映像中的PCB而撤销进程实质上是撤销进程的PCB。值得注意的是进程映像是静态的进程则是动态的。 进程的定义 进程的定义一个运行中的程序 例如 源程序文件 ---- 可执行文件 狭义定义进程就是一段程序的执行过程。 广义定义进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元在传统的操作系统中进程既是基本的分配单元也是基本的执行单元 内存最小的单位bit(位) 内存最小的管理单位字节 进程的组成 进程由三部分组成代码段数据段堆栈段 也就是程序数据进程控制块 数据全局变量静态变量(已初始化未初始化)只读变量局部变量 代码进程的源代码 堆栈变量手动内存分配malloc new 进程模式 程序在运行的时候一般为2种模式 1.内核模式内核上的程序 2.用户模式用户自己写的程序应用程序正常运行 进程的状态 用来显示进程信息可以用 top命令或者 ps -aut pstree 进程数命令 进程的状态 1.R(running) 运行态 2.S(sleep)睡眠态 3. 4. 5. 6. 7. 进程的运行 1.手动运行命令以及执行可执行程序 2. 调读 nice , renice: 控制进程是否让步 kill crontab bg 进程的创建 system:在程序中执行命令fork, vfork 创建子进程exe 进程的结束 1.自然结束 2.被动结束 os 结束 被内核进程结束 被本进程或者其他进程干掉 孤儿进程 父进程结束子进程还在运行的子进程被称为孤儿进程。 一个父进程退出而它的一个或多个子进程还在运行那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为1)所收养并由 init 进程对它们完成状态收集工作 僵尸进程 一个进程使用 fork 创建子进程如果子进程退出而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息那么子进程的进程描述符仍然保存在系统中这种进程称之为僵死进程。 3.提防僵尸进程产生(占用的资源不会被释放掉) 首先你要理解进程本身占用的资源以及进程运行时占用的资源 进程运行时占用的资源会释放 进程本身占用的资源不会被释放 僵尸进程产生的原因 子进程结束了父进程没有回收它的资源 (也就是父进程先于子进程结束没有回收子进程的资源) 怎么防止僵尸进程 1.父进程结束前子进程结束父进程回收子进程的资源 2.父进程结束后子进程被父进程的父进程收养爷爷进程回收子进程的资源。 僵尸进程的危害 僵尸进程虽然不占有任何内存空间但如果父进程不调用 wait() / waitpid() 的话那么保留的信息就不会释放其进程号就会一直被占用而系统所能使用的进程号是有限的如果大量的产生僵死进程将因为没有可用的进程号而导致系统不能产生新的进程此即为僵尸进程的危害 进程的创建 在Linux中所有的进程都可以看做是init()进程的子进程孙子进程重孙进程等。 pid ,每个进程在系统中都有一个唯一·的非负整数表示的进程ID用getpid() 获取进程pid, getppid(), 获取当前进程的父进程的pid 每一个进程都有对应的目录在/proc目录下 用kill()函数 注意 kill函数的第一个参数是pid_t的数据类型 pid_t 实际上是一个int类型 fork 没有参数有一个返回值 fork: 用克隆的方式创建一个进程创建成功返回这个进程的id 克隆全盘复制包括这个进程的上下全文 子进程拷贝了父进程的上下文 进程的上下文进程运行这个位置的地方数据时间状态 fork实际上创建的是子进程 调用fork的进程 是父进程 fork创建的进程 是子进程 wait wait()函数是用来防止僵尸进程 作用让父进程结束的在子进程之后如果父进程结束的早用了wait()可以起到延迟效果等子进程结束父进程才结束 注意这里有个waitpid()函数 可以指定进程 案例
#includestdio.h
#includeunistd.h
#includesys/types.hint main()
{if(fork()){printf(father %d\n , getpid());}else{for(int i 0; i 3; i){printf(son %d\n , getpid());}}printf(end %d\n, getpid());return 0;
} 由运行结果可知 father 为父进程 son为子进程 end 都被执行了2次 因为用了fork函数之后 子进程被创建子进程拷贝的父进程的上下文(fork函数的原理) 注意这里是父进程先结束子进程的资源没有被回收造成的僵尸进程 用wait()函数避免僵尸进程 #includestdio.h
#includeunistd.h
#includesys/types.h
#includesys/wait.hint main()
{if(fork()){printf(father %d\n , getpid());wait(0); //避免僵尸进程的出现}else{for(int i 0; i 3; i){printf(son %d\n , getpid());}}printf(end %d\n, getpid());return 0;
} 这里就是子进程比父进程先结束