( 1)进程状态。
Linux中的进程有以下几种主要状态。
①运行状态( TASK_ RUNNING)
进程当前正在运行,或者正在运行队列中等待调度。
②可中断的阻塞状态( TASK_ INTERRUPTIBLE)
进程处于阻塞(睡眠)状态,正在等待某些事件发生或能够占用某些资源。处在这种状态下的进程可以被信号中断。接收到信号或被显式地唤醒呼叫(如调用wake_ up系列宏: wake_ up、wake_ up_ interruptible 等)唤醒之后,进程将转变为TASK_ RUNNING状态。
③不可中断的阻塞状态( TASK_UNINTERRUPTIBLE)
此进程状态类似于可中断的阻塞状态( TASK_ INTERRUPTIBLE),只是它不会处理信号,把信号传递到这种状态下的进程不能改变它的状态。在一些特定的情况下(进程必须等待,直到某些不能被中断的事件发生),这种状态是很有用的。只有在它所等待的事件发生时,进程才被显式地唤醒呼叫唤醒。
④暂停状态( TASK_ STOPPED)
进程的执行被暂停,当进程收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号,就会进入暂停状态。
⑤僵死状态( EXIT ZOMBIE)
子进程运行结束,父进程未退出,并且未使用wait函数族(如使用waitpid)函数)等系统调用来回收子进程的退出状态。处在该状态下的子进程已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其父进程收集。
⑥消亡状态(EXIT DEAD)
这是最终状态,父进程调用wait 函数族回收之后,子进程彻底由系统删除,不可见。
( 2)进程标识符。
Linux内核通过唯一的进程标识符PID来标识每个进程。PID存放在task struct的pid字段中。系统中可以创建的进程数目有限制,读者可以查看/proc/sys/kernel/ pid_ max来确定上限。
当系统启动后,内核通常作为某一个进程的代表。一个指向task_ struct的宏current用来记录正在运行的进程。current经常作为进程描述符结构指针的形式出现在内核代码中,例如,ccurrent→pid表示处理器正在执行的进程的PID。当系统需要查看所有的进程时,则调用for_ each_ process()宏,这将比系统搜索数组的速度要快得多。
在Linux中获得当前进程的进程号( PID)和父进程号(PPID)的系统调用函数分别为getpid()和getppid()。
(3)进程的特点。
1.进程是资源调度分配的最小单位,线程是系统调度的最小单位
2.进程是程序的动态执行过程,线程是进程的子任务
3.进程实现了系统的并发,线程实现了进程的并发
4.一个进程可以拥有多个线程,一个线程只能属于一个进程