进程概念
进程是程序的一次动态执行,是操作系统分配资源的基本单位。
进程组成
程序段:代码部分
数据段:进程中的一些数据
pcb:一种数据结构,用于描述进程的相关信息等。
详细介绍
在单道操作系统中,操作系统一次只能加载一个进程,进程是独占cpu的。在多道操作系统中,操作系统一次可以加载多个进程,然后进程之间并发执行,每个进程都独占cpu一段时间,然后cpu时间片耗完之后,就让出cpu,让别的进程执行。进程有一些状态,如下:
首先是新建,这里以unix操作系统为例,操作系统在启动时,会创建一个初始化进程,即init进程,这个是所有进程的父进程。init进程会创建一些需要的子进程,比如bash等。所以从这里可以看出,unix是父进程通过系统调用fork创建子进程的,刚创建时,父进程和子进程是共享内存空间的,即子进程是对父进程的一个内存拷贝。这里创建时,操作系统会给进程分配一些资源,比如内存,一些硬件系统等。
在创建后,进程则进入就绪态,就绪态的意思是进程已经拥有了其它资源,但是缺少cpu,因为此时cpu已经被别的进程占用。
创建后,如果运行进程时间片到了,或者由于阻塞事件发生等退出执行状态,则就绪进程进入运行态,运行自己的代码片段等。
运行态如果需要等待一些阻塞事件的发生,则会进入阻塞态。
阻塞态如果io事件已经发生的话,则会进入就绪态。
如果已经运行结束,或者收到一些终止信号,比如kill -9等,则会终止。终止后会回收进程的资源。
进程切换需要保存上下文环境到寄存器中,以保证下次执行时还能还原当时的执行场景,所以进程切换是一个很重的操作。
在多道程序操作系统中,很可能有多个进程在等待或者就绪,这时就需要有队列来维护这些进程的状态。操作系统通过原语的操作来保证进程状态切换的原子性。
数据结构
进程的状态保存在pcb(processor control block)中,pcb是描述进程信息的一个数据结构,操作系统在分配资源时,会将信息写入pcb中。在进程进行上下文切换时,也会将此时进程的执行状态保存在pcb的寄存器中。
pcb中包括进程id,usrid,程序计数器,寄存器,栈帧等信息。
对于多道程序,操作系统可以一次加载多个进程,所以需要一种数据结构来管理进程,即process table。
进程间通信
进程间信息交换 ,即ipc,方式如下:
共享存储:有一块共享内存,供两个进程访问,以实现通信。该块区域互斥访问。
管道通信:通过管道交互,管道可以理解为一种缓冲区,常见的例子,shell中的管道,ps -ef|grep xxx,就是常见的管道通信,其中|表示管道。半双工通信。
消息传递:通过格式化的消息传递消息。
socket通信:通过socket端口建立连接,进行通信。
思考
1.unix创建子进程时,占用内存会double吗?
不会,unix采用写时复制,在fork时是共享那一段内存空间的,只有当父进程或者子进程需要改时才会copy修改的某一页内存。
2.unix创建子进程时,会copy父进程的内存,那么会有父进程的所有线程吗?
不会,子进程只有一个线程,即父进程调用fork系统调用的线程的副本。该部分具体可以见《UNIX环境高级编程》12.9章节的内容。