多进程启动
main中的fork创建了第一个进程,这是初始化的进程,然后init执行科shell,就是Windows的桌面。用户执行的任务,也是创建一个进程。在linux中的一个命令,如ls等都是创建一个进程,去执行这个任务。
多进程如何组织
操作系统管理进程的核心就是PCB(Process Control Block)用来记录进程信息的数据结构,用PCB的结构体形成数据结构,比如形成一个队列。根据进程的状态,区分开来,便于管理,不同状态的变化,由操作系统控制,根据状态的转化,推进进程前进。
多进程如何进行交替
A进程运行一会,切换到B进程,稍候再切换回A进程继续执行。
比如A进程现在启动磁盘的读写了,先把状态编程阻塞态,放在阻塞队列上,然后使用schedule函数进行切换。从PCB中存放的信息,找到下一个进程,保存当前进程。下一个进程进行切换。
schedule中有getNext调度,如何调度,基本的有FIFO,先进先出。当然还有优先级的概念,比如有的程序使用的多,有的使用的少,不可能所有的都一样,这些都是有具体的算法策略。
切换的时候怎么记住呢,直接将CPU里面的一些信息,记录到PCB中,把CPU寄存器的一些信息记录下来。这些东西需要精细的控制,所以需要汇编才行,具体哪个寄存器需要记录下来。
多进程如何影响
多进程都是在内存中,在A进程使用的时候,使用到的内存可能占用了B进程的空间,这样的话切换回B进程的时候,进程B就会崩溃了。所以就要限制进程内存的读写,怎么限制,需要用到映射表。每个进程都有自己的映射表,不同的进程可能都访问内存100的位置,但是映射到实际的物理地址,就会完全不一样,所以两个程序之间是完全不影响的。
多进程的合作
比如A进程唤醒B进程进行一些操作。多进程合作的时候,交替执行就会乱套了,所以的话,使用一个典型的生产者消费者模型。在生产者和消费者之间,会有中间共享变量处理之间的消费生产counter, 但是生产者和消费者会交替执行,对于共享变量会同时修改出错。为了处理这种错误,需要进程同步需要合理的推进顺序,不是在任意的时候都可以的,这时候会给共享变量上锁。同一时刻只允许一个进程操作这个变量。