在之前文章说到进程相关时,说到linux中产生进程的机制
需要注意几个点:
fork()以后,父子进程哪些不同,哪些相同
1.不同:进程ID、fork()的返回值、父进程ID、进程运行时间、闹钟(定时器)、未决信号集
(3G空间一样,PCB的一些内容不完全一样)
2.相同:全局变量、data、text、堆、栈、环境变量、用户ID、工作目录、信号处理方式等
(0-3G的空间内容基本相同)
注意:父子进程中全局变量不是共享的,各自有一份,不要和多线程中混淆
父子进程间共享:文件描述符(文件的结构体)、mmap建立的映射区(进程间通信机制)
父子进程运行的先后顺序我们无法得知,由内核调度算法决定。
linux下产生新进程的通用方法:
fork()(准确的说是vfork())产生一个子进程,然后用exec()函数族替换掉子进程,这样一个我们想要的进程就产生了
一、基础概念:
1.临界资源:
每次只允许一个进程或者线程访问使用的资源,可以是一台打印机、可以是一个数字、可以是一个文件等等。
2.临界区: 用来访问临界资源的代码。比如一个列表为临界资源,增删查改代码就是临界区。
3.进程互斥: 临界资源的排他性,决定了进程使用这些资源是互斥的,这种关系就叫互斥。
4.三者的联系:
进程A,进程B,临界资源C
当A执行临界区代码访问C时,B再去执行临界区代码访问C,B将会被阻塞,直到A离开临界区
5.多道程序设计的基础:
时钟中断:强行使程序让出CPU等系统资源,再依靠进程调度进程来调度哪个进程去使用CPU。
再加上CPU的高速运转,使得实际串行执行的进程看起来像并发执行。
二、进程的互斥和同步:
进程的互斥:实际上是因为进程间要访问临界资源而产生的一种竞争(进程间是竞争关系)
进程的同步:一个任务可能要多个进程共同完成,但是存在某种时序问题,需要我们编程人员干涉(进程间是协作关系,为伙伴进程)
一般我们可以将互斥,看作是一种特殊的同步。