线程(Thread)
到目前为止,进程只有一个执行线程
每个进程有多个程序计数器,多个位置可以同时执行
进程调度
进程调度器(内核内的算法、软件)在可用进程中进行选择,以便在CPU内核上的下一次执行。
维护进程的调度队列:
就绪队列–驻留在主存中、准备好并等待执行的所有进程的集合
等待队列–等待事件(即i/O)的一组进程
进程在不同的队列之间迁移
调度目的:最大限度地利用CPU,快速将进程切换到CPU上
上下文切换(context switch):
将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态
发生上下文切换时:内核心会将旧进程的状态保存在其PCB中
上下文切换时间是开销。切换时,系统不会执行任何有用的操作。上下文切换时间与硬件支持相关。
操作系统必须提供以下机制:
1,进程创建
2,进程终止
进程创建:
进程在其执行过程中,可以通过创建系统调用出啊创建多个进程。创建进程成为父进程,新的进程成为子进程。形成进程树。
进程通过**进程标识符(Pid)**来识别进程。通常是一个整数。
资源共享选项:
1,父进程和子进程共享所有资源
2,子进程分享父进程资源的子集
3,父进程和子进程不共享资源
执行选项:
1,父进程和子进程同时执行
2,父进程等待,知道某个或全部子进程执行完
地址空间选项:
1,子进程是父进程的复制品
2,子进程装入新程序
进程终止:
进程完成执行最后语句并使用系统调用exit()删除自身时,进程终止。将状态数据从子级返回到父级(通过调用wait( )),进程资源会被操作系统释放。
由于某些原因,父进程可能会终止子进程的执行(abort()系统调用):
1,子进程已超出分配的资源
2,不再需要分配给子进程的任务
3,父进程终止(某些操作系统不允许子进程存活)
僵尸进程和孤儿进程:
进程炸弹(fork bomb):
创建了指数级的进程,内核使用了所有的CPU,创建进程并尝试在它们之间进行上下文切换,内存变满,整个计算机系统变慢,无法使用。现代Unix系统限制了用户可以创建的进程数。
僵尸进程:即子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程。
孤儿进程:一个父进程退出, 而它的一个或几个子进程仍然还在运行,那么这些子进程就会变成孤儿进程,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集的工作。
wait / waitpid回收进程资源
wait( )