当前位置:首页 > 教育论文 » 正文

线程的周期(多线程死锁)

 人参与  2022-11-28 18:14:01  分类 : 教育论文  点这评论  作者:团论文网  来源:https://www.tuanlunwen.com/
线程的周期(多线程死锁)

目录:

线程的周期

多线程死锁

什么是进程和线程

线程的周期

线程的周期

1、 wait方OO释放锁,sleep不会释放锁。 在线程t中调用tjoin(),线程t进入阻塞状态直到线程t2执行完毕。 Thread.yield()线程主动放弃cpu使用权。

2、一个进程创建了子进程,父子进程异步执行。当子进程死亡时,操作系统会释放子进程占用的资源,但仍保留进程号、状态等信息,直到父进程调用wait或waitpid方法,这些信息才会被清除。若子进程先于父进程死亡,但父进程不调用wait或waitpid,则子进程的信息会一直保留,一直占用着进程号,这就是僵死进程。若父进程先于子进程死亡,子进程的父进程由init代替,当子进程死亡时init会负责释放子进程的信息,不会出现僵死进程。

多线程死锁

多线程死锁

1、两个人在过独木桥,这个桥每次只能过一个人,死锁相当于两个人同时从对面上桥,走到中间的时候,谁都很强势,都在等待对方先退下去,让自己先过,但他们又都不退,从而造成僵死。

2、两个人在一个狭窄的胡同的相遇,但是呢两个人都很有礼貌,都彼此先让对方先过,所以一直同时从这边移到那边,从那边移到这边,虽然还在活动,但是却忙于彼此礼让对方,最终导致谁也不能干的别的事。

3、线程饥饿问题其实指的公平性问题,意思是多个线程都在执行任务,但是只有一个cpu,如果想要大家都有机会执行自己的任务,那么必须是每个人执行一会之后,让出资源让别人执行,谁都不能一直占着cpu,如果某个线程一直占着cpu,那么造成的结果就是别的线程一直没有机会运行,从而导致饿死。

4、每到过年的时候,大家都要买OOO回家,但是呢票的总数是有限的,当票一放出来的时候,黄牛通过不正当的方式,一下抢到了80%的票源,从而导致有很大一部分人买不到票,最后无奈要么不回家了,要么改换日期或者其他交通工具,这其实就是一个典型的公平性问题,公平指的是让人人都有机会而不是让某一个人垄断。

什么是进程和线程

什么是进程和线程

1、进程是指可执行文件加载到内存运行起来的程序,即内存中正在运行的程序; (现代多任务操作系统利用分时机制(即时间片轮转机制)实现多任务并发,操作系统内核为每一个任务创建一个抽象对象(struct task_struct)类型的对象,并用多种数据结构来管理这些任务,其中分时机制的实现利用一个称为就绪队列的数据结构来实现); 任务的五种状态 两种正常状态: 就绪态:位于就绪队列中处于等待时间片来临的状态; 运行态:CPU正在执行其代码的状态—每次只能保持时间片的时长 三种特殊状态: 暂停态:由于外部因素干扰,任务暂时不能参与时间片流转; 僵死态:任务退出,但是任务占用的资源还未被系统回收; 睡眠态:任务由于自身逻辑需要,运行到某处需要满足一定的条件才能继续执行后面的代码,但该条件确未能成立,此时,任务可以进入等待该条件成立(资源就绪)的一种状态;

2、进程的创建:pid_t fork() 创建过程: 为子进程在内核创建对应的PCB对象 以父进程栈区,数据区,代码区,堆区为模型,为子进程准备其专用的栈区,数据区,堆区三区的大小,内容与父进程都一样; 子进程共用父进程的代码区; 为子进程准备专用的描述符数组,并且将父进程的描述符数组中的内容拷贝到子进程的描述符数组,将每个描述符对应的引擎对象的引用计数加1 因此, fork成功后,虽然父子进程执行的代码是同一份代码,但可以在这样代码中,通过fork函数的返回值来控制: 1>哪些代码只是父进程才执行的:在if(pid > O)条件下的代码 2>哪些代码只是子进程才执行的:在 if(pid == 0)条件下的代码 3>哪些代码是父子进程均要执行的:不在if(pid > 0)且不在 if(pid == 0)条件下的代码;

3、进程的善后:wait waitpid 一个进程退出后并不会立即彻底消亡,进程运行过程中使用的资源还有一些未被系统回收(如:进程的PCB对象),此时进程所处的状态为僵死态,处于僵死态的进程被称为僵尸进程,如果任由僵尸进程长时间存在,势必会导致一些资源不能被再度利用而造成浪费(这种错误行为类似于内存泄漏),因此,编程时如果发现一个进程退出,因尽快对其进行善后处理—即回收进程仍然占用的资源 如何对已退出的进程进行善后: --------即如何避免僵尸进程: 由已退出进程的父进程对已退出的进程调用wait或waitpid函数 让已退出的进程成为孤儿进程,该进程会被祖先进程OO,由祖先进程对其调用wait 父进程在fork前调用函数signal(SIGCHILD,SIG_IGN); 父进程中一旦调用signal(SIGCHILD,SIGIGN)函数,实际就是通知OS内核父进程不关心子进程的退出,而委托给内核对其子进程做善后处理 *pid_t wait(int pstatus) 函数功能:检查当前进程(调用wait函数的进程)是否有子进程退出: 1)无子进程退出,则wait阻塞等待有任一子进程退出2)有某个子进程退出: 1>获取该子进程的退出信息(其中包括子进程OOin函数返回值),并将退出信息填入形参pstatus指向的空间 2>对该子进程进行善后处理-----即回收该子进程占用的所有资源----子进程彻底消亡

4、进程的替换:exec系列函数 exec系列函数共计6个,这6个函的功能是一样的,就是形参组织方式、访问新可执行文件的基准路径不一样int execl(char *path,char *argvO,char *argv1…char *argvn,NULL); 函数功能:调用本函数的进程,不再与其父进程共享代码区,而是造出一个新的代码区来存放指定可执行文件中 二进制代码,并调用新可执行文件中的OOin函数 一旦一个进程调用了exec系列中的某个函数,exec系列函数会对该进程做如下几个方面的处理: 1>清空整个进程的栈区 2>重造数据区:原有数据区被释放,按可执行文件中指示重新创建新的数据区3>堆区:释放所有调用exec函数前所有动态分配的空间 4>为子进程新建一个专用代码区,用来存放指定可执行文件中的二进制指令 5>子进程的描述符数组中,每个下标位置的描述符对应的引擎对象,有的会被close、而有的会被保留 被close: open时会通过fcntl后添加了O_CLOEXEC标记的描述符会被close 被保留:没有O_CLOEXEC标记的描述符会被继续保留 exec函数如果调用正常是不返回的,此后调用exec函数的进程的退出由新的可执行文件代码逻辑来决定 argy0、argyv1 、、argvVn:这些形参指向空间存放的都是字符串,这些字符串内容在调用新可执行文件中的OOin函数时,作为新OOin函数argv[0]、argv[1]、…、argv[n] 而n+1作为新OOin函数的argc的实参 编程时fork子进程主要运用于两种情况: 期望父子进程同时执行同样性质工作内容:比如TCP服务端多进程并发 2期望子进程去执行另一个可执行文件:比如: shell命令行执行外部命令功能的实现

后台-系统设置-扩展变量-手机广告位-内容正文底部

本文标签:进程  执行  函数

<< 上一篇 下一篇 >>

  • 评论(
  • 赞助本站

赞助团论文网
留言与评论(共有 0 条评论)
   
验证码:

相关文章

随机文章

标签列表

最近发表

    热门文章 | 最新文章 | 随机文章

最新留言

首页 论文知识 教育论文 毕业论文 教学论文 经济学 管理学 职称论文 法学 理学 医学 社会学 物理学 文献 工程论文 学位论文 研究论文

Powered 团论文网 版权所有 备案号:粤ICP备2022136924号-2统计代码

全站搜索