进程

定义

1、进程是程序执行的一个实例。
2、从内核观点看,进程目的就是担当分配系统资源(CPU时间、内存等)的实例。
任何进程都有父进程,这就意味着所有进程会有一个共同的“祖先”进程,也就是1号进程。

进程描述符

为了管理进程,内核必须对每个进程所做的事情进行清楚的描述。例如,内核必须知道进程的优先级,它是正在CPU上运行还是因某些事件而被阻塞,给它分配了什么样的地址空间,允许它访问哪个文件等等。这正是***进程描述符***的作用。进程描述符主要包含以下信息:
进程的基本信息
指向内存区描述符的指针
与进程相关的tty
当前目录
指向文件描述符的指针
所接收的信号

进程状态

进程有以下几个可能的状态:

可运行状态(TASK_RUNNING)

进程要么在CPU上执行,要么准备执行

可中断的等待状态(TASK_INTERRUPTIBLE)

进程被挂起,直到某个条件变为真。

不可中断的等待状态(TASK_UNINTERRUPTIBLE)

与可中断的等待状态类似,但有一个例外,把信号传递到这种状态的进程不能改变它的状态。这种状态很少用到,但在一些特定的情况下(一个不能被中断的事件发生的场景)。例如,当进程打开一个设备文件,其相应的设备驱动程序开始探测相应的硬件设备时会用到这种状态。因为探测完成前,如果被中断,硬件设备会处于不可预知的状态。

暂停状态(TASK_STOPPED)

进程的执行被暂停。

跟踪状态(TASK_TRACED)

进程的执行已由debugger程序暂停。当一个进程被另一个进程监控时,任何信号都可以把这个进程置于此种状态。

僵死状态(EXIT_ZOMBIE)

进程的执行被终止,但是父进程还没有发布wait4()或waitpid()系统调用来返回有关死亡进程的信息。

僵死撤销状态(EXIT_DEAD)

最终状态:由于父进程刚发出wait4()或waitpid()系统调用,因而进程由系统删除。

进程间的关系

程序创建的进程具有父子关系。如果一个进程创建多个子进程时,则子进程之间具有兄弟关系。
进程0和进程1是由内核创建的;进程1(init)是所有进程的祖先。

进程切换

为了控制进程的执行,内核必须由能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为称为进程切换、任务切换或上下文切换。
进程恢复执行前必须装入寄存器的一组数据成为硬件上下文。硬件上下文是进程执行上下文的一个子集,因为可执行上下文包含进程执行时需要的所有信息。
我们假定用prev局部变量表示切换出的进程描述符,next表示切换进的进程描述符,那么进程切换可以这样定义:
保存prev硬件上下文,用next硬件上下文代替prev。

创建进程

Unix操作系统紧紧依赖进程创建来满足用户的需求。例如,只要用户输入一条命令,shell进程就创建一个新进程,新进程执行shell的另一个拷贝。
在Linux中,轻量级进程是由名为clone()的函数创建的。

内核线程

内核线程在以下几个方面不同于普通进程:
1、内核线程只运行在内核态,而普通进程既可以运行在内核态,也可以运行在用户态。
2、因为内核线程只运行在内核态,它们只使用大于PAGE_OFFSET的线性地址空间。另一方面,不管在用户态还是在内核态,普通进程可以用4GB的线性地址空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值