进程的创建和进程的状态
gcc —linux编译器代码编译需要经过四个步骤:预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别的代码)连接(生成可执行文件或库文件)linux系统下,gcc也是进行这四个步骤,用法是: gcc 【选项】要编译的文件 【选项】目标文件1.预处理gcc将c语言编译成机器可识别的语言,即可执行文件,gcc 默认动态链接,动态库命名方式:libc.so...
进程
**浅层认识:**程序从硬盘上要开始执行起来,先要加载到内存上,然后描述起来(创建PCB),然后在运行,运行起来的程序叫进程。
**从操作系统的角度来看进程: **
操作系统就是管理者,进程就是被管理者,要管理进程需要:
1.操作系统不直接管理进程,先将进程描述起来
2.描述进程的载体是一种结构体,一个进程具有一个结构体,这个结构体叫做进程的PCB(进程控制块)
3.然后把所有的结构体组织起来,组织起来的方式就是用指针将结构体连成一个链表 (或者用其他高级数据结构组织起来)
PCB–描述进程
PCB是包含进程的信息(描述进程的信息,有优先级,状态等)的一种结构体,
linux下描述进程的PCB叫 task_struct
##task_structl里面的内容
标识符:pid,描述本进程的唯一标识符,用来普别其他进程
状态:任务状态,退出代码,退出信息等
优先级:cpu资源分配的先后顺序
程序计数器:程序中即将被执行的吓一条指令的地址。
内存指针:程序代码和进程相关数据的指针等,可以指向虚拟地址空间,通过页表映射到物理内地址,最终在内存中找到这个进程所要运行的代码和数据。
上下文数据:进程执行时处理器中的寄存器的数据(进程正在执行时寄存器中的数据)(时间片:进程在cpu上运行的时间,分时机制:aa)
i/o状态信息:进程打开的文件信息
记账信息:可能包含处理器的时间总和(运行时间)等
##查看进程
每个进程都有自己的PID
查看进程指令有: ls /proc/ , ps aux 等
系统调用获取进程标识符(id):
getpid() //获取进程pid
getppid() //获取父进程pid
创建进程
创建进程有两个函数:fork 和 vfork
pid _t fork(void )
有两个返回值:对于子进程来说,返回0;对于父进程来说,返回子进程的id,创建失败返回-1。
创建子进程:以父进程为模板,父子进程代码段相同,但数据不同,fork的返回值起到分流的作用,用户通过fork的返回值来判断哪个是子进程,哪个是父进程。
fork之后,父子进程谁先运行,由调度器决定,父子进程分别独立自己的,执行自己的任务
fork之后内核的做法:
- 分配新的内存块和内核数据给子进程
- 将父进程的部分数据内容拷贝到子进程中
- 添加子进程到系统的进程的列表中
- fork返回,开始调度
代码如下:
打印结果:
变量地址相同,内容不同;通常,父子进程代码共享,父子不在写入时,数据也是共享的,当任意一方要写入时,就以写实拷贝的方式来处理
vfork
pid_t vfork(void)
也是用来创建子进程的但是vfork创建的子进程和父进程共享虚拟地址,但fork创建的子进程具有独立的虚拟空间;
vfork保证子进程先运行,在它调用exit后,父进程才可能被调度运行
代码:
运行结果:
地址相同,变量内容相同,因为虚拟地址相同
创建进程图:
fork和vfork的区别
1.fork:子进程拷贝父进程的数据段,代码段。
2.vfork:子进程和父进程共享代码段。
3.fork(),创建的父子进程的执行次序不确定,vfork()保证子进程先运行,在子进程调用exit()之后父进程才被调用。
进程状态
统一描述:就绪,态运行态,阻塞态
linux下进程的状态:
运行状态 (R) //要么在运行这种,要么在运行的队列中
睡眠状态(S) //浅睡眠,可以被唤醒
磁盘休眠状态(D) //深度睡眠,不可以被唤醒,不能被中断(不可终端睡眠状态)
停止状态(T) //可以发送信号给进程让其暂停,也可以发送信号让它继续运行
跟踪状态(t) //跟踪进程的状态
死亡状态(X)
僵尸状态(Z)
僵尸进程
概念:进程退出,父进程没有读取到子进程的返回代码时 就会产生僵尸进程。
僵尸进程产生原因以及危害:
1.子进程先于父进程退出(父进程没有关心子进程的退出状态)
2.进程退出为了保存自己退出的原因,因此退出后资源不会被完全释放,等待父进程来获取退出状态(这就是为什么要进程等待),然后释放子进程所有资源,所以假如父进程没有关心子进程的退出,那么这个时候退出子进程将成为一个僵尸进程,占着资源不释放,成为僵尸进程,造成资源泄漏(资源没有完全释放),正常进程可能无法创建。
孤儿进程
父进程先于子进程退出,这个孤儿进程将被孤儿院init进程所领养,子进程退出后由init回收释放
进程的优先级
cpu分配资源的先后顺序,调整优先级的命令 nice,renice,其实是调整NI的值,nice的值影响进程的而优先级
交互式进程:优先级应该高一点
批处理进程:优先级可以低一点
程序与进程
程序是硬盘上的一个文件。
进程是放在内存里,还要被操作系统管理。
管理:
管理和被管理者不直接沟通
被管理的对象需要描述起来(利用数据)
为了高效,描述对象也要被组织起来
更多推荐
所有评论(0)