进程是程序在计算机上的一次执行活动,运行一个程序就意味着启动了一个进程。简单来说,程序是“静态”的,而进程是“动态”的。进程可划分为系统进程与用户进程:系统进程负责实现操作系统的各项功能,本质上是正在运行的操作系统本身;用户进程则是你启动的所有应用程序。进程是操作系统分配资源的基本单位。有些进程在任务管理器里无法直接结束——例如疑似木马混入时,该怎么办?其实有技巧可以强行终止它。
在Windows操作系统中,真正无法被强行杀死的进程只有System、SMSS.EXE和CSRSS.EXE。前两个是纯内核态进程,最后一个是Win32子系统,而ntsd命令本身依赖它。ntsd从Windows 2000开始就是系统自带的用户态调试工具。被调试器附着(attach)的进程会随调试器一起退出,因此可以在命令行下通过它终止进程。利用ntsd自动获取debug权限,就能杀掉大部分进程。ntsd会新开一个调试窗口,本来在纯命令行下不太好控制,但如果只是执行简单命令如退出(q),使用-c参数从命令行传递即可。按照惯例,ntsd也提供给软件开发人员,但系统管理员同样可以使用。具体操作:打开cmd.exe窗口,输入
ntsd -c q -p PID
把最后的PID替换成你要终止的进程的ID。如果你不知道进程ID,可以在任务管理器→进程选项卡→查看→选择列→勾选“PID(进程标识符)”,就能看到了。
Windows XP下还有两个好用的工具:tasklist和tskill。tasklist能列出所有进程及其详细信息,tskill能查杀进程,语法很简单:tskill 程序名。
Linux进程的睡眠与唤醒机制
在Linux系统中,仅等待CPU时间的进程被称为“就绪进程”,它们被放置在一个运行队列中,状态标志位为TASK_RUNNING。一旦某个运行中的进程时间片用完,Linux内核的调度器会剥夺该进程对CPU的控制权,并从运行队列中选取一个合适的进程投入运行。
当然,进程也可以主动释放CPU控制权。函数schedule()是一个调度函数,进程可以主动调用它,从而让出CPU并调度其他进程。当这个主动放弃CPU的进程被重新调度占用CPU时,它会从上次停止执行的位置继续——即从调用schedule()的下一行代码开始执行。
有时,进程需要等待某个特定事件发生,例如设备初始化完成、I/O操作结束或定时器到期。在这种情况下,进程必须从运行队列中移出,加入到一个等待队列中,此时进程就进入了睡眠状态。
