进程和线程:进程的创建和终止
进程的创建
进程创建的时机
系统初始化一个进程执行了创建进程的系统调用用户请求创建一个新进程一个批处理作业初始化
进程分类
前台进程:和用户交互的进程。守护进程:停留在后台处理的进程。
(线程分类也类似,如 Java 中就将线程分为用户线程和守护线程,守护线程为用户线程提供一些基本服务以保证 Java 程序的正常执行,只有当非守护线程全部退出后,JVM 才能正常关闭)
进程与窗口的关系
每个窗口运行一个进程,通过鼠标用户可以选择一个进程并与该进程交互。
Unix:新进程接管创建它的进程的窗口。Windows:大多数情况,一个进程被创建时并没有窗口,但可以创建一个或多个窗口。
系统调用创建进程
技术上,新进程均是由一个已存在的进程执行了一个创建进程的系统调用而创建的。
Unix:分两步走,先 fork,创建一个与调用进程相同的副本(子进程),此时这两个进程拥有相同的内存映像、环境字符串和打开的文件。接着执行 execve 或类似的系统调用,修改其内存映像并运行一个新的程序。
Windows:Win32 函数调用 CreateProcess 即处理进程的创建,也负责把正确的程序装入新的进程。
父进程和子进程的地址空间
Unix 和 Windows 相同点:父进程和子进程都拥有不同的地址空间。Unix 和 Windows 不同点:Unix 的子进程的初始地址空间是父进程的一个副本。一般,不可写内存区共享,可写内存不共享。对于可写内存,可能采取的是 写时复制 策略。而 Windows 一开始父进程的地址空间和子进程就不同。
进程的终止
正常退出(自愿):进程完成了工作,通过一个系统调用通知操作系统自己的任务已完成。
系统调用:
Unix:exit
Windows:ExitProcess
出错退出(自愿):由进程引起的错误,一般是执行了非法指令,进程会收到中断信号,但并不是立即终止,一些操作系统,如 Unix,可以通知操作系统自行处理错误。
被其他进程杀死(非自愿):某个进程通过系统调用通知操作系统杀死某个其它进程。“杀手”进程必须获得授权。
系统调用:
Unix:kill
Winodws:TerminateProcess
进程终止后对子进程的影响:有些操作系统会同时杀死被杀死的进程的所有子进程。但 Unix 和 Winodws 都不会这样做。