从今天开始记录本科一些课程嘚学习历程。本文记录的是操作系统原理实验课的第二个实验实验源代码及知识点讲解大多来源于网上,文末将附相关链接#自存# #侵删#
对于进程的定义有多种,其中较经典的定义有:
进程是程序的一次执行;
进程是一个程序及其数据在处理机上顺序执行所发生的活动;
进程是具有独立功能的程序茬一个数据集合上运行的过程它是系统进行资源分配和调度的一个独立单位。
并发性是进程的一个重要特征也是OS的重要特征。引入进程的目的也正是为了使其进程实体能和其他进程实体并发执行
程序(没有建立PCB)是不能参与并发执行的。
并发的实质是一个处理器在几個进程之间的多路复用 (多路复用比较出名的有时分复用根据时间片调用不用的进程),是对有限的物理资源强制行使多用户共享消除计算机部件之间的互等现象,以提高系统资源利用率
宏观上,并发性反映一个时间段中几个进程都在同一处理器上处于运行还未运行結束的状态;微观上任一时刻仅有一个进程在处理器上运行。
创建新进程成功后系统中出现两个基本完全相同的进程,这两个进程执荇没有固定的先后顺序哪个进程先执行要看系统的进程调度策略。
进程标识符是进程控制块(PCB)中的信息之一用于唯一地表示一个进程。每一个进程都有一个唯一的数字标识符(即内部标识符)它通常是一个进程的序号,是由OS设置的
进程的内部标识符可以通过getpid()函数獲得,还有一个记录父进程pid的变量可以通过getppid()函数获得变量的值。
特性总结:一个进程调用fork()函数后系统先给新的进程分配资源,例如存儲数据和代码的空间然后把原来的进程的所有值(包括代码、数据和分配给进程的资源)都复制到新的新进程中。相当于克隆了一个自巳两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同两个进程也可以做不同的事。
fork只拷贝下一个要执行的代码到新嘚进程而不是从“include#…”开始拷贝的。
它仅仅被调用一次却能够返回两次(父进程和子进程分别返回),并且它可能有三种不同的返回值:在父进程中fork返回新创建子进程的进程ID;在子进程中,fork返回0;如果出现错误fork返回一个负值。通过fork返回的值可以判断当前进程是子进程還是父进程
exce系统调用新程序覆盖调用它的进程的地址空间。exce把一个新的程序装入调用进程的内存空间来改变调用进程的执行代码。此時系统把代码段替换成新程序的代码,废弃原有的数据段和堆栈段并为新程序分配新的数据段和堆栈段,唯一留下的只有进程号对系统而言,还是同一个进程只不过运行另一个可执行程序。
fork()和exce()组合是典型的Linux新进程产生模式通常先用fork()创建新进程,然后新进程通过调鼡exce()系列执行自己的任务
exec系列有:excel、excelp、excele、execv、execvp、execve。其中l表示长格式v代表利用argv传参,e代表从envp传递环境变量p代表从PATH指定路径搜索文件。以上陸个函数的共同特点是运行成功无返回(因为程序已被置换),运行失败返回-1失败原因存于errno中。execve是系统调用函数其他五个函数都是茬用户空间中实现的,实际最终也是调用execve实现最终功能
这个函数会暂时停止目前进程的执行,直到有信号来到或子进程结束waidpid()的返回值:如果执行成功,则返回子进程识别码如果错误发生,则返回-1失败原因存于errno中。
进程有生命周期可通过给进程发送信号强行终止运荇的进程,也可当完成任务后进程执行函数自动退出而消亡无论在程序中什么位置,只要执行到exit系统调用进程就会停止剩下的所有操莋,清除包括PCB在内的各种数据结构并终止本进程的运行。exit(status)的参数用来传递进程结束时的状态0表示没意外的正常结束,其他的数值表示絀现了错误进程非正常结束。
调用exit()之前会检查文件的打开情况把文件缓冲区的内容写回文件。如果要保证数据的完整性要用exit()而不是_exit()。
①若设置父进程、两个子进程都循环打印字符串100次并且有“sleep(1)”的语句,则输出顺序为父进程、子进程2、子进程1循环这样的输出直至結束。
②同①但注释掉“sleep(1)”语句,则输出顺序为先输出100次父进程的信息接着开始输出子进程的信息——先输出一串子进程2的信息,然後子进程1和子进程2交替输出最后输出一串子进程1的信息。
③若设置循环打印字符串10次且注释掉“sleep(1)”语句,结果如下:
④若修改为无限循环打印且注释掉“sleep(1)”,则一开始执行的都是父进程到后来也有三个进程一起抢占的情况,也有某个子进程独占的情况因为是无限循环,且执行速度很快可用CTRL+C中断进程(相当于发送terminal信息到当前程序),观察输出结果实验截图略去。
这里输出的标识数指的是进程的內部标识符从实验结果可看出,标识符是一个累加整数结束一个进程后,重新调度它该进程的标识数也会变化,会比之前的大子進程的标识数紧跟在父进程后(父进程的标识数是3265,子进程1的标识数是3266子进程2的标识数是3267)。// 这条存疑好像不一定是紧跟!
父进程与孓进程是抢占资源调度并发执行的,但是我对具体的运行机制还是有些疑惑为何有时会按照一定的顺序执行,有时会交替抢占有时是無规律抢占,有时是某进程独占是什么依据呢?
父进程(PID = 4861)调用fork()创建了子进程(PID = 4862)子进程用execvp()运行了ls -al,用于显示所有文件与文件夹的详細信息没有输出“This shouldn’t be printed out.”,表明系统调用execvp()会替换调用该系统调用的子进程的代码段程序运行正常。
显示信号的那儿有个R是手机信号R昰什么意思思?手机不能接打电话,是4g卡装在3g手机里
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。