计蒜客(二)进程

1.进程,地址空间与线程

    一个进程可以使用的全部内存的地址和它们存储的数据成为这个进程的 地址空间。我们可以将级才能拿笼统地看成是一个或多个线程与一个地址空间的结合。

    进程在系统中的实现方式需要达到两个目的:

(1)进程的结果必须囊括一个进程的运行状态,在由于中断、异常或系统调度进入内核态时我们应该能够将进程的运行状态放入内存中的某一位置,使我们可以在某一个时间点根据进程的优先级接着这次的进度再运行该进程

(2)由于进程在用户一侧对内存进行抽象,我们需要在系统一侧包含从抽象内存向实际内存和外存(磁盘等存储设备)的映射,以便通过抽象内存的地址获得物理地址和其中存储的数据。

为了(1),即在进程中存储其运行状态,我们将在进程中存储处理器状态寄存器、指令计数器、栈指针、通用寄存器等代表了进程目前的运行状态的值。由于线代计算机中往往有多个核和多个处理器,我们的程序可以达到 并行(parallelism,即在物理时间上同时进行,区别于多个进程在处理器上的并发(concurrency)),因此同一个进程可能同时包含有多个不同的运行状态。为了更好区分进程在一个处理器上的运行状态和进程本身的运行状态,我们引入 线程(thread)概念。每个线程拥有一个线程控制块(Thread control block,TCB),用来存储我们上述提到的处理器状态寄存器、指令计数器、栈指针、通用寄存器等数值,但同一个进程中的所有线程都共享同一个地址空间。

    一个用户进程所看到的内存空间是抽象的,区别于实际的物理内存,因此为了支持进程从抽象内存获取物理内存中存储的信息,我们需要在进程中包含从抽象内存向物理内存的映射,即该系统所用的地址转换方法所需要的信息。地址转换有很多种不同方法:分页存储、分段存储等,他们都需要不同的信息来实现地址转换。下面以Base and Bound例子解释。

     在Base and Bound方法汇总,系统将一段连续的物理内存分配给一个进程,Base代表基地址,即系统分配给一个进程的可用内存的起始地址,Bound代表这个进程可用的内存的最高地址,为了读写物理内存,我们将基地址与抽象内存地址相加,获得实际地址;只要实际地址不大于Bound,内核就会允许进程进行该操作。因此在这个方法中,为了实现进程地址空间的抽象,进程在系统的一侧的数据结构中必须包括这段可用的内存的基地址、可用长度。

   为了能在一个进程开始运行的时候方便的载入上面提到的两个方面的数据,我们需要一数据结构——进程控制块(Process Control Bloc ,PCB)。对于内核来说,它是进程存在的唯一标识。进程控制块中存储的信息除了上面提到的实现地址转换的信息和标识运行状态的线程信息以外,还包括了很多系统在调度进程需要的信息,如进程号、进程所处状态、进程的优先级等。注意:我们不会将整个地址空间中包含的地址及其数据都存储在PCB,我们只需要可以帮助我们从抽象内存地址获得实际物理地址的方法,而实际数据仍然存储在内存的对应位置中。

2.进程状态与用户态和内核态之间的切换

为了建立一个新的进程,内核需要给进程分配资源(如建立进程控制块)、建立必要的管理信息。终止态对应的是进程已经结束但尚未被系统撤销的状态。处于终止态的进程虽然已经结束,但其获得的资源还未被系统回收,因此系统仍然可以获得该进程结束时的信息。

   在UNIX系统中,如果发生一个进程创建另一个进程的情况,那么在老进程从新进程获得信息前,新进程会一直停留在终止态;如果新进程终止后,仍在运行的老进程没有从新进程获取信息,那么新进程就会成为“僵尸进程”,停留在系统内存中,导致系统变慢。

3.进程

终止态可以为需要从终止进程中获得信息的其它进程保留信息。

1

4.子进程与父进程

1

5.exec()

1

6.章节复习

1

7.实验:设计自己的shell

1
发布了219 篇原创文章 · 获赞 13 · 访问量 9820

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/104123476
今日推荐