操作系统原理学习笔记(3)之进程操作与进程通信(关键词:操作系统原理学习笔记)

来源:互联网 发布:java 数据 hadoop 开发 编辑:程序博客网 时间:2024/05/16 13:00

一、进程操作

    进程创建、进程终止、进程通信等等

    1.进程创建(OS开启之后,首先有0号进程)

共享(duplicate,而不是copy),虽然子进程的内容和父进程的内容是一样的,但是是在内存空间的不同位置。

例如:(子进程共享父进程的所有资源)父进程所带的程序代码,子进程也有了程序代码了,但是程序代码是复制了一份,放在另外一个新的位置,交给子进程。子进程不是与父进程共享代码。

过去某些经典的OS父进程创建子进程之后,采用的一种策略:


解释:父进程fork()创建了子进程之后,父进程等待,子进程继承了父进程所有的资源,但是子进程往往不想要用这些继承下来的资源,子进程又去调用另外一个系统调用exec(),把新的程序装入。父进程等待(此时不占用CPU),直到子进程发了一个终止的系统调用exit()(子进程做完事情了,要退出了)之后,操作系统把这个信号返回给父进程,父进程再从等待队列里面唤醒,父进程再往下继续执行。


Unix环境fork一个进程的功效:


如上代码的解释:

Pid_t pid; 定义一个pid,是Pid_t类型。此时只有一个进程。定义了一个局部变量pid,在堆栈里面。

pid = fork(); 先看fork()系统调用,创建子进程。如果是Linux,则子进程完全继承了父进程的一切。子进程是一个独立的进程,父进程是一个独立的进程。唯一不同的是pid号。父进程返回的AX的值是一个非零的正整数,这个数是子进程的pid号,而子进程返回的AX寄存器的值是0,只有这一点不同,其他一模一样。含义:子进程也拥有了这么一个完整的函数代码,包括main,包括Pid_t的申请,但是对于子进程来讲,Pid_t pid在子进程里面并没有执行。

往后,父进程和子进程均有各自的执行、相互独立。CPU给了父进程,则父进程执行,给了子进程,则子进程执行。

下面,分别来看父进程、子进程的执行。

父进程

    由于父进程的pid是非零正整数,所以if、else if语句块均跳过,不执行。执行else后的语句块:

    wait(NULL) :意思是要等待子进程执行完了之后,它才做,父进程在wait里面等待,主动交出CPU,处于等待队列,等待的对象是子进程返回。等子进程执行完毕后,它才从wait里面返回回来,它才有可能去执行下一句话printf。然后exit(0)。父进程的副作用是输出Child Complete。

子进程

    子进程也要做pid = fork()中的=符号,子进程拿到的pid是0,所以,if语句块跳过,执行else if语句块。执行execlp系统调用。

注意:父进程、子进程的执行顺序取决于CPU调度。因为父进程、子进程是完全独立的。

因此,这个C语言程序经过fork()操作之后,它会变成两个独立运算的东西。


二、进程终止


正常终止手段 exit

异常终止手段 abort



三、进程间合作



四、进程通信(Interprocess Communication IPC)

进程之间通信的方法,有很多。比如signal、管道、共享内存、消息传递。

经典案例:生产者-消费者问题


IPC

比较流行的、好的办法:消息系统


同步通信 vs 异步通信


同步通信

send操作:发送端发送消息,发送端等待,等到接收端接收到消息,并且接收端确认接收到了,发送端接收到了确认的信息,发送端才可以往下做事情。若发送端没有接收到,则继续等待。例如TCP协议。

receive操作:

TCP优点:发出去的数据,都可以确定知道发出去的数据是否到达。缺点:慢。


异步通信

send操作:发送端发出去一个消息,发送端可以立马做别的事情,不管消息有没有到达。如IP协议。

IP优点:发出去数据之后,就可以继续做自己的事情,通信的性能好、反应快。缺点:不可靠。



参考文献:

1.《操作系统概念》

2.操作系统-浙江大学







阅读全文
0 0
原创粉丝点击