【操作系统】 进程控制 僵尸进程和孤儿进程

1. 进程创建fork()

  1. 调用形式 pid=fork()
  2. 功能
    创建一个子进程,被创建的子进程是父进程的进 程映像的一个副本 (除proc结构外),在UNIX系统中,除 了0#进程外,其它进程都是通过调用进程创建系统调用创建的。
  3. 动作
    ① 为新进程分配一个新的pcb结构
    ② 为子进程赋一个唯一的进程标识号 (PID)
    ③ 做一个父进程上下文的逻辑副本。由于进程的正文区 (代码段) 可被几个进程所共享,所以核心只要增加某个正文区的引用数即可,而不是真的将该区拷贝到一个新的内存物理区。这就意味着父子进程将执行相同的代码数据段堆栈段属于进程的私有数据,需要拷贝到新的内存区中。
    ④ 增加与该进程相关联的文件表和索引节点表的引用数,父进程的所有打开文件符被复制到子进程中。这就意味着父进程打开的文件子进程可以继续使用。
    ⑤ fork()被调用一次,但返回两次。对父进程返回子进程的进程号,对子进程返回零。
    在这里插入图片描述
    在这里插入图片描述
    上例说明子进程有父进程数据段的拷贝(不影响父进程数据),共享了文件(标准输出文件)

2. 启动新程序exec()

exec函数族可以实现在一个进程中启动另一个程序的功能。系统内核会使用新的程序替换原有进程中使用的程序。开始新程序的执行。新进程和原有的进程号相同。调用exec函数后,代码段中的内容被新进程的代码替换,接着更新堆栈段和数据段。
《unix环境高级编程8.10》
exec()函数族
在这里插入图片描述

3. 结束线程exit()

在这里插入图片描述在这里插入图片描述

4. 等待进程wait() waitpid()

在这里插入图片描述
在这里插入图片描述

5. 僵尸进程和孤儿进程

**孤儿进程:**一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程并不会有什么危害
僵尸进程:一个进程使用fork创建子进程,如果子进程退出(一般是调用exit、运行时发生致命错误或收到终止信号所导致),而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的PCB仍然保存在系统中。这种进程称之为僵死进程。
任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。如果父进程没有调用wait()处理掉,子进程就会一直保留PCB。
僵尸进程和孤儿进程具体讲解-知乎

6. 协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
对操作系统而言,线程是最小的执行单元,进程是最小的资源管理单元。无论是进程还是线程,都是由操作系统所管理的。
协程不是被操作系统内核所管理的,而是完全由程序所控制,也就是在用户态执行。这样带来的好处是性能大幅度的提升,因为不会像线程切换那样消耗资源。
协程既不是进程也不是线程,协程仅仅是一个特殊的函数,协程它进程和进程不是一个维度的。
一个进程可以包含多个线程,一个线程可以包含多个协程。
一个线程内的多个协程虽然可以切换,但是多个协程是串行执行的,只能在一个线程内运行,没法利用 CPU 多核能力。
协程与进程一样,切换是存在上下文切换问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值