进程和程序的区别:
进程是执行中的程序,除了程序之外还包括数据以及进程控制块
进程控制块:
- 进程标识信息
- 进程控制信息:包括了进程状态信息,与其他进程的通信信息,进程所占的存储信息,调用系统资源的信息等,控制块所在链表的信息。
- 现场保存的信息:内存地址,CPU状态,寄存器等信息
进程控制块通过链表或索引表来组织
进程的状态: - 创建
- 执行
- 等待
- 抢占
- 唤醒
- 结束
三状态进程模型:指就绪,执行和等待,程序运行时会在这三种状态间切换。就绪和等待的区别是,就绪指已经有了除CPU之外的资源,只需CPU叫它就能开始。等待是指还在等其他的资源,比如说被抢占的内存等。
挂起进程模型:在三状态进程模型的基础上又加了就绪挂起和等待挂起两个状态,表示在相应的状态下当内存中地方不够时,把进程放到外存中。
状态之间的切换其实就是在不同的状态队列里的搬迁。
线程:当我们一个进程内部需要并发时,我们引入线程的概念。线程是CPU调度的最小单元(之前是进程)。引入线程更好的实现了资源的共享和并发。
线程=进程-共享资源
线程有几种实现: - 用户线程:系统本身不支持线程,还是以进程为单位调度,需要用户自己在用户态写线程的程序。优点是不依赖操作系统,缺点是不支持基于线程的处理机抢占。
- 内核线程:基于系统内核的线程,优点是支持基于线程的处理机抢占,缺点是稍比用户态慢,是现在主流的线程实现方法。
- 轻量级线程:同时支持前两者,但过于复杂,不实用。
进程的创建:
Windows是通过一个CreatProcees函数创建的
LINUX是通过fork和exec两个函数来完成,具体做法是
- fork完成对父进程的复制,并分配新的进程ID
- exec将新的程序加载进来,完成对复制内容的替换,这样一个完全新的进程就创建完成啦
进程的加载:
通过exec()函数来执行,包含在创建过程里。
进程的等待和结束:
父进程对应wait(),子进程对应exit(),完成进程资源的回收;
父进程发现还有子进程时,进入wait状态,等待回收。当子进程结束时,发出exit(),父进程将其回收。
如果子进程exit了,但父进程没有响应,有两种情况:
一 是父进程还活着,只是有点忙,那子进程就进入僵尸状态,等待父进程回收;
二 是父进程不存在了,那子进程直接释放所有资源,进程结束