什么是进程?
进程是一个运行中的程序,是程序的动态描述,每一个进程都有它自己的地址空间(一般包括文本区域,数据区域,堆栈)。进程是操作系统基本的分配单元和执行单元,在Linux下进程是一个task_struct结构体,叫做PCB,里面存放着进程的相关信息(如进程当前的状态,执行到的位置信息等等)
Linux下的task_struct结构体内容:
名称 | 作用 |
---|---|
标识符 | 描述本进程的唯一标识符,用来区别其它进程 |
优先级 | 用来处理和其它进程之间的顺序 |
程序计数器 | 程序中即将执行的而下一条指令地址 |
内存指针 | 程序代码指针,进程相关数据的指针,和其它进程共享内存块的指针 |
上下文数据 | 进程执行时处理器寄存器中的数据 |
状态 | 任务状态,退出代码,退出信号 |
在Linux下进程的状态(基本):
运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列
里。
睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))
磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的
进程通常会等待IO的结束
停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可
以通过发送 SIGCONT 信号让进程继续运行
僵尸进程
僵尸进程如何产生:当进程退出时,父进程没有读取到子进程退出的返回代码,子进程无法释放资源就会产生僵尸进程
僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码
僵尸进程会导致资源泄露
如何避免僵尸进程:
进程等待:处理子进程的退出,获取返回值,释放子进程资源
如果不想一直等待,可以使用SIGCHILD信号的自定义处理
孤儿进程
孤儿进程:运行在后台,父进程是1号init进程的特殊进程
孤儿进程的产生:父进程先于子进程退出
守护进程
守护进程:是一种特殊的孤儿进程,运行在后台,脱离终端以及登陆会话,父进程是1号进程
0号进程
在内核里面有一个进程,这个进程被叫做0号进程,在操作系统启动的时候,此进程就启动了。0号进程启动之后,用于启动1号用户态进程,其它后来创建的进程也可以看作是1号进程的子孙
进程的虚拟地址空间
每一个进程都有自己的虚拟地址空间,而每个虚拟地址空间开4G大小的内存用来使用。
为什么要给进程一个虚拟的地址空间呢?
一般来说,Windows下2G空间在用户空间,2G空间在内核中,Linux下3G空间在用户空间,1G空间在内核中。因为进程在同一时间内可能有很多,但是并没有那么多的内存分配给进程,并且因为cpu调度机制是分时机制,一个进程可能会在不同时刻调用,进程一部分一部分执行,即使进程有4G的空间也不会同一时间使用4G的空间,只需要在进程执行的时候通过虚拟地址空间调用实际的内存空间分配给进程所需要空间,在当前进程执行完毕(cpu轮转到下一进程)
,操作系统就可以将这部分内存空间提供给别的进程使用。
虚拟地址空间作用:通过页表实现虚拟地址与物理地址的映射, 提高内存利用率,提高内存访问控制,提高进程独立性